public void Commit_Does_Not_Commit_Transaction_If_Transaction_InActive()
        {
            // Arrange
            var uow = new UnitOfWork(_session, _transaction);

            // Act
            uow.Commit();

            // Assert
            _transaction.AssertWasNotCalled(trans => trans.Commit());
        }
        public void Dispose_Closes_And_Disposes_Current_Session()
        {
            // Arrange
            var uow = new UnitOfWork(_session, _transaction);

            // Act
            uow.Dispose();

            // Assert
            _session.AssertWasCalled(sess => sess.Close());
            _session.AssertWasCalled(sess => sess.Dispose());
        }
        public void Commit_Commits_Transaction_If_Transaction_Active()
        {
            // Arrange
            _transaction.Stub(trans => trans.IsActive)
                .Return(true);

            var uow = new UnitOfWork(_session, _transaction);

            // Act
            uow.Commit();

            // Assert
            _transaction.AssertWasCalled(trans => trans.Commit());
        }
        public void Dispose_Clears_Current_UnitOfWork()
        {
            // Arrange
            var uow = new UnitOfWork(_session, _transaction);
            UnitOfWorkFactory.SetGlobalUnitOfWork(uow);

            Assert.IsNotNull(UnitOfWorkFactory.CurrentUnitOfWork);

            // Act
            uow.Dispose();

            // Assert
            try
            {
                Assert.IsNull(UnitOfWorkFactory.CurrentUnitOfWork);
            }
            catch (InvalidOperationException)
            {
                // Should exception as CurrentUnitOfWork is null.
            }
        }
        public void Dispose_Disposes_Current_Transaction()
        {
            // Arrange
            var uow = new UnitOfWork(_session, _transaction);

            // Act
            uow.Dispose();

            // Assert
            _transaction.AssertWasCalled(trans => trans.Dispose());
        }
        public void Start_Uses_Factory_To_Create_New_UnitOfWork()
        {
            // Arrange
            var unitOfWork = new UnitOfWork(null, null);

            _unitOfWorkFactory.Stub(factory => factory.Create())
                .Return(unitOfWork);

            // Act
            var uow = UnitOfWork.Start();

            // Assert
            Assert.AreEqual(unitOfWork, uow);
        }
        public void RollBack_Rolls_Back_Transaction_If_Transaction_Active()
        {
            // Arrange
            _transaction.Stub(trans => trans.IsActive)
                .Return(true);

            var uow = new UnitOfWork(_session, _transaction);

            // Act
            uow.Rollback();

            // Assert
            _transaction.AssertWasCalled(trans => trans.Rollback());
        }
        public void RollBack_Does_Not_Roll_Back_Transaction_If_Transaction_InActive()
        {
            // Arrange
            var uow = new UnitOfWork(_session, _transaction);

            // Act
            uow.Rollback();

            // Assert
            _transaction.AssertWasNotCalled(trans => trans.Rollback());
        }