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();
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        /// <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));
            }
        }
Ejemplo n.º 6
0
        /// <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;
        }
Ejemplo n.º 8
0
        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));
            }
        }