public void GolfClubAggregate_CanBeCreated_IsCreated() { GolfClubAggregate aggregate = GolfClubAggregate.Create(GolfClubTestData.AggregateId); aggregate.ShouldNotBeNull(); aggregate.AggregateId.ShouldBe(GolfClubTestData.AggregateId); }
public void GolfClubAggregate_CreateGolfClub_DuplicateCreateGolfClubCalled_ErrorThrown() { GolfClubAggregate aggregate = GolfClubAggregate.Create(GolfClubTestData.AggregateId); Should.NotThrow(() => { aggregate.CreateGolfClub(GolfClubTestData.Name, GolfClubTestData.AddressLine1, GolfClubTestData.AddressLine2, GolfClubTestData.Town, GolfClubTestData.Region, GolfClubTestData.PostalCode, GolfClubTestData.TelephoneNumber, GolfClubTestData.Website, GolfClubTestData.EmailAddress); }); Should.Throw <InvalidOperationException>(() => { aggregate.CreateGolfClub(GolfClubTestData.Name, GolfClubTestData.AddressLine1, GolfClubTestData.AddressLine2, GolfClubTestData.Town, GolfClubTestData.Region, GolfClubTestData.PostalCode, GolfClubTestData.TelephoneNumber, GolfClubTestData.Website, GolfClubTestData.EmailAddress); }); }
public void GolfClubAggregate_AddTournamentDivision_NullTournamentDivision_ErrorThrown() { GolfClubAggregate aggregate = GolfClubTestData.GetGolfClubAggregateWithMeasuredCourse(); TournamentDivisionDataTransferObject tournamentDivision = null; Should.Throw <ArgumentNullException>(() => { aggregate.AddTournamentDivision(tournamentDivision); }); }
public void GolfClubAggregate_CanBeCreated_EmptyAggregateId_ErrorThrown() { Should.Throw <ArgumentNullException>(() => { GolfClubAggregate aggregate = GolfClubAggregate.Create(Guid.Empty); }); }
/// <summary> /// Handles the command. /// </summary> /// <param name="command">The command.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns></returns> private async Task HandleCommand(CreateTournamentCommand command, CancellationToken cancellationToken) { // Rehydrate the aggregate TournamentAggregate tournament = await this.TournamentRepository.GetLatestVersion(command.TournamentId, cancellationToken); // Get the club to validate the input GolfClubAggregate club = await this.GolfClubRepository.GetLatestVersion(command.GolfClubId, cancellationToken); // bug #29 fixes (throw exception if club not created) if (!club.HasBeenCreated) { throw new NotFoundException($"No created golf club found with Id {command.GolfClubId}"); } // Club is valid, now check the measured course, this will throw exception if not found MeasuredCourseDataTransferObject measuredCourse = club.GetMeasuredCourse(command.CreateTournamentRequest.MeasuredCourseId); tournament.CreateTournament(command.CreateTournamentRequest.TournamentDate, command.GolfClubId, command.CreateTournamentRequest.MeasuredCourseId, measuredCourse.StandardScratchScore, command.CreateTournamentRequest.Name, (PlayerCategory)command.CreateTournamentRequest.MemberCategory, (TournamentFormat)command.CreateTournamentRequest.Format); // Save the changes await this.TournamentRepository.SaveChanges(tournament, cancellationToken); // Setup the response command.Response = new CreateTournamentResponse { TournamentId = command.TournamentId }; }
public void GolfClubAggregate_GetMeasuredCourse_MeasuredCourseWithHolesReturned() { GolfClubAggregate aggregate = GolfClubTestData.GetGolfClubAggregateWithMeasuredCourse(); MeasuredCourseDataTransferObject measuredCourseDataTransferObject = GolfClubTestData.GetMeasuredCourseToAdd(); MeasuredCourseDataTransferObject measuredCourse = aggregate.GetMeasuredCourse(measuredCourseDataTransferObject.MeasuredCourseId); measuredCourse.ShouldNotBeNull(); measuredCourse.Name.ShouldBe(measuredCourseDataTransferObject.Name); measuredCourse.StandardScratchScore.ShouldBe(measuredCourseDataTransferObject.StandardScratchScore); measuredCourse.TeeColour.ShouldBe(measuredCourseDataTransferObject.TeeColour); measuredCourse.Holes.Count.ShouldBe(measuredCourseDataTransferObject.Holes.Count); IOrderedEnumerable <HoleDataTransferObject> resultHoles = measuredCourse.Holes.OrderBy(m => m.HoleNumber); foreach (HoleDataTransferObject holeDataTransferObject in resultHoles) { HoleDataTransferObject orignalHole = measuredCourseDataTransferObject.Holes.Single(h => h.HoleNumber == holeDataTransferObject.HoleNumber); holeDataTransferObject.HoleNumber.ShouldBe(orignalHole.HoleNumber); holeDataTransferObject.LengthInMeters.ShouldBe(orignalHole.LengthInMeters); holeDataTransferObject.LengthInYards.ShouldBe(orignalHole.LengthInYards); holeDataTransferObject.Par.ShouldBe(orignalHole.Par); holeDataTransferObject.StrokeIndex.ShouldBe(orignalHole.StrokeIndex); } }
/// <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); }
public void GolfClubAggregate_AddTournamentDivision_DivisionAdded() { GolfClubAggregate aggregate = GolfClubTestData.GetGolfClubAggregateWithMeasuredCourse(); TournamentDivisionDataTransferObject tournamentDivision = GolfClubTestData.GetTournamentDivision1(); Should.NotThrow(() => { aggregate.AddTournamentDivision(tournamentDivision); }); }
public void GolfClubAggregate_AddTournamentDivision_ClubNotCreated_ErrorThrown() { GolfClubAggregate aggregate = GolfClubTestData.GetEmptyGolfClubAggregate(); TournamentDivisionDataTransferObject tournamentDivision = GolfClubTestData.GetTournamentDivision1(); Should.Throw <InvalidOperationException>(() => { aggregate.AddTournamentDivision(tournamentDivision); }); }
public void GolfClubAggregate_CreateGolfClub_GolfClubCreated() { GolfClubAggregate aggregate = GolfClubAggregate.Create(GolfClubTestData.AggregateId); aggregate.CreateGolfClub(GolfClubTestData.Name, GolfClubTestData.AddressLine1, GolfClubTestData.AddressLine2, GolfClubTestData.Town, GolfClubTestData.Region, GolfClubTestData.PostalCode, GolfClubTestData.TelephoneNumber, GolfClubTestData.Website, GolfClubTestData.EmailAddress); aggregate.ShouldNotBeNull(); aggregate.AggregateId.ShouldBe(GolfClubTestData.AggregateId); aggregate.Name.ShouldBe(GolfClubTestData.Name); aggregate.AddressLine1.ShouldBe(GolfClubTestData.AddressLine1); aggregate.AddressLine2.ShouldBe(GolfClubTestData.AddressLine2); aggregate.Town.ShouldBe(GolfClubTestData.Town); aggregate.Region.ShouldBe(GolfClubTestData.Region); aggregate.PostalCode.ShouldBe(GolfClubTestData.PostalCode); aggregate.TelephoneNumber.ShouldBe(GolfClubTestData.TelephoneNumber); aggregate.Website.ShouldBe(GolfClubTestData.Website); aggregate.EmailAddress.ShouldBe(GolfClubTestData.EmailAddress); aggregate.HasBeenCreated.ShouldBeTrue(); }
/// <summary> /// Handles the command. /// </summary> /// <param name="command">The command.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns></returns> private async Task HandleCommand(CreateGolfClubCommand command, CancellationToken cancellationToken) { Guid golfClubAggregateId = command.GolfClubId; // Rehydrate the aggregate GolfClubAggregate golfClubAggregate = await this.GolfClubRepository.GetLatestVersion(golfClubAggregateId, cancellationToken); // Call the aggregate method golfClubAggregate.CreateGolfClub(command.CreateGolfClubRequest.Name, command.CreateGolfClubRequest.AddressLine1, command.CreateGolfClubRequest.AddressLine2, command.CreateGolfClubRequest.Town, command.CreateGolfClubRequest.Region, command.CreateGolfClubRequest.PostalCode, command.CreateGolfClubRequest.TelephoneNumber, command.CreateGolfClubRequest.Website, command.CreateGolfClubRequest.EmailAddress); // Record club admin user against aggregate golfClubAggregate.CreateGolfClubAdministratorSecurityUser(command.SecurityUserId); // Save the changes await this.GolfClubRepository.SaveChanges(golfClubAggregate, cancellationToken); // Setup the response command.Response = new CreateGolfClubResponse { GolfClubId = golfClubAggregateId }; }
public void GolfClubAggregate_AddMeasuredCourse_InvalidNumberOfHoles_ErrorThrown(Int32 numberHoles) { GolfClubAggregate aggregate = GolfClubTestData.GetCreatedGolfClubAggregate(); MeasuredCourseDataTransferObject measuredCourseDataTransferObject = GolfClubTestData.GetMeasuredCourseToAdd(numberHoles); Should.Throw <InvalidDataException>(() => { aggregate.AddMeasuredCourse(measuredCourseDataTransferObject); }); }
public void GolfClubAggregate_GetMeasuredCourse_MeasuredCourseNotFound_ErrorThrown() { GolfClubAggregate aggregate = GolfClubTestData.GetGolfClubAggregateWithMeasuredCourse(); MeasuredCourseDataTransferObject measuredCourseDataTransferObject = GolfClubTestData.GetMeasuredCourseToAdd(); Should.Throw <NotFoundException>(() => { aggregate.GetMeasuredCourse(GolfClubTestData.InvalidMeasuredCourseId); }); }
public void GolfClubAggregate_AddMeasuredCourse_InvalidHoleData_MissingHoleNumber_ErrorThrown(Int32 holeNumber) { GolfClubAggregate aggregate = GolfClubTestData.GetCreatedGolfClubAggregate(); MeasuredCourseDataTransferObject measuredCourseDataTransferObject = GolfClubTestData.GetMeasuredCourseToAddWithMissingHoles(holeNumber); Should.Throw <InvalidDataException>(() => { aggregate.AddMeasuredCourse(measuredCourseDataTransferObject); }); }
public void GolfClubAggregate_GetMeasuredCourses_NoCourses_ErrorThrown() { GolfClubAggregate aggregate = GolfClubTestData.GetCreatedGolfClubAggregate(); MeasuredCourseDataTransferObject measuredCourseDataTransferObject = GolfClubTestData.GetMeasuredCourseToAdd(); Should.Throw <NotFoundException>(() => { aggregate.GetMeasuredCourses(); }); }
public void GolfClubAggregate_AddMeasuredCourse_ClubNotCreated_ErrorThrown() { GolfClubAggregate aggregate = GolfClubTestData.GetEmptyGolfClubAggregate(); MeasuredCourseDataTransferObject measuredCourseDataTransferObject = GolfClubTestData.GetMeasuredCourseToAdd(); Should.Throw <InvalidOperationException>(() => { aggregate.AddMeasuredCourse(measuredCourseDataTransferObject); }); }
public void GolfClubAggregate_AddTournamentDivision_DuplicateDivision_ErrorThrown() { GolfClubAggregate aggregate = GolfClubTestData.GetGolfClubAggregateWithMeasuredCourse(); TournamentDivisionDataTransferObject tournamentDivision = GolfClubTestData.GetTournamentDivision1(); aggregate.AddTournamentDivision(tournamentDivision); Should.Throw <InvalidOperationException>(() => { aggregate.AddTournamentDivision(tournamentDivision); }); }
public void GolfClubAggregate_CreateGolfClubAdministratorSecurityUser_GolfClubAdministratorSecurityUserCreated() { GolfClubAggregate aggregate = GolfClubTestData.GetCreatedGolfClubAggregate(); aggregate.CreateGolfClubAdministratorSecurityUser(GolfClubTestData.GolfClubAdministratorSecurityUserId); aggregate.GolfClubAdministratorSecurityUserId.ShouldBe(GolfClubTestData.GolfClubAdministratorSecurityUserId); aggregate.HasAdminSecurityUserBeenCreated.ShouldBeTrue(); }
public void GolfClubAggregate_AddMeasuredCourse_InvalidHoleData_InvalidData_ErrorThrown(Int32 lengthInYards, Int32 par) { GolfClubAggregate aggregate = GolfClubTestData.GetCreatedGolfClubAggregate(); MeasuredCourseDataTransferObject measuredCourseDataTransferObject = GolfClubTestData.GetMeasuredCourseToAdd(); measuredCourseDataTransferObject.Holes.First().LengthInYards = lengthInYards; measuredCourseDataTransferObject.Holes.First().Par = par; Should.Throw <InvalidDataException>(() => { aggregate.AddMeasuredCourse(measuredCourseDataTransferObject); }); }
public async Task <IActionResult> GetGolfClub([FromRoute] Guid golfClubId, [FromQuery] Boolean includeMemberships, CancellationToken cancellationToken) { GolfClubAggregate golfClub = await this.GolfClubRepository.GetLatestVersion(golfClubId, cancellationToken); if (!golfClub.HasBeenCreated) { return(this.NotFound($"Golf Club not found with Id {golfClubId}")); } // Translate to Developer DTO DeveloperGetGolfClubResponse response = new DeveloperGetGolfClubResponse { AddressLine1 = golfClub.AddressLine1, Name = golfClub.Name, Town = golfClub.Town, Website = golfClub.Website, Region = golfClub.Region, TelephoneNumber = golfClub.TelephoneNumber, EmailAddress = golfClub.EmailAddress, PostalCode = golfClub.PostalCode, AggregateId = golfClub.AggregateId, AddressLine2 = golfClub.AddressLine2, HasBeenCreated = golfClub.HasBeenCreated }; if (includeMemberships) { GolfClubMembershipAggregate golfClubMemberships = await this.GolfClubMembershipRepository.GetLatestVersion(golfClubId, cancellationToken); List <MembershipDataTransferObject> memberships = golfClubMemberships.GetMemberships(); memberships.ForEach(m => { response.GolfClubMemberships.Add(new GolfClubMembershipResponse { AcceptedDateAndTime = m.AcceptedDateAndTime, MembershipId = m.MembershipId, MembershipNumber = m.MembershipNumber, PlayerDateOfBirth = m.PlayerDateOfBirth, PlayerFullName = m.PlayerFullName, PlayerGender = m.PlayerGender, PlayerId = m.PlayerId, RejectedDateAndTime = m.RejectedDateAndTime, RejectionReason = m.RejectionReason, Status = m.Status }); }); } return(this.Ok(response)); }
public void GolfClubAggregate_GetMeasuredCourses_MeasuredCoursesReturned() { GolfClubAggregate aggregate = GolfClubTestData.GetGolfClubAggregateWithMeasuredCourse(); MeasuredCourseDataTransferObject measuredCourseDataTransferObject = GolfClubTestData.GetMeasuredCourseToAdd(); List <MeasuredCourseDataTransferObject> measuredCourses = aggregate.GetMeasuredCourses(); measuredCourses.ShouldNotBeEmpty(); measuredCourses.First().MeasuredCourseId.ShouldBe(measuredCourseDataTransferObject.MeasuredCourseId); measuredCourses.First().Name.ShouldBe(measuredCourseDataTransferObject.Name); measuredCourses.First().TeeColour.ShouldBe(measuredCourseDataTransferObject.TeeColour); measuredCourses.First().StandardScratchScore.ShouldBe(measuredCourseDataTransferObject.StandardScratchScore); }
public void GolfClubAggregate_AddTournamentDivision_InvalidDivisionData_ErrorThrown(Int32 division, Int32 startHandicap, Int32 endHandicap, Type exceptionType) { GolfClubAggregate aggregate = GolfClubTestData.GetGolfClubAggregateWithMeasuredCourse(); TournamentDivisionDataTransferObject tournamentDivision = new TournamentDivisionDataTransferObject { Division = division, EndHandicap = endHandicap, StartHandicap = startHandicap }; Should.Throw(() => { aggregate.AddTournamentDivision(tournamentDivision); }, exceptionType); }
public void GolfClubAggregate_AddMeasuredCourse_InvalidCourseData_ErrorThrown(Boolean validMeasuredCourseId, String name, String teeColour, Int32 standardScratchScore) { GolfClubAggregate aggregate = GolfClubTestData.GetCreatedGolfClubAggregate(); MeasuredCourseDataTransferObject measuredCourseDataTransferObject = GolfClubTestData.GetMeasuredCourseToAdd(); measuredCourseDataTransferObject.MeasuredCourseId = validMeasuredCourseId ? GolfClubTestData.MeasuredCourseId : Guid.Empty; measuredCourseDataTransferObject.Name = name; measuredCourseDataTransferObject.TeeColour = teeColour; measuredCourseDataTransferObject.StandardScratchScore = standardScratchScore; Should.Throw <ArgumentNullException>(() => { aggregate.AddMeasuredCourse(measuredCourseDataTransferObject); }); }
public void GolfClubAggregate_AddTournamentDivision_DivisionStartHandicapClashesWithExistingRange_ErrorThrown() { GolfClubAggregate aggregate = GolfClubTestData.GetGolfClubAggregateWithMeasuredCourse(); TournamentDivisionDataTransferObject tournamentDivision = GolfClubTestData.GetTournamentDivision1(); aggregate.AddTournamentDivision(tournamentDivision); TournamentDivisionDataTransferObject tournamentDivisionInvalid = new TournamentDivisionDataTransferObject { Division = 2, EndHandicap = 12, StartHandicap = GolfClubTestData.GetTournamentDivision1().StartHandicap }; Should.Throw <InvalidDataException>(() => { aggregate.AddTournamentDivision(tournamentDivisionInvalid); }); }
/// <summary> /// Handles the command. /// </summary> /// <param name="command">The command.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns></returns> private async Task HandleCommand(AddTournamentDivisionToGolfClubCommand command, CancellationToken cancellationToken) { // Rehydrate the aggregate GolfClubAggregate golfClubAggregate = await this.GolfClubRepository.GetLatestVersion(command.GolfClubId, cancellationToken); // Create the dto from the request in the command TournamentDivisionDataTransferObject tournamentDivisionDataTransferObject = new TournamentDivisionDataTransferObject { Division = command.AddTournamentDivisionToGolfClubRequest.Division, StartHandicap = command.AddTournamentDivisionToGolfClubRequest.StartHandicap, EndHandicap = command.AddTournamentDivisionToGolfClubRequest.EndHandicap }; golfClubAggregate.AddTournamentDivision(tournamentDivisionDataTransferObject); await this.GolfClubRepository.SaveChanges(golfClubAggregate, cancellationToken); }
public void GolfClubAggregate_CreateGolfClub_InvalidData_ErrorThrown(String name, String addressLine1, String town, String region, String postalCode) { GolfClubAggregate aggregate = GolfClubAggregate.Create(GolfClubTestData.AggregateId); Should.Throw <ArgumentNullException>(() => { aggregate.CreateGolfClub(name, addressLine1, GolfClubTestData.AddressLine2, town, region, postalCode, GolfClubTestData.TelephoneNumber, GolfClubTestData.Website, GolfClubTestData.EmailAddress); }); }
/// <summary> /// Handles the command. /// </summary> /// <param name="command">The command.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns></returns> private async Task HandleCommand(AddMeasuredCourseToClubCommand command, CancellationToken cancellationToken) { // Rehydrate the aggregate GolfClubAggregate golfClubAggregate = await this.GolfClubRepository.GetLatestVersion(command.GolfClubId, cancellationToken); // Translate the request to the input for AddMeasuredCourse MeasuredCourseDataTransferObject measuredCourse = new MeasuredCourseDataTransferObject { MeasuredCourseId = command.MeasuredCourseId, Name = command.AddMeasuredCourseToClubRequest.Name, StandardScratchScore = command.AddMeasuredCourseToClubRequest.StandardScratchScore, TeeColour = command.AddMeasuredCourseToClubRequest.TeeColour, Holes = new List <HoleDataTransferObject>() }; foreach (HoleDataTransferObjectRequest holeDataTransferObject in command.AddMeasuredCourseToClubRequest.Holes) { measuredCourse.Holes.Add(new HoleDataTransferObject { HoleNumber = holeDataTransferObject.HoleNumber, Par = holeDataTransferObject.Par, StrokeIndex = holeDataTransferObject.StrokeIndex, LengthInYards = holeDataTransferObject.LengthInYards, LengthInMeters = holeDataTransferObject.LengthInMeters }); } // Add the measured course golfClubAggregate.AddMeasuredCourse(measuredCourse); // Save the changes await this.GolfClubRepository.SaveChanges(golfClubAggregate, cancellationToken); // No Response to set }
/// <summary> /// Handles the command. /// </summary> /// <param name="command">The command.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns></returns> private async Task HandleCommand(CreateMatchSecretaryCommand command, CancellationToken cancellationToken) { Guid golfClubAggregateId = command.GolfClubId; // Rehydrate the aggregate GolfClubAggregate golfClubAggregate = await this.GolfClubRepository.GetLatestVersion(golfClubAggregateId, cancellationToken); // Create the user RegisterUserRequest registerUserRequest = new RegisterUserRequest { EmailAddress = command.CreateMatchSecretaryRequest.EmailAddress, Claims = new Dictionary <String, String> { { "GolfClubId", golfClubAggregateId.ToString() } }, Password = "******", PhoneNumber = command.CreateMatchSecretaryRequest.TelephoneNumber, MiddleName = command.CreateMatchSecretaryRequest.MiddleName, FamilyName = command.CreateMatchSecretaryRequest.FamilyName, GivenName = command.CreateMatchSecretaryRequest.GivenName, Roles = new List <String> { RoleNames.MatchSecretary } }; // Create the user RegisterUserResponse registerUserResponse = await this.OAuth2SecurityService.RegisterUser(registerUserRequest, cancellationToken); // Record against the aggregate golfClubAggregate.CreateMatchSecretarySecurityUser(registerUserResponse.UserId); // Save the changes await this.GolfClubRepository.SaveChanges(golfClubAggregate, cancellationToken); }
public void GolfClubAggregate_CreateMatchSecretarySecurityUser_InvalidData_ErrorThrown() { GolfClubAggregate aggregate = GolfClubTestData.GetEmptyGolfClubAggregate(); Should.Throw <ArgumentNullException>(() => { aggregate.CreateMatchSecretarySecurityUser(Guid.Empty); }); }
public void GolfClubAggregate_CreateMatchSecretarySecurityUser_MatchSecretaryUserAdded() { GolfClubAggregate aggregate = GolfClubTestData.GetCreatedGolfClubAggregate(); Should.NotThrow(() => { aggregate.CreateMatchSecretarySecurityUser(GolfClubTestData.MatchSecretarySecurityUserId); }); }