From 0d20a5c9aae8b7792a51b5d8436311a47e2c88c1 Mon Sep 17 00:00:00 2001 From: Direside Date: Fri, 1 Nov 2019 11:45:10 -0700 Subject: [PATCH 1/2] Fix CI generation code. Added integration test to cover usecase. --- internal/generate/ci/generate.go | 8 +- templates/ci/circleci.tmpl | 3 +- tests/integration/ci/ci_test.go | 130 ++++++++++++++++++ .../ci/expected/.circleci/config.yml | 29 ++++ tests/test_data/ci/expected/.travis.yml | 7 + tests/test_data/ci/expected/Jenkinsfile | 29 ++++ 6 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 tests/integration/ci/ci_test.go create mode 100644 tests/test_data/ci/expected/.circleci/config.yml create mode 100644 tests/test_data/ci/expected/.travis.yml create mode 100644 tests/test_data/ci/expected/Jenkinsfile diff --git a/internal/generate/ci/generate.go b/internal/generate/ci/generate.go index 68855037a..2860b8ab1 100644 --- a/internal/generate/ci/generate.go +++ b/internal/generate/ci/generate.go @@ -3,6 +3,7 @@ package ci import ( "fmt" "sync" + "text/template" "github.com/commitdev/commit0/internal/config" "github.com/commitdev/commit0/internal/templator" @@ -47,22 +48,25 @@ func Generate(templator *templator.CITemplator, config *config.Commit0Config, ba var ciConfigPath string var ciFilename string + var ciTemp *template.Template switch config.CI.System { case "jenkins": ciConfigPath = basePath ciFilename = "Jenkinsfile" + ciTemp = templator.Jenkins case "circleci": ciConfigPath = fmt.Sprintf("%s/%s", basePath, ".circleci/") ciFilename = "config.yml" + ciTemp = templator.CircleCI case "travisci": ciConfigPath = basePath ciFilename = ".travis.yml" + ciTemp = templator.TravisCI default: return &CIGenerationError{"Unsupported CI System", config} } - - util.TemplateFileIfDoesNotExist(ciConfigPath, ciFilename, templator.TravisCI, wg, config) + util.TemplateFileIfDoesNotExist(ciConfigPath, ciFilename, ciTemp, wg, config) return nil } diff --git a/templates/ci/circleci.tmpl b/templates/ci/circleci.tmpl index 79a4cd809..67b45f2f0 100644 --- a/templates/ci/circleci.tmpl +++ b/templates/ci/circleci.tmpl @@ -12,12 +12,13 @@ jobs: test: docker: + - image: {{ .CI.BuildImage }} steps: - checkout - run: name: Test command: | - {{ .CI.BuildCommand }} + {{ .CI.TestCommand }} workflow: diff --git a/tests/integration/ci/ci_test.go b/tests/integration/ci/ci_test.go new file mode 100644 index 000000000..84af67bd2 --- /dev/null +++ b/tests/integration/ci/ci_test.go @@ -0,0 +1,130 @@ +package ci_test + +import ( + "bytes" + "io/ioutil" + "os" + "sync" + "testing" + + "github.com/commitdev/commit0/internal/config" + "github.com/commitdev/commit0/internal/generate/ci" + "github.com/commitdev/commit0/internal/templator" + "github.com/gobuffalo/packr/v2" +) + +var testData = "../../test_data/ci/" + +// setupTeardown removes all the generated test files before and after +// the test runs to ensure clean data. +func setupTeardown(t *testing.T) func(t *testing.T) { + os.RemoveAll("../../test_data/ci/actual") + return func(t *testing.T) { + os.RemoveAll("../../test_data/ci/actual") + } +} + +func TestGenerateJenkins(t *testing.T) { + teardown := setupTeardown(t) + defer teardown(t) + + templates := packr.New("templates", "../../../templates") + testTemplator := templator.NewTemplator(templates) + + var waitgroup *sync.WaitGroup + + testConf := &config.Commit0Config{ + Language: "go", + CI: config.CI{ + System: "jenkins", + }, + } + + err := ci.Generate(testTemplator.CI, testConf, testData+"/actual", waitgroup) + if err != nil { + t.Errorf("Error when executing test. %s", err) + } + + actual, err := ioutil.ReadFile(testData + "actual/Jenkinsfile") + if err != nil { + t.Errorf("Error reading created file: %s", err.Error()) + } + expected, err := ioutil.ReadFile(testData + "/expected/Jenkinsfile") + if err != nil { + t.Errorf("Error reading created file: %s", err.Error()) + } + + if !bytes.Equal(expected, actual) { + t.Errorf("want:\n%s\n\n, got:\n%s\n\n", string(expected), string(actual)) + } +} + +func TestGenerateCircleCI(t *testing.T) { + teardown := setupTeardown(t) + defer teardown(t) + + templates := packr.New("templates", "../../../templates") + testTemplator := templator.NewTemplator(templates) + + var waitgroup *sync.WaitGroup + + testConf := &config.Commit0Config{ + Language: "go", + CI: config.CI{ + System: "circleci", + }, + } + + err := ci.Generate(testTemplator.CI, testConf, testData+"/actual", waitgroup) + if err != nil { + t.Errorf("Error when executing test. %s", err) + } + + actual, err := ioutil.ReadFile(testData + "actual/.circleci/config.yml") + if err != nil { + t.Errorf("Error reading created file: %s", err.Error()) + } + expected, err := ioutil.ReadFile(testData + "/expected/.circleci/config.yml") + if err != nil { + t.Errorf("Error reading created file: %s", err.Error()) + } + + if !bytes.Equal(expected, actual) { + t.Errorf("want:\n%s\n\ngot:\n%s\n\n", string(expected), string(actual)) + } +} + +func TestGenerateTravisCI(t *testing.T) { + teardown := setupTeardown(t) + defer teardown(t) + + templates := packr.New("templates", "../../../templates") + testTemplator := templator.NewTemplator(templates) + + var waitgroup *sync.WaitGroup + + testConf := &config.Commit0Config{ + Language: "go", + CI: config.CI{ + System: "travisci", + }, + } + + err := ci.Generate(testTemplator.CI, testConf, testData+"/actual", waitgroup) + if err != nil { + t.Errorf("Error when executing test. %s", err) + } + + actual, err := ioutil.ReadFile(testData + "actual/.travis.yml") + if err != nil { + t.Errorf("Error reading created file: %s", err.Error()) + } + expected, err := ioutil.ReadFile(testData + "/expected/.travis.yml") + if err != nil { + t.Errorf("Error reading created file: %s", err.Error()) + } + + if !bytes.Equal(expected, actual) { + t.Errorf("want:\n%s\n\n, got:\n%s\n\n", string(expected), string(actual)) + } +} diff --git a/tests/test_data/ci/expected/.circleci/config.yml b/tests/test_data/ci/expected/.circleci/config.yml new file mode 100644 index 000000000..6b928dd14 --- /dev/null +++ b/tests/test_data/ci/expected/.circleci/config.yml @@ -0,0 +1,29 @@ +version: 2.1 +jobs: + build: + docker: + - image: golang/golang:1.12 + steps: + - checkout + - run: + name: Build + command: | + make build + + test: + docker: + - image: golang/golang:1.12 + steps: + - checkout + - run: + name: Test + command: | + make test + + +workflow: + version: 2.1 + build_and_test: + jobs: + - build + - test \ No newline at end of file diff --git a/tests/test_data/ci/expected/.travis.yml b/tests/test_data/ci/expected/.travis.yml new file mode 100644 index 000000000..352ea8297 --- /dev/null +++ b/tests/test_data/ci/expected/.travis.yml @@ -0,0 +1,7 @@ +language: go +go: +- 1.12 + +scripts: +- make build +- make test \ No newline at end of file diff --git a/tests/test_data/ci/expected/Jenkinsfile b/tests/test_data/ci/expected/Jenkinsfile new file mode 100644 index 000000000..1b815b99d --- /dev/null +++ b/tests/test_data/ci/expected/Jenkinsfile @@ -0,0 +1,29 @@ +pipeline { + agent none + stages { + stage('Build and Test') { + parallel { + stage('Build') { + agent { + docker { + image 'golang/golang:1.12' + } + } + steps { + sh 'make build' + } + } + stage('Test') { + agent { + docker { + image 'golang/golang:1.12' + } + } + steps { + sh 'make test' + } + } + } + } + } +} \ No newline at end of file From f900d82c5ff9998af6a8c05e27e24316c66bb47d Mon Sep 17 00:00:00 2001 From: Direside Date: Fri, 1 Nov 2019 12:01:48 -0700 Subject: [PATCH 2/2] Added waitgroup to tests to wait for files to be created. --- tests/integration/ci/ci_test.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/integration/ci/ci_test.go b/tests/integration/ci/ci_test.go index 84af67bd2..e063de1bd 100644 --- a/tests/integration/ci/ci_test.go +++ b/tests/integration/ci/ci_test.go @@ -31,7 +31,7 @@ func TestGenerateJenkins(t *testing.T) { templates := packr.New("templates", "../../../templates") testTemplator := templator.NewTemplator(templates) - var waitgroup *sync.WaitGroup + var waitgroup sync.WaitGroup testConf := &config.Commit0Config{ Language: "go", @@ -40,10 +40,11 @@ func TestGenerateJenkins(t *testing.T) { }, } - err := ci.Generate(testTemplator.CI, testConf, testData+"/actual", waitgroup) + err := ci.Generate(testTemplator.CI, testConf, testData+"/actual", &waitgroup) if err != nil { t.Errorf("Error when executing test. %s", err) } + waitgroup.Wait() actual, err := ioutil.ReadFile(testData + "actual/Jenkinsfile") if err != nil { @@ -66,7 +67,7 @@ func TestGenerateCircleCI(t *testing.T) { templates := packr.New("templates", "../../../templates") testTemplator := templator.NewTemplator(templates) - var waitgroup *sync.WaitGroup + var waitgroup sync.WaitGroup testConf := &config.Commit0Config{ Language: "go", @@ -75,10 +76,11 @@ func TestGenerateCircleCI(t *testing.T) { }, } - err := ci.Generate(testTemplator.CI, testConf, testData+"/actual", waitgroup) + err := ci.Generate(testTemplator.CI, testConf, testData+"/actual", &waitgroup) if err != nil { t.Errorf("Error when executing test. %s", err) } + waitgroup.Wait() actual, err := ioutil.ReadFile(testData + "actual/.circleci/config.yml") if err != nil { @@ -101,7 +103,7 @@ func TestGenerateTravisCI(t *testing.T) { templates := packr.New("templates", "../../../templates") testTemplator := templator.NewTemplator(templates) - var waitgroup *sync.WaitGroup + var waitgroup sync.WaitGroup testConf := &config.Commit0Config{ Language: "go", @@ -110,10 +112,11 @@ func TestGenerateTravisCI(t *testing.T) { }, } - err := ci.Generate(testTemplator.CI, testConf, testData+"/actual", waitgroup) + err := ci.Generate(testTemplator.CI, testConf, testData+"/actual", &waitgroup) if err != nil { t.Errorf("Error when executing test. %s", err) } + waitgroup.Wait() actual, err := ioutil.ReadFile(testData + "actual/.travis.yml") if err != nil {