Ejemplo n.º 1
0
        public async Task TLevels_Get_WithNoTLevels_ReturnsOkWithEmptyCollection()
        {
            SqlQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetTLevels>()))
            .ReturnsAsync(Array.Empty <TLevel>());

            CosmosDbQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <CosmosQueries.GetProvidersByIds>()))
            .ReturnsAsync(new Dictionary <Guid, CosmosModels.Provider>());

            SqlQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetProvidersByIds>()))
            .ReturnsAsync(new Dictionary <Guid, Provider>());

            SqlQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetVenuesByIds>()))
            .ReturnsAsync(new Dictionary <Guid, Venue>());

            CosmosDbQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <CosmosQueries.GetFeChoicesByProviderUkprns>()))
            .ReturnsAsync(new Dictionary <int, CosmosModels.FeChoice>());

            // Act
            var response = await HttpClient.GetAsync($"tlevels");

            // Assert
            response.StatusCode.Should().Be(StatusCodes.Status200OK);
            var result = JObject.Parse(await response.Content.ReadAsStringAsync());

            result.Should().NotBeNull();
            result["tLevels"].ToArray().Should().BeEmpty();
        }
        public async Task DeleteVenue_Post_DeletesVenueAndRedirects()
        {
            // Arrange
            var provider = await TestData.CreateProvider(
                providerType : ProviderType.FE);

            await User.AsTestUser(TestUserType.ProviderUser, provider.ProviderId);

            var venue = await TestData.CreateVenue(provider.ProviderId);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add(nameof(Command.Confirm), true)
                                 .Add(nameof(Command.ProviderId), provider.ProviderId)
                                 .ToContent();

            var request = new HttpRequestMessage(HttpMethod.Post, $"/venues/{venue.Id}/delete")
            {
                Content = requestContent
            };

            // Act
            var response = await HttpClient.SendAsync(request);

            // Assert
            response.StatusCode.Should().Be(StatusCodes.Status302Found);
            response.Headers.Location.OriginalString.Should().Be($"/venues/{venue.Id}/delete-success?providerId={provider.ProviderId}");

            CosmosDbQueryDispatcher.VerifyExecuteQuery <Core.DataStore.CosmosDb.Queries.DeleteVenue, OneOf <NotFound, Success> >(q => q.VenueId == venue.Id, Times.Once());
        }
Ejemplo n.º 3
0
        public async Task PostConfirmation_ValidRequestUpdatesDbAndRedirects()
        {
            // Arrange
            var provider = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted);

            await User.AsProviderUser(provider.ProviderId, ProviderType.Apprenticeships);

            var flowModel = new FlowModel();

            flowModel.SetProviderDetails("<p>New marketing info</p>");
            var mptxInstance = CreateMptxInstance(flowModel);

            var requestContent = new FormUrlEncodedContentBuilder().ToContent();

            // Act
            var response = await HttpClient.PostAsync(
                $"new-apprenticeship-provider/provider-detail-confirmation?providerId={provider.ProviderId}&ffiid={mptxInstance.InstanceId}",
                requestContent);

            // Assert
            CosmosDbQueryDispatcher.Verify(mock => mock.ExecuteQuery(It.Is <UpdateProviderInfo>(c =>
                                                                                                c.ProviderId == provider.ProviderId &&
                                                                                                c.MarketingInformation == "<p>New marketing info</p>" &&
                                                                                                c.UpdatedBy.UserId == User.UserId &&
                                                                                                c.UpdatedOn == Clock.UtcNow)));

            Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
            Assert.Equal(
                "/new-apprenticeship-provider/find-standard",
                UrlHelper.StripQueryParams(response.Headers.Location.OriginalString));
        }
        public async Task SyncProviderData_ProviderDoesNotExist_CreatesProviderInfo()
        {
            // Arrange
            const int ukprn           = 1234569;
            var       ukrlpData       = GenerateUkrlpProviderData(ukprn);
            var       ukrlpContact    = ukrlpData.ProviderContact.Single();
            var       ukrlpSyncHelper = SetupUkrlpSyncHelper(ukprn, ukrlpData);

            ICollection <CreateProviderFromUkrlpData> capturedUpdateCommands = new List <CreateProviderFromUkrlpData>();

            CosmosDbQueryDispatcher.Setup(mock => mock.ExecuteQuery(Capture.In(capturedUpdateCommands)));

            // Act
            await ukrlpSyncHelper.SyncProviderData(ukprn);

            // Assert
            var createCommand = capturedUpdateCommands.Should().ContainSingle().Subject;

            createCommand.Alias.Should().Be(ukrlpData.ProviderAliases.Single().ProviderAlias);
            createCommand.DateUpdated.Should().Be(Clock.UtcNow);
            createCommand.ProviderName.Should().Be(ukrlpData.ProviderName);
            createCommand.ProviderStatus.Should().Be(ukrlpData.ProviderStatus);
            createCommand.ProviderType.Should().Be(ProviderType.None);
            createCommand.Status.Should().Be(ProviderStatus.Registered);
            createCommand.Ukprn.Should().Be(ukprn);
            var actualContact = createCommand.Contacts.Should().ContainSingle().Subject;

            AssertContactMapping(actualContact, ukrlpContact);
        }
        public async Task Post_ValidSetsCorrectStatusAndRequestRendersExpectedOutput(
            bool passed,
            ApprenticeshipQAStatus expectedStatus,
            bool expectApprenticeshipToBeMadeLive)
        {
            // Arrange
            var provider = await TestData.CreateProvider(
                providerName : "Provider 1",
                apprenticeshipQAStatus : ApprenticeshipQAStatus.InProgress);

            var providerUser = await TestData.CreateUser(providerId : provider.ProviderId);

            var standard = await TestData.CreateStandard(standardCode : 1234, version : 1, standardName : "Test Standard");

            var apprenticeshipId = (await TestData.CreateApprenticeship(provider.ProviderId, standard, createdBy: User.ToUserInfo())).Id;

            var submissionId = await TestData.CreateApprenticeshipQASubmission(
                provider.ProviderId,
                submittedOn : Clock.UtcNow,
                submittedByUserId : providerUser.UserId,
                providerMarketingInformation : "The overview",
                apprenticeshipIds : new[] { apprenticeshipId });

            await TestData.UpdateApprenticeshipQASubmission(
                submissionId,
                providerAssessmentPassed : passed,
                apprenticeshipAssessmentsPassed : passed,
                passed : passed,
                lastAssessedByUserId : User.UserId,
                lastAssessedOn : Clock.UtcNow);

            await User.AsHelpdesk();

            var requestContent = new FormUrlEncodedContentBuilder().ToContent();

            // Act
            var response = await HttpClient.PostAsync($"apprenticeship-qa/{provider.ProviderId}/complete", requestContent);

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            var doc = await response.GetDocument();

            var providerName = doc.GetElementById("pttcd-apprenticeship-qa-complete-provider-name").TextContent.Trim();

            Assert.Equal("Provider 1", providerName);

            var newStatus = await WithSqlQueryDispatcher(dispatcher => dispatcher.ExecuteQuery(new GetProviderApprenticeshipQAStatus()
            {
                ProviderId = provider.ProviderId
            }));

            Assert.Equal(expectedStatus, newStatus);

            CosmosDbQueryDispatcher.VerifyExecuteQuery <UpdateApprenticeshipStatus, OneOf <NotFound, Success> >(
                q => q.ApprenticeshipId == apprenticeshipId && q.ProviderUkprn == provider.Ukprn && q.Status == 1,
                expectApprenticeshipToBeMadeLive ? Times.Once() : Times.Never());
        }
Ejemplo n.º 6
0
        private void ResetMocks()
        {
            CosmosDbQueryDispatcher.Reset();
            FindACourseOfferingSearchClient.Reset();
            LarsSearchClient.Reset();
            RegionCache.Reset();
            SqlQueryDispatcher.Reset();

            RegionCache.Setup(c => c.GetAllRegions()).ReturnsAsync(Array.Empty <Region>());
        }
        public async Task Post_ValidRequest_UpdatesDatabaseAndRedirects()
        {
            // Arrange
            var provider = await TestData.CreateProvider();

            var venueId = (await TestData.CreateVenue(provider.ProviderId)).Id;

            var journeyInstance = await CreateJourneyInstance(venueId);

            journeyInstance.UpdateState(state =>
            {
                state.Name         = "Updated name";
                state.Email        = "*****@*****.**";
                state.PhoneNumber  = "02345 678901";
                state.Website      = "updated-provider.com";
                state.AddressLine1 = "Updated line 1";
                state.AddressLine2 = "Updated line 2";
                state.Town         = "Updated town";
                state.County       = "Updated county";
                state.Postcode     = "UP1 D8D";
                state.Latitude     = 42;
                state.Longitude    = 42;
            });

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .ToContent();

            var request = new HttpRequestMessage(HttpMethod.Post, $"venues/{venueId}")
            {
                Content = requestContent
            };

            // Act
            var response = await HttpClient.SendAsync(request);

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.Found);
            response.Headers.Location.OriginalString.Should().Be($"/venues?providerId={provider.ProviderId}");

            CosmosDbQueryDispatcher.VerifyExecuteQuery <UpdateVenue, OneOf <NotFound, Venue> >(q =>
                                                                                               q.VenueId == venueId &&
                                                                                               q.Name == "Updated name" &&
                                                                                               q.Email == "*****@*****.**" &&
                                                                                               q.PhoneNumber == "02345 678901" &&
                                                                                               q.Website == "updated-provider.com" &&
                                                                                               q.AddressLine1 == "Updated line 1" &&
                                                                                               q.AddressLine2 == "Updated line 2" &&
                                                                                               q.Town == "Updated town" &&
                                                                                               q.County == "Updated county" &&
                                                                                               q.Postcode == "UP1 D8D" &&
                                                                                               q.Latitude == 42 &&
                                                                                               q.Longitude == 42 &&
                                                                                               q.UpdatedBy.UserId == User.UserId &&
                                                                                               q.UpdatedDate == Clock.UtcNow);
        }
Ejemplo n.º 8
0
        public async Task TLevels_Get_WithTLevels_ReturnsOkWithExpectedTLevelsCollection()
        {
            var provider1                = CreateProvider(1);
            var sqlProvider1             = CreateSqlProvider(provider1);
            var provider1FeChoice        = CreateFeChoice(1, provider1.Ukprn);
            var provider1Venue1          = CreateVenue(1);
            var provider1Venue2          = CreateVenue(2);
            var provider1TLevelLocation1 = CreateTLevelLocation(1, provider1Venue1.VenueId);
            var provider1TLevelLocation2 = CreateTLevelLocation(2, provider1Venue1.VenueId);
            var provider1TLevelLocation3 = CreateTLevelLocation(3, provider1Venue2.VenueId);

            // Provider1, with one location
            var provider1TLevel1 = CreateTLevel(1, provider1, new[] { provider1TLevelLocation1 });
            // Provider1, with two locations
            var provider1TLevel2 = CreateTLevel(2, provider1, new[] { provider1TLevelLocation2, provider1TLevelLocation3 });

            var provider2                = CreateProvider(2);
            var sqlProvider2             = CreateSqlProvider(provider2);
            var provider2Venue1          = CreateVenue(3);
            var provider2TLevelLocation1 = CreateTLevelLocation(4, provider2Venue1.VenueId);

            // Provider2, with one location, no FeChoices
            var provider2TLevel1 = CreateTLevel(3, provider2, new[] { provider2TLevelLocation1 });

            SqlQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetTLevels>()))
            .ReturnsAsync(new[] { provider1TLevel1, provider1TLevel2, provider2TLevel1 });

            CosmosDbQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <CosmosQueries.GetProvidersByIds>()))
            .ReturnsAsync(new[] { provider1, provider2 }.ToDictionary(p => p.Id, p => p));

            SqlQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetProvidersByIds>()))
            .ReturnsAsync(new[] { sqlProvider1, sqlProvider2 }.ToDictionary(p => p.ProviderId, p => p));

            SqlQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetVenuesByIds>()))
            .ReturnsAsync(new[] { provider1Venue1, provider1Venue2, provider2Venue1 }.ToDictionary(v => v.VenueId, v => v));

            CosmosDbQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <CosmosQueries.GetFeChoicesByProviderUkprns>()))
            .ReturnsAsync(new[] { provider1FeChoice }.ToDictionary(f => f.UKPRN, f => f));

            // Act
            var response = await HttpClient.GetAsync($"tlevels");

            // Assert
            response.StatusCode.Should().Be(StatusCodes.Status200OK);
            var result = JObject.Parse(await response.Content.ReadAsStringAsync());

            result.Should().NotBeNull();
            var tLevels = result["tLevels"].ToArray();

            tLevels.Should().NotBeNullOrEmpty();
            tLevels.Length.Should().Be(3);

            AssertHasTLevel(tLevels, provider1, sqlProvider1, new[] { provider1Venue1, provider1Venue2 }, provider1TLevel1, provider1FeChoice);
            AssertHasTLevel(tLevels, provider1, sqlProvider1, new[] { provider1Venue1, provider1Venue2 }, provider1TLevel2, provider1FeChoice);
            AssertHasTLevel(tLevels, provider2, sqlProvider2, new[] { provider2Venue1 }, provider2TLevel1, null);
Ejemplo n.º 9
0
        public async Task SyncProviderData_ProviderAlreadyExists_UpdatesProviderInfo()
        {
            // Arrange
            const int ukprn = 1234567;

            var providerId = await TestData.CreateProvider(
                ukprn,
                providerName : "Test Provider",
                providerType : ProviderType.FE | ProviderType.Apprenticeships,
                providerStatus : "Provider deactivated, not verified",
                contacts : new[]
            {
                new CreateProviderContact
                {
                    ContactType               = "P",
                    ContactTelephone1         = "0123456789",
                    ContactWebsiteAddress     = "http://www.example.com",
                    ContactEmail              = "*****@*****.**",
                    AddressSaonDescription    = "SAON Description",
                    AddressPaonDescription    = "PAON Description",
                    AddressStreetDescription  = "Street",
                    AddressLocality           = "Locality",
                    AddressItems              = new[] { "ItemDescription" },
                    AddressPostTown           = "PostTown",
                    AddressPostCode           = "Postcode",
                    PersonalDetailsFamilyName = "FamilyName",
                    PersonalDetailsGivenName  = "GivenName"
                }
            });

            var ukrlpData    = GenerateUkrlpProviderData(ukprn);
            var ukrlpContact = ukrlpData.ProviderContact.Single();

            var ukrlpSyncHelper = SetupUkrlpSyncHelper(ukprn, ukrlpData);

            ICollection <UpdateProviderFromUkrlpData> capturedUpdateCommands = new List <UpdateProviderFromUkrlpData>();

            CosmosDbQueryDispatcher.Setup(mock => mock.ExecuteQuery(Capture.In(capturedUpdateCommands)));

            // Act
            await ukrlpSyncHelper.SyncProviderData(ukprn);

            // Assert
            var updateCommand = capturedUpdateCommands.Should().ContainSingle().Subject;

            updateCommand.Alias.Should().Be(ukrlpData.ProviderAliases.Single().ProviderAlias);
            updateCommand.DateUpdated.Should().Be(Clock.UtcNow);
            updateCommand.ProviderName.Should().Be(ukrlpData.ProviderName);
            updateCommand.ProviderId.Should().Be(providerId);
            updateCommand.ProviderStatus.Should().Be(ukrlpData.ProviderStatus);
            var actualContact = updateCommand.Contacts.Should().ContainSingle().Subject;

            AssertContactMapping(actualContact, ukrlpContact);
        }
        public async Task Handle_WithCourseIdNotFound_ReturnsNotFound()
        {
            var courseId    = Guid.NewGuid();
            var courseRunId = Guid.NewGuid();

            CosmosDbQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetCourseById>()))
            .ReturnsAsync((Course)null);

            var result = await HttpClient.GetAsync(CourseRunDetailUrl(courseId, courseRunId));

            result.StatusCode.Should().Be(StatusCodes.Status404NotFound);
        }
Ejemplo n.º 11
0
        public async Task Post_ValidRequest_DeletesCourseRunAndRedirects()
        {
            // Arrange
            var provider = await TestData.CreateProvider();

            var courseId = await TestData.CreateCourse(
                provider.ProviderId,
                qualificationCourseTitle : "Maths",
                createdBy : User.ToUserInfo());

            var courseRunId = await GetCourseRunIdForCourse(courseId);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("Confirm", "true")
                                 .ToContent();

            var request = new HttpRequestMessage(
                HttpMethod.Post,
                $"/courses/{courseId}/course-runs/{courseRunId}/delete?returnUrl=%2fcourses")
            {
                Content = requestContent
            };

            await User.AsProviderUser(provider.ProviderId, ProviderType.FE);

            CreateJourneyInstance(courseId, courseRunId);

            DeleteCourseRunQuery capturedDeleteCourseRunQuery = null;

            CosmosDbQueryDispatcher.Callback <DeleteCourseRunQuery, OneOf <NotFound, Success> >(q => capturedDeleteCourseRunQuery = q);

            // Act
            var response = await HttpClient.SendAsync(request);

            // Assert
            Assert.Equal(HttpStatusCode.Found, response.StatusCode);

            Assert.Equal(
                $"/courses/{courseId}/course-runs/{courseRunId}/delete/confirmed",
                response.Headers.Location.OriginalString);

            CosmosDbQueryDispatcher.Verify(d => d.ExecuteQuery(It.IsAny <DeleteCourseRunQuery>()), Times.Once);
            using (new AssertionScope())
            {
                capturedDeleteCourseRunQuery.Should().NotBeNull();
                capturedDeleteCourseRunQuery.CourseId.Should().Be(courseId);
                capturedDeleteCourseRunQuery.CourseRunId.Should().Be(courseRunId);
                capturedDeleteCourseRunQuery.ProviderUkprn.Should().Be(provider.Ukprn);
                capturedDeleteCourseRunQuery.UpdatedBy.Should().Be(TestUserInfo.DefaultUserId);
                capturedDeleteCourseRunQuery.UpdatedDate.Should().Be(MutableClock.Start);
            }
        }
Ejemplo n.º 12
0
        public async Task PostConfirmation_ValidRequestWithRegions_CreatesValidApprenticeship()
        {
            // Arrange
            var providerId = 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(providerId, ProviderType.Apprenticeships);

            var flowModel = new FlowModel();

            flowModel.SetProviderDetails("Provider 1 rocks");
            flowModel.SetApprenticeshipStandardOrFramework(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;

            CosmosDbQueryDispatcher.Callback <CreateApprenticeship, Success>(q => apprenticeshipId = q.Id);

            var requestContent = new FormUrlEncodedContentBuilder().ToContent();

            // Act
            var response = await HttpClient.PostAsync(
                $"new-apprenticeship-provider/apprenticeship-confirmation?providerId={providerId}&ffiid={mptxInstance.InstanceId}",
                requestContent);

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            CosmosDbQueryDispatcher.Verify(mock => mock.ExecuteQuery(It.Is <CreateApprenticeship>(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().Regions.Contains("E06000001") &&
                                                                                                  q.ApprenticeshipLocations.Single().Regions.Contains("E10000009"))));
        }
Ejemplo n.º 13
0
        public async Task PostConfirmation_ValidRequestWithVenue_CreatesValidApprenticeship()
        {
            // Arrange
            var providerId = 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(providerId);

            await User.AsProviderUser(providerId, ProviderType.Apprenticeships);

            var flowModel = new FlowModel();

            flowModel.SetProviderDetails("Provider 1 rocks");
            flowModel.SetApprenticeshipStandardOrFramework(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;

            CosmosDbQueryDispatcher.Callback <CreateApprenticeship, Success>(q => apprenticeshipId = q.Id);

            var requestContent = new FormUrlEncodedContentBuilder().ToContent();

            // Act
            var response = await HttpClient.PostAsync(
                $"new-apprenticeship-provider/apprenticeship-confirmation?providerId={providerId}&ffiid={mptxInstance.InstanceId}",
                requestContent);

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            CosmosDbQueryDispatcher.Verify(mock => mock.ExecuteQuery(It.Is <CreateApprenticeship>(q =>
                                                                                                  q.ApprenticeshipLocations.Single().ApprenticeshipLocationType == ApprenticeshipLocationType.ClassroomBased &&
                                                                                                  q.ApprenticeshipLocations.Single().DeliveryModes.Single() == ApprenticeshipDeliveryMode.BlockRelease &&
                                                                                                  q.ApprenticeshipLocations.Single().Radius == 5 &&
                                                                                                  q.ApprenticeshipLocations.Single().VenueId == venueId)));
        }
Ejemplo n.º 14
0
        public async Task Post_MissingClassroomLocations_RendersErrorMessage()
        {
            // Arrange
            var providerId = 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(providerId, ProviderType.Apprenticeships);

            var flowModel = new FlowModel();

            flowModel.SetProviderDetails("Provider 1 rocks");
            flowModel.SetApprenticeshipStandardOrFramework(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;

            CosmosDbQueryDispatcher.Callback <CreateApprenticeship, Success>(q => apprenticeshipId = q.Id);

            var requestContent = new FormUrlEncodedContentBuilder().ToContent();

            // Act
            var response = await HttpClient.PostAsync(
                $"new-apprenticeship-provider/apprenticeship-confirmation?providerId={providerId}&ffiid={mptxInstance.InstanceId}",
                requestContent);

            // Assert
            Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);

            var doc = await response.GetDocument();

            Assert.NotNull(doc.GetElementsByClassName("govuk-error-summary"));
        }
Ejemplo n.º 15
0
        public async Task Post_ValidRequest_DeletesCourseRunAndRedirects()
        {
            // Arrange
            var providerId = await TestData.CreateProvider(ukprn : 12345);

            var courseId = await TestData.CreateCourse(
                providerId,
                qualificationCourseTitle : "Maths",
                createdBy : User.ToUserInfo());

            var courseRunId = await GetCourseRunIdForCourse(courseId);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("Confirm", "true")
                                 .ToContent();

            var request = new HttpRequestMessage(
                HttpMethod.Post,
                $"/courses/{courseId}/course-runs/{courseRunId}/delete?returnUrl=%2fcourses")
            {
                Content = requestContent
            };

            await User.AsProviderUser(providerId, ProviderType.FE);

            CreateFormFlowInstance(courseId, courseRunId);

            // Act
            var response = await HttpClient.SendAsync(request);

            // Assert
            Assert.Equal(HttpStatusCode.Found, response.StatusCode);

            Assert.Equal(
                $"/courses/{courseId}/course-runs/{courseRunId}/delete/confirmed",
                response.Headers.Location.OriginalString);

            CosmosDbQueryDispatcher.VerifyExecuteQuery <DeleteCourseRunQuery, OneOf <NotFound, Success> >(q =>
                                                                                                          q.CourseId == courseId && q.CourseRunId == courseRunId && q.ProviderUkprn == 12345);
        }
        public async Task Post_ValidRequest_UpdatesProviderTypeAndRedirects(ProviderType providerType)
        {
            // Arrange
            var providerId = await TestData.CreateProvider(providerType : ProviderType.Undefined);

            var content = new FormUrlEncodedContentBuilder()
                          .Add("ProviderType", (int)providerType)
                          .ToContent();

            var request = new HttpRequestMessage(HttpMethod.Post, $"providers/provider-type?providerId={providerId}")
            {
                Content = content
            };

            // Act
            var response = await HttpClient.SendAsync(request);

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.Found);
            response.Headers.Location.OriginalString.Should().Be($"/providers?providerId={providerId}");

            CosmosDbQueryDispatcher.VerifyExecuteQuery <UpdateProviderType, OneOf <NotFound, Success> >(q =>
                                                                                                        q.ProviderId == providerId && q.ProviderType == providerType);
        }
        public async Task ValidRequest_ReturnsOkWithExpectedOutput()
        {
            // Arrange
            var providerId                   = Guid.NewGuid();
            var providerName                 = "Test Provider";
            var providerUkprn                = 123456;
            var providerContactEmail         = "*****@*****.**";
            var providerEmployerSatisfaction = 9m;
            var providerLearnerSatisfaction  = 10m;

            var tLevelDefinitionId                 = Guid.NewGuid();
            var tLevelDefinitionName               = "T Level name";
            var tLevelDefinitionFrameworkCode      = 4;
            var tLevelDefinitionProgType           = 3;
            var tLevelDefinitionQualificationLevel = 5;

            var venueId           = Guid.NewGuid();
            var venueName         = "Venue";
            var venueAddressLine1 = "Venue address line 1";
            var venueAddressLine2 = "Venue address line 2";
            var venueTown         = "Venue town";
            var venueCounty       = "Venue county";
            var venuePostcode     = "AB1 2DE";
            var venueTelephone    = "01234 567890";
            var venueEmail        = "*****@*****.**";
            var venueWebsite      = "exampleprovider.com/venue";
            var venueLatitude     = 1d;
            var venueLongitude    = 2d;

            var tLevelId           = Guid.NewGuid();
            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://exampleprovider.com/tlevel";

            var tLevelLocationId = Guid.NewGuid();

            var now = DateTime.UtcNow;

            SqlQueryDispatcher
            .Setup(d => d.ExecuteQuery(It.Is <GetTLevel>(q => q.TLevelId == tLevelId)))
            .ReturnsAsync(new TLevel()
            {
                TLevelId         = tLevelId,
                TLevelStatus     = TLevelStatus.Live,
                TLevelDefinition = new TLevelDefinition()
                {
                    TLevelDefinitionId = tLevelDefinitionId,
                    Name               = tLevelDefinitionName,
                    FrameworkCode      = tLevelDefinitionFrameworkCode,
                    ProgType           = tLevelDefinitionProgType,
                    QualificationLevel = tLevelDefinitionQualificationLevel
                },
                ProviderId         = providerId,
                ProviderName       = providerName,
                WhoFor             = whoFor,
                EntryRequirements  = entryRequirements,
                WhatYoullLearn     = whatYoullLearn,
                HowYoullLearn      = howYoullLearn,
                HowYoullBeAssessed = howYoullBeAssessed,
                WhatYouCanDoNext   = whatYouCanDoNext,
                YourReference      = yourReference,
                StartDate          = startDate,
                Locations          = new[]
                {
                    new TLevelLocation()
                    {
                        TLevelLocationId     = tLevelLocationId,
                        TLevelLocationStatus = TLevelLocationStatus.Live,
                        VenueId   = venueId,
                        VenueName = venueName
                    }
                },
                Website   = website,
                CreatedOn = now,
                UpdatedOn = now
            });

            SqlQueryDispatcher
            .Setup(d => d.ExecuteQuery(It.Is <GetProviderById>(q => q.ProviderId == providerId)))
            .ReturnsAsync(new Provider()
            {
                ProviderId   = providerId,
                ProviderType = ProviderType.TLevels,
                ProviderName = providerName,
                Ukprn        = providerUkprn
            });

            SqlQueryDispatcher
            .Setup(d => d.ExecuteQuery(It.Is <GetVenuesByIds>(q => q.VenueIds.SingleOrDefault() == venueId)))
            .ReturnsAsync(new Dictionary <Guid, Venue>()
            {
                {
                    venueId,
                    new Venue()
                    {
                        VenueId      = venueId,
                        VenueName    = venueName,
                        AddressLine1 = venueAddressLine1,
                        AddressLine2 = venueAddressLine2,
                        Town         = venueTown,
                        County       = venueCounty,
                        Postcode     = venuePostcode,
                        Telephone    = venueTelephone,
                        Email        = venueEmail,
                        Website      = venueWebsite,
                        Latitude     = venueLatitude,
                        Longitude    = venueLongitude
                    }
                }
            });

            CosmosDbQueryDispatcher
            .Setup(d => d.ExecuteQuery(It.Is <Core.DataStore.CosmosDb.Queries.GetProviderById>(q => q.ProviderId == providerId)))
            .ReturnsAsync(new Core.DataStore.CosmosDb.Models.Provider()
            {
                Id = providerId,
                UnitedKingdomProviderReferenceNumber = providerUkprn.ToString(),
                ProviderType    = ProviderType.TLevels,
                ProviderContact = new[]
                {
                    new Core.DataStore.CosmosDb.Models.ProviderContact()
                    {
                        ContactType  = "P",     // Primary,
                        ContactEmail = providerContactEmail
                    }
                },
                ProviderAliases = Array.Empty <Core.DataStore.CosmosDb.Models.ProviderAlias>()
            });

            CosmosDbQueryDispatcher
            .Setup(d => d.ExecuteQuery(It.Is <Core.DataStore.CosmosDb.Queries.GetFeChoiceForProvider>(q => q.ProviderUkprn == providerUkprn)))
            .ReturnsAsync(new Core.DataStore.CosmosDb.Models.FeChoice()
            {
                UKPRN = providerUkprn,
                Id    = Guid.NewGuid(),
                EmployerSatisfaction = providerEmployerSatisfaction,
                LearnerSatisfaction  = providerLearnerSatisfaction,
                CreatedDateTimeUtc   = now
            });

            // Act
            var response = await HttpClient.GetAsync($"tleveldetail?tlevelid={tLevelId}");

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.OK);

            var json = JObject.Parse(await response.Content.ReadAsStringAsync());

            using (new AssertionScope())
            {
                json["offeringType"].ToObject <string>().Should().Be("TLevel");
                json["tLevelId"].ToObject <string>().Should().Be(tLevelId.ToString());
                json["tLevelDefinitionId"].ToObject <string>().Should().Be(tLevelDefinitionId.ToString());
                json["qualification"]["frameworkCode"].ToObject <int>().Should().Be(tLevelDefinitionFrameworkCode);
                json["qualification"]["progType"].ToObject <int>().Should().Be(tLevelDefinitionProgType);
                json["qualification"]["qualificationLevel"].ToObject <string>().Should().Be(tLevelDefinitionQualificationLevel.ToString());
                json["qualification"]["tLevelName"].ToObject <string>().Should().Be(tLevelDefinitionName);
                json["provider"]["providerName"].ToObject <string>().Should().Be(providerName);
                json["provider"]["ukprn"].ToObject <int>().Should().Be(providerUkprn);
                json["provider"]["email"].ToObject <string>().Should().Be(providerContactEmail);
                json["provider"]["employerSatisfaction"].ToObject <decimal?>().Should().Be(providerEmployerSatisfaction);
                json["provider"]["learnerSatisfaction"].ToObject <decimal?>().Should().Be(providerLearnerSatisfaction);
                json["whoFor"].ToObject <string>().Should().Be(whoFor);
                json["entryRequirements"].ToObject <string>().Should().Be(entryRequirements);
                json["whatYoullLearn"].ToObject <string>().Should().Be(whatYoullLearn);
                json["howYoullLearn"].ToObject <string>().Should().Be(howYoullLearn);
                json["howYoullBeAssessed"].ToObject <string>().Should().Be(howYoullBeAssessed);
                json["whatYouCanDoNext"].ToObject <string>().Should().Be(whatYouCanDoNext);
                json["website"].ToObject <string>().Should().Be(website);
                json["startDate"].ToObject <DateTime>().Should().Be(startDate);
                json["deliveryMode"].ToObject <string>().Should().Be("ClassroomBased");
                json["attendancePattern"].ToObject <string>().Should().Be("Daytime");
                json["studyMode"].ToObject <string>().Should().Be("FullTime");
                json["durationUnit"].ToObject <string>().Should().Be("Years");
                json["durationValue"].ToObject <int>().Should().Be(2);
                json["cost"].ToObject <decimal?>().Should().BeNull();
                json["costDescription"].ToObject <string>().Should().Be("T Levels are currently only available to 16-19 year olds. Contact us for details of other suitable courses.");

                var location = json["locations"].ToArray().Should().ContainSingle().Subject;
                location["tLevelLocationId"].ToObject <string>().Should().Be(tLevelLocationId.ToString());
                location["venueName"].ToObject <string>().Should().Be(venueName);
                location["addressLine1"].ToObject <string>().Should().Be(venueAddressLine1);
                location["addressLine2"].ToObject <string>().Should().Be(venueAddressLine2);
                location["town"].ToObject <string>().Should().Be(venueTown);
                location["county"].ToObject <string>().Should().Be(venueCounty);
                location["postcode"].ToObject <string>().Should().Be(venuePostcode);
                location["telephone"].ToObject <string>().Should().Be(venueTelephone);
                location["email"].ToObject <string>().Should().Be(venueEmail);
                location["website"].ToObject <string>().Should().Be("http://" + venueWebsite);
                location["latitude"].ToObject <double>().Should().Be(venueLatitude);
                location["longitude"].ToObject <double>().Should().Be(venueLongitude);
            }
        }
        public async Task Handle_WithValidCourseIdAndCourseRunId_ReturnsOkWithResult()
        {
            var venue = new Venue
            {
                Id        = Guid.NewGuid(),
                VenueName = "TestVenueName"
            };

            var lars = new Core.Search.Models.Lars
            {
                LearnAimRef      = "00112233",
                LearnAimRefTitle = "TestLearnAimRefTitle"
            };

            var courseRun = new CourseRun
            {
                Id           = Guid.NewGuid(),
                RecordStatus = CourseStatus.Live,
                VenueId      = venue.Id
            };

            var alternativeCourseRun = new CourseRun
            {
                Id           = Guid.NewGuid(),
                RecordStatus = CourseStatus.Live,
                VenueId      = venue.Id
            };

            var course = new Course
            {
                Id            = Guid.NewGuid(),
                ProviderUKPRN = 12345678,
                LearnAimRef   = lars.LearnAimRef,
                CourseRuns    = new[]
                {
                    courseRun,
                    alternativeCourseRun
                }
            };

            var provider = new Provider
            {
                Id = Guid.NewGuid(),
                UnitedKingdomProviderReferenceNumber = "12345678",
                ProviderContact = new[]
                {
                    new ProviderContact
                    {
                        ContactEmail = "*****@*****.**",
                        ContactType  = "P"
                    }
                }
            };

            var sqlProvider = new Core.DataStore.Sql.Models.Provider
            {
                ProviderId        = provider.Id,
                ProviderName      = "TestProviderAlias",
                DisplayNameSource = ProviderDisplayNameSource.ProviderName
            };

            var feChoice = new FeChoice
            {
                UKPRN = course.ProviderUKPRN,
                EmployerSatisfaction = 1.2M,
                LearnerSatisfaction  = 3.4M
            };

            CosmosDbQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetCourseById>()))
            .ReturnsAsync(course);

            CosmosDbQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetProviderByUkprn>()))
            .ReturnsAsync(provider);

            LarsSearchClient.Setup(s => s.Search(It.IsAny <LarsLearnAimRefSearchQuery>()))
            .ReturnsAsync(new SearchResult <Core.Search.Models.Lars>
            {
                Items = new[] { new SearchResultItem <Core.Search.Models.Lars> {
                                    Record = lars
                                } }
            });

            CosmosDbQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetVenuesByProvider>()))
            .ReturnsAsync(new[] { venue });

            CosmosDbQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <GetFeChoiceForProvider>()))
            .ReturnsAsync(feChoice);

            SqlQueryDispatcher.Setup(s => s.ExecuteQuery(It.IsAny <Core.DataStore.Sql.Queries.GetProviderById>()))
            .ReturnsAsync(sqlProvider);

            var result = await HttpClient.GetAsync(CourseRunDetailUrl(course.Id, courseRun.Id));

            result.StatusCode.Should().Be(StatusCodes.Status200OK);

            var resultJson = JObject.Parse(await result.Content.ReadAsStringAsync());

            using (new AssertionScope())
            {
                resultJson.ToObject <object>().Should().NotBeNull();
                resultJson["provider"].ToObject <object>().Should().NotBeNull();
                resultJson["provider"]["ukprn"].ToObject <int>().Should().Be(provider.Ukprn);
                resultJson["provider"]["providerName"].ToObject <string>().Should().Be(sqlProvider.DisplayName);
                resultJson["provider"]["tradingName"].ToObject <string>().Should().Be(sqlProvider.DisplayName);
                resultJson["provider"]["email"].ToObject <string>().Should().Be(provider.ProviderContact.Single().ContactEmail);
                resultJson["provider"]["learnerSatisfaction"].ToObject <decimal>().Should().Be(feChoice.LearnerSatisfaction);
                resultJson["provider"]["employerSatisfaction"].ToObject <decimal>().Should().Be(feChoice.EmployerSatisfaction);
                resultJson["course"].ToObject <object>().Should().NotBeNull();
                resultJson["course"]["courseId"].ToObject <Guid>().Should().Be(course.Id);
                resultJson["venue"].ToObject <object>().Should().NotBeNull();
                resultJson["venue"]["venueName"].ToObject <string>().Should().Be(venue.VenueName);
                resultJson["qualification"].ToObject <object>().Should().NotBeNull();
                resultJson["qualification"]["learnAimRef"].ToObject <string>().Should().Be(lars.LearnAimRef);
                resultJson["qualification"]["learnAimRefTitle"].ToObject <string>().Should().Be(lars.LearnAimRefTitle);
                resultJson["alternativeCourseRuns"][0]["courseRunId"].ToObject <Guid>().Should().Be(alternativeCourseRun.Id);
                resultJson["courseRunId"].ToObject <Guid>().Should().Be(courseRun.Id);
            }
        }
        public async Task Post_ValidRequest_CreatesVenueCompletesJourneyAndRedirects()
        {
            // Arrange
            var provider = await TestData.CreateProvider();

            var addressLine1 = "Test Venue line 1";
            var addressLine2 = "Test Venue line 2";
            var town         = "Town";
            var county       = "County";
            var postcode     = "AB1 2DE";
            var name         = "My Venue";
            var email        = "*****@*****.**";
            var telephone    = "020 7946 0000";
            var website      = "example.com";
            var latitude     = 42M;
            var longitude    = 43M;

            var journeyInstance = CreateJourneyInstance(
                provider.ProviderId,
                new AddVenueJourneyModel()
            {
                AddressLine1 = addressLine1,
                AddressLine2 = addressLine2,
                County       = county,
                Email        = email,
                Latitude     = latitude,
                Longitude    = longitude,
                Name         = name,
                AddressIsOutsideOfEngland = false,
                Telephone   = telephone,
                Postcode    = postcode,
                Town        = town,
                Website     = website,
                ValidStages = AddVenueCompletedStages.All
            });

            var request = new HttpRequestMessage(
                HttpMethod.Post,
                $"/venues/add/publish?providerId={provider.ProviderId}&ffiid={journeyInstance.InstanceId.UniqueKey}");

            // Act
            var response = await HttpClient.SendAsync(request);

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.Found);

            response.Headers.Location.OriginalString.Should().Be(
                $"/venues/add/success?providerId={provider.ProviderId}&ffiid={journeyInstance.InstanceId.UniqueKey}");

            GetJourneyInstance <AddVenueJourneyModel>(journeyInstance.InstanceId).Completed.Should().BeTrue();

            CosmosDbQueryDispatcher.VerifyExecuteQuery <CreateVenue, Success>(q =>
                                                                              q.ProviderUkprn == provider.Ukprn &&
                                                                              q.Name == name &&
                                                                              q.Email == email &&
                                                                              q.Telephone == telephone &&
                                                                              q.Website == website &&
                                                                              q.AddressLine1 == addressLine1 &&
                                                                              q.AddressLine2 == addressLine2 &&
                                                                              q.Town == town &&
                                                                              q.County == county &&
                                                                              q.Postcode == postcode &&
                                                                              q.Latitude == latitude &&
                                                                              q.Longitude == longitude &&
                                                                              q.CreatedBy.UserId == User.UserId &&
                                                                              q.CreatedDate == Clock.UtcNow);
        }
Ejemplo n.º 20
0
        public async Task PostConfirmation_ValidRequestWithNationalLocations_CreatesApprenticeshipQASubmissionUpdatesQAStatusAndReturnsConfirmation()
        {
            // Arrange
            var providerId = 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(providerId, ProviderType.Apprenticeships);

            var flowModel = new FlowModel();

            flowModel.SetProviderDetails("Provider 1 rocks");
            flowModel.SetApprenticeshipStandardOrFramework(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;

            CosmosDbQueryDispatcher.Callback <CreateApprenticeship, Success>(q => apprenticeshipId = q.Id);

            var requestContent = new FormUrlEncodedContentBuilder().ToContent();

            // Act
            var response = await HttpClient.PostAsync(
                $"new-apprenticeship-provider/apprenticeship-confirmation?providerId={providerId}&ffiid={mptxInstance.InstanceId}",
                requestContent);

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            CosmosDbQueryDispatcher.Verify(mock => mock.ExecuteQuery(It.Is <CreateApprenticeship>(q =>
                                                                                                  q.ApprenticeshipTitle == "My standard" &&
                                                                                                  q.ApprenticeshipType == ApprenticeshipType.StandardCode &&
                                                                                                  q.ContactEmail == "*****@*****.**" &&
                                                                                                  q.ContactTelephone == "01234 5678902" &&
                                                                                                  q.ContactWebsite == "http://provider.com" &&
                                                                                                  q.CreatedByUser.UserId == User.UserId &&
                                                                                                  q.CreatedDate == Clock.UtcNow &&
                                                                                                  q.MarketingInformation == "My apprenticeship" &&
                                                                                                  q.ProviderId == providerId &&
                                                                                                  q.StandardOrFramework.Standard.StandardCode == standardCode &&
                                                                                                  q.StandardOrFramework.Standard.Version == standardVersion &&
                                                                                                  q.Url == "http://provider.com/apprenticeship" &&
                                                                                                  q.Status == 2)));

            SqlQuerySpy.VerifyQuery <CreateApprenticeshipQASubmission, int>(q =>
                                                                            q.Apprenticeships.Single().ApprenticeshipId == apprenticeshipId &&
                                                                            q.Apprenticeships.Single().ApprenticeshipMarketingInformation == "My apprenticeship" &&
                                                                            q.Apprenticeships.Single().ApprenticeshipTitle == "My standard" &&
                                                                            q.ProviderId == providerId &&
                                                                            q.ProviderMarketingInformation == "Provider 1 rocks" &&
                                                                            q.SubmittedByUserId == User.UserId &&
                                                                            q.SubmittedOn == Clock.UtcNow);

            SqlQuerySpy.VerifyQuery <SetProviderApprenticeshipQAStatus, None>(q =>
                                                                              q.ProviderId == providerId && q.ApprenticeshipQAStatus == ApprenticeshipQAStatus.Submitted);

            var doc = await response.GetDocument();

            Assert.Equal(
                "Quality assurance submitted",
                doc.GetElementsByClassName("govuk-panel__title").Single().TextContent.Trim());
        }
Ejemplo n.º 21
0
        public async Task PostConfirmation_ValidRequestWithExistingApprenticeshipRegionsAndVenue_UpdatesApprenticeship()
        {
            // Arrange
            var ukprn            = 12347;
            var providerUserId   = $"{ukprn}-user";
            var adminUserId      = $"admin-user";
            var contactTelephone = "1111 111 1111";
            var contactWebsite   = "https://somerandomprovider.com";
            var marketingInfo    = "Providing Online training";
            var regions          = new List <string> {
                "123"
            };
            var standardCode    = 123;
            var standardVersion = 1;
            var providerId      = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted);

            var user = await TestData.CreateUser(providerUserId, "*****@*****.**", "Provider 1", "Person", providerId);

            var adminUser = await TestData.CreateUser(adminUserId, "*****@*****.**", "admin", "admin", null);

            var standard = await TestData.CreateStandard(standardCode, standardVersion, standardName : "My standard");

            var apprenticeshipId = await TestData.CreateApprenticeship(providerId,
                                                                       standard,
                                                                       createdBy : user,
                                                                       contactEmail : adminUser.Email,
                                                                       contactTelephone : contactTelephone,
                                                                       contactWebsite : contactWebsite,
                                                                       marketingInformation : marketingInfo,
                                                                       locations : new[]
            {
                CreateApprenticeshipLocation.CreateRegions(regions)
            });

            var venueId = await TestData.CreateVenue(providerId);

            await User.AsProviderUser(providerId, ProviderType.Apprenticeships);

            var flowModel = new FlowModel();

            flowModel.SetProviderDetails("Provider 1 rocks");
            flowModel.SetApprenticeshipStandardOrFramework(standard);
            flowModel.SetApprenticeshipDetails(
                marketingInformation: "My apprenticeship",
                website: "http://provider.com/apprenticeship",
                contactTelephone: "01234 5678902",
                contactEmail: "*****@*****.**",
                contactWebsite: "http://provider.com");
            flowModel.SetApprenticeshipLocationType(ApprenticeshipLocationType.ClassroomBasedAndEmployerBased);
            flowModel.SetApprenticeshipLocationRegionIds(new[]
            {
                "E06000001", // County Durham
                "E10000009"  // Dorset
            });
            flowModel.SetApprenticeshipId(apprenticeshipId);
            flowModel.SetClassroomLocationForVenue(
                venueId,
                originalVenueId: null,
                radius: 5,
                deliveryModes: new[] { ApprenticeshipDeliveryMode.BlockRelease });
            var mptxInstance = CreateMptxInstance(flowModel);

            var requestContent = new FormUrlEncodedContentBuilder().ToContent();

            // Act
            var response = await HttpClient.PostAsync(
                $"new-apprenticeship-provider/apprenticeship-confirmation?providerId={providerId}&ffiid={mptxInstance.InstanceId}",
                requestContent);

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

            CosmosDbQueryDispatcher.Verify(mock => mock.ExecuteQuery(It.Is <UpdateApprenticeship>(q =>
                                                                                                  q.ApprenticeshipLocations.Any(l =>
                                                                                                                                l.ApprenticeshipLocationType == ApprenticeshipLocationType.ClassroomBased &&
                                                                                                                                l.DeliveryModes.Single() == ApprenticeshipDeliveryMode.BlockRelease &&
                                                                                                                                l.Radius == 5 &&
                                                                                                                                l.VenueId == venueId) &&
                                                                                                  q.ApprenticeshipLocations.Any(l =>
                                                                                                                                l.ApprenticeshipLocationType == ApprenticeshipLocationType.EmployerBased &&
                                                                                                                                l.DeliveryModes.Single() == ApprenticeshipDeliveryMode.EmployerAddress &&
                                                                                                                                l.National == false &&
                                                                                                                                l.VenueId == null &&
                                                                                                                                l.Regions.Contains("E06000001") &&
                                                                                                                                l.Regions.Contains("E10000009")))));
        }