github.com/Ali-iotechsys/sqlboiler/v4@v4.0.0-20221208124957-6aec9a5f1f71/drivers/binary_driver_test.go (about)

     1  package drivers
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"os"
     8  	"reflect"
     9  	"runtime"
    10  	"strings"
    11  	"testing"
    12  )
    13  
    14  var testBinaryDriver = fmt.Sprintf("#!/bin/sh\ncat <<EOF%s\nEOF\n", testBinaryJSON)
    15  var testWarningBinaryDriver = `#!/bin/sh
    16  echo "warning binary" 1>&2
    17  echo "{}"
    18  `
    19  var testBadBinaryDriver = `#!/bin/sh
    20  echo "bad binary" 1>&2
    21  exit 1
    22  `
    23  
    24  func TestBinaryDriver(t *testing.T) {
    25  	if runtime.GOOS == "windows" {
    26  		t.Skip("cannot run binary test on windows (needs bin/sh)")
    27  	}
    28  
    29  	var want, got *DBInfo
    30  	if err := json.Unmarshal([]byte(testBinaryJSON), &want); err != nil {
    31  		t.Fatal(err)
    32  	}
    33  
    34  	bin, err := os.CreateTemp("", "test_binary_driver")
    35  	if err != nil {
    36  		t.Fatal(err)
    37  	}
    38  	fmt.Fprint(bin, testBinaryDriver)
    39  	if err := bin.Chmod(0774); err != nil {
    40  		t.Fatal(err)
    41  	}
    42  	if err := bin.Close(); err != nil {
    43  		t.Fatal(err)
    44  	}
    45  
    46  	name := bin.Name()
    47  
    48  	exe := binaryDriver(name)
    49  	got, err = exe.Assemble(nil)
    50  	if err != nil {
    51  		t.Fatal(err)
    52  	}
    53  
    54  	if !reflect.DeepEqual(want, got) {
    55  		t.Errorf("want:\n%#v\ngot:\n%#v\n", want, got)
    56  	}
    57  }
    58  
    59  func TestBinaryWarningDriver(t *testing.T) {
    60  	if runtime.GOOS == "windows" {
    61  		t.Skip("cannot run binary test on windows (needs bin/sh)")
    62  	}
    63  
    64  	bin, err := os.CreateTemp("", "test_binary_driver")
    65  	if err != nil {
    66  		t.Fatal(err)
    67  	}
    68  	fmt.Fprint(bin, testWarningBinaryDriver)
    69  	if err := bin.Chmod(0774); err != nil {
    70  		t.Fatal(err)
    71  	}
    72  	if err := bin.Close(); err != nil {
    73  		t.Fatal(err)
    74  	}
    75  
    76  	stderr := &bytes.Buffer{}
    77  	err = execute(bin.Name(), "method", nil, nil, stderr)
    78  	if err != nil {
    79  		t.Error(err)
    80  	} else if !strings.Contains(stderr.String(), "warning binary") {
    81  		t.Error("it should have written to stderr")
    82  	}
    83  }
    84  
    85  func TestBinaryBadDriver(t *testing.T) {
    86  	if runtime.GOOS == "windows" {
    87  		t.Skip("cannot run binary test on windows (needs bin/sh)")
    88  	}
    89  
    90  	bin, err := os.CreateTemp("", "test_binary_driver")
    91  	if err != nil {
    92  		t.Fatal(err)
    93  	}
    94  	fmt.Fprint(bin, testBadBinaryDriver)
    95  	if err := bin.Chmod(0774); err != nil {
    96  		t.Fatal(err)
    97  	}
    98  	if err := bin.Close(); err != nil {
    99  		t.Fatal(err)
   100  	}
   101  
   102  	stderr := &bytes.Buffer{}
   103  	err = execute(bin.Name(), "method", nil, nil, stderr)
   104  	if err == nil {
   105  		t.Error("it should have failed when the program exited 1")
   106  	} else if !strings.Contains(stderr.String(), "bad binary") {
   107  		t.Error("it should have written to stderr")
   108  	} else if !strings.Contains(err.Error(), "non-zero") {
   109  		t.Error("it should have reported non-zero exit")
   110  	}
   111  }
   112  
   113  var testBinaryJSON = `
   114  {
   115  	"tables": [
   116  		{
   117  			"name": "users",
   118  			"schema_name": "dbo",
   119  			"columns": [
   120  				{
   121  					"name": "id",
   122  					"type": "int",
   123  					"db_type": "integer",
   124  					"default": "",
   125  					"nullable": false,
   126  					"unique": true,
   127  					"validated": false,
   128  					"arr_type": null,
   129  					"udt_name": "",
   130  					"full_db_type": "",
   131  					"auto_generated": false
   132  				},
   133  				{
   134  					"name": "profile_id",
   135  					"type": "int",
   136  					"db_type": "integer",
   137  					"default": "",
   138  					"nullable": false,
   139  					"unique": true,
   140  					"validated": false,
   141  					"arr_type": null,
   142  					"udt_name": "",
   143  					"full_db_type": "",
   144  					"auto_generated": false
   145  				}
   146  			],
   147  			"p_key": {
   148  				"name": "pk_users",
   149  				"columns": ["id"] 
   150  			},
   151  			"f_keys": [
   152  				{
   153  					"table": "users",
   154  					"name": "fk_users_profile",
   155  					"column": "profile_id",
   156  					"nullable": false,
   157  					"unique": true,
   158  					"foreign_table": "profiles",
   159  					"foreign_column": "id",
   160  					"foreign_column_nullable": false,
   161  					"foreign_column_unique": true
   162  				}
   163  			],
   164  			"is_join_table": false,
   165  			"to_one_relationships": [
   166  				{
   167  					"table": "users",
   168  					"name": "fk_users_profile",
   169  					"column": "profile_id",
   170  					"nullable": false,
   171  					"unique": true,
   172  					"foreign_table": "profiles",
   173  					"foreign_column": "id",
   174  					"foreign_column_nullable": false,
   175  					"foreign_column_unique": true
   176  				}
   177  			]
   178  		}
   179  	],
   180  	"dialect": {
   181  		"lq": 91,
   182  		"rq": 93,
   183  
   184  		"use_index_placeholders": false,
   185  		"use_last_insert_id": true,
   186  		"use_top_clause": false
   187  	}
   188  }
   189  `