diff --git a/Directory.Packages.props b/Directory.Packages.props index 99cf5134..98922233 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,6 +6,7 @@ + diff --git a/ScriptBee.Marketplace.Client/Data/PluginVersion.cs b/ScriptBee.Marketplace.Client/Data/PluginVersion.cs deleted file mode 100644 index 76f26478..00000000 --- a/ScriptBee.Marketplace.Client/Data/PluginVersion.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace ScriptBee.Marketplace.Client.Data; - -public record PluginVersion( - string Url, - Version Version, - string ManifestUrl -); diff --git a/ScriptBee.Marketplace.Client/ScriptBee.Marketplace.Client.csproj b/ScriptBee.Marketplace.Client/ScriptBee.Marketplace.Client.csproj deleted file mode 100644 index 22e7d230..00000000 --- a/ScriptBee.Marketplace.Client/ScriptBee.Marketplace.Client.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - net6.0 - enable - enable - - - - - - - - - diff --git a/ScriptBee.sln b/ScriptBee.sln index 248db6cd..42eb3962 100644 --- a/ScriptBee.sln +++ b/ScriptBee.sln @@ -71,6 +71,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Service.Plugin.Tests", "tes EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Service.Plugin", "src\Application\Domain\Service.Plugin\Service.Plugin.csproj", "{23230FA8-50CC-4883-ABC3-8BA66BC92023}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marketplace.Client", "src\Adapters\Driven\Marketplace.Client\Marketplace.Client.csproj", "{D8626754-E493-456D-A809-9AA76677E8F8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Marketplace.Client.Tests", "test\Adapters\Driven\Marketplace.Client.Tests\Marketplace.Client.Tests.csproj", "{6B16EF85-94DA-427B-ADAA-55565AC89287}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -217,5 +221,13 @@ Global {23230FA8-50CC-4883-ABC3-8BA66BC92023}.Debug|Any CPU.Build.0 = Debug|Any CPU {23230FA8-50CC-4883-ABC3-8BA66BC92023}.Release|Any CPU.ActiveCfg = Release|Any CPU {23230FA8-50CC-4883-ABC3-8BA66BC92023}.Release|Any CPU.Build.0 = Release|Any CPU + {D8626754-E493-456D-A809-9AA76677E8F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8626754-E493-456D-A809-9AA76677E8F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8626754-E493-456D-A809-9AA76677E8F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8626754-E493-456D-A809-9AA76677E8F8}.Release|Any CPU.Build.0 = Release|Any CPU + {6B16EF85-94DA-427B-ADAA-55565AC89287}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6B16EF85-94DA-427B-ADAA-55565AC89287}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B16EF85-94DA-427B-ADAA-55565AC89287}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6B16EF85-94DA-427B-ADAA-55565AC89287}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/ScriptBee.Marketplace.Client/Data/MarketPlaceProject.cs b/src/Adapters/Driven/Marketplace.Client/Data/MarketPlaceProject.cs similarity index 95% rename from ScriptBee.Marketplace.Client/Data/MarketPlaceProject.cs rename to src/Adapters/Driven/Marketplace.Client/Data/MarketPlaceProject.cs index 8443e1de..214ef783 100644 --- a/ScriptBee.Marketplace.Client/Data/MarketPlaceProject.cs +++ b/src/Adapters/Driven/Marketplace.Client/Data/MarketPlaceProject.cs @@ -3,7 +3,7 @@ public enum MarketPlaceProjectType { Plugin, - Bundle + Bundle, } public record MarketPlaceProject( diff --git a/src/Adapters/Driven/Marketplace.Client/Data/PluginVersion.cs b/src/Adapters/Driven/Marketplace.Client/Data/PluginVersion.cs new file mode 100644 index 00000000..b3320191 --- /dev/null +++ b/src/Adapters/Driven/Marketplace.Client/Data/PluginVersion.cs @@ -0,0 +1,3 @@ +namespace ScriptBee.Marketplace.Client.Data; + +public record PluginVersion(string Url, Version Version, string ManifestUrl); diff --git a/src/Adapters/Driven/Marketplace.Client/Marketplace.Client.csproj b/src/Adapters/Driven/Marketplace.Client/Marketplace.Client.csproj new file mode 100644 index 00000000..4818612f --- /dev/null +++ b/src/Adapters/Driven/Marketplace.Client/Marketplace.Client.csproj @@ -0,0 +1,12 @@ + + + + ScriptBee.Marketplace.Client + + + + + + + + diff --git a/ScriptBee.Marketplace.Client/ScriptBeeMarketplaceClientExtensions.cs b/src/Adapters/Driven/Marketplace.Client/ScriptBeeMarketplaceClientExtensions.cs similarity index 90% rename from ScriptBee.Marketplace.Client/ScriptBeeMarketplaceClientExtensions.cs rename to src/Adapters/Driven/Marketplace.Client/ScriptBeeMarketplaceClientExtensions.cs index 11250b91..a1aa1182 100644 --- a/ScriptBee.Marketplace.Client/ScriptBeeMarketplaceClientExtensions.cs +++ b/src/Adapters/Driven/Marketplace.Client/ScriptBeeMarketplaceClientExtensions.cs @@ -6,8 +6,10 @@ namespace ScriptBee.Marketplace.Client; public static class ScriptBeeMarketplaceClientExtensions { - public static IServiceCollection AddScriptBeeMarketplaceClient(this IServiceCollection services, - Action? configureOptionsAction = null) + public static IServiceCollection AddScriptBeeMarketplaceClient( + this IServiceCollection services, + Action? configureOptionsAction = null + ) { services.AddDxWorksHubSdk(configureOptionsAction); services.AddSingleton(); diff --git a/ScriptBee.Marketplace.Client/Services/IMarketPluginFetcher.cs b/src/Adapters/Driven/Marketplace.Client/Services/IMarketPluginFetcher.cs similarity index 100% rename from ScriptBee.Marketplace.Client/Services/IMarketPluginFetcher.cs rename to src/Adapters/Driven/Marketplace.Client/Services/IMarketPluginFetcher.cs diff --git a/ScriptBee.Marketplace.Client/Services/MarketPluginFetcher.cs b/src/Adapters/Driven/Marketplace.Client/Services/MarketPluginFetcher.cs similarity index 52% rename from ScriptBee.Marketplace.Client/Services/MarketPluginFetcher.cs rename to src/Adapters/Driven/Marketplace.Client/Services/MarketPluginFetcher.cs index 5c35e0fb..eccbbd6e 100644 --- a/ScriptBee.Marketplace.Client/Services/MarketPluginFetcher.cs +++ b/src/Adapters/Driven/Marketplace.Client/Services/MarketPluginFetcher.cs @@ -4,35 +4,26 @@ namespace ScriptBee.Marketplace.Client.Services; -public sealed class MarketPluginFetcher : IMarketPluginFetcher +public sealed class MarketPluginFetcher(IScriptBeeClient hubClient) : IMarketPluginFetcher { - private readonly IScriptBeeClient _hubClient; - - - public MarketPluginFetcher(IScriptBeeClient hubClient) - { - _hubClient = hubClient; - } - public async Task UpdateRepositoryAsync(CancellationToken cancellationToken = default) { - await _hubClient.UpdateRepositoryAsync(cancellationToken); + await hubClient.UpdateRepositoryAsync(cancellationToken); } public IEnumerable GetProjectsAsync() { - return _hubClient.GetScriptBeeProjects() - .Select(ConvertToPlugin); + return hubClient.GetScriptBeeProjects().Select(ConvertToPlugin); } private static MarketPlaceProject ConvertToPlugin(ScriptBeeProject project) { - var projectType = project.Type == ScriptBeeProjectTypes.Bundle - ? MarketPlaceProjectType.Bundle - : MarketPlaceProjectType.Plugin; + var projectType = + project.Type == ScriptBeeProjectTypes.Bundle + ? MarketPlaceProjectType.Bundle + : MarketPlaceProjectType.Plugin; - return new MarketPlaceProject - ( + return new MarketPlaceProject( project.Id, project.Name, projectType, @@ -44,11 +35,6 @@ private static MarketPlaceProject ConvertToPlugin(ScriptBeeProject project) private static PluginVersion ConvertToPluginVersion(ScriptBeeProjectVersion version) { - return new PluginVersion - ( - version.DownloadUrl, - version.Version, - version.Manifest - ); + return new PluginVersion(version.DownloadUrl, version.Version, version.Manifest); } } diff --git a/test/Adapters/Driven/Marketplace.Client.Tests/Marketplace.Client.Tests.csproj b/test/Adapters/Driven/Marketplace.Client.Tests/Marketplace.Client.Tests.csproj new file mode 100644 index 00000000..a93e8b1c --- /dev/null +++ b/test/Adapters/Driven/Marketplace.Client.Tests/Marketplace.Client.Tests.csproj @@ -0,0 +1,11 @@ + + + + ScriptBee.Marketplace.Client.Tests + + + + + + + diff --git a/test/Adapters/Driven/Marketplace.Client.Tests/Services/MarketPluginFetcherTest.cs b/test/Adapters/Driven/Marketplace.Client.Tests/Services/MarketPluginFetcherTest.cs new file mode 100644 index 00000000..566157f6 --- /dev/null +++ b/test/Adapters/Driven/Marketplace.Client.Tests/Services/MarketPluginFetcherTest.cs @@ -0,0 +1,112 @@ +using DxWorks.Hub.Sdk.Clients; +using DxWorks.Hub.Sdk.Project; +using NSubstitute; +using ScriptBee.Marketplace.Client.Data; +using ScriptBee.Marketplace.Client.Services; + +namespace ScriptBee.Marketplace.Client.Tests.Services; + +public class MarketPluginFetcherTest +{ + private readonly IScriptBeeClient _hubClient = Substitute.For(); + private readonly MarketPluginFetcher _pluginFetcher; + + public MarketPluginFetcherTest() + { + _pluginFetcher = new MarketPluginFetcher(_hubClient); + } + + [Fact] + public async Task UpdateRepositoryAsync_CallsHubClientUpdateRepositoryAsync() + { + var cancellationToken = new CancellationTokenSource().Token; + + await _pluginFetcher.UpdateRepositoryAsync(cancellationToken); + + await _hubClient.Received(1).UpdateRepositoryAsync(cancellationToken); + } + + [Fact] + public void GetProjectsAsync_CallsHubClientGetScriptBeeProjects() + { + _pluginFetcher.GetProjectsAsync(); + + _hubClient.Received(1).GetScriptBeeProjects(); + } + + [Fact] + public void GetProjectsAsync_ReturnsEmptyList_WhenHubClientReturnsEmptyList() + { + _hubClient.GetScriptBeeProjects().Returns([]); + + var result = _pluginFetcher.GetProjectsAsync(); + + result.ShouldBeEmpty(); + } + + [Fact] + public void GetProjectsAsync_MapsScriptBeeProjectsToMarketPlaceProjects() + { + var scriptBeeProjects = new List + { + new() + { + Id = "project1", + Name = "Test Plugin", + Type = ScriptBeeProjectTypes.Plugin, + Description = "A test plugin description.", + Authors = [new Author { Name = "John Doe" }], + Versions = + [ + new ScriptBeeProjectVersion + { + DownloadUrl = "url1", + Version = new Version("1.0.0"), + Manifest = "manifest1", + }, + ], + }, + new() + { + Id = "bundle1", + Name = "Test Bundle", + Type = ScriptBeeProjectTypes.Bundle, + Description = "A test bundle description.", + Authors = [new Author { Name = "Jane Doe" }], + Versions = + [ + new ScriptBeeProjectVersion + { + DownloadUrl = "url2", + Version = new Version("2.0.0"), + Manifest = "manifest2", + }, + ], + }, + }; + _hubClient.GetScriptBeeProjects().Returns(scriptBeeProjects); + + var result = _pluginFetcher.GetProjectsAsync().ToList(); + + result.Count.ShouldBe(2); + var pluginProject = result.First(p => p.Id == "project1"); + pluginProject.Name.ShouldBe("Test Plugin"); + pluginProject.Type.ShouldBe(MarketPlaceProjectType.Plugin); + pluginProject.Description.ShouldBe("A test plugin description."); + pluginProject.Authors.ShouldContain("John Doe"); + var pluginVersion = pluginProject.Versions.Single(); + pluginVersion.Url.ShouldBe("url1"); + pluginVersion.Version.ShouldBe(new Version("1.0.0")); + pluginVersion.ManifestUrl.ShouldBe("manifest1"); + + var bundleProject = result.First(p => p.Id == "bundle1"); + bundleProject.Name.ShouldBe("Test Bundle"); + bundleProject.Type.ShouldBe(MarketPlaceProjectType.Bundle); + bundleProject.Description.ShouldBe("A test bundle description."); + bundleProject.Authors.ShouldContain("Jane Doe"); + var version = bundleProject.Versions.Single(); + version.Url.ShouldBe("url2"); + version.Version.ShouldBe(new Version("2.0.0")); + version.ManifestUrl.ShouldBe("manifest2"); + } +}