back ported template repo and file service updates

This commit is contained in:
Shannon
2013-12-16 18:10:44 +11:00
parent d1e071b9cb
commit 7e6fdcb05e
8 changed files with 674 additions and 94 deletions

View File

@@ -0,0 +1,34 @@
using System.Collections.Generic;
namespace Umbraco.Core.Models
{
/// <summary>
/// Represents a template in a template tree
/// </summary>
public class TemplateNode
{
public TemplateNode(ITemplate template)
{
Template = template;
Children = new List<TemplateNode>();
}
/// <summary>
/// The current template
/// </summary>
public ITemplate Template { get; set; }
/// <summary>
/// The children of the current template
/// </summary>
public IEnumerable<TemplateNode> Children { get; set; }
/// <summary>
/// The parent template to the current template
/// </summary>
/// <remarks>
/// Will be null if there is no parent
/// </remarks>
public TemplateNode Parent { get; set; }
}
}

View File

@@ -7,5 +7,20 @@ namespace Umbraco.Core.Persistence.Repositories
{
ITemplate Get(string alias);
IEnumerable<ITemplate> GetAll(params string[] aliases);
/// <summary>
/// Returns a template as a template node which can be traversed (parent, children)
/// </summary>
/// <param name="alias"></param>
/// <returns></returns>
TemplateNode GetTemplateNode(string alias);
/// <summary>
/// Given a template node in a tree, this will find the template node with the given alias if it is found in the hierarchy, otherwise null
/// </summary>
/// <param name="anyNode"></param>
/// <param name="alias"></param>
/// <returns></returns>
TemplateNode FindTemplateInTree(TemplateNode anyNode, string alias);
}
}

View File

@@ -273,6 +273,32 @@ namespace Umbraco.Core.Persistence.Repositories
protected override void PersistDeletedItem(ITemplate entity)
{
//TODO: This isn't the most ideal way to delete a template tree, because below it will actually end up
// recursing back to this method for each descendant and re-looking up the template list causing an extrac
// SQL call - not ideal but there shouldn't ever be a heaping list of descendant templates.
//The easiest way to overcome this is to expose the underlying cache upwards so that the repository has access
// to it, then in the PersistDeletedTemplate we wouldn't recurse the underlying function, we'd just call
// PersistDeletedItem with a Template object and clear it's cache.
var sql = new Sql();
sql.Select("*").From<TemplateDto>().Where<TemplateDto>(dto => dto.Master != null || dto.NodeId == entity.Id);
var dtos = Database.Fetch<TemplateDto>(sql);
var self = dtos.Single(x => x.NodeId == entity.Id);
var allChildren = dtos.Except(new[] { self });
var hierarchy = GenerateTemplateHierarchy(self, allChildren);
//remove ourselves
hierarchy.Remove(self);
//change the order so it goes bottom up!
hierarchy.Reverse();
//delete the hierarchy
foreach (var descendant in hierarchy)
{
PersistDeletedTemplate(descendant);
}
//now we can delete this one
base.PersistDeletedItem(entity);
//Check for file under the Masterpages filesystem
@@ -298,6 +324,34 @@ namespace Umbraco.Core.Persistence.Repositories
#endregion
private void PersistDeletedTemplate(TemplateDto dto)
{
//we need to get the real template for this item unfortunately to remove it
var template = Get(dto.NodeId);
if (template != null)
{
//NOTE: We must cast here so that it goes to the outter method to
// ensure the cache is updated.
PersistDeletedItem((IEntity)template);
}
}
/// <summary>
/// Returns a list of templates in order of descendants from the parent
/// </summary>
/// <param name="template"></param>
/// <param name="allChildTemplates"></param>
/// <returns></returns>
private static List<TemplateDto> GenerateTemplateHierarchy(TemplateDto template, IEnumerable<TemplateDto> allChildTemplates)
{
var hierarchy = new List<TemplateDto> { template };
foreach (var t in allChildTemplates.Where(x => x.Master == template.NodeId))
{
hierarchy.AddRange(GenerateTemplateHierarchy(t, allChildTemplates));
}
return hierarchy;
}
private void PopulateViewTemplate(ITemplate template, string fileName)
{
string content = string.Empty;
@@ -379,6 +433,103 @@ namespace Umbraco.Core.Persistence.Repositories
}
/// <summary>
/// Returns a template as a template node which can be traversed (parent, children)
/// </summary>
/// <param name="alias"></param>
/// <returns></returns>
public TemplateNode GetTemplateNode(string alias)
{
//in order to do this we need to get all of the templates and then organize, unfortunately
// our db structure does not use the path correctly for templates so we cannot just look
// up a template tree easily.
//first get all template objects
var allTemplates = GetAll().ToArray();
var selfTemplate = allTemplates.SingleOrDefault(x => x.Alias == alias);
if (selfTemplate == null)
{
return null;
}
//then we need to get all template Dto's because those contain the master property
var sql = new Sql();
sql.Select("*").From<TemplateDto>();
var allDtos = Database.Fetch<TemplateDto>(sql).ToArray();
var selfDto = allDtos.Single(x => x.NodeId == selfTemplate.Id);
//need to get the top-most node of the current tree
var top = selfDto;
while (top.Master.HasValue)
{
top = allDtos.Single(x => x.NodeId == top.Master.Value);
}
var topNode = new TemplateNode(allTemplates.Single(x => x.Id == top.NodeId));
var childIds = allDtos.Where(x => x.Master == top.NodeId).Select(x => x.NodeId);
//This now creates the hierarchy recursively
topNode.Children = CreateChildren(topNode, childIds, allTemplates, allDtos);
//now we'll return the TemplateNode requested
return FindTemplateInTree(topNode, alias);
}
private static TemplateNode WalkTree(TemplateNode current, string alias)
{
//now walk the tree to find the node
if (current.Template.Alias == alias)
{
return current;
}
foreach (var c in current.Children)
{
var found = WalkTree(c, alias);
if (found != null) return found;
}
return null;
}
/// <summary>
/// Given a template node in a tree, this will find the template node with the given alias if it is found in the hierarchy, otherwise null
/// </summary>
/// <param name="anyNode"></param>
/// <param name="alias"></param>
/// <returns></returns>
public TemplateNode FindTemplateInTree(TemplateNode anyNode, string alias)
{
//first get the root
var top = anyNode;
while (top.Parent != null)
{
top = top.Parent;
}
return WalkTree(top, alias);
}
private static IEnumerable<TemplateNode> CreateChildren(TemplateNode parent, IEnumerable<int> childIds, ITemplate[] allTemplates, TemplateDto[] allDtos)
{
var children = new List<TemplateNode>();
foreach (var i in childIds)
{
var template = allTemplates.Single(x => x.Id == i);
var child = new TemplateNode(template)
{
Parent = parent
};
//add to our list
children.Add(child);
//get this node's children
var kids = allDtos.Where(x => x.Master == i).Select(x => x.NodeId).ToArray();
//recurse
child.Children = CreateChildren(child, kids, allTemplates, allDtos);
}
return children;
}
#endregion
}
}

View File

@@ -13,24 +13,24 @@ namespace Umbraco.Core.Services
/// </summary>
public class FileService : IFileService
{
private readonly RepositoryFactory _repositoryFactory;
private readonly RepositoryFactory _repositoryFactory;
private readonly IUnitOfWorkProvider _fileUowProvider;
private readonly IDatabaseUnitOfWorkProvider _dataUowProvider;
public FileService()
: this(new RepositoryFactory())
{}
{ }
public FileService(RepositoryFactory repositoryFactory)
: this(new FileUnitOfWorkProvider(), new PetaPocoUnitOfWorkProvider(), repositoryFactory)
: this(new FileUnitOfWorkProvider(), new PetaPocoUnitOfWorkProvider(), repositoryFactory)
{
}
public FileService(IUnitOfWorkProvider fileProvider, IDatabaseUnitOfWorkProvider dataProvider, RepositoryFactory repositoryFactory)
public FileService(IUnitOfWorkProvider fileProvider, IDatabaseUnitOfWorkProvider dataProvider, RepositoryFactory repositoryFactory)
{
_repositoryFactory = repositoryFactory;
_fileUowProvider = fileProvider;
_dataUowProvider = dataProvider;
_repositoryFactory = repositoryFactory;
_fileUowProvider = fileProvider;
_dataUowProvider = dataProvider;
}
/// <summary>
@@ -65,19 +65,19 @@ namespace Umbraco.Core.Services
/// <param name="userId"></param>
public void SaveStylesheet(Stylesheet stylesheet, int userId = 0)
{
if (SavingStylesheet.IsRaisedEventCancelled(new SaveEventArgs<Stylesheet>(stylesheet), this))
return;
var uow = _fileUowProvider.GetUnitOfWork();
if (SavingStylesheet.IsRaisedEventCancelled(new SaveEventArgs<Stylesheet>(stylesheet), this))
return;
var uow = _fileUowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateStylesheetRepository(uow, _dataUowProvider.GetUnitOfWork()))
{
repository.AddOrUpdate(stylesheet);
uow.Commit();
{
repository.AddOrUpdate(stylesheet);
uow.Commit();
SavedStylesheet.RaiseEvent(new SaveEventArgs<Stylesheet>(stylesheet, false), this);
}
SavedStylesheet.RaiseEvent(new SaveEventArgs<Stylesheet>(stylesheet, false), this);
}
Audit.Add(AuditTypes.Save, string.Format("Save Stylesheet performed by user"), userId, -1);
Audit.Add(AuditTypes.Save, string.Format("Save Stylesheet performed by user"), userId, -1);
}
/// <summary>
@@ -92,15 +92,15 @@ namespace Umbraco.Core.Services
{
var stylesheet = repository.Get(name);
if (DeletingStylesheet.IsRaisedEventCancelled(new DeleteEventArgs<Stylesheet>(stylesheet), this))
return;
if (DeletingStylesheet.IsRaisedEventCancelled(new DeleteEventArgs<Stylesheet>(stylesheet), this))
return;
repository.Delete(stylesheet);
uow.Commit();
repository.Delete(stylesheet);
uow.Commit();
DeletedStylesheet.RaiseEvent(new DeleteEventArgs<Stylesheet>(stylesheet, false), this);
DeletedStylesheet.RaiseEvent(new DeleteEventArgs<Stylesheet>(stylesheet, false), this);
Audit.Add(AuditTypes.Delete, string.Format("Delete Stylesheet performed by user"), userId, -1);
Audit.Add(AuditTypes.Delete, string.Format("Delete Stylesheet performed by user"), userId, -1);
}
}
@@ -146,19 +146,19 @@ namespace Umbraco.Core.Services
/// <param name="userId"></param>
public void SaveScript(Script script, int userId = 0)
{
if (SavingScript.IsRaisedEventCancelled(new SaveEventArgs<Script>(script), this))
return;
var uow = _fileUowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateScriptRepository(uow))
{
repository.AddOrUpdate(script);
uow.Commit();
if (SavingScript.IsRaisedEventCancelled(new SaveEventArgs<Script>(script), this))
return;
SavedScript.RaiseEvent(new SaveEventArgs<Script>(script, false), this);
}
var uow = _fileUowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateScriptRepository(uow))
{
repository.AddOrUpdate(script);
uow.Commit();
Audit.Add(AuditTypes.Save, string.Format("Save Script performed by user"), userId, -1);
SavedScript.RaiseEvent(new SaveEventArgs<Script>(script, false), this);
}
Audit.Add(AuditTypes.Save, string.Format("Save Script performed by user"), userId, -1);
}
/// <summary>
@@ -173,15 +173,15 @@ namespace Umbraco.Core.Services
{
var script = repository.Get(name);
if (DeletingScript.IsRaisedEventCancelled(new DeleteEventArgs<Script>(script), this))
return; ;
repository.Delete(script);
uow.Commit();
if (DeletingScript.IsRaisedEventCancelled(new DeleteEventArgs<Script>(script), this))
return; ;
DeletedScript.RaiseEvent(new DeleteEventArgs<Script>(script, false), this);
repository.Delete(script);
uow.Commit();
Audit.Add(AuditTypes.Delete, string.Format("Delete Script performed by user"), userId, -1);
DeletedScript.RaiseEvent(new DeleteEventArgs<Script>(script, false), this);
Audit.Add(AuditTypes.Delete, string.Format("Delete Script performed by user"), userId, -1);
}
}
@@ -233,6 +233,33 @@ namespace Umbraco.Core.Services
}
}
/// <summary>
/// Returns a template as a template node which can be traversed (parent, children)
/// </summary>
/// <param name="alias"></param>
/// <returns></returns>
public TemplateNode GetTemplateNode(string alias)
{
using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork()))
{
return repository.GetTemplateNode(alias);
}
}
/// <summary>
/// Given a template node in a tree, this will find the template node with the given alias if it is found in the hierarchy, otherwise null
/// </summary>
/// <param name="anyNode"></param>
/// <param name="alias"></param>
/// <returns></returns>
public TemplateNode FindTemplateInTree(TemplateNode anyNode, string alias)
{
using (var repository = _repositoryFactory.CreateTemplateRepository(_dataUowProvider.GetUnitOfWork()))
{
return repository.FindTemplateInTree(anyNode, alias);
}
}
/// <summary>
/// Saves a <see cref="Template"/>
/// </summary>
@@ -240,19 +267,19 @@ namespace Umbraco.Core.Services
/// <param name="userId"></param>
public void SaveTemplate(ITemplate template, int userId = 0)
{
if (SavingTemplate.IsRaisedEventCancelled(new SaveEventArgs<ITemplate>(template), this))
return;
var uow = _dataUowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateTemplateRepository(uow))
{
repository.AddOrUpdate(template);
uow.Commit();
if (SavingTemplate.IsRaisedEventCancelled(new SaveEventArgs<ITemplate>(template), this))
return;
SavedTemplate.RaiseEvent(new SaveEventArgs<ITemplate>(template, false), this);
}
var uow = _dataUowProvider.GetUnitOfWork();
using (var repository = _repositoryFactory.CreateTemplateRepository(uow))
{
repository.AddOrUpdate(template);
uow.Commit();
Audit.Add(AuditTypes.Save, string.Format("Save Template performed by user"), userId, template.Id);
SavedTemplate.RaiseEvent(new SaveEventArgs<ITemplate>(template, false), this);
}
Audit.Add(AuditTypes.Save, string.Format("Save Template performed by user"), userId, template.Id);
}
/// <summary>
@@ -292,15 +319,15 @@ namespace Umbraco.Core.Services
{
var template = repository.Get(alias);
if (DeletingTemplate.IsRaisedEventCancelled(new DeleteEventArgs<ITemplate>(template), this))
return;
if (DeletingTemplate.IsRaisedEventCancelled(new DeleteEventArgs<ITemplate>(template), this))
return;
repository.Delete(template);
uow.Commit();
repository.Delete(template);
uow.Commit();
DeletedTemplate.RaiseEvent(new DeleteEventArgs<ITemplate>(template, false), this);
DeletedTemplate.RaiseEvent(new DeleteEventArgs<ITemplate>(template, false), this);
Audit.Add(AuditTypes.Delete, string.Format("Delete Template performed by user"), userId, template.Id);
Audit.Add(AuditTypes.Delete, string.Format("Delete Template performed by user"), userId, template.Id);
}
}
@@ -320,62 +347,62 @@ namespace Umbraco.Core.Services
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<ITemplate>> DeletingTemplate;
public static event TypedEventHandler<IFileService, DeleteEventArgs<ITemplate>> DeletingTemplate;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<ITemplate>> DeletedTemplate;
public static event TypedEventHandler<IFileService, DeleteEventArgs<ITemplate>> DeletedTemplate;
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Script>> DeletingScript;
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Script>> DeletingScript;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Script>> DeletedScript;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Script>> DeletedScript;
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Stylesheet>> DeletingStylesheet;
/// <summary>
/// Occurs before Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Stylesheet>> DeletingStylesheet;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Stylesheet>> DeletedStylesheet;
/// <summary>
/// Occurs after Delete
/// </summary>
public static event TypedEventHandler<IFileService, DeleteEventArgs<Stylesheet>> DeletedStylesheet;
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<ITemplate>> SavingTemplate;
public static event TypedEventHandler<IFileService, SaveEventArgs<ITemplate>> SavingTemplate;
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<ITemplate>> SavedTemplate;
public static event TypedEventHandler<IFileService, SaveEventArgs<ITemplate>> SavedTemplate;
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Script>> SavingScript;
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Script>> SavingScript;
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Script>> SavedScript;
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Script>> SavedScript;
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Stylesheet>> SavingStylesheet;
/// <summary>
/// Occurs before Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Stylesheet>> SavingStylesheet;
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Stylesheet>> SavedStylesheet;
/// <summary>
/// Occurs after Save
/// </summary>
public static event TypedEventHandler<IFileService, SaveEventArgs<Stylesheet>> SavedStylesheet;
#endregion
}

View File

@@ -96,6 +96,21 @@ namespace Umbraco.Core.Services
/// <returns>A <see cref="ITemplate"/> object</returns>
ITemplate GetTemplate(int id);
/// <summary>
/// Returns a template as a template node which can be traversed (parent, children)
/// </summary>
/// <param name="alias"></param>
/// <returns></returns>
TemplateNode GetTemplateNode(string alias);
/// <summary>
/// Given a template node in a tree, this will find the template node with the given alias if it is found in the hierarchy, otherwise null
/// </summary>
/// <param name="anyNode"></param>
/// <param name="alias"></param>
/// <returns></returns>
TemplateNode FindTemplateInTree(TemplateNode anyNode, string alias);
/// <summary>
/// Saves a <see cref="ITemplate"/>
/// </summary>

View File

@@ -197,6 +197,7 @@
<Compile Include="Models\PublishedContent\IPublishedContentModelFactory.cs" />
<Compile Include="Models\PublishedContent\PublishedContentModel.cs" />
<Compile Include="Models\PublishedContent\PublishedContentModelFactoryResolver.cs" />
<Compile Include="Models\TemplateNode.cs" />
<Compile Include="PropertyEditors\PropertyCacheValue.cs" />
<Compile Include="PropertyEditors\PropertyValueCacheAttribute.cs" />
<Compile Include="PropertyEditors\PropertyValueTypeAttribute.cs" />

View File

@@ -0,0 +1,336 @@
using System;
using System.IO;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Umbraco.Core.IO;
using Umbraco.Core.Models;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.Caching;
using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.UnitOfWork;
using Umbraco.Tests.TestHelpers;
namespace Umbraco.Tests.Persistence.Repositories
{
[TestFixture]
public class TemplateRepositoryTest : BaseDatabaseFactoryTest
{
private IFileSystem _masterPageFileSystem;
private IFileSystem _viewsFileSystem;
[SetUp]
public override void Initialize()
{
base.Initialize();
_masterPageFileSystem = new PhysicalFileSystem(SystemDirectories.Masterpages);
_viewsFileSystem = new PhysicalFileSystem(SystemDirectories.MvcViews);
}
[Test]
public void Can_Instantiate_Repository_From_Resolver()
{
// Arrange
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
// Act
var repository = RepositoryResolver.Current.ResolveByType<ITemplateRepository>(unitOfWork);
// Assert
Assert.That(repository, Is.Not.Null);
}
[Test]
public void Can_Instantiate_Repository()
{
// Arrange
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
// Act
var repository = new TemplateRepository(unitOfWork, NullCacheProvider.Current, _masterPageFileSystem, _viewsFileSystem);
// Assert
Assert.That(repository, Is.Not.Null);
}
[Test]
public void Can_Perform_Add_MasterPage()
{
// Arrange
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
var repository = new TemplateRepository(unitOfWork, NullCacheProvider.Current, _masterPageFileSystem, _viewsFileSystem);
// Act
var template = new Template("test-add-masterpage.master", "test", "test") { Content = @"<%@ Master Language=""C#"" %>" };
repository.AddOrUpdate(template);
unitOfWork.Commit();
//Assert
Assert.That(repository.Get("test"), Is.Not.Null);
Assert.That(_masterPageFileSystem.FileExists("test.master"), Is.True);
}
[Test]
public void Can_Perform_Update_MasterPage()
{
// Arrange
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
var repository = new TemplateRepository(unitOfWork, NullCacheProvider.Current, _masterPageFileSystem, _viewsFileSystem);
// Act
var template = new Template("test-updated-masterpage.master", "test", "test") { Content = @"<%@ Master Language=""C#"" %>" };
repository.AddOrUpdate(template);
unitOfWork.Commit();
template.Content = @"<%@ Master Language=""VB"" %>";
repository.AddOrUpdate(template);
unitOfWork.Commit();
var updated = repository.Get("test");
// Assert
Assert.That(_masterPageFileSystem.FileExists("test.master"), Is.True);
Assert.That(updated.Content, Is.EqualTo(@"<%@ Master Language=""VB"" %>"));
}
[Test]
public void Can_Perform_Delete()
{
// Arrange
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
var repository = new TemplateRepository(unitOfWork, NullCacheProvider.Current, _masterPageFileSystem, _viewsFileSystem);
var template = new Template("test-add-masterpage.master", "test", "test") { Content = @"<%@ Master Language=""C#"" %>" };
repository.AddOrUpdate(template);
unitOfWork.Commit();
// Act
var templates = repository.Get("test");
repository.Delete(templates);
unitOfWork.Commit();
// Assert
Assert.IsNull(repository.Get("test"));
}
[Test]
public void Can_Perform_Delete_On_Nested_Templates()
{
// Arrange
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
var repository = new TemplateRepository(unitOfWork, NullCacheProvider.Current, _masterPageFileSystem, _viewsFileSystem);
var parent = new Template("test-parent-masterpage.master", "parent", "parent") { Content = @"<%@ Master Language=""C#"" %>" };
var child = new Template("test-child-masterpage.master", "child", "child") { Content = @"<%@ Master Language=""C#"" %>" };
var baby = new Template("test-baby-masterpage.master", "baby", "baby") { Content = @"<%@ Master Language=""C#"" %>" };
child.MasterTemplateAlias = parent.Alias;
child.MasterTemplateId = new Lazy<int>(() => parent.Id);
baby.MasterTemplateAlias = child.Alias;
baby.MasterTemplateId = new Lazy<int>(() => child.Id);
repository.AddOrUpdate(parent);
repository.AddOrUpdate(child);
repository.AddOrUpdate(baby);
unitOfWork.Commit();
// Act
var templates = repository.Get("parent");
repository.Delete(templates);
unitOfWork.Commit();
// Assert
Assert.IsNull(repository.Get("test"));
}
[Test]
public void Can_Get_Template_Tree()
{
// Arrange
var provider = new PetaPocoUnitOfWorkProvider();
var unitOfWork = provider.GetUnitOfWork();
var repository = new TemplateRepository(unitOfWork, NullCacheProvider.Current, _masterPageFileSystem, _viewsFileSystem);
var parent = new Template("test-parent-masterpage.master", "parent", "parent") { Content = @"<%@ Master Language=""C#"" %>" };
var child1 = new Template("test-child1-masterpage.master", "child1", "child1") { Content = @"<%@ Master Language=""C#"" %>" };
var toddler1 = new Template("test-toddler1-masterpage.master", "toddler1", "toddler1") { Content = @"<%@ Master Language=""C#"" %>" };
var toddler2 = new Template("test-toddler2-masterpage.master", "toddler2", "toddler2") { Content = @"<%@ Master Language=""C#"" %>" };
var baby1 = new Template("test-baby1-masterpage.master", "baby1", "baby1") { Content = @"<%@ Master Language=""C#"" %>" };
var child2 = new Template("test-child2-masterpage.master", "child2", "child2") { Content = @"<%@ Master Language=""C#"" %>" };
var toddler3 = new Template("test-toddler3-masterpage.master", "toddler3", "toddler3") { Content = @"<%@ Master Language=""C#"" %>" };
var toddler4 = new Template("test-toddler4-masterpage.master", "toddler4", "toddler4") { Content = @"<%@ Master Language=""C#"" %>" };
var baby2 = new Template("test-baby2-masterpage.master", "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);
repository.AddOrUpdate(parent);
repository.AddOrUpdate(child1);
repository.AddOrUpdate(child2);
repository.AddOrUpdate(toddler1);
repository.AddOrUpdate(toddler2);
repository.AddOrUpdate(toddler3);
repository.AddOrUpdate(toddler4);
repository.AddOrUpdate(baby1);
repository.AddOrUpdate(baby2);
unitOfWork.Commit();
// Act
var rootNode = repository.GetTemplateNode("parent");
// Assert
Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "parent"));
Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "child1"));
Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "child2"));
Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "toddler1"));
Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "toddler2"));
Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "toddler3"));
Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "toddler4"));
Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "baby1"));
Assert.IsNotNull(repository.FindTemplateInTree(rootNode, "baby2"));
}
//[Test]
//public void Can_Perform_Get_On_ScriptRepository()
//{
// // Arrange
// var provider = new FileUnitOfWorkProvider();
// var unitOfWork = provider.GetUnitOfWork();
// var repository = new ScriptRepository(unitOfWork, _masterPageFileSystem);
// // Act
// var exists = repository.Get("test-script.js");
// // Assert
// Assert.That(exists, Is.Not.Null);
// Assert.That(exists.Alias, Is.EqualTo("test-script"));
// Assert.That(exists.Name, Is.EqualTo("test-script.js"));
//}
//[Test]
//public void Can_Perform_GetAll_On_ScriptRepository()
//{
// // Arrange
// var provider = new FileUnitOfWorkProvider();
// var unitOfWork = provider.GetUnitOfWork();
// var repository = new ScriptRepository(unitOfWork, _masterPageFileSystem);
// var script = new Script("test-script1.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
// repository.AddOrUpdate(script);
// var script2 = new Script("test-script2.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
// repository.AddOrUpdate(script2);
// var script3 = new Script("test-script3.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
// repository.AddOrUpdate(script3);
// unitOfWork.Commit();
// // Act
// var scripts = repository.GetAll();
// // Assert
// Assert.That(scripts, Is.Not.Null);
// Assert.That(scripts.Any(), Is.True);
// Assert.That(scripts.Any(x => x == null), Is.False);
// Assert.That(scripts.Count(), Is.EqualTo(4));
//}
//[Test]
//public void Can_Perform_GetAll_With_Params_On_ScriptRepository()
//{
// // Arrange
// var provider = new FileUnitOfWorkProvider();
// var unitOfWork = provider.GetUnitOfWork();
// var repository = new ScriptRepository(unitOfWork, _masterPageFileSystem);
// var script = new Script("test-script1.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
// repository.AddOrUpdate(script);
// var script2 = new Script("test-script2.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
// repository.AddOrUpdate(script2);
// var script3 = new Script("test-script3.js") { Content = "/// <reference name=\"MicrosoftAjax.js\"/>" };
// repository.AddOrUpdate(script3);
// unitOfWork.Commit();
// // Act
// var scripts = repository.GetAll("test-script1.js", "test-script2.js");
// // Assert
// Assert.That(scripts, Is.Not.Null);
// Assert.That(scripts.Any(), Is.True);
// Assert.That(scripts.Any(x => x == null), Is.False);
// Assert.That(scripts.Count(), Is.EqualTo(2));
//}
//[Test]
//public void Can_Perform_Exists_On_ScriptRepository()
//{
// // Arrange
// var provider = new FileUnitOfWorkProvider();
// var unitOfWork = provider.GetUnitOfWork();
// var repository = new ScriptRepository(unitOfWork, _masterPageFileSystem);
// // Act
// var exists = repository.Exists("test-script.js");
// // Assert
// Assert.That(exists, Is.True);
//}
[TearDown]
public override void TearDown()
{
base.TearDown();
_masterPageFileSystem = null;
_viewsFileSystem = null;
//Delete all files
var fsMaster = new PhysicalFileSystem(SystemDirectories.Masterpages);
var masterPages = fsMaster.GetFiles("", "*.master");
foreach (var file in masterPages)
{
fsMaster.DeleteFile(file);
}
var fsViews = new PhysicalFileSystem(SystemDirectories.MvcViews);
var views = fsMaster.GetFiles("", "*.cshtml");
foreach (var file in views)
{
fsMaster.DeleteFile(file);
}
}
protected Stream CreateStream(string contents = null)
{
if (string.IsNullOrEmpty(contents))
contents = "/* test */";
var bytes = Encoding.UTF8.GetBytes(contents);
var stream = new MemoryStream(bytes);
return stream;
}
}
}

View File

@@ -205,6 +205,7 @@
<Compile Include="Persistence\PetaPocoExtensionsTest.cs" />
<Compile Include="Persistence\Repositories\MemberRepositoryTest.cs" />
<Compile Include="Persistence\Repositories\MemberTypeRepositoryTest.cs" />
<Compile Include="Persistence\Repositories\TemplateRepositoryTest.cs" />
<Compile Include="Persistence\Repositories\UserRepositoryTest.cs" />
<Compile Include="Persistence\Repositories\UserTypeRepositoryTest.cs" />
<Compile Include="PublishedContent\PublishedContentExtensionTests.cs" />