Beispiel #1
0
        public void SubmitChanges_PersonInserted_SetsNewId()
        {
            var person = new Person {
                Id = -1
            };
            var entry = new ChangeTrackerEntry
            {
                Item  = person,
                State = ChangeTrackerEntry.States.Inserted
            };
            var mockDriver = new Mock <IDatabaseDriver>();

            mockDriver.Setup(x => x.RunInsertStatement(It.IsAny <string>())).Returns(1);
            var mockSqlBuilder    = new Mock <ISqlStatementBuilder>();
            var mockChangeTracker = new Mock <IChangeTracker>();

            mockChangeTracker.Setup(x => x.GetEntry(person)).Returns(entry);
            mockChangeTracker.Setup(x => x.InsertedObjects).Returns(new List <object> {
                person
            });
            var orm = new MyOrm(mockDriver.Object, mockSqlBuilder.Object, mockChangeTracker.Object);

            orm.SubmitChanges();

            person.Id.ShouldBe(1);
        }
Beispiel #2
0
        /// <summary>
        /// Used by the query provider to materialize database objects
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="builder"></param>
        /// <returns></returns>
        public List <T> GetObjectsFromDb <T>(ISqlStatementBuilder builder)
        {
            var selectResults = _dbDriver.RunSelectStatement(builder.SelectStatement);
            var objects       = new List <T>();

            foreach (var result in selectResults)
            {
                var myObject = MaterializeObject <T>(result);

                var id = GetId(myObject);

                var possiblyExistingObject = ChangeTracker.GetEntry(id, typeof(T))?.Item;

                var objectIsNew = possiblyExistingObject == null;

                if (!objectIsNew)
                {
                    objects.Add((T)possiblyExistingObject);
                    continue;
                }

                var changeTrackerEntry = new ChangeTrackerEntry
                {
                    State = ChangeTrackerEntry.States.Unmodified,
                    Item  = myObject,
                };

                changeTrackerEntry.UpdateOriginals(myObject);
                ChangeTracker.AddEntry(changeTrackerEntry);
                objects.Add(myObject);
            }

            return(objects);
        }
        public void AddEntry_NoItem_ThrowsException()
        {
            var            entry         = new ChangeTrackerEntry();
            IChangeTracker changeTracker = new ChangeTracker();

            Should.Throw <Exception>(() => changeTracker.AddEntry(entry));
        }
 /// <inheritdoc />
 public void AddEntry(ChangeTrackerEntry entry)
 {
     if (entry.Item == null)
     {
         throw new Exception("Item is null");
     }
     _entries.Add(entry.Item, entry);
 }
Beispiel #5
0
        /// <summary>
        /// Used to add objects to the ORM
        /// </summary>
        /// <param name="objectToInsert"></param>
        public void Insert(object objectToInsert)
        {
            SetId(objectToInsert, --_insertionId);

            var changeTrackerEntry = new ChangeTrackerEntry
            {
                State = ChangeTrackerEntry.States.Inserted,
                Item  = objectToInsert,
            };

            changeTrackerEntry.UpdateOriginals(objectToInsert);
            ChangeTracker.AddEntry(changeTrackerEntry);
        }
        public void ModifiedObjects_HaveBeenAdded_ReturnEntries()
        {
            var myObject = new object();
            var entry    = new ChangeTrackerEntry
            {
                Item  = myObject,
                State = ChangeTrackerEntry.States.Modified
            };
            IChangeTracker changeTracker = new ChangeTracker();

            changeTracker.AddEntry(entry);

            changeTracker.ModifiedObjects.Single().ShouldBe(myObject);
        }
        public void AddEntry_HasItem_ContainsEntry()
        {
            var myObject = new object();
            var entry    = new ChangeTrackerEntry
            {
                Item = myObject
            };
            IChangeTracker changeTracker = new ChangeTracker();

            changeTracker.AddEntry(entry);

            changeTracker.Count.ShouldBe(1);
            changeTracker.Entries.Single().Item.ShouldBe(myObject);
        }
        public void GetEntryByObject_EntryExists_CorrectEntry()
        {
            var myObject = new object();
            var entry    = new ChangeTrackerEntry
            {
                Item = myObject
            };
            IChangeTracker changeTracker = new ChangeTracker();

            changeTracker.AddEntry(entry);

            var retrievedEntry = changeTracker.GetEntry(myObject);

            retrievedEntry.ShouldBe(entry);
            retrievedEntry.Item.ShouldBe(myObject);
        }
        public void ComputeState_SetState_StateModified()
        {
            //Arrange
            Photographer       p   = GetPhotographer();
            ChangeTrackerEntry cte = new ChangeTrackerEntry(p);

            //Act
            p.BirthDate = p.BirthDate.AddDays(2);
            cte.ComputeState();

            //Assert
            Assert.NotNull(cte.Item);
            Assert.Equal(p, cte.Item);
            Assert.NotNull(cte.Originals);
            Assert.Equal(ChangeTrackerEntry.States.Modified, cte.State);
            Assert.Equal(p.GetType().GetProperties().Length, cte.Originals.Count);
        }
        public void ComputeState_NoChange_StateDeleted()
        {
            //Arrange
            Photographer       p   = GetPhotographer();
            ChangeTrackerEntry cte = new ChangeTrackerEntry(p, ChangeTrackerEntry.States.Deleted);

            //Act
            p.Name = "othername";
            cte.ComputeState();

            //Assert
            Assert.NotNull(cte.Item);
            Assert.Equal(p, cte.Item);
            Assert.NotNull(cte.Originals);
            Assert.Equal(ChangeTrackerEntry.States.Deleted, cte.State);
            Assert.Equal(p.GetType().GetProperties().Length, cte.Originals.Count);
        }
        public void Constructor_SetsValues()
        {
            //Arrange
            Photographer p = GetPhotographer();

            //Act
            ChangeTrackerEntry cte = new ChangeTrackerEntry(p);

            //Assert
            Assert.NotNull(cte.Item);
            Assert.Equal(p, cte.Item);
            Assert.NotNull(cte.Originals);
            Assert.Equal(ChangeTrackerEntry.States.Unmodified, cte.State);
            Assert.Equal(p.GetType().GetProperties().Length, cte.Originals.Count);
            foreach (var pair in cte.Originals)
            {
                Assert.Equal(pair.Item1.GetValue(p), pair.Item2);
            }
        }
Beispiel #12
0
        public void Delete_GetsChangeTrackerEntry_SetsDeleted()
        {
            var person = new Person();
            var entry  = new ChangeTrackerEntry
            {
                Item  = person,
                State = ChangeTrackerEntry.States.Unmodified
            };
            var mockDriver        = new Mock <IDatabaseDriver>();
            var mockSqlBuilder    = new Mock <ISqlStatementBuilder>();
            var mockChangeTracker = new Mock <IChangeTracker>();

            mockChangeTracker.Setup(x => x.GetEntry(person)).Returns(entry);
            var orm = new MyOrm(mockDriver.Object, mockSqlBuilder.Object, mockChangeTracker.Object);

            orm.Delete(person);

            mockChangeTracker.Verify(x => x.GetEntry(person), Times.Once);
            entry.State.ShouldBe(ChangeTrackerEntry.States.Deleted);
        }
Beispiel #13
0
        public void SubmitChanges_PersonInserted_SetsStateUnmodified()
        {
            var person = new Person();
            var entry  = new ChangeTrackerEntry
            {
                Item  = person,
                State = ChangeTrackerEntry.States.Inserted
            };
            var mockDriver        = new Mock <IDatabaseDriver>();
            var mockSqlBuilder    = new Mock <ISqlStatementBuilder>();
            var mockChangeTracker = new Mock <IChangeTracker>();

            mockChangeTracker.Setup(x => x.GetEntry(person)).Returns(entry);
            mockChangeTracker.Setup(x => x.InsertedObjects).Returns(new List <object> {
                person
            });
            var orm = new MyOrm(mockDriver.Object, mockSqlBuilder.Object, mockChangeTracker.Object);

            orm.SubmitChanges();

            entry.State.ShouldBe(ChangeTrackerEntry.States.Unmodified);
        }
Beispiel #14
0
        public void SubmitChanges_PersonInserted_InvokesDriverRunInsertStatement()
        {
            var person = new Person();
            var entry  = new ChangeTrackerEntry
            {
                Item  = person,
                State = ChangeTrackerEntry.States.Inserted
            };
            var mockDriver        = new Mock <IDatabaseDriver>();
            var mockSqlBuilder    = new Mock <ISqlStatementBuilder>();
            var mockChangeTracker = new Mock <IChangeTracker>();

            mockChangeTracker.Setup(x => x.GetEntry(person)).Returns(entry);
            mockChangeTracker.Setup(x => x.InsertedObjects).Returns(new List <object> {
                person
            });
            var orm = new MyOrm(mockDriver.Object, mockSqlBuilder.Object, mockChangeTracker.Object);

            orm.SubmitChanges();

            mockDriver.Verify(x => x.RunInsertStatement(It.IsAny <string>()), Times.AtLeastOnce());
        }
Beispiel #15
0
        public void GetObjectsFromDb_ObjectExists_UsesSameObject()
        {
            var id     = new Random().Next(1, int.MaxValue);
            var person = new Person
            {
                Id        = id,
                FirstName = "Mike",
                LastName  = "Rosoft",
                Age       = 1337
            };
            var entry = new ChangeTrackerEntry
            {
                Item  = person,
                State = ChangeTrackerEntry.States.Unmodified
            };
            var props = new List <IDictionary <string, object> >
            {
                new Dictionary <string, object>
                {
                    { "Id", id },
                    { "FirstName", "Mike" },
                    { "LastName", "Rosoft" },
                    { "Age", 1337 }
                }
            };
            var mockDriver = new Mock <IDatabaseDriver>();

            mockDriver.Setup(x => x.RunSelectStatement(It.IsAny <string>()))
            .Returns(props);
            var mockSqlBuilder    = new Mock <ISqlStatementBuilder>();
            var mockChangeTracker = new Mock <IChangeTracker>();

            mockChangeTracker.Setup(x => x.GetEntry(id, typeof(Person))).Returns(entry);
            var orm = new MyOrm(mockDriver.Object, mockSqlBuilder.Object, mockChangeTracker.Object);

            var result = orm.GetObjectsFromDb <Person>(mockSqlBuilder.Object);

            result.Single().ShouldBe(person);
        }
        public void SetUnmodified_SetsStateToUnmodified_FromModified()
        {
            //Arrange
            Photographer       p   = GetPhotographer();
            ChangeTrackerEntry cte = new ChangeTrackerEntry(p);

            p.BirthDate = p.BirthDate.AddDays(2);
            cte.ComputeState();

            //Act
            cte.SetUnmodified();

            //Assert
            Assert.NotNull(cte.Item);
            Assert.Equal(p, cte.Item);
            Assert.NotNull(cte.Originals);
            Assert.Equal(ChangeTrackerEntry.States.Unmodified, cte.State);
            Assert.Equal(p.GetType().GetProperties().Length, cte.Originals.Count);
            foreach (var pair in cte.Originals)
            {
                Assert.Equal(pair.Item1.GetValue(p), pair.Item2);
            }
        }