mirror of
https://github.com/lukaszraczylo/semver-generator.git
synced 2026-06-05 22:49:25 +00:00
511 lines
11 KiB
Go
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()
|
|
})
|
|
}
|
|
}
|