github.com/gobuffalo/buffalo-cli/v2@v2.0.0-alpha.15.0.20200919213536-a7350c8e6799/cli/cmds/build/main_test.go (about) 1 package build 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "io/ioutil" 8 "os" 9 "os/exec" 10 "path/filepath" 11 "runtime" 12 "testing" 13 14 "github.com/gobuffalo/buffalo-cli/v2/cli/cmds/build/buildtest" 15 "github.com/gobuffalo/plugins" 16 "github.com/stretchr/testify/require" 17 ) 18 19 var ( 20 mainFileBeforeBuilder = func(ctx context.Context, root string, args []string) error { 21 err := os.MkdirAll(filepath.Join(root, "cmd", "build"), 0777) 22 if err != nil { 23 return err 24 } 25 26 main := []byte(`package main 27 func main() { 28 29 } 30 `) 31 32 err = ioutil.WriteFile(filepath.Join(root, "cmd", "build", "main.go"), main, 0777) 33 if err != nil { 34 return err 35 } 36 37 err = ioutil.WriteFile(filepath.Join(root, "go.mod"), []byte(`module build`), 0777) 38 return err 39 } 40 41 cleanupAfterBuilder = func(ctx context.Context, root string, args []string, oerr error) error { 42 err := os.RemoveAll(filepath.Join(root, "cmd")) 43 if err != nil { 44 return err 45 } 46 47 err = os.RemoveAll(filepath.Join(root, "bin")) 48 if err != nil { 49 return err 50 } 51 52 err = os.Remove(filepath.Join(root, "go.mod")) 53 if err != nil && !os.IsNotExist(err) { 54 return err 55 } 56 57 err = os.Remove(filepath.Join(root, "go.sum")) 58 if err != nil && !os.IsNotExist(err) { 59 return err 60 } 61 62 return nil 63 } 64 ) 65 66 func Test_Cmd_Main(t *testing.T) { 67 r := require.New(t) 68 69 bc := &Cmd{} 70 bn := filepath.Join("bin", "build") 71 72 if runtime.GOOS == "windows" { 73 bn += ".exe" 74 } 75 76 mainFolder := "." + string(filepath.Separator) + filepath.Join("cmd", "build") 77 78 exp := []string{"go", "build", "-o", bn, mainFolder} 79 80 var act []string 81 fn := func(ctx context.Context, root string, cmd *exec.Cmd) error { 82 act = cmd.Args 83 return nil 84 } 85 bc.WithPlugins(func() []plugins.Plugin { 86 return []plugins.Plugin{ 87 buildtest.GoBuilder(fn), 88 } 89 }) 90 91 var args []string 92 err := bc.Main(context.Background(), ".", args) 93 r.NoError(err) 94 r.Equal(exp, act) 95 } 96 97 func Test_Cmd_Main_SubCommand(t *testing.T) { 98 r := require.New(t) 99 100 bc := &Cmd{} 101 102 var act []string 103 fn := func(ctx context.Context, root string, args []string) error { 104 act = args 105 return nil 106 } 107 108 p := buildtest.Builder(fn) 109 bc.WithPlugins(func() []plugins.Plugin { 110 return []plugins.Plugin{ 111 p, 112 } 113 }) 114 115 args := []string{"builder", "a", "b", "c"} 116 err := bc.Main(context.Background(), ".", args) 117 118 r.NoError(err) 119 r.Equal(args[1:], act) 120 } 121 122 func Test_Cmd_Main_SubCommand_err(t *testing.T) { 123 r := require.New(t) 124 125 bc := &Cmd{} 126 127 exp := fmt.Errorf("boom") 128 fn := func(ctx context.Context, root string, args []string) error { 129 return exp 130 } 131 132 p := buildtest.Builder(fn) 133 bc.WithPlugins(func() []plugins.Plugin { 134 return []plugins.Plugin{ 135 p, 136 } 137 }) 138 139 act := bc.Main(context.Background(), ".", []string{p.PluginName()}) 140 r.Equal(exp, act) 141 } 142 143 func Test_Cmd_Main_BeforeBuilders(t *testing.T) { 144 table := []struct { 145 name string 146 root string 147 exp []string 148 err error 149 }{ 150 {name: "happy", root: ".", exp: []string{"-v"}}, 151 {name: "sad", root: ".", exp: []string{"-v"}, err: fmt.Errorf("boom")}, 152 } 153 154 for _, tt := range table { 155 t.Run(tt.name, func(st *testing.T) { 156 r := require.New(st) 157 158 var act []string 159 fn := func(ctx context.Context, root string, args []string) error { 160 act = args 161 return tt.err 162 } 163 164 plugs := plugins.Plugins{ 165 buildtest.BeforeBuilder(mainFileBeforeBuilder), 166 buildtest.BeforeBuilder(fn), 167 buildtest.AfterBuilder(cleanupAfterBuilder), 168 } 169 170 bc := &Cmd{ 171 pluginsFn: func() []plugins.Plugin { 172 return plugs 173 }, 174 } 175 176 err := bc.Main(context.Background(), tt.root, tt.exp) 177 r.True(errors.Is(err, tt.err)) 178 r.Equal(tt.exp, act) 179 }) 180 } 181 182 } 183 184 func Test_Cmd_Main_AfterBuilders(t *testing.T) { 185 table := []struct { 186 name string 187 root string 188 exp []string 189 err error 190 }{ 191 {name: "happy", root: ".", exp: []string{"-v"}}, 192 {name: "sad", root: ".", exp: []string{"-v"}, err: fmt.Errorf("boom")}, 193 } 194 195 for _, tt := range table { 196 t.Run(tt.name, func(st *testing.T) { 197 r := require.New(st) 198 199 var act []string 200 fn := func(ctx context.Context, root string, args []string, err error) error { 201 act = args 202 return tt.err 203 } 204 205 plugs := plugins.Plugins{ 206 buildtest.BeforeBuilder(mainFileBeforeBuilder), 207 buildtest.AfterBuilder(cleanupAfterBuilder), 208 buildtest.AfterBuilder(fn), 209 } 210 211 bc := &Cmd{ 212 pluginsFn: func() []plugins.Plugin { 213 return plugs 214 }, 215 } 216 217 err := bc.Main(context.Background(), tt.root, tt.exp) 218 if err != nil { 219 r.Contains(err.Error(), tt.err.Error()) 220 } 221 r.Equal(tt.exp, act) 222 }) 223 } 224 225 }