Пример #1
0
        public void GetObjectsFromDb_Materializes_Correctly()
        {
            var props = new List <IDictionary <string, object> >
            {
                new Dictionary <string, object>
                {
                    { "Id", 1 },
                    { "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(It.IsAny <int>(), typeof(Person)))
            .Returns((ChangeTrackerEntry)null);
            var orm = new MyOrm(mockDriver.Object, mockSqlBuilder.Object, mockChangeTracker.Object);

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

            var person = result.Single().ShouldBeOfType <Person>();

            person.Id.ShouldBe(1);
            person.FirstName.ShouldBe("Mike");
            person.LastName.ShouldBe("Rosoft");
            person.Age.ShouldBe(1337);
        }
Пример #2
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);
        }
Пример #3
0
        public void Insert_AddsChangeTrackerEntry_Once()
        {
            var person            = new Person();
            var mockDriver        = new Mock <IDatabaseDriver>();
            var mockSqlBuilder    = new Mock <ISqlStatementBuilder>();
            var mockChangeTracker = new Mock <IChangeTracker>();
            var orm = new MyOrm(mockDriver.Object, mockSqlBuilder.Object, mockChangeTracker.Object);

            orm.Insert(person);

            mockChangeTracker.Verify(x => x.AddEntry(It.IsAny <ChangeTrackerEntry>()), Times.Once);
        }
Пример #4
0
        public void Insert_SetsId_NegativeOne()
        {
            var person            = new Person();
            var mockDriver        = new Mock <IDatabaseDriver>();
            var mockSqlBuilder    = new Mock <ISqlStatementBuilder>();
            var mockChangeTracker = new Mock <IChangeTracker>();
            var orm = new MyOrm(mockDriver.Object, mockSqlBuilder.Object, mockChangeTracker.Object);

            orm.Insert(person);

            person.Id.ShouldBe(-1);
        }
Пример #5
0
        public void GetObjectsFromDb_InvokesDriverRunSelectStatement()
        {
            var mockDriver = new Mock <IDatabaseDriver>();

            mockDriver.Setup(x => x.RunSelectStatement(It.IsAny <string>()))
            .Returns(new List <IDictionary <string, object> >());
            var mockSqlBuilder    = new Mock <ISqlStatementBuilder>();
            var mockChangeTracker = new Mock <IChangeTracker>();
            var orm = new MyOrm(mockDriver.Object, mockSqlBuilder.Object, mockChangeTracker.Object);

            orm.GetObjectsFromDb <object>(mockSqlBuilder.Object);

            mockDriver.Verify(x => x.RunSelectStatement(It.IsAny <string>()), Times.Once);
        }
Пример #6
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);
        }
Пример #7
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);
        }
Пример #8
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());
        }
Пример #9
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);
        }
Пример #10
0
        private static void Main(string[] args)
        {
            var            sqlBuilder    = new MySqlStatementBuilder();
            var            driver        = new MySqlDriver("");
            IChangeTracker changeTracker = new ChangeTracking.ChangeTracker();
            var            orm           = new MyOrm(driver, sqlBuilder, changeTracker);
            var            qry           = orm.GetQuery <Person>();

            var filtered = qry
                           .Where(i => i.Age > 18 || i.Age < 30)
                           .Where(i => i.FirstName == "Peter")
                           .Where(i => i.FirstName != "Otto" && i.Age <= 100);

            //var filtered = qry.OrderBy(i => i.Age);

            var lst = filtered.ToList();

            //foreach (var person1 in lst)
            //{
            //    person1.Age++;
            //}

            //orm.SubmitChanges();



            //var person = new Person
            //{
            //    Age = 18,
            //    FirstName = "Manfred",
            //    LastName = "Fredmann"
            //};

            // orm.Insert(person);

            Console.ReadKey();
        }
Пример #11
0
        public void Insert_Update_Delete_Select()
        {
            const string validConnectionString = "server=127.0.0.1;uid=root;pwd=root;database=test";
            var          options = new DbContextOptionsBuilder <MysqlContext>()
                                   .UseMySQL(validConnectionString)
                                   .Options;
            var context = new MysqlContext(options);

            context.RemoveRange(context.Persons);
            context.SaveChanges();

            var driver        = new MySqlDriver(validConnectionString);
            var sqlBuilder    = new MySqlStatementBuilder();
            var changeTracker = new ChangeTracking.ChangeTracker();
            var orm           = new MyOrm(driver, sqlBuilder, changeTracker);

            orm.ChangeTracker.Count.ShouldBe(0);

            var person1 = new Person
            {
                FirstName = "Mike",
                LastName  = "Rosoft",
                Age       = 1337
            };

            var person2 = new Person
            {
                FirstName = "Tux",
                LastName  = "L. Oves",
                Age       = 80085
            };

            var person3 = new Person
            {
                FirstName = "Mac",
                LastName  = "N. Tosh",
                Age       = 1234
            };

            //Insert
            person1.Id.ShouldBe(0);
            orm.Insert(person1);
            person1.Id.ShouldBe(-1);

            person2.Id.ShouldBe(0);
            orm.Insert(person2);
            person2.Id.ShouldBe(-2);

            person3.Id.ShouldBe(0);
            orm.Insert(person3);
            person3.Id.ShouldBe(-3);

            orm.ChangeTracker.Count.ShouldBe(3);
            orm.ChangeTracker.InsertedObjects.Count().ShouldBe(3);

            GetFreshContext(options).Persons.ShouldBeEmpty();

            orm.SubmitChanges();
            person1.Id.ShouldBeGreaterThan(0);
            person2.Id.ShouldBe(person1.Id + 1);
            person3.Id.ShouldBe(person2.Id + 1);

            GetFreshContext(options).Persons.Count().ShouldBe(3);
            orm.ChangeTracker.InsertedObjects.ShouldBeEmpty();
            orm.ChangeTracker.UnmodifiedObjects.Count().ShouldBe(3);

            //Update
            var rand   = new Random();
            var newAge = rand.Next(1, int.MaxValue);

            person1.Age = newAge;

            GetFreshContext(options).Persons.Single(x => x.Id == person1.Id).Age.ShouldBe(1337);
            orm.SubmitChanges();
            orm.ChangeTracker.UnmodifiedObjects.Count().ShouldBe(3);
            GetFreshContext(options).Persons.Single(x => x.Id == person1.Id).Age.ShouldBe(newAge);
            GetFreshContext(options).Persons.Count().ShouldBe(3);

            //Delete
            GetFreshContext(options).Persons.Count().ShouldBe(3);
            orm.ChangeTracker.UnmodifiedObjects.Count().ShouldBe(3);

            orm.Delete(person3);
            orm.ChangeTracker.Entries.Count().ShouldBe(3);
            orm.ChangeTracker.DeletedObjects.Count().ShouldBe(1);
            orm.ChangeTracker.GetEntry(person3).State.ShouldBe(ChangeTrackerEntry.States.Deleted);
            GetFreshContext(options).Persons.Count().ShouldBe(3);

            orm.SubmitChanges();
            orm.ChangeTracker.Entries.Count().ShouldBe(3);
            orm.ChangeTracker.DeletedObjects.Count().ShouldBe(1);
            orm.ChangeTracker.GetEntry(person3).State.ShouldBe(ChangeTrackerEntry.States.Deleted);
            GetFreshContext(options).Persons.Count().ShouldBe(2);

            //GetObjectsFromDb
            var anotherPerson1 = orm.GetQuery <Person>()
                                 .Where(p => p.FirstName == "Mike" &&
                                        p.LastName == "Rosoft")
                                 .Where(p => p.Age == newAge).ToList().First();

            anotherPerson1.ShouldNotBeNull();
            anotherPerson1.Id.ShouldBe(person1.Id);
            person1.ShouldBe(anotherPerson1);

            var person1AndPerson2 = orm.GetQuery <Person>()
                                    .Where(p => p.FirstName == "Mike" || p.FirstName == "Tux" &&
                                           p.LastName == "Rosoft" || p.LastName == "L. Oves")
                                    .Where(p => p.Age == newAge || p.Age == 80085).ToList();

            person1AndPerson2[0].ShouldNotBeNull();
            person1AndPerson2[1].ShouldNotBeNull();

            person1AndPerson2[0].ShouldBe(anotherPerson1);
            person1AndPerson2[0].ShouldBe(person1);
            person1AndPerson2[1].ShouldBe(person2);
        }
Пример #12
0
        public void Select_Multiple()
        {
            const string validConnectionString = "server=127.0.0.1;uid=root;pwd=root;database=test";
            var          options = new DbContextOptionsBuilder <MysqlContext>()
                                   .UseMySQL(validConnectionString)
                                   .Options;
            var context = new MysqlContext(options);

            context.RemoveRange(context.Persons);
            context.SaveChanges();

            var driver        = new MySqlDriver(validConnectionString);
            var sqlBuilder    = new MySqlStatementBuilder();
            var changeTracker = new ChangeTracking.ChangeTracker();
            var orm           = new MyOrm(driver, sqlBuilder, changeTracker);

            orm.ChangeTracker.Entries.ShouldBeEmpty();

            var person1 = new Person
            {
                FirstName = "Mike",
                LastName  = "Rosoft",
                Age       = 1337
            };

            var person2 = new Person
            {
                FirstName = "Tux",
                LastName  = "L. Oves",
                Age       = 80085
            };

            var person3 = new Person
            {
                FirstName = "Mac",
                LastName  = "N. Tosh",
                Age       = 1234
            };

            var inserterContext = GetFreshContext(options);

            inserterContext.Persons.Add(person1);
            inserterContext.Persons.Add(person2);
            inserterContext.Persons.Add(person3);
            inserterContext.SaveChanges();
            GetFreshContext(options).Persons.Count().ShouldBe(3);

            orm.ChangeTracker.Entries.ShouldBeEmpty();

            var people = orm.GetQuery <Person>().ToList();

            orm.ChangeTracker.Entries.Count().ShouldBe(3);
            orm.ChangeTracker.GetEntry(people[0]).ShouldNotBeNull();
            orm.ChangeTracker.GetEntry(people[1]).ShouldNotBeNull();
            orm.ChangeTracker.GetEntry(people[2]).ShouldNotBeNull();

            people[0].Id.ShouldBe(person1.Id);
            people[1].Id.ShouldBe(person2.Id);
            people[2].Id.ShouldBe(person3.Id);

            people[0].ShouldNotBe(person1);
            people[1].ShouldNotBe(person2);
            people[2].ShouldNotBe(person3);

            var evenMorePeople = orm.GetQuery <Person>().ToList();

            people[0].ShouldBe(evenMorePeople[0]);
            people[1].ShouldBe(evenMorePeople[1]);
            people[2].ShouldBe(evenMorePeople[2]);
        }