Adding fields to metadata definitions

Refactoring some component and record names
Made content definition model immutable, with builder pattern for creation and alteration
Moving records and storage out of base framework assembly
Splitting into separate ContentTypeRecord and ContentTypeDefinitionRecord
Changing MetaData module's MetaDataController to AdminController
Introduced a ContentHandlerBase : IContentHandler to provide virtual no-op implementation of fairly large interface

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-06-04 13:37:34 -07:00
parent dcc51f28c6
commit 83f1de1fc9
47 changed files with 1222 additions and 427 deletions

View File

@@ -0,0 +1,211 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using Autofac;
using Moq;
using NHibernate;
using NUnit.Framework;
using Orchard.ContentManagement.MetaData;
using Orchard.ContentManagement.MetaData.Builders;
using Orchard.ContentManagement.MetaData.Models;
using Orchard.ContentManagement.MetaData.Services;
using Orchard.Core.Settings.Metadata;
using Orchard.Core.Settings.Metadata.Records;
using Orchard.Data;
using Orchard.Tests;
using Orchard.Tests.Utility;
namespace Orchard.Core.Tests.Settings.Metadata {
[TestFixture]
public class ContentDefinitionManagerTests {
private string _databaseFileName;
private ISessionFactory _sessionFactory;
private ISession _session;
private IContainer _container;
[TestFixtureSetUp]
public void InitFixture() {
_databaseFileName = Path.GetTempFileName();
_sessionFactory = DataUtility.CreateSessionFactory(
_databaseFileName,
typeof(ContentTypeDefinitionRecord),
typeof(ContentTypePartDefinitionRecord),
typeof(ContentPartDefinitionRecord),
typeof(ContentPartFieldDefinitionRecord),
typeof(ContentFieldDefinitionRecord)
);
}
[SetUp]
public void Init() {
var builder = new ContainerBuilder();
builder.RegisterAutoMocking();
builder.RegisterType<ContentDefinitionManager>().As<IContentDefinitionManager>();
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
builder.RegisterType(typeof(SettingsFormatter))
.As(typeof(IMapper<XElement, IDictionary<string, string>>))
.As(typeof(IMapper<IDictionary<string, string>, XElement>));
_container = builder.Build();
_container.Mock<ISessionLocator>()
.Setup(x => x.For(It.IsAny<Type>()))
.Returns(() => _session);
_session = _sessionFactory.OpenSession();
foreach (var killType in new[] { typeof(ContentTypeDefinitionRecord), typeof(ContentPartDefinitionRecord), typeof(ContentFieldDefinitionRecord) }) {
foreach (var killRecord in _session.CreateCriteria(killType).List()) {
_session.Delete(killRecord);
}
}
_session.Flush();
}
void ResetSession() {
_session.Flush();
_session.Dispose();
_session = _sessionFactory.OpenSession();
}
[TearDown]
public void Term() {
_session.Dispose();
}
[TestFixtureTearDown]
public void TermFixture() {
File.Delete(_databaseFileName);
}
[Test]
public void NoTypesAreAvailableByDefault() {
var types = _container.Resolve<IContentDefinitionManager>().ListTypeDefinitions();
Assert.That(types.Count(), Is.EqualTo(0));
}
[Test]
public void TypeRecordsAreReturned() {
var repository = _container.Resolve<IRepository<ContentTypeDefinitionRecord>>();
repository.Create(new ContentTypeDefinitionRecord { Name = "alpha" });
repository.Create(new ContentTypeDefinitionRecord { Name = "beta" });
ResetSession();
var types = _container.Resolve<IContentDefinitionManager>().ListTypeDefinitions();
Assert.That(types.Count(), Is.EqualTo(2));
}
[Test]
public void TypeSettingsAreParsed() {
var repository = _container.Resolve<IRepository<ContentTypeDefinitionRecord>>();
repository.Create(new ContentTypeDefinitionRecord { Name = "alpha", Settings = "<settings a='1' b='2'/>" });
ResetSession();
var alpha = _container.Resolve<IContentDefinitionManager>().ListTypeDefinitions().Single();
Assert.That(alpha.Settings["a"], Is.EqualTo("1"));
Assert.That(alpha.Settings["b"], Is.EqualTo("2"));
}
[Test]
public void ContentTypesWithSettingsCanBeCreatedAndModified() {
var manager = _container.Resolve<IContentDefinitionManager>();
manager.StoreTypeDefinition(new ContentTypeDefinitionBuilder()
.Named("alpha")
.WithSetting("a", "1")
.WithSetting("b", "2")
.Build());
manager.StoreTypeDefinition(new ContentTypeDefinitionBuilder()
.Named("beta")
.WithSetting("c", "3")
.WithSetting("d", "4")
.Build());
ResetSession();
var types1 = manager.ListTypeDefinitions();
Assert.That(types1.Count(), Is.EqualTo(2));
var alpha1 = types1.Single(t => t.Name == "alpha");
Assert.That(alpha1.Settings["a"], Is.EqualTo("1"));
manager.StoreTypeDefinition(new ContentTypeDefinitionBuilder(alpha1).WithSetting("a", "5").Build());
ResetSession();
var types2 = manager.ListTypeDefinitions();
Assert.That(types2.Count(), Is.EqualTo(2));
var alpha2 = types2.Single(t => t.Name == "alpha");
Assert.That(alpha2.Settings["a"], Is.EqualTo("5"));
Assert.That(alpha2.Settings["a"], Is.EqualTo("5"));
}
[Test]
public void StubPartDefinitionsAreCreatedWhenContentTypesAreStored() {
var manager = _container.Resolve<IContentDefinitionManager>();
manager.StoreTypeDefinition(new ContentTypeDefinitionBuilder()
.Named("alpha")
.WithPart("foo", pb => { })
.Build());
ResetSession();
var fooRecord = _container.Resolve<IRepository<ContentPartDefinitionRecord>>().Fetch(r => r.Name == "foo").SingleOrDefault();
Assert.That(fooRecord, Is.Not.Null);
Assert.That(fooRecord.Name, Is.EqualTo("foo"));
var foo = manager.GetPartDefinition("foo");
Assert.That(foo, Is.Not.Null);
Assert.That(foo.Name, Is.EqualTo("foo"));
var alpha = manager.GetTypeDefinition("alpha");
Assert.That(alpha, Is.Not.Null);
Assert.That(alpha.Parts.Count(), Is.EqualTo(1));
Assert.That(alpha.Parts.Single().PartDefinition.Name, Is.EqualTo("foo"));
}
[Test]
public void GettingDefinitionsByNameCanReturnNullAndWillAcceptNullEmptyOrInvalidNames() {
var manager = _container.Resolve<IContentDefinitionManager>();
Assert.That(manager.GetTypeDefinition("no such name"), Is.Null);
Assert.That(manager.GetTypeDefinition(string.Empty), Is.Null);
Assert.That(manager.GetTypeDefinition(null), Is.Null);
Assert.That(manager.GetPartDefinition("no such name"), Is.Null);
Assert.That(manager.GetPartDefinition(string.Empty), Is.Null);
Assert.That(manager.GetPartDefinition(null), Is.Null);
}
[Test]
public void PartsAreRemovedWhenNotReferencedButPartDefinitionRemains() {
var manager = _container.Resolve<IContentDefinitionManager>();
manager.StoreTypeDefinition(
new ContentTypeDefinitionBuilder()
.Named("alpha")
.WithPart("foo", pb => { })
.WithPart("bar", pb => { })
.Build());
AssertThatTypeHasParts("alpha","foo","bar");
Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(2));
ResetSession();
AssertThatTypeHasParts("alpha","foo","bar");
Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(2));
manager.StoreTypeDefinition(
new ContentTypeDefinitionBuilder(manager.GetTypeDefinition("alpha"))
.WithPart("frap", pb => { })
.RemovePart("bar")
.Build());
AssertThatTypeHasParts("alpha","foo","frap");
Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(3));
ResetSession();
AssertThatTypeHasParts("alpha","foo","frap");
Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(3));
}
private void AssertThatTypeHasParts(string typeName, params string[] partNames) {
var type = _container.Resolve<IContentDefinitionManager>().GetTypeDefinition(typeName);
Assert.That(type, Is.Not.Null);
Assert.That(type.Parts.Count(), Is.EqualTo(partNames.Count()));
foreach(var partName in partNames) {
Assert.That(type.Parts.Select(p=>p.PartDefinition.Name), Has.Some.EqualTo(partName));
}
}
}
}