public void VerifyThatUniquenessConstraintWorks()
        {
            var fromObject = new User
            {
                Id = Guid.NewGuid(),
                Name = "John Doe"
            };

            fromObject.Usergroup_Id = 3;

            DatabaseSession.Instance.Connector.CreateTableWithColumns(fromObject);

            Assert.Throws<InvalidDataException>(
                () =>
                    DatabaseSession.Instance.Connector.DeleteUniquenessConstraint(new[] { fromObject.GetType().GetProperty("Usergroup_Id") }, fromObject));

            Assert.Throws<ArgumentException>(
                () => DatabaseSession.Instance.Connector.CreateUniquenessConstraint(null, fromObject));

            Assert.Throws<ArgumentException>(
                () => DatabaseSession.Instance.Connector.DeleteUniquenessConstraint(null, fromObject));

            DatabaseSession.Instance.Connector.CreateUniquenessConstraint(new []{ fromObject.GetType().GetProperty("Usergroup_Id") }, fromObject );
            Assert.Throws<InvalidDataException>(
                () => DatabaseSession.Instance.Connector.CreateUniquenessConstraint(new[] { fromObject.GetType().GetProperty("Usergroup_Id") }, fromObject));

            Assert.DoesNotThrow(() => DatabaseSession.Instance.Connector.DeleteUniquenessConstraint(new[] { fromObject.GetType().GetProperty("Usergroup_Id") }, fromObject));

            Assert.DoesNotThrow(() => fromObject.Save());

            DatabaseSession.Instance.Connector.DeleteTable(new User());
        }
        public void VerifyThatNotNullConstraintWorks()
        {
            var fromObject = new User
            {
                Id = Guid.NewGuid(),
                Name = "John Doe"
            };

            fromObject.Usergroup_Id = 3;

            DatabaseSession.Instance.Connector.CreateTableWithColumns(fromObject);
            DatabaseSession.Instance.Connector.CreatePrimaryKeyConstraint(fromObject);

            Assert.Throws<ArgumentNullException>(
                () => DatabaseSession.Instance.Connector.CreateNotNullConstraint(null, fromObject));

            Assert.Throws<ArgumentNullException>(
                () => DatabaseSession.Instance.Connector.DeleteNotNullConstraint(null, fromObject));

            fromObject.Name = null;
            fromObject.Save();

            Assert.Throws<InvalidDataException>(
                () => DatabaseSession.Instance.Connector.CreateNotNullConstraint(fromObject.GetType().GetProperty("Name"), fromObject));

            fromObject.Name = "somename";
            fromObject.Save();

            DatabaseSession.Instance.Connector.CreateNotNullConstraint(fromObject.GetType().GetProperty("Name"), fromObject);

            fromObject.Name = null;

            Assert.Throws<InvalidDataException>(() => fromObject.Save());

            Assert.DoesNotThrow(() => DatabaseSession.Instance.Connector.DeleteNotNullConstraint(fromObject.GetType().GetProperty("Name"), fromObject));

            fromObject.Name = null;

            Assert.DoesNotThrow(() => fromObject.Save());

            DatabaseSession.Instance.Connector.DeleteTable(new User());
        }
        public void VerifyThatOverridesAndForeignKeyConstraintsWork()
        {
            var fromObject = new User
            {
                Id = Guid.NewGuid(),
                Name = "John Doe"
            };

            var toObject = new Usergroup
            {
                Iid = 1,
                Name = "Admin"
            };

            fromObject.Usergroup_Id = toObject.Iid;

            DatabaseSession.Instance.Connector.CreateTableWithColumns(toObject);
            DatabaseSession.Instance.Connector.CreateTableWithColumns(fromObject);

            Assert.Throws<InvalidDataException>(() => DatabaseSession.Instance.Connector.CreateForeignKeyConstraint(fromObject.GetType().GetProperty("Usergroup_Id"), fromObject, toObject.GetType().GetProperty(toObject.PrimaryKey), toObject));

            DatabaseSession.Instance.Connector.CreatePrimaryKeyConstraint(toObject);
            Assert.Throws<InvalidDataException>(
                () =>
                    DatabaseSession.Instance.Connector.DeleteForeignKeyConstraint(
                        fromObject.GetType().GetProperty("Usergroup_Id"), fromObject,
                        toObject.GetType().GetProperty(toObject.PrimaryKey), toObject));

            Assert.DoesNotThrow(() => DatabaseSession.Instance.Connector.CreateForeignKeyConstraint(fromObject.GetType().GetProperty("Usergroup_Id"), fromObject, toObject.GetType().GetProperty(toObject.PrimaryKey), toObject));

            Assert.Throws<InvalidDataException>(() => fromObject.Save());

            toObject.Save();

            Assert.DoesNotThrow(() => fromObject.Save());

            Assert.Throws<InvalidDataException>(() => toObject.Delete());

            DatabaseSession.Instance.Connector.DeleteForeignKeyConstraint(fromObject.GetType().GetProperty("Usergroup_Id"), fromObject, toObject.GetType().GetProperty(toObject.PrimaryKey), toObject);

            Assert.DoesNotThrow(() => toObject.Delete());
            DatabaseSession.Instance.Connector.DeleteTable(new User());
            DatabaseSession.Instance.Connector.DeleteTable(new Usergroup());
        }
        public void VerifyThatDefaultWorks()
        {
            var fromObject = new User
            {
                Id = Guid.NewGuid(),
                Name = null
            };

            fromObject.Usergroup_Id = 3;

            var testname = "James";

            Assert.Throws<ArgumentNullException>(()=> DatabaseSession.Instance.Connector.SetDefault(null, testname, fromObject));

            Assert.Throws<ArgumentNullException>(() => DatabaseSession.Instance.Connector.DeleteDefault(null, fromObject));

            DatabaseSession.Instance.Connector.CreateTableWithColumns(fromObject);

            DatabaseSession.Instance.Connector.SetDefault(fromObject.GetType().GetProperty("Name"), testname , fromObject);

            // save some names
            fromObject.Save(ignoreNull: true);

            var object2 = new User
            {
                Id = Guid.NewGuid(),
                Name = null
            };

            object2.Save(ignoreNull: true);

            Assert.AreEqual(2, User.All().Where(x => x.Name == testname).ToList().Count);

            DatabaseSession.Instance.Connector.DeleteDefault(fromObject.GetType().GetProperty("Name"), fromObject);

            var object3 = new User
            {
                Id = Guid.NewGuid(),
                Name = null
            };

            object3.Save(ignoreNull: true);

            Assert.AreEqual(2, User.All().Where(x => x.Name == testname).ToList().Count);
            Assert.AreEqual(3, User.All().ToList().Count);

            Assert.AreEqual(2, User.Subset(2,1, fromObject.GetType().GetProperty("Name")).ToList().Count);

            DatabaseSession.Instance.Connector.DeleteTable(new User());
        }