public void Rollback_Calls_RollbackTo_On_Parent_Transaction()
        {
            // arrange
            var parentTransactionMock = TestHelper.SetupMock <ITransaction>();

            parentTransactionMock.Setup(s => s.Save(It.IsAny <string>()));
            parentTransactionMock.Setup(s => s.RollbackTo(It.IsAny <string>()));

            var nestedTransaction = new NestedTransaction(parentTransactionMock.Object);

            // act
            nestedTransaction.Rollback();

            // assert
            parentTransactionMock.VerifyAll();
        }
        public void Commit_Throws_When_Not_In_Transaction()
        {
            // arrange
            var parentTransactionMock = TestHelper.SetupMock <ITransaction>();

            parentTransactionMock.Setup(s => s.Save(It.IsAny <string>()));
            parentTransactionMock.Setup(s => s.RollbackTo(It.IsAny <string>()));

            var nestedTransaction = new NestedTransaction(parentTransactionMock.Object);

            nestedTransaction.Rollback();

            // act
            Assert.Throws <InvalidOperationException>(() => nestedTransaction.Commit());

            // assert
            parentTransactionMock.VerifyAll();
        }
        public void Rollback_Calls_Event()
        {
            // arrange
            var finished = false;

            var parentTransactionMock = TestHelper.SetupMock <ITransaction>();

            parentTransactionMock.Setup(s => s.Save(It.IsAny <string>()));
            parentTransactionMock.Setup(s => s.RollbackTo(It.IsAny <string>()));

            var nestedTransaction = new NestedTransaction(parentTransactionMock.Object);

            nestedTransaction.Finished += (s, e) => finished = true;

            // act
            nestedTransaction.Rollback();

            // assert
            Assert.True(finished);

            parentTransactionMock.VerifyAll();
        }