github.com/jasonish/buffalo@v0.8.2-0.20170413145823-bacbdd415f1b/buffalo/cmd/test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"os"
     7  	"os/exec"
     8  	"regexp"
     9  	"strings"
    10  
    11  	"github.com/markbates/pop"
    12  	"github.com/spf13/cobra"
    13  )
    14  
    15  const vendorPattern = "/vendor/"
    16  
    17  var vendorRegex *regexp.Regexp
    18  
    19  func init() {
    20  	RootCmd.AddCommand(testCmd)
    21  	vendorRegex = regexp.MustCompile(vendorPattern)
    22  }
    23  
    24  var testCmd = &cobra.Command{
    25  	Use:                "test",
    26  	Short:              "Runs the tests for your Buffalo app",
    27  	DisableFlagParsing: true,
    28  	RunE: func(c *cobra.Command, args []string) error {
    29  		os.Setenv("GO_ENV", "test")
    30  		if _, err := os.Stat("database.yml"); err == nil {
    31  			// there's a database
    32  			test, err := pop.Connect("test")
    33  			if err != nil {
    34  				return err
    35  			}
    36  
    37  			// drop the test db:
    38  			test.Dialect.DropDB()
    39  
    40  			// create the test db:
    41  			err = test.Dialect.CreateDB()
    42  			if err != nil {
    43  				return err
    44  			}
    45  
    46  			dev, err := pop.Connect("development")
    47  			if err != nil {
    48  				return err
    49  			}
    50  			schema := &bytes.Buffer{}
    51  			err = dev.Dialect.DumpSchema(schema)
    52  			if err != nil {
    53  				return err
    54  			}
    55  
    56  			err = test.Dialect.LoadSchema(schema)
    57  			if err != nil {
    58  				return err
    59  			}
    60  		}
    61  		return testRunner(args)
    62  	},
    63  }
    64  
    65  func testRunner(args []string) error {
    66  	cmd := exec.Command("go", "test", "-p", "1")
    67  	cmd.Args = append(cmd.Args, args...)
    68  	cmd.Stdin = os.Stdin
    69  	cmd.Stdout = os.Stdout
    70  	cmd.Stderr = os.Stderr
    71  	runFlag := false
    72  	for _, a := range cmd.Args {
    73  		if a == "-run" {
    74  			runFlag = true
    75  		}
    76  	}
    77  	if !runFlag {
    78  		out, err := exec.Command("go", "list", "./...").Output()
    79  		if err != nil {
    80  			return err
    81  		}
    82  		pkgs := bytes.Split(bytes.TrimSpace(out), []byte("\n"))
    83  		for _, p := range pkgs {
    84  			if !vendorRegex.Match(p) {
    85  				cmd.Args = append(cmd.Args, string(p))
    86  			}
    87  		}
    88  	}
    89  	fmt.Println(strings.Join(cmd.Args, " "))
    90  	return cmd.Run()
    91  }