github.com/Accefy/pop@v0.0.0-20230428174248-e9f677eab5b9/genny/model/model_test.go (about)

     1  package model
     2  
     3  import (
     4  	"io"
     5  	"os"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/gobuffalo/attrs"
    10  	"github.com/gobuffalo/genny/v2/gentest"
    11  	"github.com/gobuffalo/genny/v2/gogen"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func clean(s string) string {
    16  	s = strings.TrimSpace(s)
    17  	s = strings.Replace(s, "\r\n", "\n", -1)
    18  	s = strings.Replace(s, "\r", "\n", -1)
    19  	s = strings.Replace(s, "\t", "", -1)
    20  	return s
    21  }
    22  
    23  func Test_New(t *testing.T) {
    24  	r := require.New(t)
    25  
    26  	g, err := New(&Options{
    27  		Name: "widget",
    28  	})
    29  	r.NoError(err)
    30  
    31  	run := gentest.NewRunner()
    32  	r.NoError(run.With(g))
    33  	r.NoError(run.Run())
    34  
    35  	res := run.Results()
    36  
    37  	r.Len(res.Commands, 0)
    38  	r.Len(res.Files, 2)
    39  
    40  	r.NoError(gentest.CompareFiles([]string{"models/widget.go", "models/widget_test.go"}, res.Files))
    41  }
    42  
    43  func Test_New_Standard(t *testing.T) {
    44  	r := require.New(t)
    45  
    46  	ats, err := attrs.ParseArgs("id:uuid", "created_at:timestamp", "updated_at:timestamp", "name", "description:text", "age:int", "bar:nulls.String")
    47  	r.NoError(err)
    48  	g, err := New(&Options{
    49  		Name:  "widget",
    50  		Attrs: ats,
    51  	})
    52  
    53  	r.NoError(err)
    54  
    55  	run := gentest.NewRunner()
    56  	r.NoError(run.With(g))
    57  	r.NoError(run.Run())
    58  
    59  	res := run.Results()
    60  
    61  	r.Len(res.Commands, 0)
    62  	r.NoError(gentest.CompareFiles([]string{"models/widget.go", "models/widget_test.go"}, res.Files))
    63  
    64  	f, err := res.Find("models/widget_test.go")
    65  	r.NoError(err)
    66  
    67  	fsys := os.DirFS("_fixtures")
    68  	bf, err := fsys.Open(f.Name())
    69  	r.NoError(err)
    70  
    71  	expected, err := io.ReadAll(bf)
    72  	r.NoError(err)
    73  	r.Equal(string(expected), f.String())
    74  
    75  	f, err = res.Find("models/widget.go")
    76  	r.NoError(err)
    77  
    78  	tf := gogen.FmtTransformer()
    79  	f, err = tf.Transform(f)
    80  	r.NoError(err)
    81  
    82  	bf, err = fsys.Open(f.Name())
    83  	r.NoError(err)
    84  
    85  	expected, err = io.ReadAll(bf)
    86  	r.NoError(err)
    87  	r.Equal(clean(string(expected)), clean(f.String()))
    88  }
    89  
    90  func Test_New_No_Attrs(t *testing.T) {
    91  	r := require.New(t)
    92  	g, err := New(&Options{
    93  		Name: "widget",
    94  	})
    95  
    96  	r.NoError(err)
    97  
    98  	run := gentest.NewRunner()
    99  	r.NoError(run.With(g))
   100  	r.NoError(run.Run())
   101  
   102  	res := run.Results()
   103  	f, err := res.Find("models/widget.go")
   104  	r.NoError(err)
   105  
   106  	tf := gogen.FmtTransformer()
   107  	f, err = tf.Transform(f)
   108  	r.NoError(err)
   109  
   110  	fsys := os.DirFS("_fixtures")
   111  	bf, err := fsys.Open("models/widget_empty.go")
   112  	r.NoError(err)
   113  
   114  	s, err := io.ReadAll(bf)
   115  	r.NoError(err)
   116  	r.Equal(clean(string(s)), clean(f.String()))
   117  }
   118  
   119  func Test_New_XML(t *testing.T) {
   120  	r := require.New(t)
   121  
   122  	ats, err := attrs.ParseArgs("id:uuid", "created_at:timestamp", "updated_at:timestamp", "name", "description:text", "age:int", "bar:nulls.String")
   123  	r.NoError(err)
   124  	g, err := New(&Options{
   125  		Name:     "widget",
   126  		Encoding: "xml",
   127  		Attrs:    ats,
   128  	})
   129  
   130  	r.NoError(err)
   131  
   132  	run := gentest.NewRunner()
   133  	r.NoError(run.With(g))
   134  	r.NoError(run.Run())
   135  
   136  	res := run.Results()
   137  
   138  	r.Len(res.Commands, 0)
   139  	r.NoError(gentest.CompareFiles([]string{"models/widget.go", "models/widget_test.go"}, res.Files))
   140  
   141  	f, err := res.Find("models/widget_test.go")
   142  	r.NoError(err)
   143  
   144  	fsys := os.DirFS("_fixtures")
   145  	bf, err := fsys.Open(f.Name())
   146  	r.NoError(err)
   147  
   148  	s, err := io.ReadAll(bf)
   149  	r.NoError(err)
   150  	r.Equal(string(s), f.String())
   151  
   152  	f, err = res.Find("models/widget.go")
   153  	r.NoError(err)
   154  
   155  	tf := gogen.FmtTransformer()
   156  	f, err = tf.Transform(f)
   157  	r.NoError(err)
   158  
   159  	bf, err = fsys.Open("models/widget_xml.go")
   160  	r.NoError(err)
   161  
   162  	s, err = io.ReadAll(bf)
   163  	r.NoError(err)
   164  	r.Equal(clean(string(s)), clean(f.String()))
   165  }
   166  
   167  func Test_New_JSONAPI(t *testing.T) {
   168  	r := require.New(t)
   169  
   170  	ats, err := attrs.ParseArgs("id:uuid", "created_at:timestamp", "updated_at:timestamp", "name", "description:text", "age:int", "bar:nulls.String")
   171  	r.NoError(err)
   172  	g, err := New(&Options{
   173  		Name:     "widget",
   174  		Encoding: "jsonapi",
   175  		Attrs:    ats,
   176  	})
   177  
   178  	r.NoError(err)
   179  
   180  	run := gentest.NewRunner()
   181  	r.NoError(run.With(g))
   182  	r.NoError(run.Run())
   183  
   184  	res := run.Results()
   185  
   186  	r.Len(res.Commands, 0)
   187  	r.NoError(gentest.CompareFiles([]string{"models/widget.go", "models/widget_test.go"}, res.Files))
   188  
   189  	f, err := res.Find("models/widget_test.go")
   190  	r.NoError(err)
   191  
   192  	fsys := os.DirFS("_fixtures")
   193  	bf, err := fsys.Open(f.Name())
   194  	r.NoError(err)
   195  	s, err := io.ReadAll(bf)
   196  	r.NoError(err)
   197  	r.Equal(string(s), f.String())
   198  
   199  	f, err = res.Find("models/widget.go")
   200  	r.NoError(err)
   201  
   202  	tf := gogen.FmtTransformer()
   203  	f, err = tf.Transform(f)
   204  	r.NoError(err)
   205  
   206  	bf, err = fsys.Open("models/widget_jsonapi.go")
   207  	r.NoError(err)
   208  	s, err = io.ReadAll(bf)
   209  	r.NoError(err)
   210  	r.Equal(clean(string(s)), clean(f.String()))
   211  }
   212  
   213  func Test_New_Package(t *testing.T) {
   214  	r := require.New(t)
   215  
   216  	g, err := New(&Options{
   217  		Name: "widget",
   218  		Path: "models/admin",
   219  	})
   220  	r.NoError(err)
   221  
   222  	run := gentest.NewRunner()
   223  	r.NoError(run.With(g))
   224  	r.NoError(run.Run())
   225  
   226  	res := run.Results()
   227  
   228  	r.Len(res.Commands, 0)
   229  	r.Len(res.Files, 2)
   230  
   231  	f, err := res.Find("models/admin/widget.go")
   232  	r.NoError(err)
   233  	r.Contains(f.String(), "package admin")
   234  }