public async Task The_value_returned_by_the_reservation_service_can_be_used_for_confirmation() { var reservationService = new SqlReservationService(); // given a fixed quantity of some resource, e.g. promo codes: var ownerToken = "owner-token-" + Any.Email(); var promoCode = "promo-code-" + Any.Word(); var reservedValue = Any.Email(); await reservationService.Reserve(reservedValue, scope : promoCode, ownerToken : ownerToken, lease : TimeSpan.FromDays(-1)); //act var value = await reservationService.ReserveAny( scope : promoCode, ownerToken : ownerToken, lease : TimeSpan.FromMinutes(2)); value.Should().NotBeNull(); await reservationService.Confirm(value, promoCode, ownerToken); // assert using (var db = new ReservationServiceDbContext()) { var reservation = db.Set <ReservedValue>() .Single(v => v.Value == reservedValue && v.Scope == promoCode && v.Expiration == null); reservation.ConfirmationToken.Should().Be(value); } }
public async Task Reservations_can_be_placed_for_one_of_a_fixed_quantity_of_a_resource() { var reservationService = new SqlReservationService(); // given a fixed quantity of some resource, e.g. promo codes: var word = Any.Word(); var ownerToken = Any.Guid().ToString(); var promoCode = "promo-code-" + word; var reservedValue = Any.Guid().ToString(); var userConfirmationCode = Any.Guid().ToString(); await reservationService.Reserve(reservedValue, promoCode, reservedValue, TimeSpan.FromDays(-1)); //act var result = await reservationService.ReserveAny( scope : promoCode, ownerToken : ownerToken, lease : TimeSpan.FromMinutes(2), confirmationToken : userConfirmationCode); result.Should().Be(reservedValue); await reservationService.Confirm(userConfirmationCode, promoCode, ownerToken); // assert using (var db = new ReservationServiceDbContext()) { db.Set <ReservedValue>() .Should().Contain(v => v.Value == reservedValue && v.Scope == promoCode && v.Expiration == null); } }
public void When_the_aggregate_is_saved_then_the_reservation_is_confirmed() { // arrange var username = Any.Email(); var account = new CustomerAccount(); account.Apply(new RequestUserName { UserName = username, Principal = new Customer(username) }); var bus = new FakeEventBus(); bus.Subscribe(new UserNameConfirmer()); var repository = new SqlEventSourcedRepository <CustomerAccount>(bus); // act repository.Save(account); // assert using (var db = new ReservationServiceDbContext()) { db.Set <ReservedValue>() .Single(v => v.Value == username && v.Scope == "UserName") .Expiration .Should() .BeNull(); } }
public async Task When_simultaneous_reservations_are_placed_for_one_of_a_fixed_quantity_of_a_resource_then_different_values_are_reserved() { //arrange var reservationService1 = new SqlReservationService(); var reservationService2 = new SqlReservationService(); // given a fixed quantity of some resource, e.g. promo codes: var promoCode = "promo-code-" + Any.Word(); var reservedValue1 = "firstValue:" + Any.Guid(); var reservedValue2 = "SecondValue:" + Any.Guid(); await reservationService1.Reserve(reservedValue1, promoCode, Any.CamelCaseName(), TimeSpan.FromDays(-1)); await reservationService2.Reserve(reservedValue2, promoCode, Any.CamelCaseName(), TimeSpan.FromDays(-1)); //Both services retrieve the same entry on the first reservation attempt //A subsequent call will give a different entry var db1 = new ReservationServiceDbContext(); var db2 = new ReservationServiceDbContext(); reservationService1.CreateReservationServiceDbContext = () => db1; reservationService2.CreateReservationServiceDbContext = () => db2; var entry1 = db1.ReservedValues.Single(r => r.Value == reservedValue1); var entry_1 = db2.ReservedValues.Single(r => r.Value == reservedValue1); var entry2 = db2.ReservedValues.Single(r => r.Value == reservedValue2); var queue = new Queue <ReservedValue>(new[] { entry_1, entry2 }); reservationService1.GetValueToReserve = (reservedValues, scope, now) => Task.FromResult(entry1); reservationService2.GetValueToReserve = (reservedValues, scope, now) => Task.FromResult(queue.Dequeue()); //act var result = await reservationService1.ReserveAny( scope : promoCode, ownerToken : Any.FullName(), lease : TimeSpan.FromMinutes(2), confirmationToken : Any.CamelCaseName()); var result2 = await reservationService2.ReserveAny( scope : promoCode, ownerToken : Any.FullName(), lease : TimeSpan.FromMinutes(2), confirmationToken : Any.CamelCaseName()); //assert result.Should().NotBe(result2); }
/// <summary> /// Retrieve single reserved value from Reservation Service /// </summary> /// <param name="value">The reserved value.</param> /// <param name="scope">The scope in which the reserved value must be unique.</param> /// <returns>The ReservedValue object</returns> public async Task <ReservedValue> GetReservedValue(string value, string scope) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (scope == null) { throw new ArgumentNullException(nameof(scope)); } using (var db = new ReservationServiceDbContext()) { return(await db.Set <ReservedValue>() .SingleOrDefaultAsync(v => v.Scope == scope && v.Value == value)); } }
/// <summary> /// Retrieve single reserved value from Reservation Service /// </summary> /// <param name="value">The reserved value.</param> /// <param name="scope">The scope in which the reserved value must be unique.</param> /// <returns>The ReservedValue object</returns> public async Task<ReservedValue> GetReservedValue(string value, string scope) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (scope == null) { throw new ArgumentNullException(nameof(scope)); } using (var db = new ReservationServiceDbContext()) { return await db.Set<ReservedValue>() .SingleOrDefaultAsync(v => v.Scope == scope && v.Value == value); } }
public void TestFixtureSetUp() { ReservationServiceDbContext.NameOrConnectionString = @"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=False; Initial Catalog=ItsCqrsTestsReservationService"; #if !DEBUG new ReservationServiceDbContext().Database.Delete(); #endif using (var db = new ReservationServiceDbContext()) { new ReservationServiceDatabaseInitializer().InitializeDatabase(db); } // disable authorization checks Command <Order> .AuthorizeDefault = (order, command) => true; }
static SqlReservationServiceTests() { ReservationServiceDbContext.NameOrConnectionString = @"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=False; Initial Catalog=ItsCqrsTestsReservationService"; EventStoreDbContext.NameOrConnectionString = @"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=False; Initial Catalog=ItsCqrsTestsEventStore"; Database.SetInitializer(new ReservationServiceDatabaseInitializer()); Database.SetInitializer(new EventStoreDatabaseInitializer <EventStoreDbContext>()); #if !DEBUG new ReservationServiceDbContext().Database.Delete(); #endif using (var db = new ReservationServiceDbContext()) { new ReservationServiceDatabaseInitializer().InitializeDatabase(db); } }
public void When_a_command_reserves_a_unique_value_but_it_expires_then_a_subsequent_request_by_a_different_actor_succeeds() { // arrange Clock.Now = () => DateTimeOffset.Parse("2014-1-1"); var username = Any.CamelCaseName(5); using (var db = new ReservationServiceDbContext()) { db.Set <ReservedValue>().Add(new ReservedValue { OwnerToken = Any.CamelCaseName(), Scope = "UserName", Value = username, ConfirmationToken = username, Expiration = Clock.Now().Subtract(TimeSpan.FromMinutes(30)) }); db.SaveChanges(); } // act var attempt = new CustomerAccount() .Validate(new RequestUserName { UserName = username, Principal = new Customer { Name = Any.CamelCaseName() } }); // assert attempt.ShouldBeValid(); using (var db = new ReservationServiceDbContext()) { db.Set <ReservedValue>().First(v => v.Value == username).Expiration.Should().Be(Clock.Now().AddMinutes(1)); } }