Skip to content

Commit a6b4667

Browse files
Kieran MarronKieran Marron
Kieran Marron
authored and
Kieran Marron
committed
Add unit tests for MergeMessage class
1 parent 3293afc commit a6b4667

File tree

1 file changed

+217
-0
lines changed

1 file changed

+217
-0
lines changed
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
using GitVersion;
2+
using NUnit.Framework;
3+
using Shouldly;
4+
using System;
5+
6+
namespace GitVersionCore.Tests
7+
{
8+
[TestFixture]
9+
public class MergeMessageTests : TestBase
10+
{
11+
private readonly Config _config = new Config { TagPrefix = "[vV]" };
12+
13+
[Test]
14+
public void NullMessageStringThrows()
15+
{
16+
// Act / Assert
17+
Should.Throw<NullReferenceException>(() => new MergeMessage(null, _config));
18+
}
19+
20+
[TestCase("")]
21+
[TestCase("\t\t ")]
22+
public void EmptyMessageString(string message)
23+
{
24+
// Act
25+
var sut = new MergeMessage(message, _config);
26+
27+
// Assert
28+
sut.TargetBranch.ShouldBeNull();
29+
sut.MergedBranch.ShouldBeEmpty();
30+
sut.IsMergedPullRequest.ShouldBeFalse();
31+
sut.PullRequestNumber.ShouldBeNull();
32+
sut.Version.ShouldBeNull();
33+
}
34+
35+
[TestCase("")]
36+
[TestCase("\t\t ")]
37+
[TestCase(null)]
38+
public void EmptyTagPrefix(string prefix)
39+
{
40+
// Arrange
41+
var message = "Updated some code.";
42+
var config = new Config { TagPrefix = prefix };
43+
44+
// Act
45+
var sut = new MergeMessage(message, config);
46+
47+
// Assert
48+
sut.TargetBranch.ShouldBeNull();
49+
sut.MergedBranch.ShouldBeEmpty();
50+
sut.IsMergedPullRequest.ShouldBeFalse();
51+
sut.PullRequestNumber.ShouldBeNull();
52+
sut.Version.ShouldBeNull();
53+
}
54+
55+
private static readonly object[] MergeMessages =
56+
{
57+
new object[] { "Merge branch 'feature/one'", "feature/one", null, null },
58+
new object[] { "Merge branch 'origin/feature/one'", "origin/feature/one", null, null },
59+
new object[] { "Merge tag 'v4.0.0' into master", "v4.0.0", "master", new SemanticVersion(4) },
60+
new object[] { "Merge tag 'V4.0.0' into master", "V4.0.0", "master", new SemanticVersion(4) },
61+
new object[] { "Merge branch 'feature/4.1/one'", "feature/4.1/one", null, new SemanticVersion(4, 1) },
62+
new object[] { "Merge branch 'origin/4.1/feature/one'", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) }
63+
};
64+
65+
[TestCaseSource(nameof(MergeMessages))]
66+
public void ParsesMergeMessage(
67+
string message,
68+
string expectedMergedBranch,
69+
string expectedTargetBranch,
70+
SemanticVersion expectedVersion)
71+
{
72+
// Act
73+
var sut = new MergeMessage(message, _config);
74+
75+
// Assert
76+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
77+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
78+
sut.IsMergedPullRequest.ShouldBeFalse();
79+
sut.PullRequestNumber.ShouldBeNull();
80+
sut.Version.ShouldBe(expectedVersion);
81+
}
82+
83+
private static readonly object[] GitHubPullPullMergeMessages =
84+
{
85+
new object[] { "Merge pull request #1234 from feature/one", "feature/one", null, null, 1234 },
86+
new object[] { "Merge pull request #1234 in feature/one", "feature/one", null, null, 1234 },
87+
new object[] { "Merge pull request #1234 in v4.0.0", "v4.0.0", null, new SemanticVersion(4), 1234 },
88+
new object[] { "Merge pull request #1234 in V4.0.0", "V4.0.0", null, new SemanticVersion(4), 1234 },
89+
new object[] { "Merge pull request #1234 from origin/feature/one", "origin/feature/one", null, null, 1234 },
90+
new object[] { "Merge pull request #1234 in feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4,1), 1234 },
91+
92+
93+
//TODO: Investigate successful github merge messages that may be invalid
94+
// Should an empty PR number be valid?
95+
new object[] { "Merge pull request # from feature/one", "feature/one", null, null, 0 },
96+
// The branch name appears to be incorrect
97+
new object[] { "Merge pull request #1234 from feature/one into dev", "feature/one into dev", "dev", null, 1234 },
98+
};
99+
100+
[TestCaseSource(nameof(GitHubPullPullMergeMessages))]
101+
public void ParsesGitHubPullMergeMessage(
102+
string message,
103+
string expectedMergedBranch,
104+
string expectedTargetBranch,
105+
SemanticVersion expectedVersion,
106+
int? expectedPullRequestNumber)
107+
{
108+
// Act
109+
var sut = new MergeMessage(message, _config);
110+
111+
// Assert
112+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
113+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
114+
sut.IsMergedPullRequest.ShouldBeTrue();
115+
sut.PullRequestNumber.ShouldBe(expectedPullRequestNumber);
116+
sut.Version.ShouldBe(expectedVersion);
117+
}
118+
119+
private static readonly object[] BitBucketPullMergeMessages =
120+
{
121+
new object[] { "Merge pull request #1234 from feature/one from feature/two to dev", "feature/two", null, null, 1234 },
122+
new object[] { "Merge pull request #1234 in feature/one from feature/two to dev", "feature/two", null, null, 1234 },
123+
new object[] { "Merge pull request #1234 in v4.0.0 from v4.1.0 to dev", "v4.1.0", null, new SemanticVersion(4,1), 1234 },
124+
new object[] { "Merge pull request #1234 in V4.0.0 from V4.1.0 to dev", "V4.1.0", null, new SemanticVersion(4,1), 1234 },
125+
new object[] { "Merge pull request #1234 from origin/feature/one from origin/feature/4.2/two to dev", "origin/feature/4.2/two", null, new SemanticVersion(4,2), 1234 },
126+
new object[] { "Merge pull request #1234 in feature/4.1/one from feature/4.2/two to dev", "feature/4.2/two", null, new SemanticVersion(4,2), 1234 },
127+
new object[] { "Merge pull request #1234 in feature/4.1/one from feature/4.2/two to dev into master", "feature/4.2/two", "master", new SemanticVersion(4,2), 1234 },
128+
129+
//TODO: Investigate successful bitbucket merge messages that may be invalid
130+
// Regex has double 'from/in from' section. Is that correct?
131+
new object[] { "Merge pull request #1234 in feature/4.1/one from feature/4.2/two to dev", "feature/4.2/two", null, new SemanticVersion(4,2), 1234 },
132+
new object[] { "Merge pull request #1234 from feature/one from v4.0.0 to master", "v4.0.0", null, new SemanticVersion(4), 1234 },
133+
// target branch is not resolved from targetbranch group
134+
new object[] { "Merge pull request #1234 from feature/one from feature/two to master" , "feature/two", null, null, 1234 },
135+
// Should an empty PR number be valid?
136+
new object[] { "Merge pull request # in feature/one from feature/two to master" , "feature/two", null, null, 0 }
137+
};
138+
139+
[TestCaseSource(nameof(BitBucketPullMergeMessages))]
140+
public void ParsesBitBucketPullMergeMessage(
141+
string message,
142+
string expectedMergedBranch,
143+
string expectedTargetBranch,
144+
SemanticVersion expectedVersion,
145+
int? expectedPullRequestNumber)
146+
{
147+
// Act
148+
var sut = new MergeMessage(message, _config);
149+
150+
// Assert
151+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
152+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
153+
sut.IsMergedPullRequest.ShouldBeTrue();
154+
sut.PullRequestNumber.ShouldBe(expectedPullRequestNumber);
155+
sut.Version.ShouldBe(expectedVersion);
156+
}
157+
158+
private static readonly object[] SmartGitMergeMessages =
159+
{
160+
new object[] { "Finish feature/one", "feature/one", null, null },
161+
new object[] { "Finish origin/feature/one", "origin/feature/one", null, null },
162+
new object[] { "Finish v4.0.0", "v4.0.0", null, new SemanticVersion(4) },
163+
new object[] { "Finish feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4, 1) },
164+
new object[] { "Finish origin/4.1/feature/one", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) },
165+
166+
//TODO: Investigate successful smart git merge messages that may be invalid
167+
// The branch name appears to be incorrect
168+
new object[] { "Finish V4.0.0 into master", "V4.0.0 into master", "master", new SemanticVersion(4) }
169+
};
170+
171+
[TestCaseSource(nameof(SmartGitMergeMessages))]
172+
public void ParsesSmartGitMergeMessage(
173+
string message,
174+
string expectedMergedBranch,
175+
string expectedTargetBranch,
176+
SemanticVersion expectedVersion)
177+
{
178+
// Act
179+
var sut = new MergeMessage(message, _config);
180+
181+
// Assert
182+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
183+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
184+
sut.IsMergedPullRequest.ShouldBeFalse();
185+
sut.PullRequestNumber.ShouldBeNull();
186+
sut.Version.ShouldBe(expectedVersion);
187+
}
188+
189+
private static readonly object[] RemoteTrackingMergeMessages =
190+
{
191+
new object[] { "Merge remote-tracking branch 'feature/one' into master", "feature/one", "master", null },
192+
new object[] { "Merge remote-tracking branch 'origin/feature/one' into dev", "origin/feature/one", "dev", null },
193+
new object[] { "Merge remote-tracking branch 'v4.0.0' into master", "v4.0.0", "master", new SemanticVersion(4) },
194+
new object[] { "Merge remote-tracking branch 'V4.0.0' into master", "V4.0.0", "master", new SemanticVersion(4) },
195+
new object[] { "Merge remote-tracking branch 'feature/4.1/one' into dev", "feature/4.1/one", "dev", new SemanticVersion(4, 1) },
196+
new object[] { "Merge remote-tracking branch 'origin/4.1/feature/one' into master", "origin/4.1/feature/one", "master", new SemanticVersion(4, 1) }
197+
};
198+
199+
[TestCaseSource(nameof(RemoteTrackingMergeMessages))]
200+
public void ParsesRemoteTrackingMergeMessage(
201+
string message,
202+
string expectedMergedBranch,
203+
string expectedTargetBranch,
204+
SemanticVersion expectedVersion)
205+
{
206+
// Act
207+
var sut = new MergeMessage(message, _config);
208+
209+
// Assert
210+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
211+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
212+
sut.IsMergedPullRequest.ShouldBeFalse();
213+
sut.PullRequestNumber.ShouldBeNull();
214+
sut.Version.ShouldBe(expectedVersion);
215+
}
216+
}
217+
}

0 commit comments

Comments
 (0)