Skip to content

Commit ce9590f

Browse files
authored
Merge pull request #14 from Mythetech/feat/plugin-management-dialog
feat: add plugin management dialog and registry service
2 parents fd52a38 + 1b8a7e3 commit ce9590f

File tree

13 files changed

+1189
-11
lines changed

13 files changed

+1189
-11
lines changed
Lines changed: 385 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,385 @@
1+
using System.Reflection;
2+
using Mythetech.Framework.Infrastructure.Plugins;
3+
using NSubstitute;
4+
using Shouldly;
5+
6+
namespace Mythetech.Framework.Test.Infrastructure.Plugins;
7+
8+
public class PluginInfoTests
9+
{
10+
#region ParseVersion Tests
11+
12+
[Fact(DisplayName = "ParseVersion parses valid version string")]
13+
public void ParseVersion_ValidString_ReturnsVersion()
14+
{
15+
// Act
16+
var result = PluginInfo.ParseVersion("1.0.0");
17+
18+
// Assert
19+
result.ShouldNotBeNull();
20+
result.Major.ShouldBe(1);
21+
result.Minor.ShouldBe(0);
22+
result.Build.ShouldBe(0);
23+
}
24+
25+
[Fact(DisplayName = "ParseVersion parses version with build and revision")]
26+
public void ParseVersion_WithBuildAndRevision_ReturnsVersion()
27+
{
28+
// Act
29+
var result = PluginInfo.ParseVersion("2.5.3.10");
30+
31+
// Assert
32+
result.ShouldNotBeNull();
33+
result.Major.ShouldBe(2);
34+
result.Minor.ShouldBe(5);
35+
result.Build.ShouldBe(3);
36+
result.Revision.ShouldBe(10);
37+
}
38+
39+
[Fact(DisplayName = "ParseVersion returns null for null string")]
40+
public void ParseVersion_NullString_ReturnsNull()
41+
{
42+
// Act
43+
var result = PluginInfo.ParseVersion(null!);
44+
45+
// Assert
46+
result.ShouldBeNull();
47+
}
48+
49+
[Fact(DisplayName = "ParseVersion returns null for empty string")]
50+
public void ParseVersion_EmptyString_ReturnsNull()
51+
{
52+
// Act
53+
var result = PluginInfo.ParseVersion(string.Empty);
54+
55+
// Assert
56+
result.ShouldBeNull();
57+
}
58+
59+
[Fact(DisplayName = "ParseVersion returns null for whitespace string")]
60+
public void ParseVersion_WhitespaceString_ReturnsNull()
61+
{
62+
// Act
63+
var result = PluginInfo.ParseVersion(" ");
64+
65+
// Assert
66+
result.ShouldBeNull();
67+
}
68+
69+
[Fact(DisplayName = "ParseVersion returns null for invalid version string")]
70+
public void ParseVersion_InvalidString_ReturnsNull()
71+
{
72+
// Act
73+
var result = PluginInfo.ParseVersion("not-a-version");
74+
75+
// Assert
76+
result.ShouldBeNull();
77+
}
78+
79+
#endregion
80+
81+
#region CompareVersion Tests
82+
83+
[Fact(DisplayName = "CompareVersion returns positive when this version is newer")]
84+
public void CompareVersion_ThisNewer_ReturnsPositive()
85+
{
86+
// Arrange
87+
var plugin = CreatePluginInfo(new Version(2, 0, 0));
88+
var otherVersion = new Version(1, 0, 0);
89+
90+
// Act
91+
var result = plugin.CompareVersion(otherVersion);
92+
93+
// Assert
94+
result.ShouldBeGreaterThan(0);
95+
}
96+
97+
[Fact(DisplayName = "CompareVersion returns zero when versions are the same")]
98+
public void CompareVersion_SameVersion_ReturnsZero()
99+
{
100+
// Arrange
101+
var version = new Version(1, 0, 0);
102+
var plugin = CreatePluginInfo(version);
103+
var otherVersion = new Version(1, 0, 0);
104+
105+
// Act
106+
var result = plugin.CompareVersion(otherVersion);
107+
108+
// Assert
109+
result.ShouldBe(0);
110+
}
111+
112+
[Fact(DisplayName = "CompareVersion returns negative when this version is older")]
113+
public void CompareVersion_ThisOlder_ReturnsNegative()
114+
{
115+
// Arrange
116+
var plugin = CreatePluginInfo(new Version(1, 0, 0));
117+
var otherVersion = new Version(2, 0, 0);
118+
119+
// Act
120+
var result = plugin.CompareVersion(otherVersion);
121+
122+
// Assert
123+
result.ShouldBeLessThan(0);
124+
}
125+
126+
[Fact(DisplayName = "CompareVersion compares minor version")]
127+
public void CompareVersion_ComparesMinorVersion()
128+
{
129+
// Arrange
130+
var plugin = CreatePluginInfo(new Version(1, 2, 0));
131+
var otherVersion = new Version(1, 1, 0);
132+
133+
// Act
134+
var result = plugin.CompareVersion(otherVersion);
135+
136+
// Assert
137+
result.ShouldBeGreaterThan(0);
138+
}
139+
140+
[Fact(DisplayName = "CompareVersion compares build version")]
141+
public void CompareVersion_ComparesBuildVersion()
142+
{
143+
// Arrange
144+
var plugin = CreatePluginInfo(new Version(1, 0, 2));
145+
var otherVersion = new Version(1, 0, 1);
146+
147+
// Act
148+
var result = plugin.CompareVersion(otherVersion);
149+
150+
// Assert
151+
result.ShouldBeGreaterThan(0);
152+
}
153+
154+
[Fact(DisplayName = "CompareVersion throws ArgumentNullException for null version")]
155+
public void CompareVersion_NullVersion_ThrowsArgumentNullException()
156+
{
157+
// Arrange
158+
var plugin = CreatePluginInfo(new Version(1, 0, 0));
159+
160+
// Act & Assert
161+
Should.Throw<ArgumentNullException>(() => plugin.CompareVersion(null!));
162+
}
163+
164+
#endregion
165+
166+
#region IsNewerThan Tests
167+
168+
[Fact(DisplayName = "IsNewerThan returns true when this version is newer")]
169+
public void IsNewerThan_ThisNewer_ReturnsTrue()
170+
{
171+
// Arrange
172+
var plugin = CreatePluginInfo(new Version(2, 0, 0));
173+
var otherVersion = new Version(1, 0, 0);
174+
175+
// Act
176+
var result = plugin.IsNewerThan(otherVersion);
177+
178+
// Assert
179+
result.ShouldBeTrue();
180+
}
181+
182+
[Fact(DisplayName = "IsNewerThan returns false when versions are the same")]
183+
public void IsNewerThan_SameVersion_ReturnsFalse()
184+
{
185+
// Arrange
186+
var version = new Version(1, 0, 0);
187+
var plugin = CreatePluginInfo(version);
188+
var otherVersion = new Version(1, 0, 0);
189+
190+
// Act
191+
var result = plugin.IsNewerThan(otherVersion);
192+
193+
// Assert
194+
result.ShouldBeFalse();
195+
}
196+
197+
[Fact(DisplayName = "IsNewerThan returns false when this version is older")]
198+
public void IsNewerThan_ThisOlder_ReturnsFalse()
199+
{
200+
// Arrange
201+
var plugin = CreatePluginInfo(new Version(1, 0, 0));
202+
var otherVersion = new Version(2, 0, 0);
203+
204+
// Act
205+
var result = plugin.IsNewerThan(otherVersion);
206+
207+
// Assert
208+
result.ShouldBeFalse();
209+
}
210+
211+
#endregion
212+
213+
#region IsSameVersion Tests
214+
215+
[Fact(DisplayName = "IsSameVersion returns true when versions are the same")]
216+
public void IsSameVersion_SameVersion_ReturnsTrue()
217+
{
218+
// Arrange
219+
var version = new Version(1, 0, 0);
220+
var plugin = CreatePluginInfo(version);
221+
var otherVersion = new Version(1, 0, 0);
222+
223+
// Act
224+
var result = plugin.IsSameVersion(otherVersion);
225+
226+
// Assert
227+
result.ShouldBeTrue();
228+
}
229+
230+
[Fact(DisplayName = "IsSameVersion returns false when this version is newer")]
231+
public void IsSameVersion_ThisNewer_ReturnsFalse()
232+
{
233+
// Arrange
234+
var plugin = CreatePluginInfo(new Version(2, 0, 0));
235+
var otherVersion = new Version(1, 0, 0);
236+
237+
// Act
238+
var result = plugin.IsSameVersion(otherVersion);
239+
240+
// Assert
241+
result.ShouldBeFalse();
242+
}
243+
244+
[Fact(DisplayName = "IsSameVersion returns false when this version is older")]
245+
public void IsSameVersion_ThisOlder_ReturnsFalse()
246+
{
247+
// Arrange
248+
var plugin = CreatePluginInfo(new Version(1, 0, 0));
249+
var otherVersion = new Version(2, 0, 0);
250+
251+
// Act
252+
var result = plugin.IsSameVersion(otherVersion);
253+
254+
// Assert
255+
result.ShouldBeFalse();
256+
}
257+
258+
#endregion
259+
260+
#region IsOlderThan Tests
261+
262+
[Fact(DisplayName = "IsOlderThan returns true when this version is older")]
263+
public void IsOlderThan_ThisOlder_ReturnsTrue()
264+
{
265+
// Arrange
266+
var plugin = CreatePluginInfo(new Version(1, 0, 0));
267+
var otherVersion = new Version(2, 0, 0);
268+
269+
// Act
270+
var result = plugin.IsOlderThan(otherVersion);
271+
272+
// Assert
273+
result.ShouldBeTrue();
274+
}
275+
276+
[Fact(DisplayName = "IsOlderThan returns false when versions are the same")]
277+
public void IsOlderThan_SameVersion_ReturnsFalse()
278+
{
279+
// Arrange
280+
var version = new Version(1, 0, 0);
281+
var plugin = CreatePluginInfo(version);
282+
var otherVersion = new Version(1, 0, 0);
283+
284+
// Act
285+
var result = plugin.IsOlderThan(otherVersion);
286+
287+
// Assert
288+
result.ShouldBeFalse();
289+
}
290+
291+
[Fact(DisplayName = "IsOlderThan returns false when this version is newer")]
292+
public void IsOlderThan_ThisNewer_ReturnsFalse()
293+
{
294+
// Arrange
295+
var plugin = CreatePluginInfo(new Version(2, 0, 0));
296+
var otherVersion = new Version(1, 0, 0);
297+
298+
// Act
299+
var result = plugin.IsOlderThan(otherVersion);
300+
301+
// Assert
302+
result.ShouldBeFalse();
303+
}
304+
305+
#endregion
306+
307+
#region Integration Tests
308+
309+
[Fact(DisplayName = "Version comparison methods work together correctly for upgrade scenario")]
310+
public void VersionComparison_UpgradeScenario_WorksCorrectly()
311+
{
312+
// Arrange
313+
var installedPlugin = CreatePluginInfo(new Version(1, 0, 0));
314+
var registryVersion = new Version(2, 0, 0);
315+
316+
// Act & Assert
317+
installedPlugin.IsOlderThan(registryVersion).ShouldBeTrue();
318+
installedPlugin.IsNewerThan(registryVersion).ShouldBeFalse();
319+
installedPlugin.IsSameVersion(registryVersion).ShouldBeFalse();
320+
}
321+
322+
[Fact(DisplayName = "Version comparison methods work together correctly for downgrade scenario")]
323+
public void VersionComparison_DowngradeScenario_WorksCorrectly()
324+
{
325+
// Arrange
326+
var installedPlugin = CreatePluginInfo(new Version(2, 0, 0));
327+
var registryVersion = new Version(1, 0, 0);
328+
329+
// Act & Assert
330+
installedPlugin.IsOlderThan(registryVersion).ShouldBeFalse();
331+
installedPlugin.IsNewerThan(registryVersion).ShouldBeTrue();
332+
installedPlugin.IsSameVersion(registryVersion).ShouldBeFalse();
333+
}
334+
335+
[Fact(DisplayName = "Version comparison methods work together correctly for identical scenario")]
336+
public void VersionComparison_IdenticalScenario_WorksCorrectly()
337+
{
338+
// Arrange
339+
var version = new Version(1, 0, 0);
340+
var installedPlugin = CreatePluginInfo(version);
341+
var registryVersion = new Version(1, 0, 0);
342+
343+
// Act & Assert
344+
installedPlugin.IsOlderThan(registryVersion).ShouldBeFalse();
345+
installedPlugin.IsNewerThan(registryVersion).ShouldBeFalse();
346+
installedPlugin.IsSameVersion(registryVersion).ShouldBeTrue();
347+
}
348+
349+
[Fact(DisplayName = "ParseVersion and version comparison work together")]
350+
public void ParseVersion_AndComparison_WorkTogether()
351+
{
352+
// Arrange
353+
var installedPlugin = CreatePluginInfo(new Version(1, 0, 0));
354+
var registryVersionString = "2.0.0";
355+
var registryVersion = PluginInfo.ParseVersion(registryVersionString);
356+
357+
// Act & Assert
358+
registryVersion.ShouldNotBeNull();
359+
installedPlugin.IsOlderThan(registryVersion).ShouldBeTrue();
360+
}
361+
362+
#endregion
363+
364+
#region Helper Methods
365+
366+
private static PluginInfo CreatePluginInfo(Version version)
367+
{
368+
var manifest = Substitute.For<IPluginManifest>();
369+
manifest.Id.Returns("test.plugin");
370+
manifest.Name.Returns("Test Plugin");
371+
manifest.Version.Returns(version);
372+
manifest.Developer.Returns("Test Developer");
373+
manifest.Description.Returns("Test Description");
374+
375+
return new PluginInfo
376+
{
377+
Manifest = manifest,
378+
Assembly = typeof(PluginInfoTests).Assembly,
379+
IsEnabled = true
380+
};
381+
}
382+
383+
#endregion
384+
}
385+

0 commit comments

Comments
 (0)