github.com/pjdufour-truss/pop@v4.11.2-0.20190705085848-4c90b0ff4d5a+incompatible/soda/cmd/generate/model_test.go (about)

     1  package generate
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"log"
     7  	"os"
     8  	"path"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func Test_addAttribute(t *testing.T) {
    16  	cases := []struct {
    17  		AttrInput string
    18  		HasID     bool
    19  		HasNulls  bool
    20  		Validable bool
    21  	}{
    22  		{AttrInput: "plate", HasID: false, Validable: true},
    23  		{AttrInput: "id", HasID: true, Validable: true},
    24  		{AttrInput: "id:int", HasID: true, Validable: true},
    25  		{AttrInput: "optional:nulls.String", HasNulls: true},
    26  	}
    27  
    28  	for index, tcase := range cases {
    29  		t.Run(fmt.Sprintf("%v", index), func(tt *testing.T) {
    30  			r := require.New(tt)
    31  			m, err := newModel("car", "json", "models")
    32  			r.NoError(err)
    33  			a, err := newAttribute(tcase.AttrInput, &m)
    34  			r.NoError(err)
    35  			err = m.addAttribute(a)
    36  			r.NoError(err)
    37  
    38  			r.Equal(tcase.HasID, m.HasID)
    39  			r.Equal(tcase.HasNulls, m.HasNulls)
    40  
    41  			if !tcase.Validable {
    42  				log.Println(m.ValidatableAttributes)
    43  				r.Equal(0, len(m.ValidatableAttributes))
    44  				return
    45  			}
    46  
    47  			r.Equal(a.Name, m.ValidatableAttributes[0].Name)
    48  		})
    49  
    50  	}
    51  
    52  }
    53  
    54  func Test_model_addID(t *testing.T) {
    55  	r := require.New(t)
    56  
    57  	m, err := newModel("car", "json", "models")
    58  	r.NoError(err)
    59  	m.addID()
    60  
    61  	r.Equal(m.HasID, true)
    62  	r.Equal(m.HasUUID, true)
    63  	r.Equal(m.Attributes[0].Name.String(), "id")
    64  	r.Equal(string(m.Attributes[0].GoType), "uuid.UUID")
    65  
    66  	m, err = newModel("car", "json", "models")
    67  	r.NoError(err)
    68  	a, err := newAttribute("id:int", &m)
    69  	r.NoError(err)
    70  	err = m.addAttribute(a)
    71  	r.NoError(err)
    72  	m.addID()
    73  
    74  	r.Equal(m.HasID, true)
    75  	r.Equal(m.HasUUID, false)
    76  	r.Equal(m.Attributes[0].Name.String(), "id")
    77  	r.Equal(string(m.Attributes[0].GoType), "int")
    78  }
    79  
    80  func Test_model_addDuplicate(t *testing.T) {
    81  	r := require.New(t)
    82  
    83  	m, err := newModel("car", "json", "models")
    84  	r.NoError(err)
    85  	a, err := newAttribute("color:string", &m)
    86  	r.NoError(err)
    87  	err = m.addAttribute(a)
    88  	r.NoError(err)
    89  
    90  	a, err = newAttribute("color:string", &m)
    91  	r.NoError(err)
    92  	err = m.addAttribute(a)
    93  	r.Error(err)
    94  
    95  	a, err = newAttribute("color:int", &m)
    96  	r.NoError(err)
    97  	err = m.addAttribute(a)
    98  	r.Error(err)
    99  }
   100  
   101  func Test_package_paths(t *testing.T) {
   102  	cases := map[string]struct {
   103  		path            string
   104  		expectedPackage string
   105  	}{
   106  		"default": {
   107  			"models",
   108  			"models",
   109  		},
   110  		"alternate name": {
   111  			"entities",
   112  			"entities",
   113  		},
   114  		"nested folders": {
   115  			"pkg/models/admin",
   116  			"admin",
   117  		},
   118  	}
   119  
   120  	for desc, c := range cases {
   121  		t.Run(desc, func(t *testing.T) {
   122  			r := require.New(t)
   123  
   124  			inTempDir(r, func() {
   125  				m, err := newModel("car", "json", c.path)
   126  				r.NoError(err)
   127  
   128  				r.Equal(c.expectedPackage, m.Package)
   129  				r.Equal(c.path, m.ModelPath)
   130  
   131  				err = m.Generate()
   132  				r.NoError(err)
   133  
   134  				content, err := ioutil.ReadFile(path.Join(c.path, "car.go"))
   135  				r.NoError(err)
   136  
   137  				r.Contains(string(content), "package "+c.expectedPackage)
   138  			})
   139  		})
   140  	}
   141  }
   142  
   143  func Test_testPkgName(t *testing.T) {
   144  	r := require.New(t)
   145  	m, err := newModel("car", "json", "models")
   146  	r.NoError(err)
   147  
   148  	r.Equal("models", m.testPkgName())
   149  
   150  	err = os.Mkdir("./models", 0755)
   151  	r.NoError(err)
   152  
   153  	defer os.RemoveAll("./models")
   154  
   155  	r.Equal("models", m.testPkgName())
   156  
   157  	f, err := os.Create(filepath.Join("models", "foo_test.go"))
   158  	r.NoError(err)
   159  	_, err = f.Write([]byte("// some comment\npackage models"))
   160  	f.Close()
   161  	r.NoError(err)
   162  
   163  	r.Equal("models", m.testPkgName())
   164  
   165  	r.NoError(os.Remove(f.Name()))
   166  	f, err = os.Create(filepath.Join("models", "foo_test.go"))
   167  	r.NoError(err)
   168  	_, err = f.Write([]byte("// some comment\npackage models_test"))
   169  	f.Close()
   170  	r.NoError(err)
   171  
   172  	r.Equal("models_test", m.testPkgName())
   173  }
   174  
   175  func Test_model_Fizz(t *testing.T) {
   176  	r := require.New(t)
   177  
   178  	m, err := newModel("car", "json", "models")
   179  
   180  	a, err := newAttribute("id:int", &m)
   181  	r.NoError(err)
   182  	err = m.addAttribute(a)
   183  	r.NoError(err)
   184  
   185  	a, err = newAttribute("brand:string", &m)
   186  	r.NoError(err)
   187  	err = m.addAttribute(a)
   188  	r.NoError(err)
   189  
   190  	a, err = newAttribute("owner:nulls.String", &m)
   191  	r.NoError(err)
   192  	err = m.addAttribute(a)
   193  	r.NoError(err)
   194  
   195  	expected := `create_table("cars") {
   196  	t.Column("id", "integer", {primary: true})
   197  	t.Column("brand", "string", {})
   198  	t.Column("owner", "string", {null: true})
   199  	t.Timestamps()
   200  }`
   201  	r.Equal(expected, m.Fizz())
   202  }
   203  
   204  func inTempDir(r *require.Assertions, fn func()) {
   205  	dir, err := ioutil.TempDir("", "tests")
   206  	r.NoError(err)
   207  	defer os.RemoveAll(dir)
   208  
   209  	cwd, err := os.Getwd()
   210  	r.NoError(err)
   211  	defer os.Chdir(cwd)
   212  
   213  	os.Chdir(dir)
   214  	fn()
   215  }