public void CreateNewEntity()
        {
            Core.Models.Db.Item Item = Ef.TempItems.First();

            User NewUser = new User(Item.ItemID.Value);
            NewUser.EffectiveDate = new DateTime(2015, 1, 1);

            var Address = NewUser.EffectiveRecord.GetOrCreateEntity<AddressEntity>();

            Assert.NotNull(Address);
            Assert.True(Address.Dirty);
            Assert.False(Address.EntityID.HasValue);
            Assert.Equal(NewUser.EffectiveRecord.EffectiveDate, Address.EffectiveDate);
        }
        public void SavingFields()
        {
            Core.Models.Db.Item Item = Ef.TempItems.Last();

            User NewUser = new User(Item.ItemID.Value);
            NewUser.EffectiveDate = new DateTime(2015, 1, 1);

            FieldString UserType = NewUser.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>().UserType;

            Assert.False(UserType.Dirty);

            UserType.Value = "Code Monkey";

            Assert.True(UserType.Dirty);

            UserType.PersistToDatabase();

            Assert.False(UserType.Dirty);

            using (var db = new EntityFramework7DBContext(Ef.Configuration["Data:DefaultConnection:ConnectionString"]))
            {
                Field Field = db.Fields.Single(ef => ef.FieldID == UserType.FieldID.Value);

                Assert.Equal(Field.Guid, UserType.Guid);
                Assert.Equal("Code Monkey", UserType.Value);

            }

            UserType.Value = "Subscriber";

            Assert.True(UserType.Dirty);

            UserType.PersistToDatabase();

            Assert.False(UserType.Dirty);
        }
        public void TestObjectField()
        {
            User User = new User(Ef.TempItems.First().ItemID.Value);

            var Entity = User.EffectiveRecord.CreateEntity<StaticUserDataEntity>();
            Entity.Dictionary.Value = new Dictionary<string, object>()
            {
                { "TestKey", "TestValue" }
            };

            User.PersistToDatabase();
            User.Load();
            Entity = User.EffectiveRecord.GetFirstEntityOrDefault<StaticUserDataEntity>();
            Assert.Equal("TestValue", (string)Entity.Dictionary.Value["TestKey"]);
        }
        public void RetreiveEntitiesByEffectiveDate()
        {
            Core.Models.Db.Item Item = Ef.TempItems.First();

            User NewUser = new User(Item.ItemID.Value);
            NewUser.EffectiveDate = new DateTime(2015, 1, 1);

            Assert.False(NewUser.Dirty);
            Assert.Equal(Item.Guid, NewUser.Guid);

            GeneralInfoEntity GeneralEntity = NewUser.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();

            Assert.NotNull(GeneralEntity);
            Assert.Equal(new DateTime(2015, 1, 1), GeneralEntity.Start_Date.Value);

            UserTypeEntity FirstJob = NewUser.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>();

            Assert.NotNull(FirstJob);
            Assert.Equal("Subscriber", FirstJob.UserType.Value);

            NewUser.EffectiveDate = new DateTime(2015, 2, 2);

            UserTypeEntity SecondJob = NewUser.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>();

            Assert.NotNull(SecondJob);
            Assert.Equal("Editor", SecondJob.UserType.Value);
        }
        public void SaveNewField()
        {
            Core.Models.Db.Item Item = Ef.TempItems.First();

            User NewUser = new User(Item.ItemID.Value);
            NewUser.EffectiveDate = new DateTime(2015, 1, 1);

            UserTypeEntity Job = NewUser.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>();
            Job.JobStartDate.Value = new DateTime(2015, 1, 1);

            Job.PersistToDatabase();

            using (var db = new EntityFramework7DBContext(Ef.Configuration["Data:DefaultConnection:ConnectionString"]))
            {
                Ef.TempField.Add(db.Fields.Single(f => f.FieldID == Job.JobStartDate.FieldID.Value));
            }

            NewUser = new User(Item.ItemID.Value);
            NewUser.EffectiveDate = new DateTime(2015, 1, 1);

            Job = NewUser.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>();
            Assert.Equal(new DateTime(2015, 1, 1), Job.JobStartDate.Value);
        }
        public void PersistForm()
        {
            User User = null;

            User = new User(Ef.TempItems.First().ItemID.Value);
            User.EffectiveDate = new DateTime(2015, 1, 1);
            GeneralInfoForm Form = new GeneralInfoForm();
            Form.BindTo(User);
            Form.PopulateForm();

            Form.Effective_Date = new DateTime(2015, 4, 1);
            Form.GeneralInfoID = null;
            Form.First_Name = "Johnny";
            Form.Last_Name = "Jones";
            Form.PushValuesToModel();

            User.PersistToDatabase();

            User = new User(Ef.TempItems.First().ItemID.Value);
            User.EffectiveDate = new DateTime(2015, 4, 1);
            var Entity = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();

            Assert.NotNull(Entity);
            Assert.Equal(Form.First_Name, Entity.First_Name.Value);
            Assert.Equal(Form.Last_Name, Entity.Last_Name.Value);

            User.EffectiveDate = new DateTime(2015, 1, 1);

            Entity = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();
            Assert.NotNull(Entity);
            Assert.Equal("John", Entity.First_Name.Value);
            Assert.Equal("Smith", Entity.Last_Name.Value);
        }
        public void PopulateForm()
        {
            User User = new User(Ef.TempItems.First().ItemID.Value);

            User.EffectiveDate = new DateTime(2015, 3, 1);
            GeneralInfoEntity Entity = User.EffectiveRecord.CreateEntityAndApplyPolicy<GeneralInfoEntity>(CopyValuesFromPrevious: true);
            Entity.First_Name.Value = "Bobby";
            User.PersistToDatabase();

            User = new User(Ef.TempItems.First().ItemID.Value);

            User.EffectiveDate = new DateTime(2015, 1, 1);
            GeneralInfoForm Form = new GeneralInfoForm()
            {
                GeneralInfoID = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>().EntityID,
            };
            Form.BindTo(User);
            Form.PopulateForm();

            Entity = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();

            Assert.NotNull(Entity);
            Assert.Equal(Entity.First_Name.Value, Form.First_Name);
            Assert.Equal(Entity.Last_Name.Value, Form.Last_Name);
            Assert.Equal(Entity.EntityID.Value, Form.GeneralInfoID);

            User = new User(Ef.TempItems.First().ItemID.Value);

            User.EffectiveDate = new DateTime(2015, 1, 1);
            Form = new GeneralInfoForm();
            Form.BindTo(User);
            Form.PopulateForm();

            Entity = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();

            Assert.NotNull(Entity);
            Assert.Equal(Entity.First_Name.Value, Form.First_Name);
            Assert.Equal(Entity.Last_Name.Value, Form.Last_Name);
            Assert.Equal(Entity.EntityID.Value, Form.GeneralInfoID);

            User = new User(Ef.TempItems.First().ItemID.Value);
            User.EffectiveDate = new DateTime(2015, 3, 1);
            Form = new GeneralInfoForm()
            {
                GeneralInfoID = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>().EntityID,
                Effective_Date = new DateTime(2015, 3, 1),
            };
            Form.BindTo(User);
            Form.PopulateForm();

            Entity = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();

            Assert.NotNull(Entity);
            Assert.Equal(Entity.First_Name.Value, Form.First_Name);
            Assert.Equal(Entity.Last_Name.Value, Form.Last_Name);
            Assert.Equal(Entity.EntityID.Value, Form.GeneralInfoID);
            Assert.Equal("Bobby", Form.First_Name);
        }
        public void MakeSureFieldFieldsArePopulated()
        {
            Core.Models.Db.Item Item = Ef.TempItems.First();

            User NewUser = new User(Item.ItemID.Value);
            NewUser.EffectiveDate = new DateTime(2015, 1, 1);

            GeneralInfoEntity GeneralEntity = NewUser.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();

            Assert.NotNull(GeneralEntity);
            Assert.NotNull(GeneralEntity.Start_Date);
            Assert.NotNull(GeneralEntity.Start_Date.FieldID);
            Assert.NotEqual(Guid.Empty, GeneralEntity.Start_Date.Guid);
            Assert.False(GeneralEntity.Start_Date.Dirty);
            Assert.Equal(Strings.Start_Date, GeneralEntity.Start_Date.Type.Name);
            Assert.Equal(Strings.Start_Date, GeneralEntity.Start_Date.Name);

            UserTypeEntity FirstJob = NewUser.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>();

            Assert.NotNull(FirstJob);
            Assert.NotNull(FirstJob.UserType);
            Assert.NotNull(FirstJob.UserType.FieldID);
            Assert.NotEqual(Guid.Empty, FirstJob.UserType.Guid);
            Assert.False(FirstJob.UserType.Dirty);
            Assert.Equal(Strings.Job_Title, FirstJob.UserType.Type.Name);
            Assert.Equal(Strings.Job_Title, FirstJob.UserType.Name);

            NewUser.EffectiveDate = new DateTime(2015, 2, 2);

            UserTypeEntity SecondJob = NewUser.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>();

            Assert.NotNull(SecondJob);
            Assert.NotNull(SecondJob.UserType);
            Assert.NotNull(SecondJob.UserType.FieldID);
            Assert.NotEqual(Guid.Empty, SecondJob.UserType.Guid);
            Assert.False(SecondJob.UserType.Dirty);
            Assert.Equal(Strings.Job_Title, SecondJob.UserType.Type.Name);
            Assert.Equal(Strings.Job_Title, SecondJob.UserType.Name);
        }
        public void LoadUpItemObject()
        {
            Core.Models.Db.Item Item = Ef.TempItems.First();

            User NewUser = new User(Item.ItemID.Value);
            NewUser.EffectiveDate = new DateTime(2015, 1, 1);

            Assert.Equal(Item.ItemID, NewUser.ItemID);
            Assert.Equal(Item.ItemTypeID, NewUser.Type.Value);
            Assert.Equal(3, NewUser.AllEntities.Count());
            Assert.Equal(2, NewUser.EffectiveRecord.AllEntities().Count());
            Assert.False(NewUser.EffectiveRecord.AllEntities().First().Dirty);
            Assert.False(NewUser.EffectiveRecord.AllEntities().Last().Dirty);
            Assert.False(NewUser.Dirty);

            var Record = NewUser.GetEntityCollectionForDate(new DateTime(2015, 2, 1));

            Assert.Equal(2, Record.AllEntities().Count());
            Assert.False(Record.AllEntities().First().Dirty);
            Assert.False(Record.AllEntities().Last().Dirty);
        }
        public void EnsurePushingToModelWithNoEffectiveDateUsesNow()
        {
            User User = new User(Ef.TempItems.First().ItemID.Value);

            DateTime Today = DateTime.Now.Date;

            GeneralInfoForm GeneralInfo = new GeneralInfoForm();
            GeneralInfo.BindTo(User);
            GeneralInfo.First_Name = "Johann";
            GeneralInfo.PushValuesToModel();

            User.PersistToDatabase();

            User.Load();
            User.EffectiveDate = DateTime.Now.Date;

            GeneralInfoEntity Entity = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();
            Assert.Equal("Johann", Entity.First_Name.Value);
            Assert.Equal(Today, Entity.EffectiveDate.Date);

            User.EffectiveDate = new DateTime(2015, 1, 1);
            Entity = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();

            Assert.Equal("John", Entity.First_Name.Value);
        }
        public void EnsureConcurrentUpdatesDontOverwriteEachOther()
        {
            User User1 = new User(Ef.TempItems.First().ItemID.Value);
            User User2 = new User(Ef.TempItems.First().ItemID.Value);

            User1.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>().UserType.Value = "Administrator";
            User2.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>().UserType.Value = "Pion";

            User1.PersistToDatabase();
            Assert.Throws(typeof(GuidMismatchException), () => { User2.PersistToDatabase(); });

            User2.Load();
            Assert.Equal("Administrator", User2.EffectiveRecord.GetFirstEntityOrDefault<UserTypeEntity>().UserType.Value);
        }
        public void EnsureButtSplicedEntitiesDontPersist()
        {
            User User = new User(Ef.TempItems.First().ItemID.Value);
            User.EffectiveDate = new DateTime(2015, 6, 1);

            var OldEntity = User.EffectiveRecord.GetFirstEntityOrDefault<GeneralInfoEntity>();
            OldEntity.EndEffectiveDate = new DateTime(2015, 7, 1);

            User.PersistToDatabase();

            Assert.Equal(1, User.AllEntities.Count(e => e.Type == TestEntityType.General_Info));
            User.Load();

            Assert.Equal(1, User.AllEntities.Count(e => e.Type == TestEntityType.General_Info));

            User.EffectiveDate = new DateTime(2015, 7, 1);

            User.EffectiveRecord.CreateEntityAndApplyPolicy<GeneralInfoEntity>(new DateTime(2015, 9, 1), CopyValuesFromPrevious: true);
            User.PersistToDatabase();

            Assert.Equal(1, User.AllEntities.Count(e => e.Type == TestEntityType.General_Info));
            User.Load();

            Assert.Equal(1, User.AllEntities.Count(e => e.Type == TestEntityType.General_Info));
            Assert.Equal(new DateTime(2015, 9, 1), User.AllEntities.First(e => e.Type == TestEntityType.General_Info).EndEffectiveDate);
        }