-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathVersionChangesetCommandTests.cs
More file actions
124 lines (101 loc) · 4.4 KB
/
Copy pathVersionChangesetCommandTests.cs
File metadata and controls
124 lines (101 loc) · 4.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System.Xml;
using AwesomeAssertions;
using Microsoft.Extensions.DependencyInjection;
using SolarWinds.Changesets.Commands.Add;
using SolarWinds.Changesets.Commands.Version;
using SolarWinds.Changesets.Commands.Version.Helpers;
using SolarWinds.Changesets.Infrastructure;
using SolarWinds.Changesets.Shared;
using Spectre.Console.Cli.Testing;
namespace SolarWinds.Changesets.Tests.Version;
[TestFixture]
internal sealed class VersionChangesetCommandTests
{
private const string ChangesetFolder = ".changeset";
private const string SrcFolder = "src";
private const string ChangesetFile = "usarjcqmfu.md";
private const string ChangelogFile = "CHANGELOG.md";
[SetUp]
public void SetUp()
{
string testDataDirectoryFullPath = Path.Join(Environment.CurrentDirectory, "Version", "TestData");
CopyDirectory(testDataDirectoryFullPath, Environment.CurrentDirectory, true, true);
}
[TearDown]
public void TearDown()
{
if (Directory.Exists(SrcFolder))
{
Directory.Delete(SrcFolder, true);
}
if (Directory.Exists(ChangesetFolder))
{
Directory.Delete(ChangesetFolder, true);
}
}
[Test]
public void VersionCommand_HappyPath_FolderAndFilesAreCreated()
{
ServiceCollection serviceCollection = new();
serviceCollection.AddSingleton<IConfigurationService, ConfigurationService>();
serviceCollection.AddSingleton<IProjectFileNamesLocator, CsharpProjectFileNamesLocator>();
serviceCollection.AddSingleton<IChangesetsRepository, ChangesetsRepository>();
serviceCollection.AddSingleton<IChangelogFileWriter, ChangelogFileWriter>();
serviceCollection.AddSingleton<IChangelogGenerator, ChangelogGenerator>();
serviceCollection.AddSingleton<ICsProjectsRepository, CsProjectsRepository>();
TypeRegistrar typeRegistrar = new(serviceCollection);
var app = new CommandAppTester(typeRegistrar);
app.SetDefaultCommand<VersionChangesetCommand>();
CommandAppResult result = app.Run();
result.ExitCode.Should().Be(ResultCodes.Success, result.Output);
AssertVersionOutput();
}
private static void AssertVersionOutput()
{
//changesetfile is deleted
File.Exists(Path.Join(Environment.CurrentDirectory, ChangesetFolder, ChangesetFile)).Should().BeFalse();
//project files are updated
LoadVersionFromProjectFile(Path.Join(Environment.CurrentDirectory, SrcFolder, "ProjectA", "ProjectA.csproj")).Should().BeEquivalentTo(new Semver(1, 0, 2));
LoadVersionFromProjectFile(Path.Join(Environment.CurrentDirectory, SrcFolder, "ProjectB", "ProjectB.csproj")).Should().BeEquivalentTo(new Semver(1, 1, 0));
//changelogs are created
File.Exists(Path.Join(Environment.CurrentDirectory, SrcFolder, "ProjectA", ChangelogFile)).Should().BeTrue();
File.Exists(Path.Join(Environment.CurrentDirectory, SrcFolder, "ProjectB", ChangelogFile)).Should().BeTrue();
}
private static Semver? LoadVersionFromProjectFile(string path)
{
XmlDocument doc = new();
doc.Load(path);
XmlNode? versionNode = doc.DocumentElement?.SelectSingleNode("/Project/PropertyGroup/Version");
if (versionNode != null && Semver.TryParse(versionNode.InnerText, out Semver? parsedVersion))
{
return parsedVersion;
}
return null;
}
private static void CopyDirectory(string sourceDirectory, string destinationDirectory, bool recursive, bool firstRun)
{
DirectoryInfo directoryInfo = new(sourceDirectory);
if (!directoryInfo.Exists)
{
throw new DirectoryNotFoundException($"Source directory not found: '{directoryInfo.FullName}'.");
}
DirectoryInfo[] dirs = directoryInfo.GetDirectories();
if (!firstRun)
{
Directory.CreateDirectory(destinationDirectory);
}
foreach (FileInfo file in directoryInfo.GetFiles())
{
string targetFilePath = Path.Join(destinationDirectory, file.Name);
file.CopyTo(targetFilePath);
}
if (recursive)
{
foreach (DirectoryInfo subDir in dirs)
{
string newDestinationDir = Path.Join(destinationDirectory, subDir.Name);
CopyDirectory(subDir.FullName, newDestinationDir, true, false);
}
}
}
}