github.com/raarceoml/godog@v0.7.9/builder_test.go (about)

     1  package godog
     2  
     3  import (
     4  	"bytes"
     5  	"go/build"
     6  	"io/ioutil"
     7  	"os"
     8  	"os/exec"
     9  	"path/filepath"
    10  	"testing"
    11  )
    12  
    13  var builderFeatureFile = `Feature: eat godogs
    14    In order to be happy
    15    As a hungry gopher
    16    I need to be able to eat godogs
    17  
    18    Scenario: Eat 5 out of 12
    19      Given there are 12 godogs
    20      When I eat 5
    21      Then there should be 7 remaining
    22  `
    23  
    24  var builderTestFile = `package godogs
    25  
    26  import (
    27  	"fmt"
    28  
    29  	"github.com/DATA-DOG/godog"
    30  )
    31  
    32  func thereAreGodogs(available int) error {
    33  	Godogs = available
    34  	return nil
    35  }
    36  
    37  func iEat(num int) error {
    38  	if Godogs < num {
    39  		return fmt.Errorf("you cannot eat %d godogs, there are %d available", num, Godogs)
    40  	}
    41  	Godogs -= num
    42  	return nil
    43  }
    44  
    45  func thereShouldBeRemaining(remaining int) error {
    46  	if Godogs != remaining {
    47  		return fmt.Errorf("expected %d godogs to be remaining, but there is %d", remaining, Godogs)
    48  	}
    49  	return nil
    50  }
    51  
    52  func FeatureContext(s *godog.Suite) {
    53  	s.Step("^there are (\\d+) godogs$", thereAreGodogs)
    54  	s.Step("^I eat (\\d+)$", iEat)
    55  	s.Step("^there should be (\\d+) remaining$", thereShouldBeRemaining)
    56  
    57  	s.BeforeScenario(func(interface{}) {
    58  		Godogs = 0 // clean the state before every scenario
    59  	})
    60  }
    61  `
    62  
    63  var builderXTestFile = `package godogs_test
    64  
    65  import (
    66  	"fmt"
    67  
    68  	"github.com/DATA-DOG/godog"
    69  	"godogs"
    70  )
    71  
    72  func thereAreGodogs(available int) error {
    73  	godogs.Godogs = available
    74  	return nil
    75  }
    76  
    77  func iEat(num int) error {
    78  	if godogs.Godogs < num {
    79  		return fmt.Errorf("you cannot eat %d godogs, there are %d available", num, godogs.Godogs)
    80  	}
    81  	godogs.Godogs -= num
    82  	return nil
    83  }
    84  
    85  func thereShouldBeRemaining(remaining int) error {
    86  	if godogs.Godogs != remaining {
    87  		return fmt.Errorf("expected %d godogs to be remaining, but there is %d", remaining, godogs.Godogs)
    88  	}
    89  	return nil
    90  }
    91  
    92  func FeatureContext(s *godog.Suite) {
    93  	s.Step("^there are (\\d+) godogs$", thereAreGodogs)
    94  	s.Step("^I eat (\\d+)$", iEat)
    95  	s.Step("^there should be (\\d+) remaining$", thereShouldBeRemaining)
    96  
    97  	s.BeforeScenario(func(interface{}) {
    98  		godogs.Godogs = 0 // clean the state before every scenario
    99  	})
   100  }
   101  `
   102  
   103  var builderMainCodeFile = `package godogs
   104  
   105  // Godogs available to eat
   106  var Godogs int
   107  
   108  func main() {
   109  }
   110  `
   111  
   112  func buildTestPackage(dir string, files map[string]string) error {
   113  	if err := os.MkdirAll(dir, 0755); err != nil {
   114  		return err
   115  	}
   116  
   117  	for name, content := range files {
   118  		if err := ioutil.WriteFile(filepath.Join(dir, name), []byte(content), 0644); err != nil {
   119  			return err
   120  		}
   121  	}
   122  
   123  	return nil
   124  }
   125  
   126  func buildTestCommand(t *testing.T, args ...string) *exec.Cmd {
   127  	bin, err := filepath.Abs("godog.test")
   128  	if err != nil {
   129  		t.Fatal(err)
   130  	}
   131  	if build.Default.GOOS == "windows" {
   132  		bin += ".exe"
   133  	}
   134  	if err = Build(bin); err != nil {
   135  		t.Fatal(err)
   136  	}
   137  
   138  	return exec.Command(bin, args...)
   139  }
   140  
   141  func TestGodogBuildWithSourceNotInGoPath(t *testing.T) {
   142  	dir := filepath.Join(os.TempDir(), "godogs")
   143  	err := buildTestPackage(dir, map[string]string{
   144  		"godogs.feature": builderFeatureFile,
   145  		"godogs.go":      builderMainCodeFile,
   146  		"godogs_test.go": builderTestFile,
   147  	})
   148  	if err != nil {
   149  		os.RemoveAll(dir)
   150  		t.Fatal(err)
   151  	}
   152  	defer os.RemoveAll(dir)
   153  
   154  	prevDir, err := os.Getwd()
   155  	if err != nil {
   156  		t.Fatal(err)
   157  	}
   158  
   159  	if err := os.Chdir(dir); err != nil {
   160  		t.Fatal(err)
   161  	}
   162  	defer os.Chdir(prevDir)
   163  
   164  	cmd := buildTestCommand(t, "godogs.feature")
   165  
   166  	var stdout, stderr bytes.Buffer
   167  	cmd.Stdout = &stdout
   168  	cmd.Stderr = &stderr
   169  
   170  	if err := cmd.Run(); err != nil {
   171  		t.Log(stdout.String())
   172  		t.Log(stderr.String())
   173  		t.Fatal(err)
   174  	}
   175  }
   176  
   177  func TestGodogBuildWithoutSourceNotInGoPath(t *testing.T) {
   178  	dir := filepath.Join(os.TempDir(), "godogs")
   179  	err := buildTestPackage(dir, map[string]string{
   180  		"godogs.feature": builderFeatureFile,
   181  	})
   182  	if err != nil {
   183  		os.RemoveAll(dir)
   184  		t.Fatal(err)
   185  	}
   186  	defer os.RemoveAll(dir)
   187  
   188  	prevDir, err := os.Getwd()
   189  	if err != nil {
   190  		t.Fatal(err)
   191  	}
   192  
   193  	if err := os.Chdir(dir); err != nil {
   194  		t.Fatal(err)
   195  	}
   196  	defer os.Chdir(prevDir)
   197  
   198  	cmd := buildTestCommand(t, "godogs.feature")
   199  
   200  	var stdout, stderr bytes.Buffer
   201  	cmd.Stdout = &stdout
   202  	cmd.Stderr = &stderr
   203  
   204  	if err := cmd.Run(); err != nil {
   205  		t.Log(stdout.String())
   206  		t.Log(stderr.String())
   207  		t.Fatal(err)
   208  	}
   209  }
   210  
   211  func TestGodogBuildWithoutTestSourceNotInGoPath(t *testing.T) {
   212  	dir := filepath.Join(os.TempDir(), "godogs")
   213  	err := buildTestPackage(dir, map[string]string{
   214  		"godogs.feature": builderFeatureFile,
   215  		"godogs.go":      builderMainCodeFile,
   216  	})
   217  	if err != nil {
   218  		os.RemoveAll(dir)
   219  		t.Fatal(err)
   220  	}
   221  	defer os.RemoveAll(dir)
   222  
   223  	prevDir, err := os.Getwd()
   224  	if err != nil {
   225  		t.Fatal(err)
   226  	}
   227  
   228  	if err := os.Chdir(dir); err != nil {
   229  		t.Fatal(err)
   230  	}
   231  	defer os.Chdir(prevDir)
   232  
   233  	cmd := buildTestCommand(t, "godogs.feature")
   234  
   235  	var stdout, stderr bytes.Buffer
   236  	cmd.Stdout = &stdout
   237  	cmd.Stderr = &stderr
   238  
   239  	if err := cmd.Run(); err != nil {
   240  		t.Log(stdout.String())
   241  		t.Log(stderr.String())
   242  		t.Fatal(err)
   243  	}
   244  }
   245  
   246  func TestGodogBuildWithinGopath(t *testing.T) {
   247  	gopath := filepath.Join(os.TempDir(), "_gp")
   248  	dir := filepath.Join(gopath, "src", "godogs")
   249  	err := buildTestPackage(dir, map[string]string{
   250  		"godogs.feature": builderFeatureFile,
   251  		"godogs.go":      builderMainCodeFile,
   252  		"godogs_test.go": builderTestFile,
   253  	})
   254  	if err != nil {
   255  		os.RemoveAll(gopath)
   256  		t.Fatal(err)
   257  	}
   258  	defer os.RemoveAll(gopath)
   259  
   260  	pkg := filepath.Join(gopath, "src", "github.com", "DATA-DOG")
   261  	if err := os.MkdirAll(pkg, 0755); err != nil {
   262  		t.Fatal(err)
   263  	}
   264  
   265  	prevDir, err := os.Getwd()
   266  	if err != nil {
   267  		t.Fatal(err)
   268  	}
   269  
   270  	// symlink godog package
   271  	if err := os.Symlink(prevDir, filepath.Join(pkg, "godog")); err != nil {
   272  		t.Fatal(err)
   273  	}
   274  
   275  	if err := os.Chdir(dir); err != nil {
   276  		t.Fatal(err)
   277  	}
   278  	defer os.Chdir(prevDir)
   279  
   280  	cmd := buildTestCommand(t, "godogs.feature")
   281  
   282  	var stdout, stderr bytes.Buffer
   283  	cmd.Stdout = &stdout
   284  	cmd.Stderr = &stderr
   285  	cmd.Env = os.Environ()
   286  	cmd.Env = append(cmd.Env, "GOPATH="+gopath)
   287  
   288  	if err := cmd.Run(); err != nil {
   289  		t.Log(stdout.String())
   290  		t.Log(stderr.String())
   291  		t.Fatal(err)
   292  	}
   293  }
   294  
   295  func TestGodogBuildWithVendoredGodog(t *testing.T) {
   296  	gopath := filepath.Join(os.TempDir(), "_gp")
   297  	dir := filepath.Join(gopath, "src", "godogs")
   298  	err := buildTestPackage(dir, map[string]string{
   299  		"godogs.feature": builderFeatureFile,
   300  		"godogs.go":      builderMainCodeFile,
   301  		"godogs_test.go": builderTestFile,
   302  	})
   303  	if err != nil {
   304  		os.RemoveAll(gopath)
   305  		t.Fatal(err)
   306  	}
   307  	defer os.RemoveAll(gopath)
   308  
   309  	pkg := filepath.Join(dir, "vendor", "github.com", "DATA-DOG")
   310  	if err := os.MkdirAll(pkg, 0755); err != nil {
   311  		t.Fatal(err)
   312  	}
   313  
   314  	prevDir, err := os.Getwd()
   315  	if err != nil {
   316  		t.Fatal(err)
   317  	}
   318  
   319  	// symlink godog package
   320  	if err := os.Symlink(prevDir, filepath.Join(pkg, "godog")); err != nil {
   321  		t.Fatal(err)
   322  	}
   323  
   324  	if err := os.Chdir(dir); err != nil {
   325  		t.Fatal(err)
   326  	}
   327  	defer os.Chdir(prevDir)
   328  
   329  	cmd := buildTestCommand(t, "godogs.feature")
   330  
   331  	var stdout, stderr bytes.Buffer
   332  	cmd.Stdout = &stdout
   333  	cmd.Stderr = &stderr
   334  	cmd.Env = os.Environ()
   335  	cmd.Env = append(cmd.Env, "GOPATH="+gopath)
   336  
   337  	if err := cmd.Run(); err != nil {
   338  		t.Log(stdout.String())
   339  		t.Log(stderr.String())
   340  		t.Fatal(err)
   341  	}
   342  }
   343  
   344  func TestBuildTestRunner(t *testing.T) {
   345  	bin := filepath.Join(os.TempDir(), "godog.test")
   346  	if err := Build(bin); err != nil {
   347  		t.Fatalf("failed to build godog test binary: %v", err)
   348  	}
   349  	os.Remove(bin)
   350  }
   351  
   352  func TestBuildTestRunnerWithoutGoFiles(t *testing.T) {
   353  	bin := filepath.Join(os.TempDir(), "godog.test")
   354  	pwd, err := os.Getwd()
   355  	if err != nil {
   356  		t.Fatalf("failed to get working directory: %v", err)
   357  	}
   358  
   359  	wd := filepath.Join(pwd, "features")
   360  	if err := os.Chdir(wd); err != nil {
   361  		t.Fatalf("failed to change working directory: %v", err)
   362  	}
   363  
   364  	defer func() {
   365  		_ = os.Chdir(pwd) // get back to current dir
   366  	}()
   367  
   368  	if err := Build(bin); err != nil {
   369  		t.Fatalf("failed to build godog test binary: %v", err)
   370  	}
   371  	os.Remove(bin)
   372  }