Improve test coverage.

This commit is contained in:
2025-02-08 02:06:12 +00:00
parent 38b1869177
commit a999dcc328
2 changed files with 227 additions and 342 deletions
+207 -329
View File
@@ -1,18 +1,3 @@
/*
Copyright © 2021 LUKASZ RACZYLO <lukasz$raczylo,com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package cmd
import (
@@ -151,6 +136,37 @@ func (suite *Tests) TestSetup_ForcedVersioning() {
},
want: "0.0.7",
},
{
name: "All versions set",
fields: fields{
Force: Force{
Major: 2,
Minor: 3,
Patch: 4,
},
},
want: "2.3.4",
},
{
name: "Major and Minor set",
fields: fields{
Force: Force{
Major: 2,
Minor: 3,
},
},
want: "2.3.0",
},
{
name: "Minor and Patch set",
fields: fields{
Force: Force{
Minor: 3,
Patch: 4,
},
},
want: "0.3.4",
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
@@ -165,108 +181,21 @@ func (suite *Tests) TestSetup_ForcedVersioning() {
}
}
func (suite *Tests) TestSetup_Prepare() {
type fields struct {
RepositoryName string
RepositoryLocalPath string
}
tests := []struct {
name string
fields fields
wantErr bool
}{
{
name: "Test repository lukaszraczylo/simple-gql-client",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/simple-gql-client",
},
wantErr: true,
},
{
name: "Test non-existing repository",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/simple-gql-client-dead",
},
wantErr: true,
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
s := &Setup{
RepositoryName: tt.fields.RepositoryName,
}
s.Prepare()
if _, err := os.Stat(s.RepositoryLocalPath); os.IsNotExist(err) {
if !tt.wantErr {
assert.NoError(err, "Error should not be present in "+tt.name)
} else {
assert.Error(err, "Error should be present in "+tt.name)
}
}
})
}
}
func (suite *Tests) TestSetup_ReadConfig() {
type fields struct {
Wording Wording
Force Force
}
type args struct {
file string
}
tests := []struct {
name string
args args
fields fields
wordingEmpty bool
wantErr bool
}{
{
name: "Test non-existent config file",
args: args{
file: "random-file-name.yaml",
},
wordingEmpty: true,
wantErr: true,
},
{
name: "Test existing config file",
args: args{
file: "../config.yaml",
},
wordingEmpty: false,
wantErr: false,
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
s := &Setup{}
err := s.ReadConfig(tt.args.file)
if !tt.wantErr {
assert.NoError(err, "Error should not be present in "+tt.name)
} else {
assert.Error(err, "Error should be present in "+tt.name)
}
assert.Equal(tt.wordingEmpty, pandati.IsZero(s.Wording), "Unexpected wording count "+tt.name+":", s.Wording)
})
}
}
func (suite *Tests) Test_checkMatches() {
type args struct {
content []string
targets []string
}
tests := []struct {
name string
args args
want bool
name string
args args
blacklist []string
want bool
}{
{
name: "No match",
args: args{
content: strings.Fields("Fields splits the string s around each instance of one or more consecutive white space characters, as defined by unicode.IsSpace, returning a slice of substrings of s or an empty slice if s contains only white space"),
content: strings.Fields("Fields splits the string s around each instance of one or more consecutive white space characters"),
targets: []string{"github", "repository", "test"},
},
want: false,
@@ -274,20 +203,143 @@ func (suite *Tests) Test_checkMatches() {
{
name: "Match",
args: args{
content: strings.Fields("Fields splits the string s around each instance of one or more consecutive white space characters, as defined by unicode.IsSpace, returning a slice of substrings of s or an empty slice if s contains only white space"),
content: strings.Fields("Fields splits the string s around each instance of one or more consecutive white space characters"),
targets: []string{"github", "repository", "instance"},
},
want: true,
},
{
name: "Match but blacklisted",
args: args{
content: strings.Fields("feat: add new feature with breaking changes"),
targets: []string{"feat", "feature"},
},
blacklist: []string{"breaking"},
want: false,
},
{
name: "Match with empty blacklist",
args: args{
content: strings.Fields("feat: add new feature"),
targets: []string{"feat", "feature"},
},
blacklist: []string{},
want: true,
},
{
name: "No match with blacklist",
args: args{
content: strings.Fields("chore: update dependencies"),
targets: []string{"feat", "feature"},
},
blacklist: []string{"skip-ci"},
want: false,
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
repo.Blacklist = tt.blacklist
got := checkMatches(tt.args.content, tt.args.targets)
assert.Equal(tt.want, got, "Unexpected result in "+tt.name)
})
}
}
func (suite *Tests) Test_parseExistingSemver() {
type args struct {
tagName string
}
tests := []struct {
name string
args args
currentSemver SemVer
wantSemanticVersion SemVer
}{
{
name: "Test parsing existing semver",
args: args{
tagName: "1.2.3",
},
currentSemver: SemVer{Major: 1, Minor: 1, Patch: 1},
wantSemanticVersion: SemVer{
Major: 1,
Minor: 2,
Patch: 3,
},
},
{
name: "Test parsing existing semver with v",
args: args{
tagName: "v1.2.3",
},
currentSemver: SemVer{Major: 1, Minor: 1, Patch: 1},
wantSemanticVersion: SemVer{
Major: 1,
Minor: 2,
Patch: 3,
},
},
{
name: "Test parsing existing semver with rc",
args: args{
tagName: "1.2.5-rc.7",
},
currentSemver: SemVer{Major: 1, Minor: 1, Patch: 1},
wantSemanticVersion: SemVer{
Major: 1,
Minor: 2,
Patch: 5,
Release: 7,
},
},
{
name: "Test invalid semver format",
args: args{
tagName: "invalid",
},
currentSemver: SemVer{Major: 2, Minor: 3, Patch: 4},
wantSemanticVersion: SemVer{
Major: 2,
Minor: 3,
Patch: 4,
},
},
{
name: "Test partial semver",
args: args{
tagName: "1.2",
},
currentSemver: SemVer{Major: 2, Minor: 3, Patch: 4},
wantSemanticVersion: SemVer{
Major: 2,
Minor: 3,
Patch: 4,
},
},
{
name: "Test empty tag",
args: args{
tagName: "",
},
currentSemver: SemVer{Major: 2, Minor: 3, Patch: 4},
wantSemanticVersion: SemVer{
Major: 2,
Minor: 3,
Patch: 4,
},
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
got := parseExistingSemver(tt.args.tagName, tt.currentSemver)
assert.Equal(tt.wantSemanticVersion.Major, got.Major, "Unexpected MAJOR semver result in "+tt.name)
assert.Equal(tt.wantSemanticVersion.Minor, got.Minor, "Unexpected MINOR semver result in "+tt.name)
assert.Equal(tt.wantSemanticVersion.Patch, got.Patch, "Unexpected PATCH semver result in "+tt.name)
assert.Equal(tt.wantSemanticVersion.Release, got.Release, "Unexpected RELEASE semver result in "+tt.name)
})
}
}
func (suite *Tests) TestSetup_ListCommits() {
type fields struct {
RepositoryHandler *git.Repository
@@ -357,227 +409,6 @@ func (suite *Tests) TestSetup_ListCommits() {
}
}
func (suite *Tests) TestSetup_CalculateSemver() {
type fields struct {
RepositoryName string
BranchName string
LocalConfigFile string
Force Force
}
type wantSemver struct {
Major int
Minor int
Patch int
}
tests := []struct {
name string
fields fields
wantSemver wantSemver
strictMatching bool
}{
{
name: "Test on existing repository",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/semver-generator-test-repo",
LocalConfigFile: "meta.yaml",
BranchName: "main",
},
strictMatching: false,
wantSemver: wantSemver{
Major: 0,
Minor: 0,
Patch: 7,
},
},
{
name: "Test on existing repository with strict matching",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/semver-generator-test-repo",
LocalConfigFile: "meta.yaml",
BranchName: "main",
},
strictMatching: true,
wantSemver: wantSemver{
Major: 2,
Minor: 4,
Patch: 1,
},
},
{
name: "Test on existing repository, starting with certain hash",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/semver-generator-test-repo",
LocalConfigFile: "meta.yaml",
BranchName: "main",
Force: Force{
Major: 1,
Minor: 1,
Commit: "45f9a23cec39e94503841638aee3efecd45111cf",
},
},
strictMatching: false,
wantSemver: wantSemver{
Major: 1,
Minor: 5,
Patch: 1,
},
},
{
name: "Test on existing repository, starting with different hash",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/semver-generator-test-repo",
LocalConfigFile: "meta.yaml",
BranchName: "main",
Force: Force{
Major: 1,
Minor: 1,
Commit: "48564920d88a8a16df607736b438947309ffb8c6",
},
},
strictMatching: false,
wantSemver: wantSemver{
Major: 1,
Minor: 4,
Patch: 1,
},
},
{
name: "Test on non-existing repository",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/semver-generator-test-repo-dead",
},
wantSemver: wantSemver{
Major: 1, // 1 because config file enforces MAJOR version
Minor: 1, // 1 because config file enforces MINOR version
Patch: 0,
},
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
s := &Setup{}
s.ReadConfig(tt.fields.LocalConfigFile)
s.RepositoryName = tt.fields.RepositoryName
s.RepositoryBranch = tt.fields.BranchName
s.Prepare()
s.ForcedVersioning()
s.Force = tt.fields.Force
s.ListCommits()
params.varStrict = tt.strictMatching
semver := s.CalculateSemver()
assert.Equal(tt.wantSemver.Major, semver.Major, "Unexpected MAJOR semver result in "+tt.name)
assert.Equal(tt.wantSemver.Minor, semver.Minor, "Unexpected MINOR semver result in "+tt.name)
assert.Equal(tt.wantSemver.Patch, semver.Patch, "Unexpected PATCH semver result in "+tt.name)
})
}
}
func (suite *Tests) Test_main() {
type vars struct {
varRepoName string
varRepoBranch string
varLocalCfg string
varUseLocal bool
varShowVersion bool
varDebug bool
varUpdate bool
varStrict bool
varGenerateInTest bool
varExisting bool
}
tests := []struct {
name string
vars vars
}{
{
name: "Test printing version",
vars: vars{
varShowVersion: true,
},
},
{
name: "Test update switch",
vars: vars{
varUpdate: true,
},
},
{
name: "Test main",
vars: vars{
varGenerateInTest: false,
},
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
params = myParams(tt.vars)
repo = &Setup{}
repo.LocalConfigFile = "../config.yaml"
repo.UseLocal = true
main()
})
}
}
func (suite *Tests) Test_parseExistingSemver() {
type args struct {
tagName string
}
tests := []struct {
name string
args args
wantSemanticVersion SemVer
}{
{
name: "Test parsing existing semver",
args: args{
tagName: "1.2.3",
},
wantSemanticVersion: SemVer{
Major: 1,
Minor: 2,
Patch: 3,
},
},
{
name: "Test parsing existing semver with v",
args: args{
tagName: "v1.2.3",
},
wantSemanticVersion: SemVer{
Major: 1,
Minor: 2,
Patch: 3,
},
},
{
name: "Test parsing existing semver with rc",
args: args{
tagName: "1.2.5-rc.7",
},
wantSemanticVersion: SemVer{
Major: 1,
Minor: 2,
Patch: 5,
Release: 7,
},
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
got := parseExistingSemver(tt.args.tagName, SemVer{
Major: 1,
Minor: 1,
Patch: 1,
})
assert.Equal(tt.wantSemanticVersion.Major, got.Major, "Unexpected MAJOR semver result in "+tt.name)
assert.Equal(tt.wantSemanticVersion.Minor, got.Minor, "Unexpected MINOR semver result in "+tt.name)
assert.Equal(tt.wantSemanticVersion.Patch, got.Patch, "Unexpected PATCH semver result in "+tt.name)
assert.Equal(tt.wantSemanticVersion.Release, got.Release, "Unexpected RELEASE semver result in "+tt.name)
})
}
}
func (suite *Tests) TestSetup_ListExistingTags() {
type fields struct {
RepositoryHandler *git.Repository
@@ -630,3 +461,50 @@ func (suite *Tests) TestSetup_ListExistingTags() {
})
}
}
func (suite *Tests) Test_main() {
type vars struct {
varRepoName string
varRepoBranch string
varLocalCfg string
varUseLocal bool
varShowVersion bool
varDebug bool
varUpdate bool
varStrict bool
varGenerateInTest bool
varExisting bool
}
tests := []struct {
name string
vars vars
}{
{
name: "Test printing version",
vars: vars{
varShowVersion: true,
},
},
{
name: "Test update switch",
vars: vars{
varUpdate: true,
},
},
{
name: "Test main",
vars: vars{
varGenerateInTest: false,
},
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
params = myParams(tt.vars)
repo = &Setup{}
repo.LocalConfigFile = "../config.yaml"
repo.UseLocal = true
main()
})
}
}