Base class for command builders
Creates SQL commands per the SQL92 standard. Inherit this class to customize different commands.
Inheritance: ICommandBuilder
        public void TableName_is_properly_assigned_in_the_constructor()
        {
            var mapper = Substitute.For<ICrudEntityMapper>();
            mapper.TableName.Returns("Users");

            var sut = new CommandBuilder(mapper);

            sut.TableName.Should().Be("Users");
        }
        public void key_without_value_is_ignored_in_the_insert_query()
        {
            var mapper = Substitute.For<ICrudEntityMapper>();
            mapper.TableName.Returns("Users");
            mapper.Properties.Returns(new Dictionary<string, IPropertyMapping>
            {
                {"Id", new FakePropertyMapping("Id", "id"){IsPrimaryKey = true}}
            });
            var command = new AdoNetFakes.FakeCommand();
            var entity = new { Id = "Hello" };


            var sut = new CommandBuilder(mapper);
            Action actual =  () => sut.InsertCommand(command, entity);

            actual.ShouldThrow<DataException>();
        }
        public void key_is_added_in_the_insert_query()
        {
            var mapper = Substitute.For<ICrudEntityMapper>();
            mapper.TableName.Returns("Users");
            mapper.Properties.Returns(new Dictionary<string, IPropertyMapping>
            {
                {"Id", new FakePropertyMapping("Id", "id"){Value = "Hello",IsPrimaryKey = true}}
            });
            var command = new AdoNetFakes.FakeCommand();
            var entity = new {Id = "Hello"};


            var sut = new CommandBuilder(mapper);
            sut.InsertCommand(command, entity);

            command.CommandText.Should().Be("INSERT INTO Users (id) VALUES(@Id)");
            command.Parameters[0].ParameterName.Should().Be("Id");
            command.Parameters[0].Value.Should().Be("Hello");
        }
        public void do_not_allow_DbNull_in_the_delete_query()
        {
            var mapper = Substitute.For<ICrudEntityMapper>();
            mapper.TableName.Returns("Users");
            mapper.Properties.Returns(new Dictionary<string, IPropertyMapping>
            {
                {"Name", new FakePropertyMapping("Name", "real_name")},
                {"Id", new FakePropertyMapping("Id", "id"){Value = DBNull.Value, IsPrimaryKey = true}}
            });
            var command = new AdoNetFakes.FakeCommand();
            var entity = new { Id = "Hello" };


            var sut = new CommandBuilder(mapper);
            Action actual = () => sut.DeleteCommand(command, entity);

            actual.ShouldThrow<DataException>();
        }
        public void key_is_assigned_correctly_in_a_delete_query()
        {
            var mapper = Substitute.For<ICrudEntityMapper>();
            mapper.TableName.Returns("Users");
            mapper.Properties.Returns(new Dictionary<string, IPropertyMapping>
            {
                {"Name", new FakePropertyMapping("Name", "real_name"){Value = "Arne"}},
                {"Id", new FakePropertyMapping("Id", "id"){Value = "Hello", IsPrimaryKey = true}}
            });
            var command = new AdoNetFakes.FakeCommand();
            var entity = new { Id = "Hello" };


            var sut = new CommandBuilder(mapper);
            sut.DeleteCommand(command, entity);

            command.CommandText.Should().Be("DELETE FROM Users WHERE id=@Id");
            command.Parameters[0].ParameterName.Should().Be("Id");
            command.Parameters[0].Value.Should().Be("Hello");
        }
        public void key_should_be_the_only_field_in_a_delete_query()
        {
            var mapper = Substitute.For<ICrudEntityMapper>();
            mapper.TableName.Returns("Users");
            mapper.Properties.Returns(new Dictionary<string, IPropertyMapping>
            {
                {"Name", new FakePropertyMapping("Name", "real_name"){Value = "Arne"}},
                {"Id", new FakePropertyMapping("Id", "id"){Value = "Hello", IsPrimaryKey = true}}
            });
            var command = new AdoNetFakes.FakeCommand();
            var entity = new { Id = "Hello" };


            var sut = new CommandBuilder(mapper);
            sut.DeleteCommand(command, entity);

            command.Parameters.Count.Should().Be(1);
        }
        public void field_without_value_is_added_with_DbNull_in_the_update_query()
        {
            var mapper = Substitute.For<ICrudEntityMapper>();
            mapper.TableName.Returns("Users");
            mapper.Properties.Returns(new Dictionary<string, IPropertyMapping>
            {
                {"Name", new FakePropertyMapping("Name", "real_name") {CanRead = true} },
                {"Id", new FakePropertyMapping("Id", "id"){Value = "Hello", IsPrimaryKey = true}}
            });
            var command = new AdoNetFakes.FakeCommand();
            var entity = new { Id = "Hello" };


            var sut = new CommandBuilder(mapper);
            sut.UpdateCommand(command, entity);

            command.CommandText.Should().Be("UPDATE Users SET real_name=@Name WHERE id=@Id");
            command.Parameters[0].ParameterName.Should().Be("Name");
            command.Parameters[0].Value.Should().Be(DBNull.Value);
            command.Parameters[1].ParameterName.Should().Be("Id");
            command.Parameters[1].Value.Should().Be("Hello");
        }
        public void key_may_not_be_the_only_field_in_an_update_query()
        {
            var mapper = Substitute.For<ICrudEntityMapper>();
            mapper.TableName.Returns("Users");
            mapper.Properties.Returns(new Dictionary<string, IPropertyMapping>
            {
                {"Id", new FakePropertyMapping("Id", "id"){Value = "Hello", IsPrimaryKey = true}}
            });
            var command = new AdoNetFakes.FakeCommand();
            var entity = new { Id = "Hello" };


            var sut = new CommandBuilder(mapper);
            Action actual = () => sut.UpdateCommand(command, entity);

            actual.ShouldThrow<DataException>();
        }
        public void keys_must_be_specified_in_a_delete_query()
        {
            var mapper = Substitute.For<IEntityMapper>();
            mapper.TableName.Returns("Users");
            mapper.Properties.Returns(new Dictionary<string, IPropertyMapping>
            {
                {"Id", new FakePropertyMapping("Id", "id"){IsPrimaryKey = true}}
            });
            var command = new AdoNetFakes.FakeCommand();
            var entity = new { Id = "Hello" };


            var sut = new CommandBuilder(mapper);
            Action actual = () => sut.DeleteCommand(command, entity);

            actual.ShouldThrow<DataException>();
        }
        public void key_must_a_value_in_the_update_Query()
        {
            var mapper = Substitute.For<IEntityMapper>();
            mapper.TableName.Returns("Users");
            mapper.Properties.Returns(new Dictionary<string, IPropertyMapping>
            {
                {"Name", new FakePropertyMapping("Name", "real_name"){Value = "Hello" }},
                {"Id", new FakePropertyMapping("Id", "id"){IsPrimaryKey = true}}
            });
            var command = new AdoNetFakes.FakeCommand();
            var entity = new { Id = "Hello" };


            var sut = new CommandBuilder(mapper);
            Action actual = () => sut.UpdateCommand(command, entity);

            actual.ShouldThrow<DataException>();
        }