public async Task Post_ValidRequest_DeletesApprenticeshipAndRedirects()
        {
            // Arrange
            var provider = await TestData.CreateProvider(
                providerType : ProviderType.Apprenticeships);

            var apprenticeshipTitle = await TestData.CreateStandard(standardName : "");

            var apprenticeship = await TestData.CreateApprenticeship(
                provider.ProviderId,
                apprenticeshipTitle,
                createdBy : User.ToUserInfo());

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

            var request = new HttpRequestMessage(HttpMethod.Post, $"/apprenticeships/delete/{apprenticeship.ApprenticeshipId}")
            {
                Content = requestContent
            };

            CreateJourneyInstance(apprenticeship.ApprenticeshipId);

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

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

            response.Headers.Location.OriginalString.Should()
            .Be($"/apprenticeships/delete/{apprenticeship.ApprenticeshipId}/success?providerId={provider.ProviderId}");

            SqlQuerySpy.VerifyQuery <SqlQueries.DeleteApprenticeship, OneOf <NotFound, Success> >(q => q.ApprenticeshipId == apprenticeship.ApprenticeshipId);
        }
コード例 #2
0
        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, createdBy : User.ToUserInfo());

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

            var request = new HttpRequestMessage(HttpMethod.Post, $"/venues/{venue.VenueId}/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.VenueId}/delete-success?providerId={provider.ProviderId}");

            SqlQuerySpy.VerifyQuery <Core.DataStore.Sql.Queries.DeleteVenue, OneOf <NotFound, Success> >(q => q.VenueId == venue.VenueId);
        }
コード例 #3
0
        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())).ApprenticeshipId;

            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);

            if (expectApprenticeshipToBeMadeLive)
            {
                SqlQuerySpy.VerifyQuery <PublishApprenticeship, OneOf <NotFound, Success> >(
                    q => q.ApprenticeshipId == apprenticeshipId && q.PublishedBy.UserId == User.UserId && q.PublishedOn == Clock.UtcNow);
            }
        }
コード例 #4
0
        public async Task Post_ValidRequest_UpdatesDisplayNameSourceAndRedirects()
        {
            // Arrange
            var provider = await TestData.CreateProvider(
                providerName : "Provider name",
                alias : "Trading name");

            var content = new FormUrlEncodedContentBuilder()
                          .Add("DisplayNameSource", "TradingName")
                          .ToContent();

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

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

            // Assert
            Assert.Equal(HttpStatusCode.Found, response.StatusCode);
            Assert.Equal($"/providers?providerId={provider.ProviderId}", response.Headers.Location.OriginalString);

            SqlQuerySpy.VerifyQuery <SetProviderDisplayNameSource, OneOf <NotFound, Success> >(q =>
                                                                                               q.ProviderId == provider.ProviderId && q.DisplayNameSource == ProviderDisplayNameSource.TradingName);
        }
コード例 #5
0
        public async Task Post_ValidRequest_UpdatesDatabaseAndRedirects()
        {
            // Arrange
            var provider = await TestData.CreateProvider();

            var venueId = (await TestData.CreateVenue(provider.ProviderId, createdBy: User.ToUserInfo())).VenueId;

            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}");

            SqlQuerySpy.VerifyQuery <UpdateVenue, OneOf <NotFound, Success> >(q =>
                                                                              q.VenueId == venueId &&
                                                                              q.Name == "Updated name" &&
                                                                              q.Email == "*****@*****.**" &&
                                                                              q.Telephone == "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.UpdatedOn == Clock.UtcNow);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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"));
        }
コード例 #8
0
        public async Task Post_ValidRequest_DeletesCourseRunAndRedirects()
        {
            // Arrange
            var tLevelDefinitions = await TestData.CreateInitialTLevelDefinitions();

            var provider = await TestData.CreateProvider(
                providerType : ProviderType.TLevels,
                tLevelDefinitionIds : tLevelDefinitions.Select(tld => tld.TLevelDefinitionId).ToArray());

            var venueId = (await TestData.CreateVenue(provider.ProviderId, venueName: "T Level venue")).Id;

            var tLevelDefinition = tLevelDefinitions.First();

            var yourReference = "YOUR-REF";
            var startDate     = new DateTime(2021, 10, 1);

            var tLevel = await TestData.CreateTLevel(
                provider.ProviderId,
                tLevelDefinition.TLevelDefinitionId,
                locationVenueIds : new[] { venueId },
                yourReference : yourReference,
                startDate : startDate,
                createdBy : User.ToUserInfo());

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

            var request = new HttpRequestMessage(HttpMethod.Post, $"/t-levels/{tLevel.TLevelId}/delete")
            {
                Content = requestContent
            };

            CreateJourneyInstance(tLevel.TLevelId);

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

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

            response.Headers.Location.OriginalString.Should()
            .Be($"/t-levels/{tLevel.TLevelId}/delete/success?providerId={provider.ProviderId}");

            SqlQuerySpy.VerifyQuery <SqlQueries.DeleteTLevel, OneOf <NotFound, Success> >(q => q.TLevelId == tLevel.TLevelId);
        }
コード例 #9
0
        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"));
        }
コード例 #10
0
        public async Task Post_ValidRequest_DeletesCourseRunAndRedirects()
        {
            // Arrange
            var provider = await TestData.CreateProvider();

            var course = await TestData.CreateCourse(provider.ProviderId, createdBy : User.ToUserInfo());

            var courseRunId = course.CourseRuns.Single().CourseRunId;

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

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

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

            CreateJourneyInstance(course.CourseId, courseRunId);

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

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

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

            SqlQuerySpy.VerifyQuery <DeleteCourseRunQuery, OneOf <NotFound, Success> >(q =>
                                                                                       q.CourseId == course.CourseId &&
                                                                                       q.CourseRunId == courseRunId &&
                                                                                       q.DeletedBy.UserId == User.ToUserInfo().UserId&&
                                                                                       q.DeletedOn == Clock.UtcNow);
        }
コード例 #11
0
        public async Task Post_ValidRequest_AbandonsCourseUploadAndRedirects(UploadStatus uploadStatus)
        {
            // Arrange
            var provider = await TestData.CreateProvider();

            var(courseUpload, _) = await TestData.CreateCourseUpload(provider.ProviderId, createdBy : User.ToUserInfo(), uploadStatus);

            var request = new HttpRequestMessage(HttpMethod.Post, $"/data-upload/courses/delete?providerId={provider.ProviderId}")
            {
                Content = new FormUrlEncodedContentBuilder()
                          .Add("Confirm", "true")
                          .ToContent()
            };

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

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.Found);
            response.Headers.Location.OriginalString.Should().Be($"/data-upload/courses/resolve/delete/success?providerId={provider.ProviderId}");

            SqlQuerySpy.VerifyQuery <SetCourseUploadAbandoned, OneOf <NotFound, Success> >(
                q => q.CourseUploadId == courseUpload.CourseUploadId && q.AbandonedOn == Clock.UtcNow);
        }
コード例 #12
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());
        }
コード例 #13
0
        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();
        }
コード例 #14
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 provider        = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted);

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

            var adminUser = await TestData.CreateUser();

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

            var apprenticeshipId = (await TestData.CreateApprenticeship(provider.ProviderId,
                                                                        standard,
                                                                        createdBy: user,
                                                                        contactEmail: adminUser.Email,
                                                                        contactTelephone: contactTelephone,
                                                                        contactWebsite: contactWebsite,
                                                                        marketingInformation: marketingInfo,
                                                                        locations: new[]
            {
                CreateApprenticeshipLocation.CreateRegionalEmployerBased(regions)
            })).ApprenticeshipId;
            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.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={provider.ProviderId}&ffiid={mptxInstance.InstanceId}",
                requestContent);

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

            SqlQuerySpy.VerifyQuery <UpdateApprenticeship, OneOf <NotFound, Success> >(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.SubRegionIds.Contains("E06000001") &&
                                                                                                                     l.SubRegionIds.Contains("E10000009")));
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        public async Task Post_ValidRequest_UpdatesTLevelAndRedirects()
        {
            // 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 venue = await TestData.CreateVenue(provider.ProviderId, venueName : "T Level venue");

            var tLevelDefinition   = 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 tLevel = await TestData.CreateTLevel(
                provider.ProviderId,
                tLevelDefinition.TLevelDefinitionId,
                whoFor : whoFor,
                entryRequirements : entryRequirements,
                whatYoullLearn : whatYoullLearn,
                howYoullLearn : howYoullLearn,
                howYoullBeAssessed : howYoullBeAssessed,
                whatYouCanDoNext : whatYouCanDoNext,
                yourReference : yourReference,
                startDate : startDate,
                locationVenueIds : new[] { venue.Id },
                website : website,
                createdBy : User.ToUserInfo());

            var journeyInstance = await CreateJourneyInstance(tLevel.TLevelId);

            var request = new HttpRequestMessage(
                HttpMethod.Post,
                $"/t-levels/{tLevel.TLevelId}/check-publish?ffiid={journeyInstance.InstanceId.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/{tLevel.TLevelId}/success?ffiid={journeyInstance.InstanceId.UniqueKey}");

            SqlQuerySpy.VerifyQuery <UpdateTLevel, OneOf <NotFound, UpdateTLevelFailedReason, Success> >(q =>
                                                                                                         q.UpdatedBy.UserId == User.UserId &&
                                                                                                         q.UpdatedOn == Clock.UtcNow &&
                                                                                                         q.EntryRequirements == entryRequirements &&
                                                                                                         q.HowYoullBeAssessed == howYoullBeAssessed &&
                                                                                                         q.HowYoullLearn == howYoullLearn &&
                                                                                                         q.LocationVenueIds.Single() == venue.Id &&
                                                                                                         q.StartDate == startDate &&
                                                                                                         q.Website == website &&
                                                                                                         q.WhatYouCanDoNext == whatYouCanDoNext &&
                                                                                                         q.WhatYoullLearn == q.WhatYoullLearn &&
                                                                                                         q.WhoFor == whoFor &&
                                                                                                         q.YourReference == q.YourReference);
        }
コード例 #17
0
        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     = 42D;
            var longitude    = 43D;

            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();

            SqlQuerySpy.VerifyQuery <CreateVenue, Success>(q =>
                                                           q.ProviderId == provider.ProviderId &&
                                                           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 == Convert.ToDecimal(latitude) &&
                                                           q.Longitude == Convert.ToDecimal(longitude) &&
                                                           q.CreatedBy.UserId == User.UserId &&
                                                           q.CreatedOn == Clock.UtcNow);
        }