Files
semver-generator/cmd/main_test.go
T
2025-02-08 02:06:12 +00:00

511 lines
11 KiB
Go

package cmd
import (
"os"
"strings"
"testing"
git "github.com/go-git/go-git/v5"
libpack_logging "github.com/lukaszraczylo/graphql-monitoring-proxy/logging"
"github.com/lukaszraczylo/pandati"
assertions "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
)
type Tests struct {
suite.Suite
}
var (
assert *assertions.Assertions
testCurrentPath string
)
func (suite *Tests) SetupTest() {
err := os.Chdir(testCurrentPath)
if err != nil {
logger.Critical(&libpack_logging.LogMessage{Message: "Unable to change directory to test directory", Pairs: map[string]any{"error": err}})
}
assert = assertions.New(suite.T())
params.varDebug = true
params.varRepoBranch = "main"
}
func TestSuite(t *testing.T) {
logger = libpack_logging.New()
testCurrentPath, _ = os.Getwd()
suite.Run(t, new(Tests))
}
func (suite *Tests) TestSetup_getSemver() {
type fields struct {
Semver SemVer
}
tests := []struct {
name string
want string
fields fields
}{
{
name: "Return 1.3.7",
fields: fields{
Semver: SemVer{
Major: 1,
Minor: 3,
Patch: 7,
},
},
want: "1.3.7",
},
{
name: "Return 1.3.7-rc.2",
fields: fields{
Semver: SemVer{
Major: 1,
Minor: 3,
Patch: 7,
Release: 2,
EnableReleaseCandidate: true,
},
},
want: "1.3.7-rc.2",
},
{
name: "Return 1.3.9",
fields: fields{
Semver: SemVer{
Major: 1,
Minor: 3,
Patch: 9,
Release: 2,
EnableReleaseCandidate: false,
},
},
want: "1.3.9",
},
}
for _, tt := range tests {
suite.T().Run(tt.name, func(t *testing.T) {
s := &Setup{
Semver: tt.fields.Semver,
}
got := s.getSemver()
assert.Equal(tt.want, got, "Unexpected result in "+tt.name)
})
}
}
func (suite *Tests) TestSetup_ForcedVersioning() {
type fields struct {
Force Force
Semver SemVer
}
tests := []struct {
name string
want string
fields fields
}{
{
name: "No versioning",
want: "0.0.0",
},
{
name: "Major version set",
fields: fields{
Force: Force{
Major: 2,
},
},
want: "2.0.0",
},
{
name: "Minor version set",
fields: fields{
Force: Force{
Minor: 3,
},
},
want: "0.3.0",
},
{
name: "Patch version set",
fields: fields{
Force: Force{
Patch: 7,
},
},
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) {
s := &Setup{
Semver: tt.fields.Semver,
Force: tt.fields.Force,
}
s.ForcedVersioning()
got := s.getSemver()
assert.Equal(tt.want, got, "Unexpected result in "+tt.name)
})
}
}
func (suite *Tests) Test_checkMatches() {
type args struct {
content []string
targets []string
}
tests := []struct {
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"),
targets: []string{"github", "repository", "test"},
},
want: false,
},
{
name: "Match",
args: args{
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
RepositoryName string
RepositoryBranch string
RepositoryLocalPath string
LocalConfigFile string
Wording Wording
Commits []CommitDetails
Force Force
Semver SemVer
}
tests := []struct {
name string
fields fields
noCommits bool
wantErr bool
}{
{
name: "List commits from existing repository",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/simple-gql-client",
RepositoryBranch: "master",
},
noCommits: false,
wantErr: false,
},
{
name: "List commits from non-existing repository",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/simple-gql-client-dead",
RepositoryBranch: "main",
},
noCommits: true,
wantErr: true,
},
{
name: "List commits starting with certain hash",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/simple-gql-client",
RepositoryBranch: "master",
Force: Force{
Commit: "f6ee82113afb32ee95eac892d1155582a2f85166",
},
},
noCommits: false,
wantErr: false,
},
}
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.RepositoryBranch
s.Force = tt.fields.Force
s.Prepare()
listOfCommits, err := s.ListCommits()
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.noCommits, pandati.IsZero(listOfCommits), "Unexpected commits count"+tt.name)
})
}
}
func (suite *Tests) TestSetup_ListExistingTags() {
type fields struct {
RepositoryHandler *git.Repository
RepositoryName string
RepositoryBranch string
RepositoryLocalPath string
LocalConfigFile string
Wording Wording
Commits []CommitDetails
Force Force
Semver SemVer
}
tests := []struct {
name string
fields fields
noTags bool
}{
{
name: "List tags from existing repository",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/simple-gql-client",
RepositoryBranch: "master",
},
noTags: false,
},
{
name: "List tags from non-existing repository",
fields: fields{
RepositoryName: "https://github.com/lukaszraczylo/simple-gql-client-dead",
RepositoryBranch: "master",
},
noTags: true,
},
}
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.RepositoryBranch
s.Force = tt.fields.Force
s.Prepare()
s.ListExistingTags()
if tt.noTags {
assert.Equal(len(s.Tags), 0, "Unexpected number of tags in "+tt.name)
} else {
assert.GreaterOrEqual(len(s.Tags), 1, "Unexpected number of tags 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()
})
}
}