public async Task PostConfirmation_ValidRequestWithVenue_CreatesValidApprenticeship() { // Arrange var provider = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted); var standardCode = 123; var standardVersion = 1; var standard = await TestData.CreateStandard(standardCode, standardVersion, standardName : "My standard"); var venueId = (await TestData.CreateVenue(provider.ProviderId, createdBy: User.ToUserInfo())).VenueId; await User.AsProviderUser(provider.ProviderId, ProviderType.Apprenticeships); var flowModel = new FlowModel(); flowModel.SetProviderDetails("Provider 1 rocks"); flowModel.SetApprenticeshipStandard(standard); flowModel.SetApprenticeshipDetails( marketingInformation: "My apprenticeship", website: "http://provider.com/apprenticeship", contactTelephone: "01234 5678902", contactEmail: "*****@*****.**", contactWebsite: "http://provider.com"); flowModel.SetApprenticeshipLocationType(ApprenticeshipLocationType.ClassroomBased); flowModel.SetClassroomLocationForVenue( venueId, originalVenueId: null, radius: 5, deliveryModes: new[] { ApprenticeshipDeliveryMode.BlockRelease }); var mptxInstance = CreateMptxInstance(flowModel); Guid apprenticeshipId = default; SqlQuerySpy.Callback <CreateApprenticeship, Success>(q => apprenticeshipId = q.ApprenticeshipId); var requestContent = new FormUrlEncodedContentBuilder().ToContent(); // Act var response = await HttpClient.PostAsync( $"new-apprenticeship-provider/apprenticeship-confirmation?providerId={provider.ProviderId}&ffiid={mptxInstance.InstanceId}", requestContent); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); SqlQuerySpy.VerifyQuery <CreateApprenticeship, Success>(q => q.ApprenticeshipLocations.Single().ApprenticeshipLocationType == ApprenticeshipLocationType.ClassroomBased && q.ApprenticeshipLocations.Single().DeliveryModes.Single() == ApprenticeshipDeliveryMode.BlockRelease && q.ApprenticeshipLocations.Single().Radius == 5 && q.ApprenticeshipLocations.Single().VenueId == venueId); }
public async Task PostConfirmation_ValidRequestWithRegions_CreatesValidApprenticeship() { // Arrange var provider = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted); var standardCode = 123; var standardVersion = 1; var standard = await TestData.CreateStandard(standardCode, standardVersion, standardName : "My standard"); await User.AsProviderUser(provider.ProviderId, ProviderType.Apprenticeships); var flowModel = new FlowModel(); flowModel.SetProviderDetails("Provider 1 rocks"); flowModel.SetApprenticeshipStandard(standard); flowModel.SetApprenticeshipDetails( marketingInformation: "My apprenticeship", website: "http://provider.com/apprenticeship", contactTelephone: "01234 5678902", contactEmail: "*****@*****.**", contactWebsite: "http://provider.com"); flowModel.SetApprenticeshipLocationType(ApprenticeshipLocationType.EmployerBased); flowModel.SetApprenticeshipLocationRegionIds(new[] { "E06000001", // County Durham "E10000009" // Dorset }); var mptxInstance = CreateMptxInstance(flowModel); Guid apprenticeshipId = default; SqlQuerySpy.Callback <CreateApprenticeship, Success>(q => apprenticeshipId = q.ApprenticeshipId); var requestContent = new FormUrlEncodedContentBuilder().ToContent(); // Act var response = await HttpClient.PostAsync( $"new-apprenticeship-provider/apprenticeship-confirmation?providerId={provider.ProviderId}&ffiid={mptxInstance.InstanceId}", requestContent); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); SqlQuerySpy.VerifyQuery <CreateApprenticeship, Success>(q => q.ApprenticeshipLocations.Single().ApprenticeshipLocationType == ApprenticeshipLocationType.EmployerBased && q.ApprenticeshipLocations.Single().DeliveryModes.Single() == ApprenticeshipDeliveryMode.EmployerAddress && q.ApprenticeshipLocations.Single().National == false && q.ApprenticeshipLocations.Single().VenueId == null && q.ApprenticeshipLocations.Single().SubRegionIds.Contains("E06000001") && q.ApprenticeshipLocations.Single().SubRegionIds.Contains("E10000009")); }
public async Task Post_MissingClassroomLocations_RendersErrorMessage() { // Arrange var provider = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted); var standardCode = 123; var standardVersion = 1; var standard = await TestData.CreateStandard(standardCode, standardVersion, standardName : "My standard"); await User.AsProviderUser(provider.ProviderId, ProviderType.Apprenticeships); var flowModel = new FlowModel(); flowModel.SetProviderDetails("Provider 1 rocks"); flowModel.SetApprenticeshipStandard(standard); flowModel.SetApprenticeshipDetails( marketingInformation: "My apprenticeship", website: "http://provider.com/apprenticeship", contactTelephone: "01234 5678902", contactEmail: "*****@*****.**", contactWebsite: "http://provider.com"); flowModel.SetApprenticeshipLocationType(ApprenticeshipLocationType.ClassroomBased); var mptxInstance = CreateMptxInstance(flowModel); Guid apprenticeshipId = default; SqlQuerySpy.Callback <CreateApprenticeship, Success>(q => apprenticeshipId = q.ApprenticeshipId); var requestContent = new FormUrlEncodedContentBuilder().ToContent(); // Act var response = await HttpClient.PostAsync( $"new-apprenticeship-provider/apprenticeship-confirmation?providerId={provider.ProviderId}&ffiid={mptxInstance.InstanceId}", requestContent); // Assert Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); var doc = await response.GetDocument(); Assert.NotNull(doc.GetElementsByClassName("govuk-error-summary")); }
public async Task PostConfirmation_ValidRequestWithNationalLocations_CreatesApprenticeshipQASubmissionUpdatesQAStatusAndReturnsConfirmation() { // Arrange var provider = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted); var standardCode = 123; var standardVersion = 1; var standard = await TestData.CreateStandard(standardCode, standardVersion, standardName : "My standard"); await User.AsProviderUser(provider.ProviderId, ProviderType.Apprenticeships); var flowModel = new FlowModel(); flowModel.SetProviderDetails("Provider 1 rocks"); flowModel.SetApprenticeshipStandard(standard); flowModel.SetApprenticeshipDetails( marketingInformation: "My apprenticeship", website: "http://provider.com/apprenticeship", contactTelephone: "01234 5678902", contactEmail: "*****@*****.**", contactWebsite: "http://provider.com"); flowModel.SetApprenticeshipLocationType(ApprenticeshipLocationType.EmployerBased); flowModel.SetApprenticeshipIsNational(true); var mptxInstance = CreateMptxInstance(flowModel); Guid apprenticeshipId = default; SqlQuerySpy.Callback <CreateApprenticeship, Success>(q => apprenticeshipId = q.ApprenticeshipId); var requestContent = new FormUrlEncodedContentBuilder().ToContent(); // Act var response = await HttpClient.PostAsync( $"new-apprenticeship-provider/apprenticeship-confirmation?providerId={provider.ProviderId}&ffiid={mptxInstance.InstanceId}", requestContent); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); SqlQuerySpy.VerifyQuery <CreateApprenticeship, Success>(q => q.ContactEmail == "*****@*****.**" && q.ContactTelephone == "01234 5678902" && q.ContactWebsite == "http://provider.com" && q.CreatedBy.UserId == User.UserId && q.CreatedOn == Clock.UtcNow && q.MarketingInformation == "My apprenticeship" && q.ProviderId == provider.ProviderId && q.Standard.StandardCode == standardCode && q.Standard.Version == standardVersion && q.ApprenticeshipWebsite == "http://provider.com/apprenticeship"); SqlQuerySpy.VerifyQuery <CreateApprenticeshipQASubmission, int>(q => q.Apprenticeships.Single().ApprenticeshipId == apprenticeshipId && q.Apprenticeships.Single().ApprenticeshipMarketingInformation == "My apprenticeship" && q.Apprenticeships.Single().ApprenticeshipTitle == "My standard" && q.ProviderId == provider.ProviderId && q.ProviderMarketingInformation == "Provider 1 rocks" && q.SubmittedByUserId == User.UserId && q.SubmittedOn == Clock.UtcNow); SqlQuerySpy.VerifyQuery <SetProviderApprenticeshipQAStatus, None>(q => q.ProviderId == provider.ProviderId && q.ApprenticeshipQAStatus == ApprenticeshipQAStatus.Submitted); var doc = await response.GetDocument(); Assert.Equal( "Quality assurance submitted", doc.GetElementsByClassName("govuk-panel__title").Single().TextContent.Trim()); }
public async Task Post_CreatesTLevelUpdatesJourneyStateAndRedirects() { // Arrange var tLevelDefinitions = await TestData.CreateInitialTLevelDefinitions(); var authorizedTLevelDefinitionIds = tLevelDefinitions.Select(tld => tld.TLevelDefinitionId).ToArray(); var provider = await TestData.CreateProvider( providerType : ProviderType.TLevels, tLevelDefinitionIds : authorizedTLevelDefinitionIds); var venueId = (await TestData.CreateVenue(provider.ProviderId)).Id; var selectedTLevel = tLevelDefinitions.First(); var whoFor = "Who for"; var entryRequirements = "Entry requirements"; var whatYoullLearn = "What you'll learn"; var howYoullLearn = "How you'll learn"; var howYoullBeAssessed = "How you'll be assessed"; var whatYouCanDoNext = "What you can do next"; var yourReference = "YOUR-REF"; var startDate = new DateTime(2021, 4, 1); var website = "http://example.com/tlevel"; var journeyState = new AddTLevelJourneyModel(); journeyState.SetTLevel( selectedTLevel.TLevelDefinitionId, selectedTLevel.Name); journeyState.SetDescription( whoFor, entryRequirements, whatYoullLearn, howYoullLearn, howYoullBeAssessed, whatYouCanDoNext, isComplete: true); journeyState.SetDetails( yourReference, startDate, locationVenueIds: new[] { venueId }, website, isComplete: true); var journeyInstance = CreateJourneyInstance(provider.ProviderId, journeyState); var journeyInstanceId = journeyInstance.InstanceId; Guid createdTLevelId = default; SqlQuerySpy.Callback <CreateTLevel, OneOf <CreateTLevelFailedReason, Success> >( q => createdTLevelId = q.TLevelId); var request = new HttpRequestMessage( HttpMethod.Post, $"/t-levels/add/check-publish?providerId={provider.ProviderId}&ffiid={journeyInstanceId.UniqueKey}") { Content = new FormUrlEncodedContentBuilder() .ToContent() }; // Act var response = await HttpClient.SendAsync(request); // Assert response.StatusCode.Should().Be(HttpStatusCode.Found); response.Headers.Location.OriginalString .Should().Be($"/t-levels/add/success?providerId={provider.ProviderId}&ffiid={journeyInstanceId.UniqueKey}"); SqlQuerySpy.VerifyQuery <CreateTLevel, OneOf <CreateTLevelFailedReason, Success> >(q => q.CreatedBy.UserId == User.UserId && q.CreatedOn == Clock.UtcNow && q.EntryRequirements == entryRequirements && q.HowYoullBeAssessed == howYoullBeAssessed && q.HowYoullLearn == howYoullLearn && q.LocationVenueIds.Single() == venueId && q.ProviderId == provider.ProviderId && q.StartDate == startDate && q.TLevelDefinitionId == selectedTLevel.TLevelDefinitionId && q.Website == website && q.WhatYouCanDoNext == whatYouCanDoNext && q.WhatYoullLearn == q.WhatYoullLearn && q.WhoFor == whoFor && q.YourReference == q.YourReference); GetJourneyInstance <AddTLevelJourneyModel>(journeyInstanceId) .State.TLevelId.Should().Be(createdTLevelId); }
public async Task Post_TLevelAlreadyExistsForStartDate_RendersError() { // Arrange var tLevelDefinitions = await TestData.CreateInitialTLevelDefinitions(); var authorizedTLevelDefinitionIds = tLevelDefinitions.Select(tld => tld.TLevelDefinitionId).ToArray(); var provider = await TestData.CreateProvider( providerType : ProviderType.TLevels, tLevelDefinitionIds : authorizedTLevelDefinitionIds); var venueId = (await TestData.CreateVenue(provider.ProviderId)).Id; var selectedTLevel = tLevelDefinitions.First(); var whoFor = "Who for"; var entryRequirements = "Entry requirements"; var whatYoullLearn = "What you'll learn"; var howYoullLearn = "How you'll learn"; var howYoullBeAssessed = "How you'll be assessed"; var whatYouCanDoNext = "What you can do next"; var yourReference = "YOUR-REF"; var startDate = new DateTime(2021, 4, 1); var website = "http://example.com/tlevel"; await TestData.CreateTLevel( provider.ProviderId, selectedTLevel.TLevelDefinitionId, whoFor : whoFor, entryRequirements : entryRequirements, whatYoullLearn : whatYoullLearn, howYoullLearn : howYoullLearn, howYoullBeAssessed : howYoullBeAssessed, whatYouCanDoNext : whatYouCanDoNext, yourReference : yourReference, startDate : startDate, locationVenueIds : new[] { venueId }, website : website, createdBy : User.ToUserInfo()); var journeyState = new AddTLevelJourneyModel(); journeyState.SetTLevel( selectedTLevel.TLevelDefinitionId, selectedTLevel.Name); journeyState.SetDescription( whoFor, entryRequirements, whatYoullLearn, howYoullLearn, howYoullBeAssessed, whatYouCanDoNext, isComplete: true); journeyState.SetDetails( yourReference, startDate, locationVenueIds: new[] { venueId }, website, isComplete: true); var journeyInstance = CreateJourneyInstance(provider.ProviderId, journeyState); var journeyInstanceId = journeyInstance.InstanceId; Guid createdTLevelId = default; SqlQuerySpy.Callback <CreateTLevel, OneOf <CreateTLevelFailedReason, Success> >( q => createdTLevelId = q.TLevelId); var request = new HttpRequestMessage( HttpMethod.Post, $"/t-levels/add/check-publish?providerId={provider.ProviderId}&ffiid={journeyInstanceId.UniqueKey}") { Content = new FormUrlEncodedContentBuilder() .ToContent() }; // Act var response = await HttpClient.SendAsync(request); // Assert response.StatusCode.Should().Be(HttpStatusCode.BadRequest); var doc = await response.GetDocument(); doc.GetElementByTestId("duplicate-date-error").Should().NotBeNull(); }