Files
Umbraco-CMS/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/TemplateRepositoryTest.cs

663 lines
26 KiB
C#
Raw Normal View History

// Copyright (c) Umbraco.
// See LICENSE for more details.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.Extensions.Logging;
Netcore: Migrate RepositoryBase and ContentTypeServiceBase events (#10141) * Remove ScopeEntityRemove from ContentRepositoryBase and rely on "ing" notifications * Remove old event handler from ContentEventsTests * Remove ScopedVersionRemove from ContentRepositoryBase and rely on service notifications instead * Remove unused ScopedVersionEventArgs from ContentRepositoryBase * Migrate ScopeEntityRefresh to notification pattern Unfortunately it's still published from the repository base * Add simple content type notifications * Publish Notifications instead of events in ContentTypeServiceBase for simple events * Switch OnChanged to use Notifications for ContentTypeServices * Publish notifications instead of raising ScopedRefreshedEntity on ContentTypeServiceBase * Hook up to the new ContentType notifications * Remove DistributedCacheBinderTests There are no longer any events to really test on. * Remove ContentTypeChange EventArgs * Remove ContentService_Copied from DistributedCacheBinder It's no longer used * Cleanup * Cleanup * Removed uncommented code * Fixed issue with unattented installs * Re-add ContentTreeChangeNotification to DistributedCache * Add new notification for ScopedEntityRemove Marked as obsolete/hidden in editor, since this should only be used for nucache for now, and should really be changed in the future * Mark Refresh notifications as obsolete/hidden These should not be used anywhere outside Nucache, and should be changed to tree change at some point. * Raise ScopedEntityRemoveNotification on repos and use in nucache Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-04-20 12:17:11 +02:00
using Moq;
using NUnit.Framework;
2021-02-22 10:09:20 +01:00
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Cache;
using Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.Configuration.Models;
Netcore: Migrate RepositoryBase and ContentTypeServiceBase events (#10141) * Remove ScopeEntityRemove from ContentRepositoryBase and rely on "ing" notifications * Remove old event handler from ContentEventsTests * Remove ScopedVersionRemove from ContentRepositoryBase and rely on service notifications instead * Remove unused ScopedVersionEventArgs from ContentRepositoryBase * Migrate ScopeEntityRefresh to notification pattern Unfortunately it's still published from the repository base * Add simple content type notifications * Publish Notifications instead of events in ContentTypeServiceBase for simple events * Switch OnChanged to use Notifications for ContentTypeServices * Publish notifications instead of raising ScopedRefreshedEntity on ContentTypeServiceBase * Hook up to the new ContentType notifications * Remove DistributedCacheBinderTests There are no longer any events to really test on. * Remove ContentTypeChange EventArgs * Remove ContentService_Copied from DistributedCacheBinder It's no longer used * Cleanup * Cleanup * Removed uncommented code * Fixed issue with unattented installs * Re-add ContentTreeChangeNotification to DistributedCache * Add new notification for ScopedEntityRemove Marked as obsolete/hidden in editor, since this should only be used for nucache for now, and should really be changed in the future * Mark Refresh notifications as obsolete/hidden These should not be used anywhere outside Nucache, and should be changed to tree change at some point. * Raise ScopedEntityRemoveNotification on repos and use in nucache Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-04-20 12:17:11 +02:00
using Umbraco.Cms.Core.Events;
using Umbraco.Cms.Core.Hosting;
using Umbraco.Cms.Core.IO;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Persistence.Repositories;
using Umbraco.Cms.Core.PropertyEditors;
using Umbraco.Cms.Core.Scoping;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement;
2022-01-13 17:44:11 +00:00
using Umbraco.Cms.Infrastructure.Scoping;
using Umbraco.Cms.Infrastructure.Serialization;
using Umbraco.Cms.Tests.Common.Builders;
using Umbraco.Cms.Tests.Common.Testing;
using Umbraco.Cms.Tests.Integration.Implementations;
using Umbraco.Cms.Tests.Integration.Testing;
using Umbraco.Extensions;
using IScopeProvider = Umbraco.Cms.Infrastructure.Scoping.IScopeProvider;
using IScope = Umbraco.Cms.Infrastructure.Scoping.IScope;
namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Repositories
{
[TestFixture]
2016-11-05 19:23:55 +01:00
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
public class TemplateRepositoryTest : UmbracoIntegrationTest
{
private IHostingEnvironment HostingEnvironment => GetRequiredService<IHostingEnvironment>();
Netcore: File systems rework (#10181) * Allow IMediaFileSystem to be replace in the DI, or registered with inner filesystem * Remove GetFileSystem from Filesystems It was only used by tests. * Make MediaFileSystem inherit from PhysicalFileSystem directly * Remove FileSystemWrapper * Remove inner filesystem from MediaFileSystem * Add MediaFileManager and bare minimum to make it testable * Remove MediaFileSystem * Fix unit tests using MediaFileManager * Remove IFileSystem and rely only on FileSystem * Hide dangerous methods in FileSystems and do some cleaning * Apply stylecop warnings to MediaFileManager * Add FilesystemsCreator to Tests.Common This allows you to create an instance if FileSystems with your own specified IFileSystem for testing purposes outside our own test suite. * Allow the stylesheet filesystem to be replaced. * Fix tests * Don't save stylesheetWrapper in a temporary var * refactor(FileSystems): change how stylesheet filesystem is registered * fix(FileSystems): unable to overwrite media filesystem SetMediaFileSystem added the MediaManager as a Singleton instead of replacing the existing instance. * fix(FileSystems): calling AddFileSystems replaces MediaManager When calling AddFileSystems after SetMediaFileSystem the MediaManager gets replaced by the default PhysicalFileSystem, so instead of calling SetMediaFileSystem in AddFileSystems we now call TrySetMediaFileSystem instead. This method will not replace any existing instance of the MediaManager if there's already a MediaManager registered. * Use SetMediaFileSystem instead of TrySet, and rename AddFilesystems to ConfigureFileSystems Also don't call AddFileSystems again in ConfigureFilesystems * Don't wrap CSS filesystem twice * Add CreateShadowWrapperInternal to avoid casting * Throw UnauthorizedAccessException isntead of InvalidOperationException * Remove ResetShadowId Co-authored-by: Rasmus John Pedersen <mail@rjp.dk>
2021-04-27 09:52:17 +02:00
private FileSystems FileSystems => GetRequiredService<FileSystems>();
private IViewHelper ViewHelper => GetRequiredService<IViewHelper>();
private ITemplateRepository CreateRepository(IScopeProvider provider) =>
new TemplateRepository((IScopeAccessor)provider, AppCaches.Disabled, LoggerFactory.CreateLogger<TemplateRepository>(), FileSystems, IOHelper, ShortStringHelper, ViewHelper);
[Test]
public void Can_Instantiate_Repository()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
2014-05-15 16:11:59 +10:00
{
ITemplateRepository repository = CreateRepository(provider);
2014-05-15 16:11:59 +10:00
// Assert
Assert.That(repository, Is.Not.Null);
2014-05-15 16:11:59 +10:00
}
}
[Test]
public void Can_Perform_Add_View()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
// Act
var template = new Template(ShortStringHelper, "test", "test");
2017-12-07 16:45:25 +01:00
repository.Save(template);
// Assert
Assert.That(repository.Get("test"), Is.Not.Null);
Assert.That(FileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.True);
}
}
[Test]
public void Can_Perform_Add_View_With_Default_Content()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
// Act
var template = new Template(ShortStringHelper, "test", "test")
{
Content = "mock-content"
};
2017-12-07 16:45:25 +01:00
repository.Save(template);
// Assert
Assert.That(repository.Get("test"), Is.Not.Null);
Assert.That(FileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.True);
Assert.AreEqual("mock-content", template.Content.StripWhitespace());
}
}
[Test]
public void Can_Perform_Add_View_With_Default_Content_With_Parent()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
// NOTE: This has to be persisted first
var template = new Template(ShortStringHelper, "test", "test");
2017-12-07 16:45:25 +01:00
repository.Save(template);
// Act
var template2 = new Template(ShortStringHelper, "test2", "test2");
template2.SetMasterTemplate(template);
2017-12-07 16:45:25 +01:00
repository.Save(template2);
// Assert
Assert.That(repository.Get("test2"), Is.Not.Null);
Assert.That(FileSystems.MvcViewsFileSystem.FileExists("test2.cshtml"), Is.True);
2016-02-03 13:43:51 +01:00
Assert.AreEqual(
2021-02-22 10:09:20 +01:00
"@usingUmbraco.Cms.Web.Common.PublishedModels;@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage @{ Layout = \"test.cshtml\";}".StripWhitespace(),
template2.Content.StripWhitespace());
}
}
[Test]
public void Can_Perform_Add_Unique_Alias()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
// Act
var template = new Template(ShortStringHelper, "test", "test")
{
Content = "mock-content"
};
2017-12-07 16:45:25 +01:00
repository.Save(template);
var template2 = new Template(ShortStringHelper, "test", "test")
{
Content = "mock-content"
};
2017-12-07 16:45:25 +01:00
repository.Save(template2);
// Assert
Assert.AreEqual("test1", template2.Alias);
}
}
[Test]
public void Can_Perform_Update_Unique_Alias()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
// Act
var template = new Template(ShortStringHelper, "test", "test")
{
Content = "mock-content"
};
2017-12-07 16:45:25 +01:00
repository.Save(template);
var template2 = new Template(ShortStringHelper, "test1", "test1")
{
Content = "mock-content"
};
2017-12-07 16:45:25 +01:00
repository.Save(template2);
template.Alias = "test1";
2017-12-07 16:45:25 +01:00
repository.Save(template);
// Assert
Assert.AreEqual("test11", template.Alias);
Assert.That(FileSystems.MvcViewsFileSystem.FileExists("test11.cshtml"), Is.True);
Assert.That(FileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.False);
}
}
[Test]
public void Can_Perform_Update_View()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
// Act
var template = new Template(ShortStringHelper, "test", "test")
{
Content = "mock-content"
};
2017-12-07 16:45:25 +01:00
repository.Save(template);
template.Content += "<html></html>";
2017-12-07 16:45:25 +01:00
repository.Save(template);
ITemplate updated = repository.Get("test");
// Assert
Assert.That(FileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.True);
Assert.That(updated.Content, Is.EqualTo("mock-content" + "<html></html>"));
}
}
[Test]
public void Can_Perform_Delete_View()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
var template = new Template(ShortStringHelper, "test", "test")
{
Content = "mock-content"
};
2017-12-07 16:45:25 +01:00
repository.Save(template);
// Act
ITemplate templates = repository.Get("test");
Assert.That(FileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.True);
repository.Delete(templates);
// Assert
Assert.IsNull(repository.Get("test"));
Assert.That(FileSystems.MvcViewsFileSystem.FileExists("test.cshtml"), Is.False);
}
2014-05-15 16:11:59 +10:00
}
2014-05-15 16:11:59 +10:00
[Test]
public void Can_Perform_Delete_When_Assigned_To_Doc()
{
// Arrange
IScopeProvider provider = ScopeProvider;
var scopeAccessor = (IScopeAccessor)provider;
IDataTypeService dataTypeService = GetRequiredService<IDataTypeService>();
IFileService fileService = GetRequiredService<IFileService>();
using (provider.CreateScope())
2014-05-15 16:11:59 +10:00
{
ITemplateRepository templateRepository = CreateRepository(provider);
2020-09-21 21:06:24 +02:00
var globalSettings = new GlobalSettings();
var serializer = new JsonNetSerializer();
var tagRepository = new TagRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger<TagRepository>());
var commonRepository = new ContentTypeCommonRepository(scopeAccessor, templateRepository, AppCaches, ShortStringHelper);
var languageRepository = new LanguageRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger<LanguageRepository>());
var contentTypeRepository = new ContentTypeRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger<ContentTypeRepository>(), commonRepository, languageRepository, ShortStringHelper);
var relationTypeRepository = new RelationTypeRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger<RelationTypeRepository>());
var entityRepository = new EntityRepository(scopeAccessor, AppCaches.Disabled);
var relationRepository = new RelationRepository(scopeAccessor, LoggerFactory.CreateLogger<RelationRepository>(), relationTypeRepository, entityRepository);
var propertyEditors = new PropertyEditorCollection(new DataEditorCollection(() => Enumerable.Empty<IDataEditor>()));
var dataValueReferences = new DataValueReferenceFactoryCollection(() => Enumerable.Empty<IDataValueReferenceFactory>());
Netcore: Migrate RepositoryBase and ContentTypeServiceBase events (#10141) * Remove ScopeEntityRemove from ContentRepositoryBase and rely on "ing" notifications * Remove old event handler from ContentEventsTests * Remove ScopedVersionRemove from ContentRepositoryBase and rely on service notifications instead * Remove unused ScopedVersionEventArgs from ContentRepositoryBase * Migrate ScopeEntityRefresh to notification pattern Unfortunately it's still published from the repository base * Add simple content type notifications * Publish Notifications instead of events in ContentTypeServiceBase for simple events * Switch OnChanged to use Notifications for ContentTypeServices * Publish notifications instead of raising ScopedRefreshedEntity on ContentTypeServiceBase * Hook up to the new ContentType notifications * Remove DistributedCacheBinderTests There are no longer any events to really test on. * Remove ContentTypeChange EventArgs * Remove ContentService_Copied from DistributedCacheBinder It's no longer used * Cleanup * Cleanup * Removed uncommented code * Fixed issue with unattented installs * Re-add ContentTreeChangeNotification to DistributedCache * Add new notification for ScopedEntityRemove Marked as obsolete/hidden in editor, since this should only be used for nucache for now, and should really be changed in the future * Mark Refresh notifications as obsolete/hidden These should not be used anywhere outside Nucache, and should be changed to tree change at some point. * Raise ScopedEntityRemoveNotification on repos and use in nucache Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-04-20 12:17:11 +02:00
var contentRepo = new DocumentRepository(scopeAccessor, AppCaches.Disabled, LoggerFactory.CreateLogger<DocumentRepository>(), LoggerFactory, contentTypeRepository, templateRepository, tagRepository, languageRepository, relationRepository, relationTypeRepository, propertyEditors, dataValueReferences, dataTypeService, serializer, Mock.Of<IEventAggregator>());
2014-05-15 16:11:59 +10:00
Template template = TemplateBuilder.CreateTextPageTemplate();
fileService.SaveTemplate(template); // else, FK violation on contentType!
ContentType contentType = ContentTypeBuilder.CreateSimpleContentType("umbTextpage2", "Textpage", defaultTemplateId: template.Id);
2017-12-07 16:45:25 +01:00
contentTypeRepository.Save(contentType);
Content textpage = ContentBuilder.CreateSimpleContent(contentType);
contentRepo.Save(textpage);
textpage.TemplateId = template.Id;
2017-12-07 16:45:25 +01:00
contentRepo.Save(textpage);
// Act
ITemplate templates = templateRepository.Get("textPage");
templateRepository.Delete(templates);
// Assert
Assert.IsNull(templateRepository.Get("textPage"));
}
}
[Test]
public void Can_Perform_Delete_On_Nested_Templates()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
2014-05-15 16:11:59 +10:00
{
ITemplateRepository repository = CreateRepository(provider);
var parent = new Template(ShortStringHelper, "parent", "parent")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var child = new Template(ShortStringHelper, "child", "child")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var baby = new Template(ShortStringHelper, "baby", "baby")
{
Content = @"<%@ Master Language=""C#"" %>"
};
2014-05-15 16:11:59 +10:00
child.MasterTemplateAlias = parent.Alias;
child.MasterTemplateId = new Lazy<int>(() => parent.Id);
baby.MasterTemplateAlias = child.Alias;
baby.MasterTemplateId = new Lazy<int>(() => child.Id);
2017-12-07 16:45:25 +01:00
repository.Save(parent);
repository.Save(child);
repository.Save(baby);
2014-05-15 16:11:59 +10:00
// Act
ITemplate templates = repository.Get("parent");
2014-05-15 16:11:59 +10:00
repository.Delete(templates);
// Assert
Assert.IsNull(repository.Get("test"));
}
}
[Test]
public void Can_Get_All()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
ITemplate[] created = CreateHierarchy(repository).ToArray();
// Act
IEnumerable<ITemplate> all = repository.GetAll();
IEnumerable<ITemplate> allByAlias = repository.GetAll("parent", "child2", "baby2", "notFound");
IEnumerable<ITemplate> allById = repository.GetMany(created[0].Id, created[2].Id, created[4].Id, created[5].Id, 999999);
// Assert
Assert.AreEqual(9, all.Count());
Assert.AreEqual(9, all.DistinctBy(x => x.Id).Count());
Assert.AreEqual(3, allByAlias.Count());
Assert.AreEqual(3, allByAlias.DistinctBy(x => x.Id).Count());
Assert.AreEqual(4, allById.Count());
Assert.AreEqual(4, allById.DistinctBy(x => x.Id).Count());
}
}
[Test]
public void Can_Get_Children()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
ITemplate[] created = CreateHierarchy(repository).ToArray();
// Act
IEnumerable<ITemplate> childrenById = repository.GetChildren(created[1].Id);
// Assert
Assert.AreEqual(2, childrenById.Count());
Assert.AreEqual(2, childrenById.DistinctBy(x => x.Id).Count());
}
}
[Test]
public void Can_Get_Children_At_Root()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
2017-12-15 11:19:03 +01:00
CreateHierarchy(repository).ToArray();
// Act
IEnumerable<ITemplate> children = repository.GetChildren(-1);
// Assert
Assert.AreEqual(1, children.Count());
Assert.AreEqual(1, children.DistinctBy(x => x.Id).Count());
}
}
[Test]
public void Can_Get_Descendants()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
ITemplate[] created = CreateHierarchy(repository).ToArray();
// Act
IEnumerable<ITemplate> descendantsById = repository.GetDescendants(created[1].Id);
// Assert
Assert.AreEqual(3, descendantsById.Count());
Assert.AreEqual(3, descendantsById.DistinctBy(x => x.Id).Count());
}
}
[Test]
public void Path_Is_Set_Correctly_On_Creation()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
var parent = new Template(ShortStringHelper, "parent", "parent");
var child1 = new Template(ShortStringHelper, "child1", "child1");
var toddler1 = new Template(ShortStringHelper, "toddler1", "toddler1");
var toddler2 = new Template(ShortStringHelper, "toddler2", "toddler2");
var baby1 = new Template(ShortStringHelper, "baby1", "baby1");
var child2 = new Template(ShortStringHelper, "child2", "child2");
var toddler3 = new Template(ShortStringHelper, "toddler3", "toddler3");
var toddler4 = new Template(ShortStringHelper, "toddler4", "toddler4");
var baby2 = new Template(ShortStringHelper, "baby2", "baby2");
child1.MasterTemplateAlias = parent.Alias;
child1.MasterTemplateId = new Lazy<int>(() => parent.Id);
child2.MasterTemplateAlias = parent.Alias;
child2.MasterTemplateId = new Lazy<int>(() => parent.Id);
toddler1.MasterTemplateAlias = child1.Alias;
toddler1.MasterTemplateId = new Lazy<int>(() => child1.Id);
toddler2.MasterTemplateAlias = child1.Alias;
toddler2.MasterTemplateId = new Lazy<int>(() => child1.Id);
toddler3.MasterTemplateAlias = child2.Alias;
toddler3.MasterTemplateId = new Lazy<int>(() => child2.Id);
toddler4.MasterTemplateAlias = child2.Alias;
toddler4.MasterTemplateId = new Lazy<int>(() => child2.Id);
baby1.MasterTemplateAlias = toddler2.Alias;
baby1.MasterTemplateId = new Lazy<int>(() => toddler2.Id);
baby2.MasterTemplateAlias = toddler4.Alias;
baby2.MasterTemplateId = new Lazy<int>(() => toddler4.Id);
// Act
2017-12-07 16:45:25 +01:00
repository.Save(parent);
repository.Save(child1);
repository.Save(child2);
repository.Save(toddler1);
repository.Save(toddler2);
repository.Save(toddler3);
repository.Save(toddler4);
repository.Save(baby1);
repository.Save(baby2);
// Assert
Assert.AreEqual(string.Format("-1,{0}", parent.Id), parent.Path);
Assert.AreEqual(string.Format("-1,{0},{1}", parent.Id, child1.Id), child1.Path);
Assert.AreEqual(string.Format("-1,{0},{1}", parent.Id, child2.Id), child2.Path);
Assert.AreEqual(string.Format("-1,{0},{1}", parent.Id, child2.Id), child2.Path);
Assert.AreEqual(string.Format("-1,{0},{1},{2}", parent.Id, child1.Id, toddler1.Id), toddler1.Path);
Assert.AreEqual(string.Format("-1,{0},{1},{2}", parent.Id, child1.Id, toddler2.Id), toddler2.Path);
Assert.AreEqual(string.Format("-1,{0},{1},{2}", parent.Id, child2.Id, toddler3.Id), toddler3.Path);
Assert.AreEqual(string.Format("-1,{0},{1},{2}", parent.Id, child2.Id, toddler4.Id), toddler4.Path);
Assert.AreEqual(string.Format("-1,{0},{1},{2},{3}", parent.Id, child1.Id, toddler2.Id, baby1.Id), baby1.Path);
Assert.AreEqual(string.Format("-1,{0},{1},{2},{3}", parent.Id, child2.Id, toddler4.Id, baby2.Id), baby2.Path);
}
}
[Test]
public void Path_Is_Set_Correctly_On_Update()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
{
ITemplateRepository repository = CreateRepository(provider);
var parent = new Template(ShortStringHelper, "parent", "parent");
var child1 = new Template(ShortStringHelper, "child1", "child1");
var child2 = new Template(ShortStringHelper, "child2", "child2");
var toddler1 = new Template(ShortStringHelper, "toddler1", "toddler1");
var toddler2 = new Template(ShortStringHelper, "toddler2", "toddler2");
child1.MasterTemplateAlias = parent.Alias;
child1.MasterTemplateId = new Lazy<int>(() => parent.Id);
child2.MasterTemplateAlias = parent.Alias;
child2.MasterTemplateId = new Lazy<int>(() => parent.Id);
toddler1.MasterTemplateAlias = child1.Alias;
toddler1.MasterTemplateId = new Lazy<int>(() => child1.Id);
toddler2.MasterTemplateAlias = child1.Alias;
toddler2.MasterTemplateId = new Lazy<int>(() => child1.Id);
2017-12-07 16:45:25 +01:00
repository.Save(parent);
repository.Save(child1);
repository.Save(child2);
repository.Save(toddler1);
repository.Save(toddler2);
// Act
toddler2.SetMasterTemplate(child2);
2017-12-07 16:45:25 +01:00
repository.Save(toddler2);
// Assert
2017-05-12 14:49:44 +02:00
Assert.AreEqual($"-1,{parent.Id},{child2.Id},{toddler2.Id}", toddler2.Path);
}
}
2017-05-12 14:49:44 +02:00
[Test]
public void Path_Is_Set_Correctly_On_Update_With_Master_Template_Removal()
{
// Arrange
IScopeProvider provider = ScopeProvider;
using (provider.CreateScope())
2017-05-12 14:49:44 +02:00
{
ITemplateRepository repository = CreateRepository(provider);
2017-05-12 14:49:44 +02:00
var parent = new Template(ShortStringHelper, "parent", "parent");
var child1 = new Template(ShortStringHelper, "child1", "child1")
{
MasterTemplateAlias = parent.Alias,
MasterTemplateId = new Lazy<int>(() => parent.Id)
};
2017-05-12 14:49:44 +02:00
2017-12-07 16:45:25 +01:00
repository.Save(parent);
repository.Save(child1);
2017-05-12 14:49:44 +02:00
// Act
2017-05-12 14:49:44 +02:00
child1.SetMasterTemplate(null);
2017-12-07 16:45:25 +01:00
repository.Save(child1);
2017-05-12 14:49:44 +02:00
// Assert
2017-05-12 14:49:44 +02:00
Assert.AreEqual($"-1,{child1.Id}", child1.Path);
}
}
[TearDown]
public void TearDown()
{
var testHelper = new TestHelper();
2018-07-20 09:49:05 +02:00
// Delete all files
var fsViews = new PhysicalFileSystem(IOHelper, HostingEnvironment, LoggerFactory.CreateLogger<PhysicalFileSystem>(), HostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.MvcViews), HostingEnvironment.ToAbsolute(Constants.SystemDirectories.MvcViews));
IEnumerable<string> views = fsViews.GetFiles(string.Empty, "*.cshtml");
foreach (string file in views)
{
2018-07-20 09:49:05 +02:00
fsViews.DeleteFile(file);
}
}
protected Stream CreateStream(string contents = null)
{
if (string.IsNullOrEmpty(contents))
{
contents = "/* test */";
}
byte[] bytes = Encoding.UTF8.GetBytes(contents);
var stream = new MemoryStream(bytes);
return stream;
}
2017-12-15 11:19:03 +01:00
private IEnumerable<ITemplate> CreateHierarchy(ITemplateRepository repository)
{
var parent = new Template(ShortStringHelper, "parent", "parent")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var child1 = new Template(ShortStringHelper, "child1", "child1")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var toddler1 = new Template(ShortStringHelper, "toddler1", "toddler1")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var toddler2 = new Template(ShortStringHelper, "toddler2", "toddler2")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var baby1 = new Template(ShortStringHelper, "baby1", "baby1")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var child2 = new Template(ShortStringHelper, "child2", "child2")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var toddler3 = new Template(ShortStringHelper, "toddler3", "toddler3")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var toddler4 = new Template(ShortStringHelper, "toddler4", "toddler4")
{
Content = @"<%@ Master Language=""C#"" %>"
};
var baby2 = new Template(ShortStringHelper, "baby2", "baby2")
{
Content = @"<%@ Master Language=""C#"" %>"
};
child1.MasterTemplateAlias = parent.Alias;
child1.MasterTemplateId = new Lazy<int>(() => parent.Id);
child2.MasterTemplateAlias = parent.Alias;
child2.MasterTemplateId = new Lazy<int>(() => parent.Id);
toddler1.MasterTemplateAlias = child1.Alias;
toddler1.MasterTemplateId = new Lazy<int>(() => child1.Id);
toddler2.MasterTemplateAlias = child1.Alias;
toddler2.MasterTemplateId = new Lazy<int>(() => child1.Id);
toddler3.MasterTemplateAlias = child2.Alias;
toddler3.MasterTemplateId = new Lazy<int>(() => child2.Id);
toddler4.MasterTemplateAlias = child2.Alias;
toddler4.MasterTemplateId = new Lazy<int>(() => child2.Id);
baby1.MasterTemplateAlias = toddler2.Alias;
baby1.MasterTemplateId = new Lazy<int>(() => toddler2.Id);
baby2.MasterTemplateAlias = toddler4.Alias;
baby2.MasterTemplateId = new Lazy<int>(() => toddler4.Id);
2017-12-07 16:45:25 +01:00
repository.Save(parent);
repository.Save(child1);
repository.Save(child2);
repository.Save(toddler1);
repository.Save(toddler2);
repository.Save(toddler3);
repository.Save(toddler4);
repository.Save(baby1);
repository.Save(baby2);
return new[] { parent, child1, child2, toddler1, toddler2, toddler3, toddler4, baby1, baby2 };
}
}
2017-07-20 11:21:28 +02:00
}