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 VerifyThatTransactionSafeDeleteTableWorks()
        {
            var fromObject = new User
            {
                Id = Guid.NewGuid(),
                Name = "John Doe"
            };

            var toObject = new Usergroup();

            Assert.Throws<InvalidDataException>(() => DatabaseSession.Instance.Connector.DeleteTable(fromObject));

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

            var transaction = DatabaseSession.Instance.CreateTransaction();

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

            Assert.IsTrue(DatabaseSession.Instance.Connector.CheckTableExists(fromObject));

            DatabaseSession.Instance.Connector.DeleteTable(toObject, transaction);

            Assert.IsTrue(DatabaseSession.Instance.Connector.CheckTableExists(toObject));

            DatabaseSession.Instance.CommitTransaction(transaction);

            Assert.IsFalse(DatabaseSession.Instance.Connector.CheckTableExists(fromObject));
            Assert.IsFalse(DatabaseSession.Instance.Connector.CheckTableExists(toObject));
        }
        public void VerifyThatTransactionSafeCreateTableWorks()
        {
            var fromObject = new User
            {
                Id = Guid.NewGuid(),
                Name = "John Doe"
            };

            var transaction = DatabaseSession.Instance.CreateTransaction();
            var prop = fromObject.GetType().GetProperties().First();
            DatabaseSession.Instance.Connector.CreateTable(fromObject, transaction);
            DatabaseSession.Instance.Connector.CreateColumn(prop, fromObject, transaction);
            DatabaseSession.Instance.CommitTransaction(transaction);

            DatabaseSession.Instance.Connector.DeleteTable(fromObject);

            var allTypes = new AllTypeThing();

            DatabaseSession.Instance.Connector.CreateTable(allTypes);

            transaction = DatabaseSession.Instance.CreateTransaction();
            DatabaseSession.Instance.Connector.CreateTable(fromObject, transaction);
            Assert.Throws<InvalidDataException>(() => allTypes.Save(transaction: transaction));
            DatabaseSession.Instance.CommitTransaction(transaction);

            // TODO: Unclear why but transactions stopped working all of a sudden
            DatabaseSession.Instance.Connector.DeleteTable(allTypes);
            DatabaseSession.Instance.Connector.DeleteTable(fromObject);

            Assert.IsFalse(DatabaseSession.Instance.Connector.CheckTableExists(fromObject));
        }
        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 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 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());
        }