Repository navigation
Expand file tree
/
Copy pathDynamicToolRegistryTests.cs
More file actions
150 lines (124 loc) · 5.27 KB
/
Copy pathDynamicToolRegistryTests.cs
File metadata and controls
150 lines (124 loc) · 5.27 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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using PdfEditorApp.Core.Plugins;
using PdfEditorApp.Core.Plugins.Descriptors;
using PdfEditorApp.Models;
using PdfEditorApp.Services.Tools.Core;
using PdfEditorApp.ViewModels.Tools;
using PdfEditorApp.ViewModels.Tools.Core;
using Xunit;
namespace PdfEditorApp.Tests;
public class DynamicToolRegistryTests
{
private class DummyCustomToolViewModel : PdfToolViewModelBase
{
public DummyCustomToolViewModel(PdfToolDefinition toolDef) : base(null!, toolDef)
{
}
protected override Task<ToolExecutionResult> ExecuteCoreAsync(IProgress<double> progress, CancellationToken ct)
{
return Task.FromResult(new ToolExecutionResult { Success = true });
}
}
[Fact]
public void PdfToolRegistry_ExposesBuiltInToolsByDefault()
{
var registry = new PdfToolRegistry();
var allTools = registry.GetAllTools();
Assert.NotEmpty(allTools);
Assert.Contains(allTools, t => t.Id == PdfToolId.MergePdf);
Assert.Contains(allTools, t => t.Id == PdfToolId.CompressPdf);
}
[Fact]
public async Task PdfToolRegistry_MergesPluginToolsDynamically()
{
var context = new FryPluginContext();
var host = new PluginHost(context);
var registry = new PdfToolRegistry(context);
var initialCount = registry.GetAllTools().Count;
// Register a dynamic tool plugin
var dynamicToolPlugin = new DynamicToolTestPlugin();
host.RegisterPlugin(dynamicToolPlugin);
await host.StartAsync();
var toolsAfterMount = registry.GetAllTools();
Assert.Equal(initialCount + 1, toolsAfterMount.Count);
var retrievedByStringId = registry.GetTool("vendor.custom.stamp");
Assert.NotNull(retrievedByStringId);
Assert.Equal("Custom Vector Stamp", retrievedByStringId.Name);
Assert.Equal("RubberStamp", retrievedByStringId.IconKind);
// Teardown the plugin
await host.StopAsync();
var toolsAfterUnmount = registry.GetAllTools();
Assert.Equal(initialCount, toolsAfterUnmount.Count);
Assert.Null(registry.GetTool("vendor.custom.stamp"));
}
[Fact]
public async Task PdfToolRegistry_SeamlesslyUpgradesBuiltInToolsWhenPluginsMount()
{
var context = new FryPluginContext();
var host = new PluginHost(context);
var registry = new PdfToolRegistry(context);
var initialCount = registry.GetAllTools().Count;
var initialMerge = registry.GetTool(PdfToolId.MergePdf);
Assert.NotNull(initialMerge);
Assert.Equal("MergePdf", initialMerge.StringId);
Assert.Null(initialMerge.ViewModelFactory);
// Mount the built-in Merge plugin
var mergePlugin = new PdfEditorApp.Plugins.Bundles.MergePdfToolPlugin();
host.RegisterPlugin(mergePlugin);
await host.StartAsync();
// The tool count does NOT increase because it upgrades the built-in tool in place!
var toolsAfterMount = registry.GetAllTools();
Assert.Equal(initialCount, toolsAfterMount.Count);
var upgradedMerge = registry.GetTool(PdfToolId.MergePdf);
Assert.NotNull(upgradedMerge);
Assert.Equal("frypdf.tool.merge", upgradedMerge.StringId);
Assert.NotNull(upgradedMerge.ViewModelFactory);
// Can also retrieve it by its new StringId
var byStringId = registry.GetTool("frypdf.tool.merge");
Assert.NotNull(byStringId);
Assert.Equal(PdfToolId.MergePdf, byStringId.Id);
await host.StopAsync();
}
[Fact]
public void PdfToolViewModelFactory_ExecutesPluginViewModelFactoryDelegate()
{
var services = new ServiceCollection();
var sp = services.BuildServiceProvider();
var factory = new PdfToolViewModelFactory(null!, new PdfToolRegistry(), sp);
var toolDef = new PdfToolDefinition
{
Id = PdfToolId.EditPdf,
StringId = "custom.plugin.tool",
Name = "Plugin Tool"
};
toolDef.ViewModelFactory = _ => new DummyCustomToolViewModel(toolDef);
var vm = factory.CreateToolViewModel(toolDef);
Assert.IsType<DummyCustomToolViewModel>(vm);
Assert.Equal("Plugin Tool", vm.Tool.Name);
}
private class DynamicToolTestPlugin : IFryPlugin
{
public string Id => "plugin.dynamic.tool.test";
public string Name => "Dynamic Tool Test Plugin";
public Version Version => new(1, 0, 0);
public IReadOnlyList<Type> RequiredServices => Array.Empty<Type>();
public Task ApplyAsync(IFryPluginContext ctx, CancellationToken ct = default)
{
ctx.RegisterTool(new PdfToolDescriptor
{
Id = "vendor.custom.stamp",
Name = "Custom Vector Stamp",
Description = "Apply custom vector stamps.",
Category = "OrganizeAndPage",
IconKind = "RubberStamp",
IconColorHex = "#9333EA",
CreateViewModel = sp => new DummyCustomToolViewModel(new PdfToolDefinition { StringId = "vendor.custom.stamp", Name = "Custom Vector Stamp" })
});
return Task.CompletedTask;
}
}
}