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  }