You've already forked go-semantic-release
Previous assumption about multiple labeled body blocks and footers is not correct. There is only one body text block with multi-line support. A footer always starts with a token with a separator. - A body ends when a footer is found or text ends. - A footer ends when another footer is found or text ends.
497 lines
14 KiB
Go
497 lines
14 KiB
Go
package analyzer_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/Nightapes/go-semantic-release/internal/analyzer"
|
|
"github.com/Nightapes/go-semantic-release/internal/shared"
|
|
"github.com/Nightapes/go-semantic-release/pkg/config"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestConventional(t *testing.T) {
|
|
t.Parallel()
|
|
testConfigs := []struct {
|
|
testCase string
|
|
commits []shared.Commit
|
|
wantAnalyzedCommits map[shared.Release][]shared.AnalyzedCommit
|
|
}{
|
|
{
|
|
testCase: "feat",
|
|
wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{
|
|
"minor": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "feat(internal/changelog): my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
Scope: "internal/changelog",
|
|
ParsedMessage: "my first commit",
|
|
Tag: "feat",
|
|
TagString: "Features",
|
|
Subject: "my first commit",
|
|
MessageBlocks: map[string][]shared.MessageBlock{},
|
|
Print: true,
|
|
},
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "feat: no scope",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "no scope",
|
|
Tag: "feat",
|
|
TagString: "Features",
|
|
Subject: "no scope",
|
|
MessageBlocks: map[string][]shared.MessageBlock{},
|
|
Print: true,
|
|
},
|
|
},
|
|
"major": {},
|
|
"patch": {},
|
|
"none": {},
|
|
},
|
|
commits: []shared.Commit{
|
|
{
|
|
Message: "feat(internal/changelog): my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
{
|
|
Message: "feat: no scope",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testCase: "feat breaking change",
|
|
wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{
|
|
"minor": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "feat: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "my first commit",
|
|
Tag: "feat",
|
|
TagString: "Features",
|
|
Print: true,
|
|
Subject: "my first commit",
|
|
MessageBlocks: map[string][]shared.MessageBlock{},
|
|
},
|
|
},
|
|
"major": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "feat!: my first break",
|
|
Author: "me",
|
|
Hash: "12345668",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "",
|
|
Tag: "feat",
|
|
TagString: "Features",
|
|
Print: true,
|
|
ParsedBreakingChangeMessage: "my first break",
|
|
IsBreaking: true,
|
|
Subject: "my first break",
|
|
MessageBlocks: map[string][]shared.MessageBlock{},
|
|
},
|
|
},
|
|
"patch": {},
|
|
"none": {},
|
|
},
|
|
commits: []shared.Commit{
|
|
{
|
|
Message: "feat: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
{
|
|
Message: "feat!: my first break",
|
|
Author: "me",
|
|
Hash: "12345668",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testCase: "feat breaking change footer",
|
|
wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{
|
|
"minor": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "feat: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "my first commit",
|
|
Tag: "feat",
|
|
TagString: "Features",
|
|
Print: true,
|
|
Subject: "my first commit",
|
|
MessageBlocks: map[string][]shared.MessageBlock{},
|
|
},
|
|
},
|
|
"major": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "feat: my first break \n\nBREAKING CHANGE: change api to v2\n",
|
|
Author: "me",
|
|
Hash: "12345668",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "my first break",
|
|
Tag: "feat",
|
|
TagString: "Features",
|
|
Print: true,
|
|
ParsedBreakingChangeMessage: "change api to v2",
|
|
IsBreaking: true,
|
|
Subject: "my first break",
|
|
MessageBlocks: map[string][]shared.MessageBlock{
|
|
"footer" : { shared.MessageBlock{
|
|
Label: "BREAKING CHANGE",
|
|
Content: "change api to v2",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "feat!: my first break \n\nBREAKING CHANGE: hey from the change",
|
|
Author: "me",
|
|
Hash: "12345669",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "my first break",
|
|
Tag: "feat",
|
|
TagString: "Features",
|
|
Print: true,
|
|
ParsedBreakingChangeMessage: "hey from the change",
|
|
IsBreaking: true,
|
|
Subject: "my first break",
|
|
MessageBlocks: map[string][]shared.MessageBlock{
|
|
"footer" : {shared.MessageBlock{
|
|
Label: "BREAKING CHANGE",
|
|
Content: "hey from the change",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"patch": {},
|
|
"none": {},
|
|
},
|
|
commits: []shared.Commit{
|
|
{
|
|
Message: "feat: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
{
|
|
Message: "feat: my first break \n\nBREAKING CHANGE: change api to v2\n",
|
|
Author: "me",
|
|
Hash: "12345668",
|
|
},
|
|
{
|
|
Message: "feat!: my first break \n\nBREAKING CHANGE: hey from the change",
|
|
Author: "me",
|
|
Hash: "12345669",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testCase: "invalid",
|
|
wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{
|
|
"minor": {},
|
|
"major": {},
|
|
"patch": {},
|
|
"none": {},
|
|
},
|
|
commits: []shared.Commit{
|
|
{
|
|
Message: "internal/changelog: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
{
|
|
Message: "Merge feat: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testCase: "feat and build",
|
|
wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{
|
|
"minor": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "feat: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "my first commit",
|
|
Tag: "feat",
|
|
TagString: "Features",
|
|
Print: true,
|
|
Subject: "my first commit",
|
|
MessageBlocks: map[string][]shared.MessageBlock{},
|
|
},
|
|
},
|
|
"none": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "build: my first build",
|
|
Author: "me",
|
|
Hash: "12345668",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "my first build",
|
|
Tag: "build",
|
|
TagString: "Changes to CI/CD",
|
|
Print: false,
|
|
ParsedBreakingChangeMessage: "",
|
|
Subject: "my first build",
|
|
MessageBlocks: map[string][]shared.MessageBlock{},
|
|
},
|
|
},
|
|
"patch": {},
|
|
"major": {},
|
|
},
|
|
commits: []shared.Commit{
|
|
{
|
|
Message: "feat: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
{
|
|
Message: "build: my first build",
|
|
Author: "me",
|
|
Hash: "12345668",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
testCase: "fix and build",
|
|
wantAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{
|
|
"minor": {},
|
|
"none": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "build: my first build",
|
|
Author: "me",
|
|
Hash: "12345668",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "my first build",
|
|
Tag: "build",
|
|
TagString: "Changes to CI/CD",
|
|
Print: false,
|
|
ParsedBreakingChangeMessage: "",
|
|
Subject: "my first build",
|
|
MessageBlocks: map[string][]shared.MessageBlock{},
|
|
},
|
|
},
|
|
"patch": {{
|
|
Commit: shared.Commit{
|
|
Message: "fix: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "my first commit",
|
|
Tag: "fix",
|
|
TagString: "Bug fixes",
|
|
Print: true,
|
|
Subject: "my first commit",
|
|
MessageBlocks: map[string][]shared.MessageBlock{},
|
|
}},
|
|
"major": {},
|
|
},
|
|
commits: []shared.Commit{
|
|
{
|
|
Message: "fix: my first commit",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
{
|
|
Message: "build: my first build",
|
|
Author: "me",
|
|
Hash: "12345668",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
conventional, err := analyzer.New("conventional", config.AnalyzerConfig{}, config.ChangelogConfig{})
|
|
assert.NoError(t, err)
|
|
|
|
for _, test := range testConfigs {
|
|
analyzedCommits := conventional.Analyze(test.commits)
|
|
assert.Equalf(t, test.wantAnalyzedCommits["major"], analyzedCommits["major"], "Testcase %s should have major commits", test.testCase)
|
|
assert.Equalf(t, test.wantAnalyzedCommits["minor"], analyzedCommits["minor"], "Testcase %s should have minor commits", test.testCase)
|
|
assert.Equalf(t, test.wantAnalyzedCommits["patch"], analyzedCommits["patch"], "Testcase %s should have patch commits", test.testCase)
|
|
assert.Equalf(t, test.wantAnalyzedCommits["none"], analyzedCommits["none"], "Testcase %s should have none commits", test.testCase)
|
|
}
|
|
}
|
|
|
|
func TestConventional_BodyAndFooters(t *testing.T) {
|
|
t.Parallel()
|
|
testConfigs := []struct {
|
|
testCase string
|
|
commits []shared.Commit
|
|
expectedAnalyzedCommits map[shared.Release][]shared.AnalyzedCommit
|
|
}{
|
|
{
|
|
testCase: "Only body, no footer",
|
|
commits: []shared.Commit{
|
|
{
|
|
Message: "fix: squash bug for logging\n\nNow the logs will not print lines twice. The following changed:\n\n-Buffer -Stdout",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
},
|
|
expectedAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{
|
|
"patch": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "fix: squash bug for logging\n\nNow the logs will not print lines twice. The following changed:\n\n-Buffer -Stdout",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "squash bug for logging\n\nNow the logs will not print lines twice. The following changed:\n\n-Buffer -Stdout",
|
|
Tag: "fix",
|
|
TagString: "Bug fixes",
|
|
Print: true,
|
|
Subject: "squash bug for logging",
|
|
MessageBlocks: map[string][]shared.MessageBlock{
|
|
"body": {
|
|
shared.MessageBlock{
|
|
Label: "",
|
|
Content: "Now the logs will not print lines twice. The following changed:\n\n-Buffer -Stdout",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"major": {},
|
|
"minor": {},
|
|
"none": {},
|
|
},
|
|
},
|
|
{
|
|
testCase: "Only footers, no body",
|
|
commits: []shared.Commit{
|
|
{
|
|
Message: "fix: squash bug for logging\n\nNote: now the logs will not print lines twice.\n\nIssue: #123\nSeverity: medium",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
},
|
|
expectedAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{
|
|
"patch": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "fix: squash bug for logging\n\nNote: now the logs will not print lines twice.\n\nIssue: #123\nSeverity: medium",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "squash bug for logging\n\nNote: now the logs will not print lines twice.\n\nIssue: #123\nSeverity: medium",
|
|
Tag: "fix",
|
|
TagString: "Bug fixes",
|
|
Print: true,
|
|
Subject: "squash bug for logging",
|
|
MessageBlocks: map[string][]shared.MessageBlock{
|
|
"footer": {
|
|
shared.MessageBlock{
|
|
Label: "Note",
|
|
Content: "now the logs will not print lines twice.",
|
|
},
|
|
shared.MessageBlock{
|
|
Label: "Issue",
|
|
Content: "#123",
|
|
},
|
|
shared.MessageBlock{
|
|
Label: "Severity",
|
|
Content: "medium",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"major": {},
|
|
"minor": {},
|
|
"none": {},
|
|
},
|
|
},
|
|
{
|
|
testCase: "Body and footers",
|
|
commits: []shared.Commit{
|
|
{
|
|
Message: "fix: squash bug for logging\n\nNow the logs will not print lines twice. The following changed:\n\n-Buffer -Stdout\n\nIssue: #123\nSeverity: medium",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
},
|
|
expectedAnalyzedCommits: map[shared.Release][]shared.AnalyzedCommit{
|
|
"patch": {
|
|
{
|
|
Commit: shared.Commit{
|
|
Message: "fix: squash bug for logging\n\nNow the logs will not print lines twice. The following changed:\n\n-Buffer -Stdout\n\nIssue: #123\nSeverity: medium",
|
|
Author: "me",
|
|
Hash: "12345667",
|
|
},
|
|
Scope: "",
|
|
ParsedMessage: "squash bug for logging\n\nNow the logs will not print lines twice. The following changed:\n\n-Buffer -Stdout\n\nIssue: #123\nSeverity: medium",
|
|
Tag: "fix",
|
|
TagString: "Bug fixes",
|
|
Print: true,
|
|
Subject: "squash bug for logging",
|
|
MessageBlocks: map[string][]shared.MessageBlock{
|
|
"body": {
|
|
shared.MessageBlock{
|
|
Label: "",
|
|
Content: "Now the logs will not print lines twice. The following changed:\n\n-Buffer -Stdout",
|
|
},
|
|
},
|
|
"footer": {
|
|
shared.MessageBlock{
|
|
Label: "Issue",
|
|
Content: "#123",
|
|
},
|
|
shared.MessageBlock{
|
|
Label: "Severity",
|
|
Content: "medium",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
"major": {},
|
|
"minor": {},
|
|
"none": {},
|
|
},
|
|
},
|
|
|
|
}
|
|
|
|
conventional, err := analyzer.New("conventional", config.AnalyzerConfig{}, config.ChangelogConfig{})
|
|
assert.NoError(t, err)
|
|
for _, test := range testConfigs {
|
|
analyzedCommits := conventional.Analyze(test.commits)
|
|
assert.Equalf(t, test.expectedAnalyzedCommits["major"], analyzedCommits["major"], "Testcase %s should have major commits", test.testCase)
|
|
assert.Equalf(t, test.expectedAnalyzedCommits["minor"], analyzedCommits["minor"], "Testcase %s should have minor commits", test.testCase)
|
|
assert.Equalf(t, test.expectedAnalyzedCommits["patch"], analyzedCommits["patch"], "Testcase %s should have patch commits", test.testCase)
|
|
assert.Equalf(t, test.expectedAnalyzedCommits["none"], analyzedCommits["none"], "Testcase %s should have none commits", test.testCase)
|
|
}
|
|
}
|