Beispiel #1
0
        public void UpdateUserShouldCorrect()
        {
            // arrange
            var newUser = new UserEntity {
                Id = 3, Password = "******", IsActive = true
            };

            // action
            var sut = new MariaDbRepository();

            // assert
            Assert.DoesNotThrow(() => sut.UpdateUser(newUser));
        }
Beispiel #2
0
        public void NestedScopeInnerTransactionRollbackShouldRollback()
        {
            // arrange
            var originPassword   = "******";
            var expectedPassword = "******";
            var newUser2         = new UserEntity {
                Id = 2, Password = expectedPassword, IsActive = true
            };
            var newUser3 = new UserEntity {
                Id = 3, Password = expectedPassword, IsActive = true
            };

            // action
            try
            {
                using (new TransactionScope(TransactionScopeOption.Required,
                                            new TransactionOptions {
                    IsolationLevel = IsolationLevel.ReadCommitted
                },
                                            TransactionScopeAsyncFlowOption.Enabled))
                {
                    var userRepoA = new MariaDbRepository();
                    userRepoA.UpdateUser(newUser2);

                    using (var connection = new MySqlConnection(ConnectionString))
                    {
                        connection.Open();
                        using (var transaction = connection.BeginTransaction())
                        {
                            var userRepoB = new MariaDbRepository(connection);
                            userRepoB.UpdateUser(newUser3);
                            transaction.Rollback();
                        }
                    }
                }
            }
            catch (TransactionAbortedException)
            {
                Console.WriteLine("transaction rollback!");
            }

            var repo  = new MariaDbRepository();
            var users = repo.GetUsers().Where(u => u.Id == 2 || u.Id == 3).ToArray();

            var finalPasswordUser2 = users.FirstOrDefault(u => u.Id == 2)?.Password;
            var finalPasswordUser3 = users.FirstOrDefault(u => u.Id == 3)?.Password;

            // assert
            Assert.AreEqual(originPassword, finalPasswordUser2);
            Assert.AreEqual(originPassword, finalPasswordUser3);
        }
Beispiel #3
0
        public void UpdateUserReadDirtyData()
        {
            // arrange
            var originPassword   = "******";
            var expectedPassword = "******";
            var newUser          = new UserEntity {
                Id = 2, Password = expectedPassword, IsActive = true
            };
            var    dirtyPassword = string.Empty;
            string finalPassword;

            // action
            var waiterUpdate = new AutoResetEvent(false);

            Task.Factory.StartNew(() =>
            {
                waiterUpdate.WaitOne();
                using (var suppressedScope = new TransactionScope(TransactionScopeOption.Required,
                                                                  new TransactionOptions {
                    IsolationLevel = IsolationLevel.ReadUncommitted
                }))
                {
                    var userRepoB = new MariaDbRepository();
                    dirtyPassword = userRepoB.GetUsers().FirstOrDefault(u => u.Id == 2)?.Password;
                    suppressedScope.Complete();
                }

                waiterUpdate.Set();
            });

            using (var transactionScope = new TransactionScope(TransactionScopeOption.Required,
                                                               new TransactionOptions {
                IsolationLevel = IsolationLevel.ReadCommitted
            },
                                                               TransactionScopeAsyncFlowOption.Enabled))
            {
                var userRepoA = new MariaDbRepository();
                userRepoA.UpdateUser(newUser);
                waiterUpdate.Set();
                waiterUpdate.Reset();
                waiterUpdate.WaitOne();

                transactionScope.Dispose();
                finalPassword = userRepoA.GetUsers().FirstOrDefault(u => u.Id == 2)?.Password;
            }

            // assert
            Assert.AreEqual(newUser.Password, dirtyPassword);
            Assert.AreEqual(originPassword, finalPassword);
        }
Beispiel #4
0
        public void ReadDirtyDataWithNestedScope()
        {
            // arrange
            var originPassword   = "******";
            var expectedPassword = "******";
            var newUser          = new UserEntity {
                Id = 2, Password = expectedPassword, IsActive = true
            };
            string dirtyPassword;
            string finalPassword;

            // action
            using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew,
                                                               new TransactionOptions {
                IsolationLevel = IsolationLevel.ReadCommitted
            },
                                                               TransactionScopeAsyncFlowOption.Enabled))
            {
                var userRepoA = new MariaDbRepository();
                userRepoA.UpdateUser(newUser);

                using (var suppressedScope = new TransactionScope(
                           TransactionScopeOption.RequiresNew, // can't use Suppress or Required
                           new TransactionOptions {
                    IsolationLevel = IsolationLevel.ReadUncommitted
                }))
                {
                    var userRepoB = new MariaDbRepository();
                    dirtyPassword = userRepoB.GetUsers().FirstOrDefault(u => u.Id == 2)?.Password;
                    suppressedScope.Complete();
                }

                transactionScope.Dispose();
                finalPassword = userRepoA.GetUsers().FirstOrDefault(u => u.Id == 2)?.Password;
            }

            // assert
            Assert.AreEqual(newUser.Password, dirtyPassword);
            Assert.AreEqual(originPassword, finalPassword);
        }
Beispiel #5
0
        public void UpdateUserRollbackShouldCorrect()
        {
            // arrange
            var originPassword   = "******";
            var expectedPassword = "******";
            var newUser          = new UserEntity {
                Id = 2, Password = expectedPassword, IsActive = true
            };
            UserEntity originUser, tempUser, finalUser;

            // action
            using (var connection = new MySqlConnection(ConnectionString))
            {
                connection.Open();
                using (var transaction = connection.BeginTransaction())
                {
                    var sut = new MariaDbRepository(connection);
                    originUser = sut.GetUsers().FirstOrDefault(u => u.Id == newUser.Id);
                    Assert.DoesNotThrow(() => sut.UpdateUser(newUser));
                    tempUser = sut.GetUsers().FirstOrDefault(u => u.Id == newUser.Id);
                    if (transaction.Connection != null)
                    {
                        transaction.Rollback();
                    }
                    finalUser = sut.GetUsers().FirstOrDefault(u => u.Id == newUser.Id);
                }
            }

            // assert
            Assert.NotNull(originUser);
            Assert.NotNull(tempUser);
            Assert.NotNull(finalUser);
            Assert.AreEqual(originPassword, originUser.Password);
            Assert.AreEqual(expectedPassword, tempUser.Password);
            Assert.AreEqual(originUser.Password, finalUser.Password);
        }