#19890: Allowing module from previous version to be installed

Work Item: 19890
This commit is contained in:
Daniel Dabrowski 2013-08-13 10:37:25 +02:00 committed by Sebastien Ros
parent 2a00ecdcfb
commit 8c9b3570d0
4 changed files with 133 additions and 29 deletions

View File

@ -34,14 +34,16 @@ namespace Orchard.Tests.Modules.Recipes.RecipeHandlers {
[TestFixture]
public class ModuleRecipeHandlerTest : DatabaseEnabledTestsBase {
private ExtensionManagerTests.StubFolders _folders;
private StubPackagingSourceManager _packagesInRepository;
private StubPackageManager _packageManager;
protected override IEnumerable<Type> DatabaseTypes {
get {
return new[] {
typeof (ShellDescriptorRecord),
typeof (ShellFeatureRecord),
typeof (ShellParameterRecord),
};
typeof (ShellDescriptorRecord),
typeof (ShellFeatureRecord),
typeof (ShellParameterRecord),
};
}
}
@ -49,6 +51,8 @@ namespace Orchard.Tests.Modules.Recipes.RecipeHandlers {
builder.RegisterInstance(new ShellSettings { Name = "Default" });
_folders = new ExtensionManagerTests.StubFolders();
_packagesInRepository = new StubPackagingSourceManager();
_packageManager = new StubPackageManager();
builder.RegisterInstance(_folders).As<IExtensionFolders>();
builder.RegisterType<ExtensionManager>().As<IExtensionManager>();
builder.RegisterType<FeatureManager>().As<IFeatureManager>();
@ -57,8 +61,8 @@ namespace Orchard.Tests.Modules.Recipes.RecipeHandlers {
builder.RegisterType<StubAsyncTokenProvider>().As<IAsyncTokenProvider>();
builder.RegisterType<ShellDescriptorManager>().As<IShellDescriptorManager>().SingleInstance();
builder.RegisterType<StubDataMigrationManager>().As<IDataMigrationManager>();
builder.RegisterType<StubPackagingSourceManager>().As<IPackagingSourceManager>();
builder.RegisterType<StubPackageManager>().As<IPackageManager>();
builder.RegisterInstance(_packagesInRepository).As<IPackagingSourceManager>();
builder.RegisterInstance(_packageManager).As<IPackageManager>();
builder.RegisterType<ShellStateManager>().As<IShellStateManager>().SingleInstance();
builder.RegisterType<StubEventBus>().As<IEventBus>().SingleInstance();
builder.RegisterType<ModuleRecipeHandler>();
@ -75,12 +79,19 @@ Features:
SuperWiki:
Description: My super wiki module for Orchard.
");
_packagesInRepository.AddPublishedPackage(new PublishedPackage {
Id = "Orchard.Module.SuperWiki",
PackageType = DefaultExtensionTypes.Module,
Title = "SuperWiki",
Version = "1.0.3",
IsLatestVersion = true,
});
IShellDescriptorManager shellDescriptorManager = _container.Resolve<IShellDescriptorManager>();
// No features enabled
shellDescriptorManager.UpdateShellDescriptor(0,
Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<ShellParameter>());
Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<ShellParameter>());
ModuleRecipeHandler moduleRecipeHandler = _container.Resolve<ModuleRecipeHandler>();
@ -115,10 +126,44 @@ Features:
RecipeContext recipeContext = new RecipeContext { RecipeStep = new RecipeStep { Name = "Module", Step = new XElement("SuperWiki") } };
recipeContext.RecipeStep.Step.Add(new XAttribute("repository", "test"));
Assert.Throws(typeof(InvalidOperationException), () => moduleRecipeHandler.ExecuteRecipeStep(recipeContext));
Assert.Throws(typeof (InvalidOperationException), () => moduleRecipeHandler.ExecuteRecipeStep(recipeContext));
}
[Test]
public void ExecuteRecipeStepWithRepositoryAndVersionNotLatestTest() {
_packagesInRepository.AddPublishedPackage(new PublishedPackage {
Id = "Orchard.Module.SuperWiki",
PackageType = DefaultExtensionTypes.Module,
Title = "SuperWiki",
Version = "1.0.3",
IsLatestVersion = true,
});
_packagesInRepository.AddPublishedPackage(new PublishedPackage {
Id = "Orchard.Module.SuperWiki",
PackageType = DefaultExtensionTypes.Module,
Title = "SuperWiki",
Version = "1.0.2",
IsLatestVersion = false,
});
ModuleRecipeHandler moduleRecipeHandler = _container.Resolve<ModuleRecipeHandler>();
RecipeContext recipeContext = new RecipeContext { RecipeStep = new RecipeStep { Name = "Module", Step = new XElement("SuperWiki") } };
recipeContext.RecipeStep.Step.Add(new XAttribute("packageId", "Orchard.Module.SuperWiki"));
recipeContext.RecipeStep.Step.Add(new XAttribute("repository", "test"));
recipeContext.RecipeStep.Step.Add(new XAttribute("version", "1.0.2"));
moduleRecipeHandler.ExecuteRecipeStep(recipeContext);
var installedPackage = _packageManager.GetInstalledPackages().FirstOrDefault(info => info.ExtensionName == "Orchard.Module.SuperWiki");
Assert.That(installedPackage, Is.Not.Null);
Assert.That(installedPackage.ExtensionVersion, Is.EqualTo("1.0.2"));
Assert.That(recipeContext.Executed, Is.True);
}
internal class StubPackagingSourceManager : IPackagingSourceManager {
private List<PublishedPackage> _publishedPackages = new List<PublishedPackage>();
public IEnumerable<PackagingSource> GetSources() {
return Enumerable.Empty<PackagingSource>();
}
@ -132,21 +177,33 @@ Features:
}
public IEnumerable<PackagingEntry> GetExtensionList(bool includeScreenshots, PackagingSource packagingSource = null, Func<IQueryable<PublishedPackage>, IQueryable<PublishedPackage>> query = null) {
return new[] {
new PackagingEntry {
PackageId = "Orchard.Module.SuperWiki",
Title = "SuperWiki",
Version = "1.0.3"
}
};
return query(_publishedPackages.AsQueryable()).Select(package => CreatePackagingEntry(package));
}
public int GetExtensionCount(PackagingSource packagingSource = null, Func<IQueryable<PublishedPackage>, IQueryable<PublishedPackage>> query = null) {
throw new NotImplementedException();
}
public void AddPublishedPackage(PublishedPackage package) {
_publishedPackages.Add(package);
}
private static PackagingEntry CreatePackagingEntry(PublishedPackage package) {
return new PackagingEntry {
PackageId = package.Id,
Title = package.Title,
Version = package.Version,
};
}
}
internal class StubPackageManager : IPackageManager {
private IList<PackageInfo> _installedPackages = new List<PackageInfo>();
public IEnumerable<PackageInfo> GetInstalledPackages() {
return _installedPackages;
}
public PackageData Harvest(string extensionName) {
throw new NotImplementedException();
}
@ -156,7 +213,12 @@ Features:
}
public PackageInfo Install(string packageId, string version, string location, string applicationPath) {
return null;
var package = new PackageInfo {
ExtensionName = packageId,
ExtensionVersion = version,
};
_installedPackages.Add(package);
return package;
}
public void Uninstall(string packageId, string applicationPath) {

View File

@ -20,6 +20,7 @@ using Orchard.Environment.Features;
using Orchard.Environment.State;
using Orchard.Events;
using Orchard.FileSystems.VirtualPath;
using Orchard.Packaging.GalleryServer;
using Orchard.Packaging.Services;
using Orchard.Recipes.Models;
using Orchard.Recipes.RecipeHandlers;
@ -35,14 +36,16 @@ namespace Orchard.Tests.Modules.Recipes.RecipeHandlers {
[TestFixture]
public class ThemeRecipeHandlerTest : DatabaseEnabledTestsBase {
private ExtensionManagerTests.StubFolders _folders;
private ModuleRecipeHandlerTest.StubPackagingSourceManager _packagesInRepository;
private ModuleRecipeHandlerTest.StubPackageManager _packageManager;
protected override IEnumerable<Type> DatabaseTypes {
get {
return new[] {
typeof (ShellDescriptorRecord),
typeof (ShellFeatureRecord),
typeof (ShellParameterRecord),
};
typeof (ShellDescriptorRecord),
typeof (ShellFeatureRecord),
typeof (ShellParameterRecord),
};
}
}
@ -52,6 +55,8 @@ namespace Orchard.Tests.Modules.Recipes.RecipeHandlers {
builder.RegisterInstance(new ShellSettings { Name = "Default" });
_folders = new ExtensionManagerTests.StubFolders();
_packagesInRepository = new ModuleRecipeHandlerTest.StubPackagingSourceManager();
_packageManager = new ModuleRecipeHandlerTest.StubPackageManager();
builder.RegisterInstance(_folders).As<IExtensionFolders>();
builder.RegisterType<ExtensionManager>().As<IExtensionManager>();
builder.RegisterType<FeatureManager>().As<IFeatureManager>();
@ -60,8 +65,8 @@ namespace Orchard.Tests.Modules.Recipes.RecipeHandlers {
builder.RegisterType<StubAsyncTokenProvider>().As<IAsyncTokenProvider>();
builder.RegisterType<ShellDescriptorManager>().As<IShellDescriptorManager>().SingleInstance();
builder.RegisterType<ModuleRecipeHandlerTest.StubDataMigrationManager>().As<IDataMigrationManager>();
builder.RegisterType<ModuleRecipeHandlerTest.StubPackagingSourceManager>().As<IPackagingSourceManager>();
builder.RegisterType<ModuleRecipeHandlerTest.StubPackageManager>().As<IPackageManager>();
builder.RegisterInstance(_packagesInRepository).As<IPackagingSourceManager>();
builder.RegisterInstance(_packageManager).As<IPackageManager>();
builder.RegisterType<ShellStateManager>().As<IShellStateManager>().SingleInstance();
builder.RegisterInstance(_testVirtualPathProvider).As<IVirtualPathProvider>();
builder.RegisterType<StubEventBus>().As<IEventBus>().SingleInstance();
@ -82,17 +87,24 @@ Features:
SuperWiki:
Description: My super wiki theme for Orchard.
");
_packagesInRepository.AddPublishedPackage(new PublishedPackage {
Id = "Orchard.Theme.SuperWiki",
PackageType = DefaultExtensionTypes.Theme,
Title = "SuperWiki",
Version = "1.0.3",
IsLatestVersion = true,
});
IShellDescriptorManager shellDescriptorManager = _container.Resolve<IShellDescriptorManager>();
// No features enabled
shellDescriptorManager.UpdateShellDescriptor(0,
Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<ShellParameter>());
Enumerable.Empty<ShellFeature>(),
Enumerable.Empty<ShellParameter>());
ThemeRecipeHandler themeRecipeHandler = _container.Resolve<ThemeRecipeHandler>();
RecipeContext recipeContext = new RecipeContext { RecipeStep = new RecipeStep { Name = "Theme", Step = new XElement("SuperWiki") } };
recipeContext.RecipeStep.Step.Add(new XAttribute("packageId", "SuperWiki"));
recipeContext.RecipeStep.Step.Add(new XAttribute("packageId", "Orchard.Theme.SuperWiki"));
recipeContext.RecipeStep.Step.Add(new XAttribute("repository", "test"));
IFeatureManager featureManager = _container.Resolve<IFeatureManager>();
@ -130,7 +142,39 @@ Features:
RecipeContext recipeContext = new RecipeContext { RecipeStep = new RecipeStep { Name = "Theme", Step = new XElement("SuperWiki") } };
recipeContext.RecipeStep.Step.Add(new XAttribute("repository", "test"));
Assert.Throws(typeof(InvalidOperationException), () => themeRecipeHandler.ExecuteRecipeStep(recipeContext));
Assert.Throws(typeof (InvalidOperationException), () => themeRecipeHandler.ExecuteRecipeStep(recipeContext));
}
[Test]
public void ExecuteRecipeStepWithRepositoryAndVersionNotLatestTest() {
_packagesInRepository.AddPublishedPackage(new PublishedPackage {
Id = "Orchard.Theme.SuperWiki",
PackageType = DefaultExtensionTypes.Theme,
Title = "SuperWiki",
Version = "1.0.3",
IsLatestVersion = true,
});
_packagesInRepository.AddPublishedPackage(new PublishedPackage {
Id = "Orchard.Theme.SuperWiki",
PackageType = DefaultExtensionTypes.Theme,
Title = "SuperWiki",
Version = "1.0.2",
IsLatestVersion = false,
});
ThemeRecipeHandler themeRecipeHandler = _container.Resolve<ThemeRecipeHandler>();
RecipeContext recipeContext = new RecipeContext { RecipeStep = new RecipeStep { Name = "Theme", Step = new XElement("SuperWiki") } };
recipeContext.RecipeStep.Step.Add(new XAttribute("packageId", "Orchard.Theme.SuperWiki"));
recipeContext.RecipeStep.Step.Add(new XAttribute("repository", "test"));
recipeContext.RecipeStep.Step.Add(new XAttribute("version", "1.0.2"));
themeRecipeHandler.ExecuteRecipeStep(recipeContext);
var installedPackage = _packageManager.GetInstalledPackages().FirstOrDefault(info => info.ExtensionName == "Orchard.Theme.SuperWiki");
Assert.That(installedPackage, Is.Not.Null);
Assert.That(installedPackage.ExtensionVersion, Is.EqualTo("1.0.2"));
Assert.That(recipeContext.Executed, Is.True);
}
internal class StubSiteThemeService : ISiteThemeService {

View File

@ -67,7 +67,6 @@ namespace Orchard.Recipes.RecipeHandlers {
var packagingSource = _packagingSourceManager.GetSources().FirstOrDefault();
if (repository != null) {
enforceVersion = false;
packagingSource = new PackagingSource {FeedTitle = repository, FeedUrl = repository};
}

View File

@ -81,7 +81,6 @@ namespace Orchard.Recipes.RecipeHandlers {
var packagingSource = _packagingSourceManager.GetSources().FirstOrDefault();
if (repository != null) {
enforceVersion = false;
packagingSource = new PackagingSource { FeedTitle = repository, FeedUrl = repository };
}