public async Task When_trying_to_update_a_locked_Account() { var commandProcessor = new FakeCommandProcessor(); using (var uow = new AccountContext(_options)) { //Add new account directly via repository not handler (needs both entries so no unit of work) var id = Guid.NewGuid(); var account = new Account() { AccountId = id, Name = new Name { FirstName = "Jack", LastName = "Torrance" }, Addresses = new List <Address> { new Address("Overlook Hotel", AddressType.Billing, "CO", "80517") }, ContactDetails = new ContactDetails { Email = "*****@*****.**", TelephoneNumber = "666-6666" }, CardDetails = new CardDetails { CardNumber = "4104231121998973", CardSecurityCode = "517" }, }; var repository = new AccountRepositoryAsync(new EFUnitOfWork(uow)); await repository.AddAsync(account); //create update command var updateCommand = new UpdateExistingAccountCommand ( id, new Name { FirstName = "Here's", LastName = "Johnny!!!" }, new List <Address> { new Address("Overlook Hotel", AddressType.Billing, "CO", "80517") }, new ContactDetails { Email = "*****@*****.**", TelephoneNumber = "666-6666" }, new CardDetails { CardNumber = "4104231121998973", CardSecurityCode = "517" } ); updateCommand.LockBy = "GRADY"; //Lock the existing account var aggregateLock = await repository.LockAsync(id.ToString(), "SYS"); //now try to update whilst locked var handler = new UpdateExistingAccountCommandHandlerAsync(_options, commandProcessor); Assert.ThrowsAsync <CannotGetLockException>(async() => await handler.HandleAsync(updateCommand)); //release the lock await aggregateLock.ReleaseAsync(); //now we should be able to get the lock and update await handler.HandleAsync(updateCommand); var amendedAccount = await repository.GetAsync(id); Assert.That(amendedAccount.Name.FirstName, Is.EqualTo(updateCommand.Name.FirstName)); } }
public async Task When_updating_an_account() { var commandProcessor = new FakeCommandProcessor(); using (var uow = new AccountContext(_options)) { var id = Guid.NewGuid(); var account = new Account() { AccountId = id, Name = new Name { FirstName = "Jack", LastName = "Torrance" }, Addresses = new List <Address> { new Address("Overlook Hotel", AddressType.Billing, "CO", "80517") }, ContactDetails = new ContactDetails { Email = "*****@*****.**", TelephoneNumber = "666-6666" }, CardDetails = new CardDetails { CardNumber = "4104231121998973", CardSecurityCode = "517" } }; var repository = new AccountRepositoryAsync(new EFUnitOfWork(uow)); await repository.AddAsync(account); //create update command var updateCommand = new UpdateExistingAccountCommand ( id, new Name { FirstName = "Here's", LastName = "Johnny!!!" }, new List <Address> { new Address("Overlook Hotel", AddressType.Billing, "CO", "80517") }, new ContactDetails { Email = "*****@*****.**", TelephoneNumber = "666-6666" }, new CardDetails { CardNumber = "4104231121998973", CardSecurityCode = "517" } ); var handler = new UpdateExistingAccountCommandHandlerAsync(_options, commandProcessor); //act //issue update command await handler.HandleAsync(updateCommand); //assert //versions and change to current state var updateAccount = await repository.GetAsync(id); Assert.That(updateAccount.AccountId, Is.EqualTo(id)); Assert.That(updateAccount.Name.FirstName, Is.EqualTo(updateCommand.Name.FirstName)); Assert.That(updateAccount.Name.LastName, Is.EqualTo(updateCommand.Name.LastName)); } }