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");
+ }
+}