Skip to content

Commit c3ca29e

Browse files
authored
Merge pull request #1487 from Kieranties/feature/merge-message-refactor
Refactoring of merge message class
2 parents f7b10f1 + a45fe82 commit c3ca29e

File tree

2 files changed

+188
-165
lines changed

2 files changed

+188
-165
lines changed

src/GitVersionCore.Tests/MergeMessageTests.cs

Lines changed: 133 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,14 @@ public void EmptyTagPrefix(string prefix)
5454

5555
private static readonly object[] MergeMessages =
5656
{
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-
new object[] { "Merge tag 'v://10.10.10.10' into master", "v://10.10.10.10", "master", null }
64-
65-
};
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+
new object[] { "Merge tag 'v://10.10.10.10' into master", "v://10.10.10.10", "master", null }
64+
};
6665

6766
[TestCaseSource(nameof(MergeMessages))]
6867
public void ParsesMergeMessage(
@@ -75,6 +74,7 @@ public void ParsesMergeMessage(
7574
var sut = new MergeMessage(message, _config);
7675

7776
// Assert
77+
sut.MatchDefinition.ShouldBe("Default");
7878
sut.TargetBranch.ShouldBe(expectedTargetBranch);
7979
sut.MergedBranch.ShouldBe(expectedMergedBranch);
8080
sut.IsMergedPullRequest.ShouldBeFalse();
@@ -84,21 +84,14 @@ public void ParsesMergeMessage(
8484

8585
private static readonly object[] GitHubPullPullMergeMessages =
8686
{
87-
new object[] { "Merge pull request #1234 from feature/one", "feature/one", null, null, 1234 },
88-
new object[] { "Merge pull request #1234 in feature/one", "feature/one", null, null, 1234 },
89-
new object[] { "Merge pull request #1234 in v4.0.0", "v4.0.0", null, new SemanticVersion(4), 1234 },
90-
new object[] { "Merge pull request #1234 in V4.0.0", "V4.0.0", null, new SemanticVersion(4), 1234 },
91-
new object[] { "Merge pull request #1234 from origin/feature/one", "origin/feature/one", null, null, 1234 },
92-
new object[] { "Merge pull request #1234 in feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4,1), 1234 },
93-
new object[] { "Merge pull request #1234 in V://10.10.10.10", "V://10.10.10.10", null, null, 1234 },
94-
95-
96-
//TODO: Investigate successful github merge messages that may be invalid
97-
// Should an empty PR number be valid?
98-
new object[] { "Merge pull request # from feature/one", "feature/one", null, null, 0 },
99-
// The branch name appears to be incorrect
100-
new object[] { "Merge pull request #1234 from feature/one into dev", "feature/one into dev", "dev", null, 1234 },
101-
};
87+
new object[] { "Merge pull request #1234 from feature/one", "feature/one", null, null, 1234 },
88+
new object[] { "Merge pull request #1234 in feature/one", "feature/one", null, null, 1234 },
89+
new object[] { "Merge pull request #1234 in v4.0.0", "v4.0.0", null, new SemanticVersion(4), 1234 },
90+
new object[] { "Merge pull request #1234 from origin/feature/one", "origin/feature/one", null, null, 1234 },
91+
new object[] { "Merge pull request #1234 in feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4,1), 1234 },
92+
new object[] { "Merge pull request #1234 in V://10.10.10.10", "V://10.10.10.10", null, null, 1234 },
93+
new object[] { "Merge pull request #1234 from feature/one into dev", "feature/one", "dev", null, 1234 }
94+
};
10295

10396
[TestCaseSource(nameof(GitHubPullPullMergeMessages))]
10497
public void ParsesGitHubPullMergeMessage(
@@ -112,6 +105,7 @@ public void ParsesGitHubPullMergeMessage(
112105
var sut = new MergeMessage(message, _config);
113106

114107
// Assert
108+
sut.MatchDefinition.ShouldBe("GitHubPull");
115109
sut.TargetBranch.ShouldBe(expectedTargetBranch);
116110
sut.MergedBranch.ShouldBe(expectedMergedBranch);
117111
sut.IsMergedPullRequest.ShouldBeTrue();
@@ -121,23 +115,17 @@ public void ParsesGitHubPullMergeMessage(
121115

122116
private static readonly object[] BitBucketPullMergeMessages =
123117
{
124-
new object[] { "Merge pull request #1234 from feature/one from feature/two to dev", "feature/two", null, null, 1234 },
125-
new object[] { "Merge pull request #1234 in feature/one from feature/two to dev", "feature/two", null, null, 1234 },
126-
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 },
127-
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 },
128-
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 },
129-
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 },
130-
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 },
131-
new object[] { "Merge pull request #1234 in V4.1.0 from V://10.10.10.10 to dev", "V://10.10.10.10", null, null, 1234 },
132-
//TODO: Investigate successful bitbucket merge messages that may be invalid
133-
// Regex has double 'from/in from' section. Is that correct?
134-
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 },
135-
new object[] { "Merge pull request #1234 from feature/one from v4.0.0 to master", "v4.0.0", null, new SemanticVersion(4), 1234 },
136-
// target branch is not resolved from targetbranch group
137-
new object[] { "Merge pull request #1234 from feature/one from feature/two to master" , "feature/two", null, null, 1234 },
138-
// Should an empty PR number be valid?
139-
new object[] { "Merge pull request # in feature/one from feature/two to master" , "feature/two", null, null, 0 }
140-
};
118+
new object[] { "Merge pull request #1234 from feature/one from feature/two to dev", "feature/two", "dev", null, 1234 },
119+
new object[] { "Merge pull request #1234 in feature/one from feature/two to dev", "feature/two", "dev", null, 1234 },
120+
new object[] { "Merge pull request #1234 in v4.0.0 from v4.1.0 to dev", "v4.1.0", "dev", new SemanticVersion(4,1), 1234 },
121+
new object[] { "Merge pull request #1234 from origin/feature/one from origin/feature/4.2/two to dev", "origin/feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
122+
new object[] { "Merge pull request #1234 in feature/4.1/one from feature/4.2/two to dev", "feature/4.2/two", "dev", new SemanticVersion(4,2), 1234 },
123+
new object[] { "Merge pull request #1234 from feature/one from feature/two to master" , "feature/two", "master", null, 1234 },
124+
new object[] { "Merge pull request #1234 in V4.1.0 from V://10.10.10.10 to dev", "V://10.10.10.10", "dev", null, 1234 },
125+
//TODO: Investigate successful bitbucket merge messages that may be invalid
126+
// Regex has double 'from/in from' section. Is that correct?
127+
new object[] { "Merge pull request #1234 from feature/one from v4.0.0 to master", "v4.0.0", "master", new SemanticVersion(4), 1234 }
128+
};
141129

142130
[TestCaseSource(nameof(BitBucketPullMergeMessages))]
143131
public void ParsesBitBucketPullMergeMessage(
@@ -151,26 +139,25 @@ public void ParsesBitBucketPullMergeMessage(
151139
var sut = new MergeMessage(message, _config);
152140

153141
// Assert
142+
sut.MatchDefinition.ShouldBe("BitBucketPull");
154143
sut.TargetBranch.ShouldBe(expectedTargetBranch);
155144
sut.MergedBranch.ShouldBe(expectedMergedBranch);
156145
sut.IsMergedPullRequest.ShouldBeTrue();
157146
sut.PullRequestNumber.ShouldBe(expectedPullRequestNumber);
158147
sut.Version.ShouldBe(expectedVersion);
159148
}
160149

150+
161151
private static readonly object[] SmartGitMergeMessages =
162152
{
163-
new object[] { "Finish feature/one", "feature/one", null, null },
164-
new object[] { "Finish origin/feature/one", "origin/feature/one", null, null },
165-
new object[] { "Finish v4.0.0", "v4.0.0", null, new SemanticVersion(4) },
166-
new object[] { "Finish feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4, 1) },
167-
new object[] { "Finish origin/4.1/feature/one", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) },
168-
new object[] { "Finish V://10.10.10.10", "V://10.10.10.10", null, null },
169-
170-
//TODO: Investigate successful smart git merge messages that may be invalid
171-
// The branch name appears to be incorrect
172-
new object[] { "Finish V4.0.0 into master", "V4.0.0 into master", "master", new SemanticVersion(4) }
173-
};
153+
new object[] { "Finish feature/one", "feature/one", null, null },
154+
new object[] { "Finish origin/feature/one", "origin/feature/one", null, null },
155+
new object[] { "Finish v4.0.0", "v4.0.0", null, new SemanticVersion(4) },
156+
new object[] { "Finish feature/4.1/one", "feature/4.1/one", null, new SemanticVersion(4, 1) },
157+
new object[] { "Finish origin/4.1/feature/one", "origin/4.1/feature/one", null, new SemanticVersion(4, 1) },
158+
new object[] { "Finish V://10.10.10.10", "V://10.10.10.10", null, null },
159+
new object[] { "Finish V4.0.0 into master", "V4.0.0", "master", new SemanticVersion(4) }
160+
};
174161

175162
[TestCaseSource(nameof(SmartGitMergeMessages))]
176163
public void ParsesSmartGitMergeMessage(
@@ -183,6 +170,7 @@ public void ParsesSmartGitMergeMessage(
183170
var sut = new MergeMessage(message, _config);
184171

185172
// Assert
173+
sut.MatchDefinition.ShouldBe("SmartGit");
186174
sut.TargetBranch.ShouldBe(expectedTargetBranch);
187175
sut.MergedBranch.ShouldBe(expectedMergedBranch);
188176
sut.IsMergedPullRequest.ShouldBeFalse();
@@ -192,14 +180,14 @@ public void ParsesSmartGitMergeMessage(
192180

193181
private static readonly object[] RemoteTrackingMergeMessages =
194182
{
195-
new object[] { "Merge remote-tracking branch 'feature/one' into master", "feature/one", "master", null },
196-
new object[] { "Merge remote-tracking branch 'origin/feature/one' into dev", "origin/feature/one", "dev", null },
197-
new object[] { "Merge remote-tracking branch 'v4.0.0' into master", "v4.0.0", "master", new SemanticVersion(4) },
198-
new object[] { "Merge remote-tracking branch 'V4.0.0' into master", "V4.0.0", "master", new SemanticVersion(4) },
199-
new object[] { "Merge remote-tracking branch 'feature/4.1/one' into dev", "feature/4.1/one", "dev", new SemanticVersion(4, 1) },
200-
new object[] { "Merge remote-tracking branch 'origin/4.1/feature/one' into master", "origin/4.1/feature/one", "master", new SemanticVersion(4, 1) },
201-
new object[] { "Merge remote-tracking branch 'v://10.10.10.10' into master", "v://10.10.10.10", "master", null }
202-
};
183+
new object[] { "Merge remote-tracking branch 'feature/one' into master", "feature/one", "master", null },
184+
new object[] { "Merge remote-tracking branch 'origin/feature/one' into dev", "origin/feature/one", "dev", null },
185+
new object[] { "Merge remote-tracking branch 'v4.0.0' into master", "v4.0.0", "master", new SemanticVersion(4) },
186+
new object[] { "Merge remote-tracking branch 'V4.0.0' into master", "V4.0.0", "master", new SemanticVersion(4) },
187+
new object[] { "Merge remote-tracking branch 'feature/4.1/one' into dev", "feature/4.1/one", "dev", new SemanticVersion(4, 1) },
188+
new object[] { "Merge remote-tracking branch 'origin/4.1/feature/one' into master", "origin/4.1/feature/one", "master", new SemanticVersion(4, 1) },
189+
new object[] { "Merge remote-tracking branch 'v://10.10.10.10' into master", "v://10.10.10.10", "master", null }
190+
};
203191

204192
[TestCaseSource(nameof(RemoteTrackingMergeMessages))]
205193
public void ParsesRemoteTrackingMergeMessage(
@@ -212,11 +200,96 @@ public void ParsesRemoteTrackingMergeMessage(
212200
var sut = new MergeMessage(message, _config);
213201

214202
// Assert
203+
sut.MatchDefinition.ShouldBe("RemoteTracking");
215204
sut.TargetBranch.ShouldBe(expectedTargetBranch);
216205
sut.MergedBranch.ShouldBe(expectedMergedBranch);
217206
sut.IsMergedPullRequest.ShouldBeFalse();
218207
sut.PullRequestNumber.ShouldBeNull();
219208
sut.Version.ShouldBe(expectedVersion);
220209
}
210+
211+
private static readonly object[] ParsesTfsEnglishUSMergeMessages =
212+
{
213+
new object[] { "Merge feature/one to master", "feature/one", "master", null },
214+
new object[] { "Merge v://10.10.10.10 to master", "v://10.10.10.10", "master", null },
215+
new object[] { "Merge feature/one to v://10.10.10.10", "feature/one", "v://10.10.10.10", null },
216+
new object[] { "Merge V4.0.0 to master", "V4.0.0", "master", new SemanticVersion(4) },
217+
new object[] { "Merge feature/4.1/one to master", "feature/4.1/one", "master", new SemanticVersion(4, 1) }
218+
};
219+
220+
[TestCaseSource(nameof(ParsesTfsEnglishUSMergeMessages))]
221+
public void ParsesTfsEnglishUSMessage(
222+
string message,
223+
string expectedMergedBranch,
224+
string expectedTargetBranch,
225+
SemanticVersion expectedVersion)
226+
{
227+
// Act
228+
var sut = new MergeMessage(message, _config);
229+
230+
// Assert
231+
sut.MatchDefinition.ShouldBe("TfsMergeMessageEnglishUS");
232+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
233+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
234+
sut.IsMergedPullRequest.ShouldBeFalse();
235+
sut.PullRequestNumber.ShouldBeNull();
236+
sut.Version.ShouldBe(expectedVersion);
237+
}
238+
239+
private static readonly object[] ParsesTfsGermanDEMergeMessages =
240+
{
241+
new object[] { "Zusammengeführter PR \"1234\": feature/one mit master mergen", "feature/one", "master", null, 1234 },
242+
new object[] { "Zusammengeführter PR \"1234\": v://10.10.10.10 mit master mergen", "v://10.10.10.10", "master", null, 1234 },
243+
new object[] { "Zusammengeführter PR \"1234\": feature/one mit v://10.10.10.10 mergen", "feature/one", "v://10.10.10.10", null, 1234 },
244+
new object[] { "Zusammengeführter PR \"1234\": V4.0.0 mit master mergen", "V4.0.0", "master", new SemanticVersion(4), 1234 },
245+
new object[] { "Zusammengeführter PR \"1234\": feature/4.1/one mit master mergen", "feature/4.1/one", "master", new SemanticVersion(4, 1), 1234 }
246+
};
247+
248+
[TestCaseSource(nameof(ParsesTfsGermanDEMergeMessages))]
249+
public void ParseTfsGermanDEMessage(
250+
string message,
251+
string expectedMergedBranch,
252+
string expectedTargetBranch,
253+
SemanticVersion expectedVersion,
254+
int? expectedPullRequestNumber)
255+
{
256+
// Act
257+
var sut = new MergeMessage(message, _config);
258+
259+
// Assert
260+
sut.MatchDefinition.ShouldBe("TfsMergeMessageGermanDE");
261+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
262+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
263+
sut.IsMergedPullRequest.ShouldBeTrue();
264+
sut.PullRequestNumber.ShouldBe(expectedPullRequestNumber);
265+
sut.Version.ShouldBe(expectedVersion);
266+
}
267+
268+
private static readonly object[] InvalidMergeMessages =
269+
{
270+
new object[] { "Merge pull request # from feature/one", "", null, null, null },
271+
new object[] { "Merge pull request # in feature/one from feature/two to master" , "", null, null, null },
272+
new object[] { "Zusammengeführter PR : feature/one mit master mergen", "", null, null, null }
273+
};
274+
275+
[TestCaseSource(nameof(InvalidMergeMessages))]
276+
public void ParsesInvalidMergeMessage(
277+
string message,
278+
string expectedMergedBranch,
279+
string expectedTargetBranch,
280+
SemanticVersion expectedVersion,
281+
int? expectedPullRequestNumber)
282+
{
283+
// Act
284+
var sut = new MergeMessage(message, _config);
285+
286+
// Assert
287+
sut.MatchDefinition.ShouldBeNull();
288+
sut.TargetBranch.ShouldBe(expectedTargetBranch);
289+
sut.MergedBranch.ShouldBe(expectedMergedBranch);
290+
sut.IsMergedPullRequest.ShouldBeFalse();
291+
sut.PullRequestNumber.ShouldBe(expectedPullRequestNumber);
292+
sut.Version.ShouldBe(expectedVersion);
293+
}
221294
}
222295
}

0 commit comments

Comments
 (0)