public async Task ExecuteActionAsync_GivenOpenConnection_ShouldNotCallCloseOnDbConnection()
        {
            //---------------Set up test pack-------------------
            var dataModel = new FakeTestDataModel {
                Id = Guid.NewGuid()
            };

            var dbCommand    = Substitute.For <IDbCommand>();
            var dbConnection = Substitute.For <IDbConnection>();

            dbConnection.State.Returns(ConnectionState.Open);
            dbConnection.CreateCommand().Returns(dbCommand);

            var databaseConnectionProvider = Substitute.For <IDatabaseConnectionProvider>();

            databaseConnectionProvider.GetConnection(Arg.Any <string>()).Returns(dbConnection);

            var dbContext = CreateDatabaseContext(databaseConnectionProvider: databaseConnectionProvider);
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var _ = await dbContext.ExecuteActionAsync(DbContextAction.Create, dataModel);

            //---------------Test Result -----------------------
            dbConnection.DidNotReceive().Close();
        }
        public async Task ExecuteActionAsync_GivenClosedConnection_ShouldCallOpenAndCloseOnDbConnection()
        {
            //---------------Set up test pack-------------------
            var dataModel = new FakeTestDataModel {
                Id = Guid.NewGuid()
            };

            var dbConnectionState = ConnectionState.Closed;
            var dbConnection      = Substitute.For <IDbConnection>();

            dbConnection.State.Returns(info => dbConnectionState);
            dbConnection.When(connection => connection.Open())
            .Do(info => dbConnectionState = ConnectionState.Open);

            var databaseConnectionProvider = Substitute.For <IDatabaseConnectionProvider>();

            databaseConnectionProvider.GetConnection(Arg.Any <string>()).Returns(dbConnection);

            var dbContext = CreateDatabaseContext(databaseConnectionProvider: databaseConnectionProvider);
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var _ = await dbContext.ExecuteActionAsync(DbContextAction.Create, dataModel);

            //---------------Test Result -----------------------
            dbConnection.Received(1).Open();
            dbConnection.Received(1).Close();
        }
        public async Task ExecuteActionAsync_GivenRetrieveAction_And_NoData_ShouldMapReturnedEmptyList()
        {
            //---------------Set up test pack-------------------
            var dataModel = new FakeTestDataModel {
                Id = Guid.NewGuid()
            };
            var dataReaderData = new List <FakeTestDataModel>();

            var fakeDataReader = TestHelper.CreateSubstituteDataReader(dataReaderData);
            var dbCommand      = Substitute.For <IDbCommand>();

            dbCommand.ExecuteReader().Returns(fakeDataReader);

            var dbConnection = Substitute.For <IDbConnection>();

            dbConnection.CreateCommand().Returns(dbCommand);

            var databaseConnectionProvider = Substitute.For <IDatabaseConnectionProvider>();

            databaseConnectionProvider.GetConnection(Arg.Any <string>()).Returns(dbConnection);

            var dbContext = CreateDatabaseContext(databaseConnectionProvider: databaseConnectionProvider);
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var actionResult = await dbContext.ExecuteActionAsync(DbContextAction.Retrieve, dataModel);

            //---------------Test Result -----------------------
            actionResult.ActionResult.Should().Be(DbContextActionResult.Success);
            actionResult.Results.Any().Should().BeFalse();
        }
        public void BuildInsertStatement_GivenNullDataModel_ShouldThrowArgumentNullException()
        {
            //---------------Set up test pack-------------------
            FakeTestDataModel dataModel = null;
            var buildProvider           = CreateProvider();
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            // ReSharper disable once ExpressionIsAlwaysNull
            var exception = Assert.Throws <ArgumentNullException>(() => buildProvider.BuildInsertStatement(dataModel));

            //---------------Test Result -----------------------
            exception.ParamName.Should().Be("dataModel");
        }
        public async Task ExecuteActionAsync_GivenCreateAction_ShouldCallBuildInsertStatement()
        {
            //---------------Set up test pack-------------------
            var dataModel = new FakeTestDataModel();
            var statementBuildProvider = Substitute.For <IStatementBuildProvider>();
            var dbContext = CreateDatabaseContext(sqlStatementBuildProvider: statementBuildProvider);
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            await dbContext.ExecuteActionAsync(DbContextAction.Create, dataModel);

            //---------------Test Result -----------------------
            statementBuildProvider.Received(1).BuildInsertStatement(dataModel);
        }
        public void BuildSelectStatement_GivenDataModel_ShouldBuildExpectedStatement()
        {
            //---------------Set up test pack-------------------
            FakeTestDataModel dataModel = new FakeTestDataModel
            {
                Id = Guid.NewGuid()
            };
            var expectedStatement = $"SELECT [FakeTest].[Id], [FakeTest].[Name], [FakeTest].[Date], [FakeTest].[SomeFieldAlias] AS [SomeField] " +
                                    $"FROM [FakeTest] " +
                                    $"WHERE  [FakeTest].[Id] = '{dataModel.Id}'";
            var buildProvider = CreateProvider();
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            // ReSharper disable once ExpressionIsAlwaysNull
            var selectStatement = buildProvider.BuildSelectStatement(dataModel);

            //---------------Test Result -----------------------
            selectStatement.Trim().Should().Be(expectedStatement);
        }
        public void BuildInsertStatement_GivenDataModel_ShouldBuildExpectedStatement()
        {
            //---------------Set up test pack-------------------
            FakeTestDataModel dataModel = new FakeTestDataModel
            {
                Id        = Guid.NewGuid(),
                Name      = RandomValueGenerator.CreateRandomString(10, 20),
                Date      = RandomValueGenerator.CreateRandomDate(),
                SomeField = RandomValueGenerator.CreateRandomString(15, 30)
            };
            var expectedStatement = "INSERT INTO [FakeTest] ([Id],[Name],[Date],[SomeFieldAlias]) " +
                                    $"VALUES ('{dataModel.Id}','{dataModel.Name}','{dataModel.Date}','{dataModel.SomeField}')";
            var buildProvider = CreateProvider();
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            // ReSharper disable once ExpressionIsAlwaysNull
            var insertStatement = buildProvider.BuildInsertStatement(dataModel);

            //---------------Test Result -----------------------
            insertStatement.Trim().Should().Be(expectedStatement);
        }
        public async Task ExecuteActionAsync_GivenRetrieveAction_ShouldCallExecuteReader()
        {
            //---------------Set up test pack-------------------
            var dataModel = new FakeTestDataModel {
                Id = Guid.NewGuid()
            };

            var dbCommand    = Substitute.For <IDbCommand>();
            var dbConnection = Substitute.For <IDbConnection>();

            dbConnection.CreateCommand().Returns(dbCommand);

            var databaseConnectionProvider = Substitute.For <IDatabaseConnectionProvider>();

            databaseConnectionProvider.GetConnection(Arg.Any <string>()).Returns(dbConnection);

            var dbContext = CreateDatabaseContext(databaseConnectionProvider: databaseConnectionProvider);
            //---------------Assert Precondition----------------
            //---------------Execute Test ----------------------
            var actionResult = await dbContext.ExecuteActionAsync(DbContextAction.Retrieve, dataModel);

            //---------------Test Result -----------------------
            dbCommand.Received(1).ExecuteReader();
        }