diff --git a/.gitignore b/.gitignore index 708830d..82bb634 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,6 @@ src/*/v6obj # NuGet packages packages/* !packages/repositories.config -Build/*.nupkg \ No newline at end of file +Build/*.nupkg + +src/Rainbow.*.Tests/license.xml \ No newline at end of file diff --git a/Rainbow.sln b/Rainbow.sln index a498ae2..c633f59 100644 --- a/Rainbow.sln +++ b/Rainbow.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22823.1 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rainbow.Tests", "src\Rainbow.Tests\Rainbow.Tests.csproj", "{3A8495AE-E286-44A2-8BBB-EE9911F5BA43}" EndProject @@ -13,6 +13,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rainbow.Storage.Yaml.Tests" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rainbow.Storage.Sc", "src\Rainbow.Storage.Sc\Rainbow.Storage.Sc.csproj", "{956AFE8B-51CD-4D61-B8C1-BFFDC749FD82}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rainbow.Storage.Sc.Tests", "src\Rainbow.Storage.Sc.Tests\Rainbow.Storage.Sc.Tests.csproj", "{20031F60-CD51-4F57-A13C-33D6D85D68ED}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -39,6 +41,10 @@ Global {956AFE8B-51CD-4D61-B8C1-BFFDC749FD82}.Debug|Any CPU.Build.0 = Debug|Any CPU {956AFE8B-51CD-4D61-B8C1-BFFDC749FD82}.Release|Any CPU.ActiveCfg = Release|Any CPU {956AFE8B-51CD-4D61-B8C1-BFFDC749FD82}.Release|Any CPU.Build.0 = Release|Any CPU + {20031F60-CD51-4F57-A13C-33D6D85D68ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20031F60-CD51-4F57-A13C-33D6D85D68ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20031F60-CD51-4F57-A13C-33D6D85D68ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20031F60-CD51-4F57-A13C-33D6D85D68ED}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Rainbow.Storage.Sc.Tests/App.config b/src/Rainbow.Storage.Sc.Tests/App.config new file mode 100644 index 0000000..2381a81 --- /dev/null +++ b/src/Rainbow.Storage.Sc.Tests/App.config @@ -0,0 +1,224 @@ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ true +
+
+ + + + + $(id) + + + + + + + $(id) + + + + + + + $(id) + + + + + + + + + + roles + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Rainbow.Storage.Sc.Tests/App_Config/FieldTypes.config b/src/Rainbow.Storage.Sc.Tests/App_Config/FieldTypes.config new file mode 100644 index 0000000..55de84c --- /dev/null +++ b/src/Rainbow.Storage.Sc.Tests/App_Config/FieldTypes.config @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Rainbow.Storage.Sc.Tests/Deserialization/DefaultDeserializerTests.cs b/src/Rainbow.Storage.Sc.Tests/Deserialization/DefaultDeserializerTests.cs new file mode 100644 index 0000000..bcd531b --- /dev/null +++ b/src/Rainbow.Storage.Sc.Tests/Deserialization/DefaultDeserializerTests.cs @@ -0,0 +1,262 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NSubstitute; +using NUnit.Framework; +using Rainbow.Filtering; +using Rainbow.Model; +using Rainbow.Storage.Sc.Deserialization; +using Rainbow.Tests; +using Sitecore; +using Sitecore.Data; +using Sitecore.Data.Items; +using Sitecore.FakeDb; + +namespace Rainbow.Storage.Sc.Tests.Deserialization +{ + public class DefaultDeserializerTests + { + private readonly ID _testTemplateId = ID.NewID; + private readonly ID _testTemplate2Id = ID.NewID; + private readonly ID _testSharedFieldId = ID.NewID; + private readonly ID _testVersionedFieldId = ID.NewID; + + [Test] + public void Deserialize_DeserializesNewItem() + { + using (var db = new Db()) + { + var deserializer = CreateTestDeserializer(db); + + var item = new FakeItem( + id: Guid.NewGuid(), + parentId: ItemIDs.ContentRoot.Guid, + templateId: _testTemplateId.Guid, + versions: new[] + { + new FakeItemVersion(1, "en", new[] + { + new FakeFieldValue("Hello", fieldId: _testVersionedFieldId.Guid) + }) + }); + + var deserialized = deserializer.Deserialize(item, false); + + Assert.IsNotNull(deserialized); + + var fromDb = db.GetItem(new ID(item.Id)); + + Assert.IsNotNull(fromDb); + Assert.AreEqual("Hello", fromDb[_testVersionedFieldId]); + Assert.AreEqual(item.ParentId, fromDb.ParentID.Guid); + Assert.AreEqual(item.TemplateId, fromDb.TemplateID.Guid); + } + } + + [Test] + public void Deserialize_DeserializesExistingItem_WithSharedFieldChanges() + { + RunItemChangeTest( + setup: itemData => + { + var fields = itemData.SharedFields.ToList(); + fields.Add(new FakeFieldValue("Shared Value", fieldId: _testSharedFieldId.Guid)); + itemData.SharedFields = fields; + }, + assert: dbItem => + { + Assert.AreEqual("Shared Value", dbItem[_testSharedFieldId]); + } + ); + } + + [Test] + public void Deserialize_DeserializesExistingItem_WithVersionedFieldChanges() + { + RunItemChangeTest( + setup: itemData => + { + var version = (ProxyItemVersion)itemData.Versions.First(); + var fields = version.Fields.ToList(); + fields.Add(new FakeFieldValue("Versioned Value", fieldId: _testVersionedFieldId.Guid)); + version.Fields = fields; + }, + assert: dbItem => + { + Assert.AreEqual("Versioned Value", dbItem[_testVersionedFieldId]); + } + ); + } + + [Test] + public void Deserialize_DeserializesExistingItem_WithRenamed() + { + RunItemChangeTest( + setup: itemData => + { + itemData.Name = "Testy Item"; + }, + assert: dbItem => + { + Assert.AreEqual("Testy Item", dbItem.Name); + } + ); + } + + [Test] + public void Deserialize_DeserializesExistingItem_WithMoved() + { + RunItemChangeTest( + setup: itemData => + { + itemData.ParentId = ItemIDs.TemplateRoot.Guid; + }, + assert: dbItem => + { + Assert.AreEqual(ItemIDs.TemplateRoot, dbItem.ParentID); + Assert.AreEqual("/sitecore/templates/test item", dbItem.Paths.FullPath); + } + ); + } + + [Test] + public void Deserialize_DeserializesExistingItem_WithTemplateChanged() + { + // TODO: https://github.com/sergeyshushlyapin/Sitecore.FakeDb/issues/84 + //RunItemChangeTest( + // setup: itemData => + // { + // itemData.TemplateId = _testTemplate2Id.Guid; + // }, + // assert: dbItem => + // { + // Assert.AreEqual(_testTemplate2Id, dbItem.TemplateID); + // } + //); + } + + [Test] + public void Deserialize_DeserializesExistingItem_WithVersionAdded() + { + RunItemChangeTest( + setup: itemData => + { + var versions = itemData.Versions.ToList(); + versions.Add(new FakeItemVersion(2)); + + itemData.Versions = versions; + }, + assert: dbItem => + { + Assert.AreEqual(2, dbItem.Versions.Count); + } + ); + } + + [Test] + public void Deserialize_DeserializesExistingItem_WithVersionRemoved() + { + RunItemChangeTest( + setup: itemData => + { + var versions = new List(); + itemData.Versions = versions; + }, + assert: dbItem => + { + Assert.AreEqual(0, dbItem.Versions.Count); + } + ); + } + + [Test] + public void Deserialize_IgnoresField_ExcludedWithFieldFilter() + { + var ignoredFieldId = ID.NewID; + + var fieldFilter = Substitute.For(); + fieldFilter.Includes(Arg.Any()).Returns(true); + fieldFilter.Includes(ignoredFieldId.Guid).Returns(false); + + var deserializer = new DefaultDeserializer(Substitute.For(), fieldFilter); + deserializer.ParentDataStore = new SitecoreDataStore(deserializer); + + using (var db = new Db()) + { + var itemId = ID.NewID; + + db.Add(new DbItem("Test Item", itemId) + { + {ignoredFieldId, "Test Value"} + }); + + var itemData = new ProxyItem(new ItemData(db.GetItem(itemId))); + + var fields = new List(); + fields.Add(new FakeFieldValue("Changed Ignored Value", fieldId:ignoredFieldId.Guid)); + ((ProxyItemVersion)itemData.Versions.First()).Fields = fields; + + deserializer.Deserialize(itemData, false); + + var fromDb = db.GetItem(itemId); + + Assert.AreEqual(fromDb[ignoredFieldId], "Test Value"); + } + } + + protected IDeserializer CreateTestDeserializer(Db db) + { + var fieldFilter = Substitute.For(); + fieldFilter.Includes(Arg.Any()).Returns(true); + + var deserializer = new DefaultDeserializer(Substitute.For(), fieldFilter); + deserializer.ParentDataStore = new SitecoreDataStore(deserializer); + + db.Add(new DbTemplate("Test Template", _testTemplateId) + { + new DbField("Test Field", _testVersionedFieldId), + new DbField("Test Shared", _testSharedFieldId) { Shared = true } + }); + + db.Add(new DbTemplate("Test Template2", _testTemplate2Id) + { + new DbField("Test Field"), + new DbField("Test Shared") { Shared = true } + }); + + return deserializer; + } + + protected ID AddExistingItem(Db db, Action customize = null) + { + ID id = ID.NewID; + var item = new DbItem("test item", id, _testTemplateId); + if (customize != null) customize(item); + + db.Add(item); + + return id; + } + + private void RunItemChangeTest(Action setup, Action assert) + { + using (var db = new Db()) + { + var deserializer = CreateTestDeserializer(db); + + var itemId = AddExistingItem(db); + + var itemData = new ProxyItem(new ItemData(db.GetItem(itemId))); + + setup(itemData); + + deserializer.Deserialize(itemData, false); + + var fromDb = db.GetItem(itemId); + + Assert.IsNotNull(fromDb); + assert(fromDb); + } + } + } +} diff --git a/src/Rainbow.Storage.Sc.Tests/ItemDataTests.cs b/src/Rainbow.Storage.Sc.Tests/ItemDataTests.cs new file mode 100644 index 0000000..b58e5fe --- /dev/null +++ b/src/Rainbow.Storage.Sc.Tests/ItemDataTests.cs @@ -0,0 +1,213 @@ +using System; +using System.Linq; +using NUnit.Framework; +using Rainbow.Model; +using Sitecore.Data; +using Sitecore.FakeDb; + +namespace Rainbow.Storage.Sc.Tests +{ + public class ItemDataTests + { + [Test] + public void Id_ReturnsExpectedValue() + { + var id = ID.NewID; + var item = new DbItem("hello", id); + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual(id.Guid, testItem.Id); + }); + } + + [Test] + public void DatabaseName_ReturnsExpectedValue() + { + var item = new DbItem("hello"); + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual("master", testItem.DatabaseName); + }); + } + + [Test] + public void ParentId_ReturnsExpectedValue() + { + var pid = ID.NewID; + var item = new DbItem("hello", pid); + + RunItemTest(item, (testItem, db) => + { + db.Add(new DbItem("hellochild") { ParentID = pid }); + + var child = db.GetItem("/sitecore/content/hello/hellochild"); + + Assert.AreEqual(pid, child.ParentID); + }); + } + + [Test] + public void Path_ReturnsExpectedValue() + { + var item = new DbItem("hello"); + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual("/sitecore/content/hello", testItem.Path); + }); + } + + [Test] + public void Name_ReturnsExpectedValue() + { + var item = new DbItem("hello"); + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual("hello", testItem.Name); + }); + } + + [Test] + public void BranchId_ReturnsExpectedValue() + { + var id = ID.NewID; + var item = new DbItem("hello") { BranchId = id }; + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual(id.Guid, testItem.BranchId); + }); + } + + [Test] + public void TemplateId_ReturnsExpectedValue() + { + var id = ID.NewID; + var item = new DbItem("hello") { TemplateID = id }; + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual(id.Guid, testItem.TemplateId); + }); + } + + [Test] + public void SharedFields_ReturnsExpectedValues() + { + var id = ID.NewID; + var item = new DbItem("hello") + { + new DbField(id) { Shared = true, Value = "test field"} + }; + + RunItemTest(item, (testItem, db) => + { + Assert.IsTrue(testItem.SharedFields.Any(f => f.FieldId == id.Guid)); + }); + } + + [Test] + public void Versions_ReturnsExpectedVersions() + { + var id = ID.NewID; + var item = new DbItem("hello") + { + new DbField(id) + { + {"en", 1, "test value"}, + {"en", 2, "test v2"} + } + }; + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual(2, testItem.Versions.Count()); + Assert.IsTrue(testItem.Versions.Any(v => v.Language.Name == "en" && v.VersionNumber == 1)); + Assert.IsTrue(testItem.Versions.Any(v => v.Language.Name == "en" && v.VersionNumber == 2)); + }); + } + + [Test] + public void Field_Value_ReturnsExpectedValue() + { + var id = ID.NewID; + var item = new DbItem("hello") + { + new DbField(id) + { + Shared = true, + Value = "test" + } + }; + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual(id.Guid, testItem.SharedFields.First(f => f.FieldId == id.Guid).FieldId); + }); + } + + [Test] + public void Field_FieldType_ReturnsExpectedValue() + { + var id = ID.NewID; + var item = new DbItem("hello") + { + new DbField(id) {Value = "test", Type = "test type", Shared = true} + }; + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual("test type", testItem.SharedFields.First(f => f.FieldId == id.Guid).FieldType); + }); + } + + [Test] + public void Field_NameHint_ReturnsExpectedValue() + { + var id = ID.NewID; + var item = new DbItem("hello") + { + new DbField(id) {Value = "test", Name = "Foo", Shared = true} + }; + + RunItemTest(item, (testItem, db) => + { + Assert.AreEqual("Foo", testItem.SharedFields.First(f => f.FieldId == id.Guid).NameHint); + }); + } + + [Test] + public void Version_Fields_ReturnsExpectedValues() + { + var id = ID.NewID; + var item = new DbItem("hello") + { + new DbField(id) + { + {"en", 1, "test"} + } + }; + + RunItemTest(item, (testItem, db) => + { + var version = testItem.Versions.First(); + Assert.AreEqual("test", version.Fields.FirstOrDefault(f => f.FieldId == id.Guid).Value); + }); + } + + private void RunItemTest(DbItem testItem, Action test) + { + using (var db = new Db()) + { + db.Add(testItem); + + var item = db.GetItem(testItem.ID); + + test(new ItemData(item), db); + } + } + } +} diff --git a/src/Rainbow.Storage.Sc.Tests/Properties/AssemblyInfo.cs b/src/Rainbow.Storage.Sc.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0e0502b --- /dev/null +++ b/src/Rainbow.Storage.Sc.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Rainbow.Storage.Sc.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Rainbow.Storage.Sc.Tests")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("20031f60-cd51-4f57-a13c-33d6d85d68ed")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Rainbow.Storage.Sc.Tests/Rainbow.Storage.Sc.Tests.csproj b/src/Rainbow.Storage.Sc.Tests/Rainbow.Storage.Sc.Tests.csproj new file mode 100644 index 0000000..62368f1 --- /dev/null +++ b/src/Rainbow.Storage.Sc.Tests/Rainbow.Storage.Sc.Tests.csproj @@ -0,0 +1,109 @@ + + + + + Debug + AnyCPU + {20031F60-CD51-4F57-A13C-33D6D85D68ED} + Library + Properties + Rainbow.Storage.Sc.Tests + Rainbow.Storage.Sc.Tests + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\lib\Sitecore\v7\Lucene.Net.dll + + + ..\..\packages\NSubstitute.1.8.2.0\lib\net45\NSubstitute.dll + True + + + ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + True + + + ..\..\lib\Sitecore\v7\Sitecore.Analytics.dll + + + ..\..\packages\Sitecore.FakeDb.0.29.2\lib\net45\Sitecore.FakeDb.dll + True + + + False + ..\..\lib\Sitecore\v7\Sitecore.Kernel.dll + + + False + ..\..\lib\Sitecore\v7\Sitecore.Logging.dll + + + ..\..\lib\Sitecore\v7\sitecore.nexus.dll + + + + + + + + + + + + + + + + + + + + + + + + {956afe8b-51cd-4d61-b8c1-bffdc749fd82} + Rainbow.Storage.Sc + + + {3a8495ae-e286-44a2-8bbb-ee9911f5ba43} + Rainbow.Tests + + + {8ff75c8b-2a9e-4d95-91ad-333071813199} + Rainbow + + + + + + + + + \ No newline at end of file diff --git a/src/Rainbow.Storage.Sc.Tests/SitecoreDataStoreTests.cs b/src/Rainbow.Storage.Sc.Tests/SitecoreDataStoreTests.cs new file mode 100644 index 0000000..c56722c --- /dev/null +++ b/src/Rainbow.Storage.Sc.Tests/SitecoreDataStoreTests.cs @@ -0,0 +1,202 @@ +using System; +using System.Linq; +using NSubstitute; +using NUnit.Framework; +using Rainbow.Storage.Sc.Deserialization; +using Rainbow.Tests; +using Sitecore.Data; +using Sitecore.FakeDb; + +namespace Rainbow.Storage.Sc.Tests +{ + public class SitecoreDataStoreTests + { + [Test] + public void GetDatabaseNames_ShouldReturnDatabaseNames() + { + + } + + [Test] + public void Save_ShouldDeserializeItem() + { + var deserializer = Substitute.For(); + var dataStore = new SitecoreDataStore(deserializer); + + var item = new FakeItem(); + + dataStore.Save(item); + + deserializer.Received().Deserialize(item, Arg.Any()); + } + + [Test] + public void MoveOrRename_ThrowsNotImplementedException() + { + var dataStore = CreateTestDataStore(); + Assert.Throws(() => dataStore.MoveOrRenameItem(new FakeItem(), "/sitecore")); + } + + [Test] + public void GetByPath_ReturnsExpectedItem_WhenPathExists() + { + using (new Db()) + { + var dataStore = CreateTestDataStore(); + + var item = dataStore.GetByPath("/sitecore/templates", "master").ToArray(); + + Assert.IsNotEmpty(item); + Assert.AreEqual("templates", item.First().Name); + } + } + + [Test] + public void GetByPath_ReturnsNull_WhenPathDoesNotExist() + { + using (new Db()) + { + var dataStore = CreateTestDataStore(); + + var item = dataStore.GetByPath("/sitecore/templates/Monkey Bars", "master"); + + Assert.IsEmpty(item); + } + } + + [Test] + public void GetByPathAndId_ReturnsItem_WhenItemIdExists() + { + GetById_ReturnsItem_WhenItemIdExists(); // for now. in case implementation changes later, keep this redundant test. + } + + [Test] + public void GetById_ReturnsItem_WhenItemIdExists() + { + using (var db = new Db()) + { + var id = new ID(); + db.Add(new DbItem("Hello", id)); + + var dataStore = CreateTestDataStore(); + + var item = dataStore.GetById(id.Guid, "master"); + + Assert.IsNotNull(item); + Assert.AreEqual("Hello", item.Name); + } + } + + [Test] + public void GetById_ReturnsNull_WhenItemIdDoesNotExist() + { + using (new Db()) + { + var dataStore = CreateTestDataStore(); + + var item = dataStore.GetById(Guid.NewGuid(), "master"); + + Assert.IsNull(item); + } + } + + [Test] + public void GetMetadataByTemplateId_ThrowsNotImplementedException() + { + var dataStore = CreateTestDataStore(); + Assert.Throws(() => dataStore.GetMetadataByTemplateId(Guid.NewGuid(), "master")); + } + + [Test] + public void GetChildren_ReturnsExpectedChildren() + { + using (var db = new Db()) + { + db.Add(new DbItem("Hello")); + + var dataStore = CreateTestDataStore(); + + var parent = dataStore.GetByPath("/sitecore/content", "master").First(); + + var children = dataStore.GetChildren(parent); + + Assert.IsNotNull(children); + Assert.IsNotEmpty(children); + Assert.AreEqual("Hello", children.First().Name); + } + } + + [Test] + public void GetChildren_ReturnsEmptyEnumerable_IfItemDoesNotExist() + { + using (new Db()) + { + var dataStore = CreateTestDataStore(); + + var parent = new FakeItem(Guid.NewGuid(), name: "LOL"); + + var children = dataStore.GetChildren(parent); + + Assert.IsNotNull(children); + Assert.IsEmpty(children); + } + } + + [Test] + public void Remove_RemovesExpectedItem() + { + using (var db = new Db()) + { + var id = new ID(); + db.Add(new DbItem("Hello", id)); + + var dataStore = CreateTestDataStore(); + + var item = dataStore.GetById(id.Guid, "master"); + + var result = dataStore.Remove(item); + + var itemAfterDelete = dataStore.GetById(id.Guid, "master"); + + Assert.IsTrue(result); + Assert.IsNull(itemAfterDelete); + } + } + + [Test] + public void Remove_ReturnsFalse_WhenItemDoesNotExist() + { + using (new Db()) + { + var dataStore = CreateTestDataStore(); + + var item = new FakeItem(Guid.NewGuid(), name: "lol"); + + var result = dataStore.Remove(item); + + Assert.IsFalse(result); + } + } + + [Test] + public void RegisterForChanges_ThrowsNotImplementedException() + { + var dataStore = CreateTestDataStore(); + Assert.Throws(() => dataStore.RegisterForChanges((metadata, s) => { })); + } + + [Test] + public void Clear_ThrowsNotImplementedException() + { + var dataStore = CreateTestDataStore(); + Assert.Throws(() => dataStore.Clear()); + } + + protected IDataStore CreateTestDataStore() + { + var deserializer = Substitute.For(); + + return new SitecoreDataStore(deserializer); + } + } +} diff --git a/src/Rainbow.Storage.Sc.Tests/packages.config b/src/Rainbow.Storage.Sc.Tests/packages.config new file mode 100644 index 0000000..1d396e0 --- /dev/null +++ b/src/Rainbow.Storage.Sc.Tests/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Rainbow.Storage.Sc/SitecoreDataStore.cs b/src/Rainbow.Storage.Sc/SitecoreDataStore.cs index e6cfde2..43eaac8 100644 --- a/src/Rainbow.Storage.Sc/SitecoreDataStore.cs +++ b/src/Rainbow.Storage.Sc/SitecoreDataStore.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; using Rainbow.Model; using Rainbow.Storage.Sc.Deserialization; using Sitecore.Collections; @@ -31,6 +30,8 @@ public IEnumerable GetDatabaseNames() public void Save(IItemData item) { + Assert.ArgumentNotNull(item, "item"); + _deserializer.Deserialize(item, true); } @@ -92,6 +93,8 @@ public IEnumerable GetChildren(IItemData parentItem) var item = db.GetItem(new ID(parentItem.Id)); + if (item == null) return Enumerable.Empty(); + return item.GetChildren(ChildListOptions.SkipSorting).Select(child => (IItemData)new ItemData(child, this)).ToArray(); } @@ -110,6 +113,8 @@ public void ResetTemplateEngine() public bool Remove(IItemData item) { + Assert.ArgumentNotNull(item, "item"); + var databaseRef = GetDatabase(item.DatabaseName); var scId = new ID(item.Id); var scItem = databaseRef.GetItem(scId); diff --git a/src/Rainbow/Model/ProxyFieldValue.cs b/src/Rainbow/Model/ProxyFieldValue.cs index d312f10..a42eef0 100644 --- a/src/Rainbow/Model/ProxyFieldValue.cs +++ b/src/Rainbow/Model/ProxyFieldValue.cs @@ -13,13 +13,13 @@ public ProxyFieldValue(IItemFieldValue fieldToProxy) BlobId = fieldToProxy.BlobId; } - public Guid FieldId { get; private set; } + public Guid FieldId { get; set; } - public string NameHint { get; private set; } + public string NameHint { get; set; } - public string Value { get; private set; } + public string Value { get; set; } - public string FieldType { get; private set; } - public Guid? BlobId { get; private set; } + public string FieldType { get; set; } + public Guid? BlobId { get; set; } } } diff --git a/src/Rainbow/Model/ProxyItem.cs b/src/Rainbow/Model/ProxyItem.cs index 9715c7e..f691b7c 100644 --- a/src/Rainbow/Model/ProxyItem.cs +++ b/src/Rainbow/Model/ProxyItem.cs @@ -24,16 +24,16 @@ public ProxyItem(IItemData itemToProxy) DatabaseName = itemToProxy.DatabaseName; } - public Guid Id { get; private set; } + public Guid Id { get; set; } public string DatabaseName { get; set; } - public Guid ParentId { get; private set; } - public string Path { get; private set; } - public string Name { get; private set; } - public Guid BranchId { get; private set; } - public Guid TemplateId { get; private set; } - public IEnumerable SharedFields { get; private set; } - public IEnumerable Versions { get; private set; } - public string SerializedItemId { get; private set; } + public Guid ParentId { get; set; } + public string Path { get; set; } + public string Name { get; set; } + public Guid BranchId { get; set; } + public Guid TemplateId { get; set; } + public IEnumerable SharedFields { get; set; } + public IEnumerable Versions { get; set; } + public string SerializedItemId { get; set; } public IEnumerable GetChildren() { throw new NotImplementedException("Cannot get children of a proxied item"); diff --git a/src/Rainbow/Model/ProxyItemVersion.cs b/src/Rainbow/Model/ProxyItemVersion.cs index 2417da5..67f985e 100644 --- a/src/Rainbow/Model/ProxyItemVersion.cs +++ b/src/Rainbow/Model/ProxyItemVersion.cs @@ -13,8 +13,8 @@ public ProxyItemVersion(IItemVersion versionToProxy) Fields = versionToProxy.Fields.Select(field => new ProxyFieldValue(field)).ToArray(); } - public IEnumerable Fields { get; private set; } - public CultureInfo Language { get; private set; } - public int VersionNumber { get; private set; } + public IEnumerable Fields { get; set; } + public CultureInfo Language { get; set; } + public int VersionNumber { get; set; } } }