Example #1
0
                Passing_a_transaction_to_UseStoreTransaction_when_it_is_already_enlisted_in_a_TransactionScope_Transaction_throws_InvalidOperationException()
            {
                var dbConnectionMock = new Mock<DbConnection>(MockBehavior.Strict);
                dbConnectionMock.SetupGet(m => m.State).Returns(() => ConnectionState.Open);
                dbConnectionMock.Setup(m => m.EnlistTransaction(It.IsAny<Transaction>())).Verifiable();

                var metadataWorkspaceMock = new Mock<MetadataWorkspace>(MockBehavior.Strict);
                metadataWorkspaceMock.Setup(m => m.IsItemCollectionAlreadyRegistered(DataSpace.SSpace)).Returns(true);

                using (new TransactionScope())
                {
                    var entityConnection = new EntityConnection(metadataWorkspaceMock.Object, dbConnectionMock.Object, true, true);
                    entityConnection.EnlistTransaction(Transaction.Current);

                    var dbTransactionMock = new Mock<DbTransaction>();
                    dbTransactionMock.Protected().SetupGet<DbConnection>("DbConnection").Returns(() => dbConnectionMock.Object);
                    Assert.Equal(
                        Strings.DbContext_TransactionAlreadyEnlistedInUserTransaction,
                        Assert.Throws<InvalidOperationException>(() => entityConnection.UseStoreTransaction(dbTransactionMock.Object))
                              .Message);
                }
            }
            public void Should_use_interception()
            {
                var mockConnection = new Mock<DbConnection>();
                mockConnection.SetupGet(m => m.DataSource).Returns("Foo");
                mockConnection.SetupGet(m => m.State).Returns(ConnectionState.Open);

                var mockStoreItemCollection = new Mock<StoreItemCollection>();
                mockStoreItemCollection
                    .SetupGet(m => m.ProviderFactory)
                    .Returns(DbProviderServices.GetProviderFactory(new SqlConnection()));

                var mockMetadataWorkspace = new Mock<MetadataWorkspace>();
                mockMetadataWorkspace
                    .Setup(m => m.GetItemCollection(DataSpace.SSpace))
                    .Returns(mockStoreItemCollection.Object);

                var transaction = new CommittableTransaction();

                var connectionInterceptorMock = new Mock<IDbConnectionInterceptor>();
                connectionInterceptorMock
                    .Setup(m => m.EnlistingTransaction(mockConnection.Object, It.IsAny<EnlistTransactionInterceptionContext>()))
                    .Callback<DbConnection, EnlistTransactionInterceptionContext>(
                        (_, c) => { Assert.Same(transaction, c.Transaction); });

                connectionInterceptorMock
                    .Setup(m => m.EnlistedTransaction(mockConnection.Object, It.IsAny<EnlistTransactionInterceptionContext>()))
                    .Callback<DbConnection, EnlistTransactionInterceptionContext>(
                        (_, c) => { Assert.Same(transaction, c.Transaction); });

                DbInterception.Add(connectionInterceptorMock.Object);
                try
                {
                    var connection = new EntityConnection(
                        mockMetadataWorkspace.Object,
                        mockConnection.Object,
                        true,
                        true);
                    connection.EnlistTransaction(transaction);
                }
                finally
                {
                    DbInterception.Remove(connectionInterceptorMock.Object);
                }

                connectionInterceptorMock.Verify(
                    m => m.EnlistingTransaction(mockConnection.Object, It.IsAny<EnlistTransactionInterceptionContext>()), Times.Once());
                connectionInterceptorMock.Verify(
                    m => m.EnlistedTransaction(mockConnection.Object, It.IsAny<EnlistTransactionInterceptionContext>()), Times.Once());
                mockConnection.Verify(m => m.EnlistTransaction(It.IsAny<Transaction>()), Times.Once());

                connectionInterceptorMock.Verify(
                    m => m.StateGetting(It.IsAny<DbConnection>(), It.IsAny<DbConnectionInterceptionContext<ConnectionState>>()),
                    Times.Once());
                connectionInterceptorMock.Verify(
                    m => m.StateGot(It.IsAny<DbConnection>(), It.IsAny<DbConnectionInterceptionContext<ConnectionState>>()),
                    Times.Once());
                mockConnection.Verify(m => m.State, Times.Once());
            }