github.com/solongordon/pop@v4.10.0+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 }` 200 r.Equal(expected, m.Fizz()) 201 } 202 203 func inTempDir(r *require.Assertions, fn func()) { 204 dir, err := ioutil.TempDir("", "tests") 205 r.NoError(err) 206 defer os.RemoveAll(dir) 207 208 cwd, err := os.Getwd() 209 r.NoError(err) 210 defer os.Chdir(cwd) 211 212 os.Chdir(dir) 213 fn() 214 }