예제 #1
0
        public static GolfClubMembershipAggregate GetCreatedGolfClubMembershipAggregateWithMultipleMembershipRequested()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipAggregate.Create(AggregateId);

            aggregate.RequestMembership(PlayerId, PlayerFullName, PlayerDateOfBirth, PlayerGender, RequestDateAndTime);
            aggregate.RequestMembership(PlayerId2, PlayerFullName2, PlayerDateOfBirth2, PlayerGender2, RequestDateAndTime);

            return(aggregate);
        }
        /// <summary>
        /// Requests the club membership.
        /// </summary>
        /// <param name="playerId">The player identifier.</param>
        /// <param name="golfClubId">The golf club identifier.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns></returns>
        /// <exception cref="InvalidDataException">
        /// Unable to request club membership for a player that has not been registered
        /// or
        /// Unable to request club membership for a club that has not been created
        /// </exception>
        public async Task RequestClubMembership(Guid playerId, Guid golfClubId, CancellationToken cancellationToken)
        {
            // Rehydrate the golf club membership aggregate
            GolfClubMembershipAggregate golfClubMembershipAggregate =
                await this.GolfClubMembershipRepository.GetLatestVersion(golfClubId, cancellationToken);

            // Validate the player id firstly
            PlayerAggregate playerAggregate = await this.PlayerRepository.GetLatestVersion(playerId, cancellationToken);

            if (!playerAggregate.HasBeenRegistered)
            {
                throw new InvalidDataException("Unable to request club membership for a player that has not been registered");
            }

            // Now validate the club
            GolfClubAggregate golfClubAggregate =
                await this.GolfClubRepository.GetLatestVersion(golfClubId, cancellationToken);

            if (!golfClubAggregate.HasBeenCreated)
            {
                throw new InvalidDataException("Unable to request club membership for a club that has not been created");
            }

            // Ok all the data has been validated, now run through the aggregate rules
            golfClubMembershipAggregate.RequestMembership(playerId,
                                                          playerAggregate.FullName,
                                                          playerAggregate.DateOfBirth,
                                                          playerAggregate.Gender,
                                                          DateTime.Now);

            // Save any pending changes
            await this.GolfClubMembershipRepository.SaveChanges(golfClubMembershipAggregate, cancellationToken);
        }
예제 #3
0
        public void GolfClubMembershipAggregate_RequestMembership_PlayerToYoung_RequestRejected()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregate();

            // Get the lowest valid age
            DateTime dateOfBirth = DateTime.Now.AddYears(-13);

            // Now add a day to make it invalid
            dateOfBirth = dateOfBirth.AddDays(1);

            aggregate.RequestMembership(GolfClubMembershipTestData.PlayerId,
                                        GolfClubMembershipTestData.PlayerFullName,
                                        dateOfBirth,
                                        GolfClubMembershipTestData.PlayerGender,
                                        GolfClubMembershipTestData.RequestDateAndTime);

            MembershipDataTransferObject membership = aggregate.GetMembership(GolfClubMembershipTestData.PlayerId, dateOfBirth, GolfClubMembershipTestData.PlayerGender);

            membership.MembershipId.ShouldNotBe(Guid.Empty);
            membership.PlayerId.ShouldBe(GolfClubMembershipTestData.PlayerId);
            membership.PlayerFullName.ShouldBe(GolfClubMembershipTestData.PlayerFullName);
            membership.PlayerDateOfBirth.ShouldBe(dateOfBirth);
            membership.PlayerGender.ShouldBe(GolfClubMembershipTestData.PlayerGender);
            membership.RejectedDateAndTime.ShouldBe(GolfClubMembershipTestData.RequestDateAndTime);
            membership.AcceptedDateAndTime.ShouldBe(DateTime.MinValue);
            membership.RejectionReason.ShouldBe($"Player Id {GolfClubMembershipTestData.PlayerId} is too young.");
            membership.Status.ShouldBe(2);
        }
예제 #4
0
        public static GolfClubMembershipAggregate GetCreatedGolfClubMembershipAggregateWithNumberOfAcceptedMembershipRequests(Int32 memberCount)
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipAggregate.Create(AggregateId);

            for (Int32 i = 0; i < memberCount; i++)
            {
                aggregate.RequestMembership(Guid.NewGuid(), $"Player {i}", PlayerDateOfBirth, PlayerGender, RequestDateAndTime);
            }

            return(aggregate);
        }
예제 #5
0
        public void GolfClubMembershipAggregate_RequestMembership_DuplicatePlayerMembershipRequest_RequestRejected()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregateWithMembershipRequested();

            Should.Throw <InvalidOperationException>(() =>
            {
                aggregate.RequestMembership(GolfClubMembershipTestData.PlayerId,
                                            GolfClubMembershipTestData.PlayerFullName,
                                            GolfClubMembershipTestData.PlayerDateOfBirth,
                                            GolfClubMembershipTestData.PlayerGender,
                                            GolfClubMembershipTestData.RequestDateAndTime);
            });
        }
예제 #6
0
        public void GolfClubMembershipAggregate_RequestMembership_InvalidData_ErrorThrown(Boolean validPlayerId,
                                                                                          String playerFullName,
                                                                                          Boolean validDateOfBirth,
                                                                                          String playerGender,
                                                                                          Type exceptionType)
        {
            Guid     playerId    = validPlayerId ? GolfClubMembershipTestData.PlayerId : Guid.Empty;
            DateTime dateOfBirth = validDateOfBirth ? GolfClubMembershipTestData.PlayerDateOfBirth : DateTime.MinValue;

            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregate();

            Should.Throw(() => { aggregate.RequestMembership(playerId, playerFullName, dateOfBirth, playerGender, GolfClubMembershipTestData.RequestDateAndTime); },
                         exceptionType);
        }
예제 #7
0
        public void GolfClubMembershipAggregate_RequestMembership_NoSpaceForNewMembers_RequestRejected()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregateWithNumberOfAcceptedMembershipRequests(500);

            aggregate.RequestMembership(GolfClubMembershipTestData.PlayerId,
                                        GolfClubMembershipTestData.PlayerFullName,
                                        GolfClubMembershipTestData.PlayerDateOfBirth,
                                        GolfClubMembershipTestData.PlayerGender,
                                        GolfClubMembershipTestData.RequestDateAndTime);

            MembershipDataTransferObject membership = aggregate.GetMembership(GolfClubMembershipTestData.PlayerId,
                                                                              GolfClubMembershipTestData.PlayerDateOfBirth,
                                                                              GolfClubMembershipTestData.PlayerGender);

            membership.MembershipId.ShouldNotBe(Guid.Empty);
            membership.PlayerId.ShouldBe(GolfClubMembershipTestData.PlayerId);
            membership.PlayerFullName.ShouldBe(GolfClubMembershipTestData.PlayerFullName);
            membership.PlayerDateOfBirth.ShouldBe(GolfClubMembershipTestData.PlayerDateOfBirth);
            membership.PlayerGender.ShouldBe(GolfClubMembershipTestData.PlayerGender);
            membership.RejectedDateAndTime.ShouldBe(GolfClubMembershipTestData.RequestDateAndTime);
            membership.AcceptedDateAndTime.ShouldBe(DateTime.MinValue);
            membership.RejectionReason.ShouldBe($"No more space at club for Player Id {GolfClubMembershipTestData.PlayerId}");
            membership.Status.ShouldBe(2);
        }
예제 #8
0
        public void GolfClubMembershipAggregate_RequestMembership_MembershipRequested()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregate();

            aggregate.RequestMembership(GolfClubMembershipTestData.PlayerId,
                                        GolfClubMembershipTestData.PlayerFullName,
                                        GolfClubMembershipTestData.PlayerDateOfBirth,
                                        GolfClubMembershipTestData.PlayerGender,
                                        GolfClubMembershipTestData.RequestDateAndTime);

            MembershipDataTransferObject membership = aggregate.GetMembership(GolfClubMembershipTestData.PlayerId,
                                                                              GolfClubMembershipTestData.PlayerDateOfBirth,
                                                                              GolfClubMembershipTestData.PlayerGender);

            membership.MembershipId.ShouldNotBe(Guid.Empty);
            membership.PlayerId.ShouldBe(GolfClubMembershipTestData.PlayerId);
            membership.PlayerFullName.ShouldBe(GolfClubMembershipTestData.PlayerFullName);
            membership.PlayerDateOfBirth.ShouldBe(GolfClubMembershipTestData.PlayerDateOfBirth);
            membership.PlayerGender.ShouldBe(GolfClubMembershipTestData.PlayerGender);
            membership.AcceptedDateAndTime.ShouldBe(GolfClubMembershipTestData.RequestDateAndTime);
            membership.AcceptedDateAndTime.ShouldNotBe(DateTime.MinValue);
            membership.MembershipNumber.ShouldBe("000001");
            membership.Status.ShouldBe(1);
        }