From 77492d08fc104370bd5f84b641e1f255cff2fa5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlado=20Paji=C4=87?= Date: Thu, 21 Nov 2024 22:18:38 +0100 Subject: [PATCH] example diff --- .github/.testcoverage.yml | 1 - pkg/testcoverage/badge_test.go | 173 ------------- pkg/testcoverage/check_test.go | 440 -------------------------------- pkg/testcoverage/config_test.go | 242 ------------------ 4 files changed, 856 deletions(-) delete mode 100644 pkg/testcoverage/badge_test.go delete mode 100644 pkg/testcoverage/check_test.go delete mode 100644 pkg/testcoverage/config_test.go diff --git a/.github/.testcoverage.yml b/.github/.testcoverage.yml index e6fe53f4..d4029e8c 100644 --- a/.github/.testcoverage.yml +++ b/.github/.testcoverage.yml @@ -3,7 +3,6 @@ profile: '' # set via github action local-prefix: github.com/vladopajic/go-test-coverage/v2 threshold: - file: 100 total: 100 exclude: paths: diff --git a/pkg/testcoverage/badge_test.go b/pkg/testcoverage/badge_test.go deleted file mode 100644 index 230fc9e6..00000000 --- a/pkg/testcoverage/badge_test.go +++ /dev/null @@ -1,173 +0,0 @@ -package testcoverage_test - -import ( - "bytes" - "io" - "os" - "testing" - - "github.com/stretchr/testify/assert" - - . "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage" - "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage/badge" - "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage/badgestorer" -) - -func Test_GenerateAndSaveBadge_NoAction(t *testing.T) { - t.Parallel() - - // Empty config - no action - err := GenerateAndSaveBadge(nil, Config{}, 100) - assert.NoError(t, err) -} - -func Test_GenerateAndSaveBadge_SaveToFile(t *testing.T) { - t.Parallel() - - if testing.Short() { - return - } - - const coverage = 100 - - testFile := t.TempDir() + "/badge.svg" - buf := &bytes.Buffer{} - err := GenerateAndSaveBadge(buf, Config{ - Badge: Badge{ - FileName: testFile, - }, - }, coverage) - assert.NoError(t, err) - assert.Contains(t, buf.String(), "Badge saved to file") - - contentBytes, err := os.ReadFile(testFile) - assert.NoError(t, err) - assert.NotEmpty(t, contentBytes) - - badge, err := badge.Generate(coverage) - assert.NoError(t, err) - assert.Equal(t, badge, contentBytes) -} - -func Test_StoreBadge(t *testing.T) { - t.Parallel() - - badge, err := badge.Generate(100) - assert.NoError(t, err) - - someError := io.ErrShortBuffer - - // badge saved to file - buf := &bytes.Buffer{} - config := Config{Badge: Badge{ - FileName: t.TempDir() + "/badge.svg", - }} - sf := StorerFactories{File: fileFact(newStorer(true, nil))} - err = StoreBadge(buf, sf, config, badge) - assert.NoError(t, err) - assert.Contains(t, buf.String(), "Badge saved to file") - - // failed to save badge - buf = &bytes.Buffer{} - sf = StorerFactories{File: fileFact(newStorer(false, someError))} - err = StoreBadge(buf, sf, config, badge) - assert.Error(t, err) - assert.Empty(t, buf.String()) - - // badge saved to cdn - buf = &bytes.Buffer{} - config = Config{Badge: Badge{ - CDN: badgestorer.CDN{Secret: `🔑`}, - }} - sf = StorerFactories{CDN: cdnFact(newStorer(true, nil))} - err = StoreBadge(buf, sf, config, badge) - assert.NoError(t, err) - assert.Contains(t, buf.String(), "Badge with updated coverage uploaded to CDN") - - // badge saved to cdn (no change) - buf = &bytes.Buffer{} - sf = StorerFactories{CDN: cdnFact(newStorer(false, nil))} - err = StoreBadge(buf, sf, config, badge) - assert.NoError(t, err) - assert.Contains(t, buf.String(), "Badge with same coverage already uploaded to CDN") - - // failed to save cdn - buf = &bytes.Buffer{} - sf = StorerFactories{CDN: cdnFact(newStorer(false, someError))} - err = StoreBadge(buf, sf, config, badge) - assert.Error(t, err) - assert.Empty(t, buf.String()) - - // badge saved to git - buf = &bytes.Buffer{} - config = Config{Badge: Badge{ - Git: badgestorer.Git{Token: `🔑`}, - }} - sf = StorerFactories{Git: gitFact(newStorer(true, nil))} - err = StoreBadge(buf, sf, config, badge) - assert.NoError(t, err) - assert.Contains(t, buf.String(), "Badge with updated coverage pushed") - - // badge saved to git (no change) - buf = &bytes.Buffer{} - sf = StorerFactories{Git: gitFact(newStorer(false, nil))} - err = StoreBadge(buf, sf, config, badge) - assert.NoError(t, err) - assert.Contains(t, buf.String(), "Badge with same coverage already pushed") - - // failed to save git - buf = &bytes.Buffer{} - sf = StorerFactories{Git: gitFact(newStorer(false, someError))} - err = StoreBadge(buf, sf, config, badge) - assert.Error(t, err) - assert.Empty(t, buf.String()) - - // save badge to all methods - buf = &bytes.Buffer{} - config = Config{Badge: Badge{ - FileName: t.TempDir() + "/badge.svg", - Git: badgestorer.Git{Token: `🔑`}, - CDN: badgestorer.CDN{Secret: `🔑`}, - }} - sf = StorerFactories{ - File: fileFact(newStorer(true, nil)), - Git: gitFact(newStorer(true, nil)), - CDN: cdnFact(newStorer(true, nil)), - } - err = StoreBadge(buf, sf, config, badge) - assert.NoError(t, err) - assert.Contains(t, buf.String(), "Badge saved to file") - assert.Contains(t, buf.String(), "Badge with updated coverage pushed") - assert.Contains(t, buf.String(), "Badge with updated coverage uploaded to CDN") -} - -func fileFact(s badgestorer.Storer) func(string) badgestorer.Storer { - return func(_ string) badgestorer.Storer { - return s - } -} - -func cdnFact(s badgestorer.Storer) func(badgestorer.CDN) badgestorer.Storer { - return func(_ badgestorer.CDN) badgestorer.Storer { - return s - } -} - -func gitFact(s badgestorer.Storer) func(badgestorer.Git) badgestorer.Storer { - return func(_ badgestorer.Git) badgestorer.Storer { - return s - } -} - -func newStorer(updated bool, err error) badgestorer.Storer { - return mockStorer{updated, err} -} - -type mockStorer struct { - updated bool - err error -} - -func (s mockStorer) Store([]byte) (bool, error) { - return s.updated, s.err -} diff --git a/pkg/testcoverage/check_test.go b/pkg/testcoverage/check_test.go deleted file mode 100644 index c331a4c2..00000000 --- a/pkg/testcoverage/check_test.go +++ /dev/null @@ -1,440 +0,0 @@ -package testcoverage_test - -import ( - "bytes" - "os" - "runtime" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - - . "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage" - "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage/coverage" - "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage/path" - "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage/testdata" -) - -const ( - testdataDir = "testdata/" - profileOK = testdataDir + testdata.ProfileOK - profileNOK = testdataDir + testdata.ProfileNOK - breakdownOK = testdataDir + testdata.BreakdownOK - breakdownNOK = testdataDir + testdata.BreakdownNOK -) - -func TestCheck(t *testing.T) { - t.Parallel() - - if testing.Short() { - return - } - - const prefix = "github.com/vladopajic/go-test-coverage/v2" - - t.Run("no profile", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - pass := Check(buf, Config{}) - assert.False(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 0, 0) - assertNoUncoveredLinesInfo(t, buf.String()) - }) - - t.Run("invalid profile", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{Profile: profileNOK, Threshold: Threshold{Total: 65}} - pass := Check(buf, cfg) - assert.False(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 0, 0) - assertNoUncoveredLinesInfo(t, buf.String()) - }) - - t.Run("valid profile - pass", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{Profile: profileOK, Threshold: Threshold{Total: 65}} - pass := Check(buf, cfg) - assert.True(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 1, 0) - assertNoUncoveredLinesInfo(t, buf.String()) - }) - - t.Run("valid profile with exclude - pass", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{ - Profile: profileOK, - Threshold: Threshold{Total: 100}, - Exclude: Exclude{ - Paths: []string{`cdn\.go$`, `github\.go$`, `cover\.go$`, `check\.go$`, `path\.go$`}, - }, - } - pass := Check(buf, cfg) - assert.True(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 1, 0) - assertNoUncoveredLinesInfo(t, buf.String()) - }) - - t.Run("valid profile - fail", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{Profile: profileOK, Threshold: Threshold{Total: 100}} - pass := Check(buf, cfg) - assert.False(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 0, 1) - assertHasUncoveredLinesInfo(t, buf.String(), []string{ - "pkg/testcoverage/badgestorer/cdn.go", - "pkg/testcoverage/badgestorer/github.go", - "pkg/testcoverage/check.go", - "pkg/testcoverage/coverage/cover.go", - }) - }) - - t.Run("valid profile - pass with prefix", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - - cfg := Config{Profile: profileOK, LocalPrefix: prefix, Threshold: Threshold{Total: 65}} - pass := Check(buf, cfg) - assert.True(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 1, 0) - assertNoFileNames(t, buf.String(), prefix) - assertNoUncoveredLinesInfo(t, buf.String()) - }) - - t.Run("valid profile - pass after override", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{ - Profile: profileOK, - Threshold: Threshold{File: 100}, - Override: []Override{{Threshold: 10, Path: "^pkg"}}, - } - pass := Check(buf, cfg) - assert.True(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 2, 0) - assertNoFileNames(t, buf.String(), prefix) - assertNoUncoveredLinesInfo(t, buf.String()) - }) - - t.Run("valid profile - fail after override", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{ - Profile: profileOK, - Threshold: Threshold{File: 10}, - Override: []Override{{Threshold: 100, Path: "^pkg"}}, - } - pass := Check(buf, cfg) - assert.False(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 0, 2) - assertHasUncoveredLinesInfo(t, buf.String(), []string{ - "pkg/testcoverage/badgestorer/cdn.go", - "pkg/testcoverage/badgestorer/github.go", - "pkg/testcoverage/check.go", - "pkg/testcoverage/coverage/cover.go", - }) - }) - - t.Run("valid profile - pass after file override", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{ - Profile: profileOK, - Threshold: Threshold{File: 70}, - Override: []Override{{Threshold: 60, Path: "pkg/testcoverage/badgestorer/github.go"}}, - } - pass := Check(buf, cfg) - assert.True(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 1, 0) - assertNoFileNames(t, buf.String(), prefix) - assertNoUncoveredLinesInfo(t, buf.String()) - }) - - t.Run("valid profile - fail after file override", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{ - Profile: profileOK, - Threshold: Threshold{File: 70}, - Override: []Override{{Threshold: 80, Path: "pkg/testcoverage/badgestorer/github.go"}}, - } - pass := Check(buf, cfg) - assert.False(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 0, 1) - assert.GreaterOrEqual(t, strings.Count(buf.String(), prefix), 0) - assertHasUncoveredLinesInfo(t, buf.String(), []string{ - "pkg/testcoverage/badgestorer/cdn.go", - "pkg/testcoverage/badgestorer/github.go", - "pkg/testcoverage/check.go", - "pkg/testcoverage/coverage/cover.go", - }) - }) - - t.Run("valid profile - fail couldn't save badge", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{ - Profile: profileOK, - Badge: Badge{ - FileName: t.TempDir(), // should failed because this is dir - }, - } - pass := Check(buf, cfg) - assert.False(t, pass) - assertFailedToSaveBadge(t, buf.String()) - }) - - t.Run("valid profile - fail invalid breakdown file", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{ - Profile: profileOK, - BreakdownFileName: t.TempDir(), // should failed because this is dir - } - pass := Check(buf, cfg) - assert.False(t, pass) - assert.Contains(t, buf.String(), "failed to save coverage breakdown") - }) - - t.Run("valid profile - valid breakdown file", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{ - Profile: profileOK, - BreakdownFileName: t.TempDir() + "/breakdown.testcoverage", - } - pass := Check(buf, cfg) - assert.True(t, pass) - - contentBytes, err := os.ReadFile(cfg.BreakdownFileName) - assert.NoError(t, err) - assert.NotEmpty(t, contentBytes) - - stats, err := GenerateCoverageStats(cfg) - assert.NoError(t, err) - assert.Equal(t, coverage.StatsSerialize(stats), contentBytes) - }) - - t.Run("valid profile - invalid base breakdown file", func(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - cfg := Config{ - Profile: profileOK, - Diff: Diff{ - BaseBreakdownFileName: t.TempDir(), // should failed because this is dir - }, - } - pass := Check(buf, cfg) - assert.False(t, pass) - assert.Contains(t, buf.String(), "failed to load base coverage breakdown") - }) -} - -// must not be parallel because it uses env -func TestCheckNoParallel(t *testing.T) { - if testing.Short() { - return - } - - t.Run("ok fail; no github output file", func(t *testing.T) { - t.Setenv(GaOutputFileEnv, "") - - buf := &bytes.Buffer{} - cfg := Config{Profile: profileOK, GithubActionOutput: true, Threshold: Threshold{Total: 100}} - pass := Check(buf, cfg) - assert.False(t, pass) - }) - - t.Run("ok pass; with github output file", func(t *testing.T) { - testFile := t.TempDir() + "/ga.output" - t.Setenv(GaOutputFileEnv, testFile) - - buf := &bytes.Buffer{} - cfg := Config{Profile: profileOK, GithubActionOutput: true, Threshold: Threshold{Total: 10}} - pass := Check(buf, cfg) - assert.True(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 0) - assertHumanReport(t, buf.String(), 1, 0) - assertGithubOutputValues(t, testFile) - assertNoUncoveredLinesInfo(t, buf.String()) - }) - - t.Run("ok fail; with github output file", func(t *testing.T) { - testFile := t.TempDir() + "/ga.output" - t.Setenv(GaOutputFileEnv, testFile) - - buf := &bytes.Buffer{} - cfg := Config{Profile: profileOK, GithubActionOutput: true, Threshold: Threshold{Total: 100}} - pass := Check(buf, cfg) - assert.False(t, pass) - assertGithubActionErrorsCount(t, buf.String(), 1) - assertHumanReport(t, buf.String(), 0, 1) - assertGithubOutputValues(t, testFile) - assertHasUncoveredLinesInfo(t, buf.String(), []string{}) - }) -} - -func Test_Analyze(t *testing.T) { - t.Parallel() - - prefix := "organization.org/" + randName() - - t.Run("nil coverage stats", func(t *testing.T) { - t.Parallel() - - result := Analyze(Config{}, nil, nil) - assert.Empty(t, result.FilesBelowThreshold) - assert.Empty(t, result.PackagesBelowThreshold) - assert.Equal(t, 0, result.TotalStats.CoveredPercentage()) - }) - - t.Run("total coverage above threshold", func(t *testing.T) { - t.Parallel() - - result := Analyze( - Config{LocalPrefix: prefix, Threshold: Threshold{Total: 10}}, - randStats(prefix, 10, 100), - nil, - ) - assert.True(t, result.Pass()) - assertPrefix(t, result, prefix, false) - - result = Analyze( - Config{Threshold: Threshold{Total: 10}}, - randStats(prefix, 10, 100), - nil, - ) - assert.True(t, result.Pass()) - assertPrefix(t, result, prefix, true) - }) - - t.Run("total coverage below threshold", func(t *testing.T) { - t.Parallel() - - result := Analyze( - Config{Threshold: Threshold{Total: 10}}, - randStats(prefix, 0, 9), - nil, - ) - assert.False(t, result.Pass()) - }) - - t.Run("files coverage above threshold", func(t *testing.T) { - t.Parallel() - - result := Analyze( - Config{LocalPrefix: prefix, Threshold: Threshold{File: 10}}, - randStats(prefix, 10, 100), - nil, - ) - assert.True(t, result.Pass()) - assertPrefix(t, result, prefix, false) - }) - - t.Run("files coverage below threshold", func(t *testing.T) { - t.Parallel() - - result := Analyze( - Config{Threshold: Threshold{File: 10}}, - mergeStats( - randStats(prefix, 0, 9), - randStats(prefix, 10, 100), - ), - nil, - ) - assert.NotEmpty(t, result.FilesBelowThreshold) - assert.Empty(t, result.PackagesBelowThreshold) - assert.False(t, result.Pass()) - assertPrefix(t, result, prefix, true) - }) - - t.Run("package coverage above threshold", func(t *testing.T) { - t.Parallel() - - result := Analyze( - Config{LocalPrefix: prefix, Threshold: Threshold{Package: 10}}, - randStats(prefix, 10, 100), - nil, - ) - assert.True(t, result.Pass()) - assertPrefix(t, result, prefix, false) - }) - - t.Run("package coverage below threshold", func(t *testing.T) { - t.Parallel() - - result := Analyze( - Config{Threshold: Threshold{Package: 10}}, - mergeStats( - randStats(prefix, 0, 9), - randStats(prefix, 10, 100), - ), - nil, - ) - assert.Empty(t, result.FilesBelowThreshold) - assert.NotEmpty(t, result.PackagesBelowThreshold) - assert.False(t, result.Pass()) - assertPrefix(t, result, prefix, true) - }) -} - -func TestLoadBaseCoverageBreakdown(t *testing.T) { - t.Parallel() - - if testing.Short() { - return - } - - if runtime.GOOS == "windows" { - t.Skip("tests fails windows in ci, but works locally") - } - - stats, err := LoadBaseCoverageBreakdown(Config{Diff: Diff{}}) - assert.NoError(t, err) - assert.Empty(t, stats) - - stats, err = LoadBaseCoverageBreakdown(Config{ - Diff: Diff{BaseBreakdownFileName: path.NormalizeForOS(breakdownOK)}, - }) - assert.NoError(t, err) - assert.Len(t, stats, 14) - - stats, err = LoadBaseCoverageBreakdown(Config{ - Diff: Diff{BaseBreakdownFileName: t.TempDir()}, - }) - assert.Error(t, err) - assert.Empty(t, stats) - - stats, err = LoadBaseCoverageBreakdown(Config{ - Diff: Diff{BaseBreakdownFileName: path.NormalizeForOS(breakdownNOK)}, - }) - assert.Error(t, err) - assert.Empty(t, stats) -} diff --git a/pkg/testcoverage/config_test.go b/pkg/testcoverage/config_test.go deleted file mode 100644 index af7bb6e8..00000000 --- a/pkg/testcoverage/config_test.go +++ /dev/null @@ -1,242 +0,0 @@ -package testcoverage_test - -import ( - "os" - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/yaml.v3" - - . "github.com/vladopajic/go-test-coverage/v2/pkg/testcoverage" -) - -const nonEmptyStr = "any" - -func Test_Config_Validate(t *testing.T) { - t.Parallel() - - cfg := newValidCfg() - assert.NoError(t, cfg.Validate()) - - cfg = newValidCfg() - cfg.Profile = "" - assert.ErrorIs(t, cfg.Validate(), ErrCoverageProfileNotSpecified) - - cfg = newValidCfg() - cfg.Threshold.File = 101 - assert.ErrorIs(t, cfg.Validate(), ErrThresholdNotInRange) - - cfg = newValidCfg() - cfg.Threshold.File = -1 - assert.ErrorIs(t, cfg.Validate(), ErrThresholdNotInRange) - - cfg = newValidCfg() - cfg.Threshold.Package = 101 - assert.ErrorIs(t, cfg.Validate(), ErrThresholdNotInRange) - - cfg = newValidCfg() - cfg.Threshold.Package = -1 - assert.ErrorIs(t, cfg.Validate(), ErrThresholdNotInRange) - - cfg = newValidCfg() - cfg.Threshold.Total = 101 - assert.ErrorIs(t, cfg.Validate(), ErrThresholdNotInRange) - - cfg = newValidCfg() - cfg.Threshold.Total = -1 - assert.ErrorIs(t, cfg.Validate(), ErrThresholdNotInRange) - - cfg = newValidCfg() - cfg.Override = []Override{{Threshold: 101}} - assert.ErrorIs(t, cfg.Validate(), ErrThresholdNotInRange) - - cfg = newValidCfg() - cfg.Override = []Override{{Threshold: 100, Path: "("}} - assert.ErrorIs(t, cfg.Validate(), ErrRegExpNotValid) - - cfg = newValidCfg() - cfg.Exclude.Paths = []string{"("} - assert.ErrorIs(t, cfg.Validate(), ErrRegExpNotValid) -} - -func Test_Config_ValidateCDN(t *testing.T) { - t.Parallel() - - cfg := newValidCfg() - cfg.Badge.CDN.Secret = nonEmptyStr - assert.ErrorIs(t, cfg.Validate(), ErrCDNOptionNotSet) - - cfg = newValidCfg() - cfg.Badge.CDN.Secret = nonEmptyStr - cfg.Badge.CDN.Key = nonEmptyStr - assert.ErrorIs(t, cfg.Validate(), ErrCDNOptionNotSet) - - cfg = newValidCfg() - cfg.Badge.CDN.Secret = nonEmptyStr - cfg.Badge.CDN.Key = nonEmptyStr - cfg.Badge.CDN.Region = nonEmptyStr - assert.ErrorIs(t, cfg.Validate(), ErrCDNOptionNotSet) - - cfg = newValidCfg() - cfg.Badge.CDN.Secret = nonEmptyStr - cfg.Badge.CDN.Key = nonEmptyStr - cfg.Badge.CDN.Region = nonEmptyStr - cfg.Badge.CDN.BucketName = nonEmptyStr - assert.ErrorIs(t, cfg.Validate(), ErrCDNOptionNotSet) - - cfg = newValidCfg() - cfg.Badge.CDN.Secret = nonEmptyStr - cfg.Badge.CDN.Key = nonEmptyStr - cfg.Badge.CDN.Region = nonEmptyStr - cfg.Badge.CDN.BucketName = nonEmptyStr - cfg.Badge.CDN.FileName = nonEmptyStr - cfg.Badge.CDN.Endpoint = nonEmptyStr - assert.NoError(t, cfg.Validate()) -} - -func Test_Config_ValidateGit(t *testing.T) { - t.Parallel() - - cfg := newValidCfg() - cfg.Badge.Git.Token = nonEmptyStr - assert.ErrorIs(t, cfg.Validate(), ErrGitOptionNotSet) - - cfg = newValidCfg() - cfg.Badge.Git.Token = nonEmptyStr - cfg.Badge.Git.Owner = nonEmptyStr - assert.ErrorIs(t, cfg.Validate(), ErrGitOptionNotSet) - - cfg = newValidCfg() - cfg.Badge.Git.Token = nonEmptyStr - cfg.Badge.Git.Owner = nonEmptyStr - cfg.Badge.Git.Repository = nonEmptyStr - assert.ErrorIs(t, cfg.Validate(), ErrGitOptionNotSet) - - cfg = newValidCfg() - cfg.Badge.Git.Token = nonEmptyStr - cfg.Badge.Git.Owner = nonEmptyStr - cfg.Badge.Git.Repository = nonEmptyStr - cfg.Badge.Git.Branch = nonEmptyStr - assert.ErrorIs(t, cfg.Validate(), ErrGitOptionNotSet) - - cfg = newValidCfg() - cfg.Badge.Git.Token = nonEmptyStr - cfg.Badge.Git.Owner = nonEmptyStr - cfg.Badge.Git.Repository = nonEmptyStr - cfg.Badge.Git.Branch = nonEmptyStr - cfg.Badge.Git.FileName = nonEmptyStr - assert.NoError(t, cfg.Validate()) -} - -func Test_ConfigFromFile(t *testing.T) { - t.Parallel() - - if testing.Short() { - return - } - - setFileWithContent := func(name string, content []byte) { - f, err := os.OpenFile(name, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - t.Errorf("could not open file: %v", err) - } - - _, err = f.Write(content) - assert.NoError(t, err) - - assert.NoError(t, f.Close()) - } - - t.Run("no file", func(t *testing.T) { - t.Parallel() - - cfg := Config{} - err := ConfigFromFile(&cfg, t.TempDir()) - assert.Error(t, err) - assert.Equal(t, Config{}, cfg) - }) - - t.Run("invalid file", func(t *testing.T) { - t.Parallel() - - fileName := t.TempDir() + "file.yml" - setFileWithContent(fileName, []byte("-----")) - - cfg := Config{} - err := ConfigFromFile(&cfg, fileName) - assert.Error(t, err) - assert.Equal(t, Config{}, cfg) - }) - - t.Run("ok file", func(t *testing.T) { - t.Parallel() - - savedCfg := nonZeroConfig() - data, err := yaml.Marshal(savedCfg) - assert.NoError(t, err) - - fileName := t.TempDir() + "file.yml" - setFileWithContent(fileName, data) - - cfg := Config{} - err = ConfigFromFile(&cfg, fileName) - assert.NoError(t, err) - assert.Equal(t, savedCfg, cfg) - }) -} - -func TestConfigYamlParse(t *testing.T) { - t.Parallel() - - zeroCfg := nonZeroConfig() - data, err := yaml.Marshal(zeroCfg) - assert.NoError(t, err) - assert.YAMLEq(t, string(data), nonZeroYaml()) - - cfg := Config{} - err = yaml.Unmarshal([]byte(nonZeroYaml()), &cfg) - assert.NoError(t, err) - assert.Equal(t, nonZeroConfig(), cfg) -} - -func nonZeroConfig() Config { - return Config{ - Profile: "cover.out", - LocalPrefix: "prefix", - Threshold: Threshold{100, 100, 100}, - Override: []Override{{Path: "pathToFile", Threshold: 99}}, - Exclude: Exclude{ - Paths: []string{"path1", "path2"}, - }, - BreakdownFileName: "breakdown.testcoverage", - Diff: Diff{ - BaseBreakdownFileName: "breakdown.testcoverage", - }, - GithubActionOutput: true, - } -} - -func nonZeroYaml() string { - return ` -profile: cover.out -local-prefix: prefix -threshold: - file: 100 - package: 100 - total: 100 -override: - - threshold: 99 - path: pathToFile -exclude: - paths: - - path1 - - path2 -breakdown-file-name: 'breakdown.testcoverage' -diff: - base-breakdown-file-name: 'breakdown.testcoverage' -github-action-output: true` -} - -func newValidCfg() Config { - return Config{Profile: "cover.out"} -}