using System; using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Datastore; using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.Datastore { [TestFixture] public class ObjectDatabaseFixture : ObjectDbTest { private Series testSeries; private Episode testEpisode; [SetUp] public void SetUp() { WithObjectDb(memory:false); testSeries = Builder .CreateNew() .With(s => s.OID = 0) .Build(); testEpisode = Builder .CreateNew() .With(e => e.OID = 0) .Build(); } [Test] public void should_be_able_to_write_to_database() { Db.Insert(testSeries); Db.AsQueryable().Should().HaveCount(1); } [Test] public void double_insert_should_fail() { Db.Insert(testSeries); Assert.Throws(() => Db.Insert(testSeries)); } [Test] public void update_item_with_root_index_0_should_faile() { testSeries.OID = 0; Assert.Throws(() => Db.Update(testSeries)); } [Test] public void should_be_able_to_store_empty_list() { var series = new List(); Db.InsertMany(series); } [Test] public void should_not_store_dirty_data_in_cache() { Db.Insert(testEpisode); Db.AsQueryable().Single().Series.Should().BeNull(); testEpisode.Series = Builder.CreateNew().Build(); Db.AsQueryable().Single().Series.Should().BeNull(); } [Test] public void should_store_nested_objects() { testEpisode.Series = testSeries; Db.Insert(testEpisode); Db.AsQueryable().Should().HaveCount(1); Db.AsQueryable().Single().Series.Should().NotBeNull(); } [Test] public void should_update_nested_objects() { testEpisode.Series = Builder .CreateNew() .With(s => s.OID = 0) .Build(); Db.Insert(testEpisode); testEpisode.Series.Title = "UpdatedTitle"; Db.Update(testEpisode); Db.AsQueryable().Should().HaveCount(1); Db.AsQueryable().Single().Series.Should().NotBeNull(); Db.AsQueryable().Single().Series.Title.Should().Be("UpdatedTitle"); } [Test] public void new_objects_should_get_id() { testSeries.OID = 0; Db.Insert(testSeries); testSeries.OID.Should().NotBe(0); } [Test] public void new_object_should_get_new_id() { testSeries.OID = 0; Db.Insert(testSeries); Db.AsQueryable().Should().HaveCount(1); testSeries.OID.Should().Be(1); } [Test] public void should_be_able_to_assign_ids_to_nested_objects() { var nested = new NestedModel(); nested.List.Add(new NestedModel()); Db.Insert(nested); nested.OID.Should().Be(1); nested.List.Should().OnlyContain(c => c.OID > 0); } [Test] public void should_have_id_when_returned_from_database() { testSeries.OID = 0; Db.Insert(testSeries); var item = Db.AsQueryable(); item.Should().HaveCount(1); item.First().OID.Should().NotBe(0); item.First().OID.Should().BeLessThan(100); item.First().OID.Should().Be(testSeries.OID); } [Test] public void should_be_able_to_find_object_by_id() { Db.Insert(testSeries); var item = Db.AsQueryable().Single(c => c.OID == testSeries.OID); item.OID.Should().NotBe(0); item.OID.Should().Be(testSeries.OID); } [Test] public void should_be_able_to_read_unknown_type() { Db.AsQueryable().ToList().Should().BeEmpty(); } } public class UnknownType : BaseRepositoryModel { public string Field1 { get; set; } } public class NestedModel : BaseRepositoryModel { public NestedModel() { List = new List { this }; } public List List { get; set; } } }