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  }