public void InvokeCommand_Builder_To_Entity_Conversion_Throws_When_Builder_Could_Not_Be_Constructed()
    {
        // Arrange
        var builderProviderMock = new Mock <IDatabaseCommandEntityProvider <TestEntity, TestEntityBuilder> >();
        var builderSut          = new DatabaseCommandProcessor <TestEntity, TestEntityBuilder>(Connection, builderProviderMock.Object);
        var entity = new TestEntity("A", "B", "C", true);

        // Act & Assert
        builderSut.Invoking(x => x.ExecuteCommand(new Mock <IDatabaseCommand>().Object, entity))
        .Should().Throw <InvalidOperationException>()
        .WithMessage("Builder instance was not constructed, create builder delegate should deliver an instance");
    }
    public void InvokeCommand_Entity_To_Builder_Conversion_Throws_When_Entity_Could_Not_Be_Constructed()
    {
        // Arrange
        var builderProviderMock = new Mock <IDatabaseCommandEntityProvider <TestEntity, TestEntityBuilder> >();

        builderProviderMock.SetupGet(x => x.CreateBuilderDelegate)
        .Returns(new Func <TestEntity, TestEntityBuilder>(entity => new TestEntityBuilder(entity)));
        var command    = new SqlDatabaseCommand("INSERT INTO ...", DatabaseCommandType.Text, DatabaseOperation.Insert);
        var builderSut = new DatabaseCommandProcessor <TestEntity, TestEntityBuilder>(Connection, builderProviderMock.Object);
        var entity     = new TestEntity("A", "B", "C", true);

        // Act & Assert
        builderSut.Invoking(x => x.ExecuteCommand(command, entity))
        .Should().Throw <InvalidOperationException>()
        .WithMessage("Could not cast type [CrossCutting.Data.Sql.Tests.Repositories.TestEntityBuilder] to [CrossCutting.Data.Sql.Tests.Repositories.TestEntity]");
    }
    public void InvokeCommand_Works_With_Builder_To_Entity_Conversion_When_Conversion_Succeeds()
    {
        // Arrange
        Connection.AddResultForNonQueryCommand(12345); //using ExecuteNonQuery flow, need to give valid result
        var builderProviderMock = new Mock <IDatabaseCommandEntityProvider <TestEntity, TestEntityBuilder> >();

        builderProviderMock.SetupGet(x => x.CreateBuilderDelegate)
        .Returns(new Func <TestEntity, TestEntityBuilder>(entity => new TestEntityBuilder(entity)));
        var command = new SqlDatabaseCommand("INSERT INTO ...", DatabaseCommandType.Text, DatabaseOperation.Insert);

        builderProviderMock.SetupGet(x => x.CreateEntityDelegate)
        .Returns(x => x.Build());
        var builderSut = new DatabaseCommandProcessor <TestEntity, TestEntityBuilder>(Connection, builderProviderMock.Object);
        var entity     = new TestEntity("A", "B", "C", true);

        // Act
        var actual = builderSut.ExecuteCommand(command, entity).HandleResult("Something went wrong");

        // Assert
        actual.Code.Should().Be(entity.Code);
        actual.CodeType.Should().Be(entity.CodeType);
        actual.Description.Should().Be(entity.Description);
        actual.IsExistingEntity.Should().Be(entity.IsExistingEntity);
    }
 public DatabaseCommandProcessorTests()
 {
     Connection   = new DbConnection();
     ProviderMock = new Mock <IDatabaseCommandEntityProvider <MyEntity> >();
     Sut          = new DatabaseCommandProcessor <MyEntity>(Connection, ProviderMock.Object);
 }