private void InitializePluginTiles(string pluginKey) { var pluginTileInstances = _pluginResolver.GetPluginTiles(pluginKey); foreach (ITile pluginTileInstance in pluginTileInstances) { var setDependenciesMethod = pluginTileInstance.GetType().GetMethod("SetDependencies"); if (setDependenciesMethod != null) { object?[]? dependencies = setDependenciesMethod.GetParameters() .Select(parameter => { return(_serviceProvider.GetService(parameter.ParameterType)); }) .ToArray(); setDependenciesMethod.Invoke(pluginTileInstance, dependencies); } var pluginSettingsProperty = pluginTileInstance.GetType().GetProperty("PluginSettings"); pluginSettingsProperty?.SetValue(pluginTileInstance, _pluginSettingsManager.GetPluginSettings(pluginKey)); pluginTileInstance.OnAfterLoad().Wait(); pluginTileInstance.OnAfterLoadInternal().Wait(); } }
public void LoadPluginsTest() { //Arrange var serviceCollection = new ServiceCollection(); serviceCollection.AddScoped <IRepository <Plugin>, Repository <Plugin> >(e => _pluginRepositoryMock.Object); serviceCollection.AddScoped <IRepository <Tile>, Repository <Tile> >(e => _tileRepositoryMock.Object); serviceCollection.AddScoped <DbContext, AppDashTestContext>(); _pluginRepositoryMock.SetupRepositoryMock(options => { }); _tileRepositoryMock.SetupRepositoryMock(options => { }); var pluginResolver = new PluginResolver(); PluginLoader pluginLoader = new PluginLoader(pluginResolver, serviceCollection.BuildServiceProvider()); //Act pluginLoader.LoadPlugins(Path.Combine(Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath), "plugins")); //Assert //we expect 1 plugin Assert.Single(pluginResolver.GetPlugins()); //the plugin has 5 tiles Assert.Equal(5, pluginResolver.GetPluginTiles().Count()); //4 of them are type TestTile2 Assert.Equal(4, pluginResolver.GetPluginTiles().Count(tile => tile.GetType().FullName == typeof(TestTile2).FullName)); foreach (ITile pluginTile in pluginResolver.GetPluginTiles()) { Assert.NotEmpty(pluginTile.TileKey); Assert.NotEmpty(pluginTile.PluginKey); } }
public void GetPluginTilesTest() { //Arrange PluginResolver pluginResolver = new PluginResolver(); pluginResolver.AddPlugin(typeof(TestPlugin.TestPlugin), "TestKey"); pluginResolver.LoadPluginTile(typeof(TestPlugin.TestPlugin), typeof(TestTile), "TestTileKey"); pluginResolver.LoadPluginTile(typeof(TestPlugin.TestPlugin), typeof(TestTile2), "TestTile2Key"); //Act var tiles = pluginResolver.GetPluginTiles("TestKey").ToList(); //Assert Assert.Equal(2, tiles.Count); Assert.Equal(1, tiles.Count(tile => tile.TileKey == "TestTileKey")); Assert.Equal(1, tiles.Count(tile => tile.TileKey == "TestTile2Key")); //make sure the tiles are not null Assert.NotNull(tiles.First(tile => tile.TileKey == "TestTileKey")); Assert.NotNull(tiles.First(tile => tile.TileKey == "TestTileKey")); }
public IEnumerable <ITile> GetTiles() { return(_pluginResolver.GetPluginTiles()); }
public void InitializePluginsTest() { //Arrange AppDashTestContext dbContext = new AppDashTestContext(); var serviceCollection = new ServiceCollection(); serviceCollection.AddSingleton <IRepository <Plugin>, Repository <Plugin> >(e => _pluginRepositoryMock.Object); serviceCollection.AddSingleton <IRepository <Tile>, Repository <Tile> >(e => _tileRepositoryMock.Object); serviceCollection.AddSingleton <IRepository <PluginSettings>, Repository <PluginSettings> >(e => _pluginSettingsRepositoryMock.Object); serviceCollection.AddSingleton <DbContext, AppDashTestContext>(e => dbContext); _pluginRepositoryMock.SetupRepositoryMock(dbContext, options => { options.InsertNoTracking(new Plugin { UniqueIdentifier = typeof(TestPlugin.TestPlugin).FullName, Key = "TestKey", Name = "TestName" }); }); _tileRepositoryMock.SetupRepositoryMock(dbContext, options => { }); _pluginSettingsRepositoryMock.SetupRepositoryMock(dbContext, options => { options.InsertNoTracking(new PluginSettings { PluginKey = "TestKey", Data = JsonConvert.SerializeObject(new PluginData { Data = new Dictionary <string, Tuple <Type, object> >(new List <KeyValuePair <string, Tuple <Type, object> > > { new KeyValuePair <string, Tuple <Type, object> >("TestData", new Tuple <Type, object>(typeof(string), "TestValue")), new KeyValuePair <string, Tuple <Type, object> >("TestData2", new Tuple <Type, object>(typeof(string), "TestValue2")) }) }) }); }); var serviceProvider = serviceCollection.BuildServiceProvider(); var pluginResolver = new PluginResolver(); var pluginSettingsManager = new PluginSettingsManager(serviceProvider); PluginLoader pluginLoader = new PluginLoader(pluginResolver, serviceProvider); PluginInitializer pluginInitializer = new PluginInitializer(pluginResolver, pluginSettingsManager, serviceProvider); //Act pluginLoader.LoadPlugins(Path.Combine(Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath), "plugins")); pluginInitializer.InitializePlugins(); //Assert var plugin = pluginResolver.GetPlugin("TestKey"); //make sure the plugin exists Assert.NotNull(plugin); //make sure the plugin has the right key Assert.Equal("TestKey", plugin.PluginInstance.Key); Assert.Equal("TestKey", plugin.PluginKey); foreach (ITile pluginTile in pluginResolver.GetPluginTiles()) { //make sure tiles have correct data Assert.Equal("TestKey", pluginTile.PluginKey); Assert.NotEmpty(pluginTile.TileKey); Assert.NotNull(pluginTile.PluginSettings); Assert.NotNull(pluginTile.PluginSettings.GetData <string>("TestData")); Assert.NotNull(pluginTile.PluginSettings.GetData <string>("TestData2")); Assert.Throws <InvalidCastException>(() => { //make sure this throws an InvalidCastException since it should be a string int data = pluginTile.PluginSettings.GetData <int>("TestData"); }); } }