github.com/segakazzz/buffalo@v0.16.22-0.20210119082501-1f52048d3feb/genny/resource/resource_test.go (about) 1 package resource 2 3 import ( 4 "fmt" 5 "path" 6 "path/filepath" 7 "strings" 8 "testing" 9 10 "github.com/gobuffalo/attrs" 11 "github.com/gobuffalo/flect/name" 12 "github.com/gobuffalo/genny/v2" 13 "github.com/gobuffalo/genny/v2/gentest" 14 "github.com/gobuffalo/meta" 15 packr "github.com/gobuffalo/packr/v2" 16 "github.com/stretchr/testify/require" 17 ) 18 19 type pass struct { 20 Name string 21 Options Options 22 } 23 24 func runner() *genny.Runner { 25 run := gentest.NewRunner() 26 box := packr.New("./_fixtures/coke", "./_fixtures/coke") 27 box.Walk(func(path string, file packr.File) error { 28 path = strings.TrimSuffix(path, ".tmpl") 29 run.Disk.Add(genny.NewFile(path, file)) 30 return nil 31 }) 32 return run 33 } 34 35 func Test_New(t *testing.T) { 36 ats, err := attrs.ParseArgs("name", "desc:nulls.Text") 37 if err != nil { 38 t.Fatal(err) 39 } 40 41 table := []pass{ 42 {"default", Options{Name: "widget", Attrs: ats}}, 43 {"nested", Options{Name: "admin/widget", Attrs: ats}}, 44 } 45 46 app := meta.New(".") 47 app.PackageRoot("github.com/markbates/coke") 48 49 for _, tt := range table { 50 t.Run(tt.Name, func(st *testing.T) { 51 tt.Options.App = app 52 r := require.New(st) 53 g, err := New(&tt.Options) 54 r.NoError(err) 55 56 run := runner() 57 run.With(g) 58 r.NoError(run.Run()) 59 60 res := run.Results() 61 62 r.Len(res.Commands, 1) 63 64 c := res.Commands[0] 65 r.Equal("buffalo-pop pop g model widget name desc:nulls.Text", strings.Join(c.Args, " ")) 66 67 r.Len(res.Files, 9) 68 69 nn := name.New(tt.Options.Name).Pluralize().String() 70 actions := []string{"_form", "index", "show", "new", "edit"} 71 for _, s := range actions { 72 p := path.Join("templates", nn, s+".plush.html") 73 _, err = res.Find(p) 74 r.NoError(err) 75 } 76 77 exp := packr.Folder(filepath.Join("_fixtures", tt.Name)) 78 gentest.CompareFiles(exp.List(), res.Files) 79 80 for _, n := range exp.List() { 81 n = strings.Replace(n, "\\", "/", -1) 82 f, err := res.Find(strings.TrimSuffix(n, ".tmpl")) 83 r.NoError(err) 84 s, err := exp.FindString(n) 85 r.NoError(err) 86 87 clean := func(s string) string { 88 s = strings.TrimSpace(s) 89 s = strings.Replace(s, "\n", "", -1) 90 s = strings.Replace(s, "\t", "", -1) 91 s = strings.Replace(s, "\r", "", -1) 92 return s 93 } 94 r.Equal(clean(s), clean(f.String())) 95 } 96 97 }) 98 } 99 } 100 101 func Test_New_SkipTemplates(t *testing.T) { 102 ats, err := attrs.ParseArgs("name", "desc:nulls.Text") 103 if err != nil { 104 t.Fatal(err) 105 } 106 table := []pass{ 107 {"default", Options{Name: "widget", Attrs: ats}}, 108 {"nested", Options{Name: "admin/widget", Attrs: ats}}, 109 } 110 111 app := meta.New(".") 112 app.PackageRoot("github.com/markbates/coke") 113 114 for _, tt := range table { 115 t.Run(tt.Name, func(st *testing.T) { 116 tt.Options.App = app 117 tt.Options.SkipTemplates = true 118 r := require.New(st) 119 g, err := New(&tt.Options) 120 r.NoError(err) 121 122 run := runner() 123 run.With(g) 124 r.NoError(run.Run()) 125 126 res := run.Results() 127 128 r.Len(res.Commands, 1) 129 130 for _, s := range []string{"_form", "edit", "index", "new", "show"} { 131 p := path.Join("templates", tt.Name, s+".html") 132 _, err = res.Find(p) 133 r.Error(err) 134 } 135 136 r.Len(res.Files, 3) 137 }) 138 } 139 } 140 141 func Test_New_API(t *testing.T) { 142 ats, err := attrs.ParseArgs("name", "desc:nulls.Text") 143 if err != nil { 144 t.Fatal(err) 145 } 146 table := []pass{ 147 {"default", Options{Name: "widget", Attrs: ats}}, 148 {"nested", Options{Name: "admin/widget", Attrs: ats}}, 149 } 150 151 app := meta.New(".") 152 app.PackageRoot("github.com/markbates/coke") 153 app.AsAPI = true 154 155 for _, tt := range table { 156 t.Run(tt.Name, func(st *testing.T) { 157 tt.Options.App = app 158 r := require.New(st) 159 g, err := New(&tt.Options) 160 r.NoError(err) 161 162 run := runner() 163 run.With(g) 164 r.NoError(run.Run()) 165 166 res := run.Results() 167 168 r.Len(res.Commands, 1) 169 170 nn := name.New(tt.Options.Name).Pluralize().String() 171 for _, s := range []string{"_form", "edit", "index", "new", "show"} { 172 p := path.Join("templates", nn, s+".html") 173 _, err = res.Find(p) 174 r.Error(err) 175 } 176 177 r.Len(res.Files, 3) 178 }) 179 } 180 } 181 182 func Test_New_UseModel(t *testing.T) { 183 r := require.New(t) 184 185 ats, err := attrs.ParseArgs("name", "desc:nulls.Text") 186 r.NoError(err) 187 188 app := meta.New(".") 189 app.PackageRoot("github.com/markbates/coke") 190 191 opts := &Options{ 192 App: app, 193 Name: "Widget", 194 Model: "User", 195 Attrs: ats, 196 } 197 g, err := New(opts) 198 r.NoError(err) 199 200 run := runner() 201 run.With(g) 202 r.NoError(run.Run()) 203 204 res := run.Results() 205 206 r.Len(res.Commands, 1) 207 208 c := res.Commands[0] 209 r.Equal("buffalo-pop pop g model user name desc:nulls.Text", strings.Join(c.Args, " ")) 210 211 r.Len(res.Files, 9) 212 213 for _, s := range []string{"_form", "edit", "index", "new", "show"} { 214 p := path.Join("templates", "widgets", s+".plush.html") 215 _, err = res.Find(p) 216 r.NoError(err) 217 } 218 219 f, err := res.Find("actions/widgets.go") 220 r.NoError(err) 221 r.Contains(f.String(), "users := &models.Users{}") 222 223 } 224 225 func Test_New_SkipModel(t *testing.T) { 226 r := require.New(t) 227 228 app := meta.New(".") 229 app.PackageRoot("github.com/markbates/coke") 230 231 opts := &Options{ 232 App: app, 233 Name: "Widget", 234 SkipModel: true, 235 } 236 237 g, err := New(opts) 238 r.NoError(err) 239 240 run := runner() 241 run.With(g) 242 r.NoError(run.Run()) 243 244 res := run.Results() 245 246 r.Len(res.Commands, 0) 247 r.Len(res.Files, 9) 248 249 f, err := res.Find("actions/widgets.go") 250 r.NoError(err) 251 actions := []string{"List", "Show", "Create", "Update", "Destroy", "New", "Edit"} 252 for _, action := range actions { 253 r.Contains(f.String(), fmt.Sprintf("func (v WidgetsResource) %v(c buffalo.Context) error {", action)) 254 } 255 256 }