public async Task Post_DuplicateName_RendersError()
        {
            // Arrange
            var provider = await TestData.CreateProvider();

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

            await TestData.CreateVenue(provider.ProviderId, venueName : "Venue B");

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("Name", "Venue B")
                                 .ToContent();

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

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

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

            var doc = await response.GetDocument();

            doc.AssertHasError("Name", "Location name must not already exist");
        }
        public async Task Post_ValidRequest_UpdatesFormFlowInstanceAndRedirects(string website)
        {
            // Arrange
            var providerId = await TestData.CreateProvider();

            var venueId = await TestData.CreateVenue(providerId);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("Website", website)
                                 .ToContent();

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

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

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.Found);
            response.Headers.Location.OriginalString.Should().Be($"/venues/{venueId}");

            var formFlowInstance = GetFormFlowInstance(venueId);

            formFlowInstance.State.Website.Should().Be(website);
        }
        public async Task Post_ValidRequestUpdatesFlowStateAndRedirects(
            ApprenticeshipLocationType locationType,
            string expectedRedirect)
        {
            // Arrange
            var provider = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted);

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

            var mptxInstance = CreateMptxInstance(new FlowModel());

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("LocationType", locationType.ToString())
                                 .ToContent();

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

            // Assert
            var state = GetMptxInstance <FlowModel>(mptxInstance.InstanceId).State;

            Assert.Equal(locationType, state.ApprenticeshipLocationType);

            Assert.Equal(HttpStatusCode.Found, response.StatusCode);
            Assert.StartsWith(expectedRedirect, response.Headers.Location.OriginalString);
        }
        public async Task DeleteVenue_Post_WithProviderContextProviderIdNotEqualToPostProviderId_ReturnsBadRequest()
        {
            // 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), Guid.NewGuid())
                                 .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.Status400BadRequest);
        }
        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());
        }
Example #6
0
        public async Task Post_ProviderUser_ReturnsForbidden()
        {
            // Arrange
            var provider = await TestData.CreateProvider(
                providerType : ProviderType.FE | ProviderType.Apprenticeships,
                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
            };

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

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

            // Assert
            Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
        }
        public async Task DeleteVenue_Post_WithMismatchedProvider_ReturnsForbidden(TestUserType userType)
        {
            // Arrange
            var provider1 = await TestData.CreateProvider(providerType : ProviderType.FE);

            var provider2 = await TestData.CreateProvider(providerType : ProviderType.FE);

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

            await User.AsTestUser(userType, provider2.ProviderId);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add(nameof(Command.Confirm), true)
                                 .Add(nameof(Command.ProviderId), provider1)
                                 .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.Status403Forbidden);
        }
Example #8
0
        public async Task Post_ValidRequest_UpdatesJourneyInstanceAndRedirects(string phoneNumber)
        {
            // Arrange
            var provider = await TestData.CreateProvider();

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

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("PhoneNumber", phoneNumber)
                                 .ToContent();

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

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

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.Found);
            response.Headers.Location.OriginalString.Should().Be($"/venues/{venueId}");

            var journeyInstance = GetJourneyInstance(venueId);

            journeyInstance.State.PhoneNumber.Should().Be(phoneNumber);
        }
Example #9
0
        public async Task Post_UserCannotAccessVenue_ReturnsForbidden(TestUserType userType)
        {
            // Arrange
            var provider = await TestData.CreateProvider();

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

            var anotherProvider = await TestData.CreateProvider();

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("PhoneNumber", "020 7946 0000")
                                 .ToContent();

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

            await User.AsTestUser(userType, anotherProvider.ProviderId);

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

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
        }
Example #10
0
        public async Task Post_NotConfirmed_ReturnsError()
        {
            // Arrange
            var providerId = await TestData.CreateProvider();

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

            var courseRunId = await GetCourseRunIdForCourse(courseId);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .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
            var doc = await response.GetDocument();

            doc.AssertHasError("Confirm", "Confirm you want to delete the course");
        }
Example #11
0
        public async Task Post_InvalidPhoneNumber_RendersError()
        {
            // Arrange
            var provider = await TestData.CreateProvider();

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

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("PhoneNumber", "xxx")
                                 .ToContent();

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

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

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

            var doc = await response.GetDocument();

            doc.AssertHasError("PhoneNumber", "Enter a telephone number in the correct format");
        }
Example #12
0
        public async Task Post_UserCannotAccessCourse_ReturnsForbidden(TestUserType userType)
        {
            // Arrange
            var anotherProviderId = await TestData.CreateProvider(ukprn : 23456);

            var providerId = await TestData.CreateProvider(ukprn : 12345);

            var courseId = await TestData.CreateCourse(providerId, 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.AsTestUser(userType, anotherProviderId);

            CreateFormFlowInstance(courseId, courseRunId);

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

            // Assert
            Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
        }
Example #13
0
        public async Task Post_CourseRunDoesNotExist_ReturnsNotFound()
        {
            // Arrange
            var providerId = await TestData.CreateProvider();

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

            var courseRunId = Guid.NewGuid();

            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.NotFound, response.StatusCode);
        }
Example #14
0
        public async Task Post_CourseDoesNotExist_ReturnsNotFound()
        {
            // Arrange
            var tLevelDefinitions = await TestData.CreateInitialTLevelDefinitions();

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

            var tLevelId = Guid.NewGuid();

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

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

            CreateJourneyInstance(tLevelId);

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

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.NotFound);
        }
        public async Task PostRemove_ModeNotEdit_ReturnsBadRequest()
        {
            // Arrange
            var provider = await TestData.CreateProvider(providerType : ProviderType.Apprenticeships);

            var parentMptxInstance = MptxManager.CreateInstance(new ParentFlow());
            var childMptxInstance  = MptxManager.CreateInstance <FlowModel, IFlowModelCallback>(
                parentMptxInstance.InstanceId,
                FlowModel.Add(provider.ProviderId, cancelable: true),
                new Dictionary <string, object>()
            {
                { "ReturnUrl", "callback" }
            });

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

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

            // Act
            var response = await HttpClient.PostAsync(
                $"apprenticeships/remove-classroom-location?ffiid={childMptxInstance.InstanceId}",
                requestContent);

            // Assert
            Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
        }
Example #16
0
        /// <summary>
        ///     单条发送
        ///     一次发送一条短信,常用于短信验证、找回密码、短信登录、监控报警
        /// </summary>
        /// <param name="sms"></param>
        /// <returns></returns>
        public async Task <SmsResult> Send(SingleSendSms sms)
        {
            const string apiUrl = "https://sms.yunpian.com/v2/sms/single_send.json";

            Check.NotNull(sms, nameof(sms));
            Check.NotNullOrWhiteSpace(sms.Mobile, nameof(sms.Mobile));
            Check.NotNullOrWhiteSpace(sms.Text, nameof(sms.Text));

            var content = new FormUrlEncodedContentBuilder
            {
                {
                    "apikey", _yunPianConfiguration.ApiKey
                },
                {
                    "mobile", sms.Mobile
                },
                {
                    "text", sms.Text
                }
            };

            ApplySendOption(content, sms.Option);

            return((await new ApiHttpClient().PostAsync <SendResultItem>(apiUrl, content)).ToSmsResult());
        }
        public async Task Post_MissingVenueId_RendersErrorMessage()
        {
            // Arrange
            var provider = await TestData.CreateProvider(providerType : ProviderType.Apprenticeships);

            var parentMptxInstance = MptxManager.CreateInstance(new ParentFlow());
            var childMptxInstance  = MptxManager.CreateInstance <FlowModel, IFlowModelCallback>(
                parentMptxInstance.InstanceId,
                FlowModel.Add(provider.ProviderId, cancelable: true),
                new Dictionary <string, object>()
            {
                { "ReturnUrl", "callback" }
            });

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

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("Radius", 15)
                                 .Add("DeliveryModes", ApprenticeshipDeliveryMode.DayRelease)
                                 .Add("DeliveryModes", ApprenticeshipDeliveryMode.BlockRelease)
                                 .ToContent();

            // Act
            var response = await HttpClient.PostAsync(
                $"/apprenticeships/classroom-location?ffiid={childMptxInstance.InstanceId}",
                requestContent);

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

            var doc = await response.GetDocument();

            doc.AssertHasError("VenueId", "Select the location");
        }
Example #18
0
        /// <summary>
        ///     批量发送不同内容
        ///     批量发送短信内容带变量的订单状态通知,活动信息群发
        /// </summary>
        /// <param name="sms"></param>
        /// <returns></returns>
        public async Task <SmsResult> Send(MultiSendSms sms)
        {
            const string apiUrl = "https://sms.yunpian.com/v2/sms/multi_send.json";

            Check.NotNull(sms, nameof(sms));
            Check.NotNullOrEmpty(sms.Mobile, nameof(sms.Mobile));
            Check.NotNullOrEmpty(sms.Text, nameof(sms.Text));

            var content = new FormUrlEncodedContentBuilder
            {
                {
                    "apikey", _yunPianConfiguration.ApiKey
                },
                {
                    "mobile", string.Join(",", sms.Mobile)
                },
                {
                    "text", string.Join(",", sms.Text)
                }
            };

            ApplySendOption(content, sms.Option);

            return(await new ApiHttpClient().PostAsync <SmsResult>(apiUrl, content));
        }
Example #19
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);
        }
        public async Task Post_InvalidWebsite_RendersError()
        {
            // Arrange
            var provider = await TestData.CreateProvider();

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

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("Website", ":bad/website")
                                 .ToContent();

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

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

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

            var doc = await response.GetDocument();

            doc.AssertHasErrorWithCode("Website", "VENUE_WEBSITE_FORMAT");
        }
        public async Task DeleteVenue_Post_WithConfirmNotTrue_ReturnsExpectedOutputWithError(bool?confirm)
        {
            // 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), confirm)
                                 .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.Status400BadRequest);

            var doc = await response.GetDocument();

            doc.GetElementByTestId("confirm-error-message").TextContent.Should().Be("Confirm you want to delete the location");
        }
Example #22
0
        public async Task Post_SubmissionOutcomeNotKnownReturnsBadRequest()
        {
            // Arrange
            var ukprn = 12345;

            var providerId = await TestData.CreateProvider(
                ukprn : ukprn,
                providerName : "Provider 1",
                apprenticeshipQAStatus : ApprenticeshipQAStatus.InProgress);

            var providerUserId = $"{ukprn}-user";
            await TestData.CreateUser(providerUserId, "*****@*****.**", "Provider 1", "Person", providerId);

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

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

            await TestData.CreateApprenticeshipQASubmission(
                providerId,
                submittedOn : Clock.UtcNow,
                submittedByUserId : providerUserId,
                providerMarketingInformation : "The overview",
                apprenticeshipIds : new[] { apprenticeshipId });

            await User.AsHelpdesk();

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

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

            // Assert
            Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
        }
        public async Task DeleteVenue_Post_WithExistingCourse_RendersExpectedOutputWithErrorMessageAndDeleteDisabled()
        {
            // Arrange
            var provider = await TestData.CreateProvider(
                providerType : ProviderType.FE);

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

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

            var courseId = await TestData.CreateCourse(provider.ProviderId, User.ToUserInfo(), configureCourseRuns : builder =>
                                                       builder.WithCourseRun(CourseDeliveryMode.ClassroomBased, CourseStudyMode.FullTime, CourseAttendancePattern.Daytime, venueId: venue.Id));

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

            var doc = await response.GetDocument();

            Assert.Null(doc.GetElementByTestId("delete-location-button"));
            Assert.NotNull(doc.GetElementByTestId($"affected-course-{courseId}"));
            doc.GetElementByTestId("affected-courses-error-message").TextContent.Should().Be("The affected courses have changed");
        }
        public async Task Post_NotApprenticeshipProviderReturnsForbidden()
        {
            // Arrange
            var provider = await TestData.CreateProvider(
                apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted,
                providerType : ProviderType.FE);

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

            var flowModel = new FlowModel();

            flowModel.SetApprenticeshipLocationType(ApprenticeshipLocationType.EmployerBased);
            flowModel.SetApprenticeshipIsNational(false);
            var mptxInstance = CreateMptxInstance(flowModel);

            var regions = await RegionCache.GetAllRegions();

            var subRegion1Id = regions.First().SubRegions.First().Id;
            var subRegion2Id = regions.Skip(1).First().SubRegions.First().Id;

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("RegionIds", subRegion1Id)
                                 .Add("RegionIds", subRegion2Id)
                                 .ToContent();

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

            // Assert
            Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode);
        }
        public async Task Post_InvalidWebsite_RendersError()
        {
            // Arrange
            var providerId = await TestData.CreateProvider();

            var venueId = await TestData.CreateVenue(providerId);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("Website", ":bad/website")
                                 .ToContent();

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

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

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

            var doc = await response.GetDocument();

            doc.AssertHasError("Website", "Enter a website in the correct format");
        }
        public async Task Post_InvalidRegionIdRendersError()
        {
            // Arrange
            var provider = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted);

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

            var flowModel = new FlowModel();

            flowModel.SetApprenticeshipLocationType(ApprenticeshipLocationType.EmployerBased);
            flowModel.SetApprenticeshipIsNational(false);
            var mptxInstance = CreateMptxInstance(flowModel);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("RegionIds", "bad-region-id")
                                 .ToContent();

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

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

            var doc = await response.GetDocument();

            var errorSummary = doc.GetElementsByClassName("govuk-error-summary__list").First();

            Assert.Contains(
                errorSummary.GetElementsByTagName("a"),
                e => e.TextContent.Trim() == "Select at least one sub-region");
        }
        public async Task Post_UserCannotAccessVenue_ReturnsForbidden(TestUserType userType)
        {
            // Arrange
            var providerId = await TestData.CreateProvider(ukprn : 12345);

            var venueId = await TestData.CreateVenue(providerId);

            var anotherProviderId = await TestData.CreateProvider(ukprn : 67890);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("Website", "new-provider.com")
                                 .ToContent();

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

            await User.AsTestUser(userType, anotherProviderId);

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

            // Assert
            response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
        }
        public async Task Post_RegionIdSpecifiedStoresExpandedSubRegionsInState()
        {
            // Arrange
            var provider = await TestData.CreateProvider(apprenticeshipQAStatus : ApprenticeshipQAStatus.NotStarted);

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

            var flowModel = new FlowModel();

            flowModel.SetApprenticeshipLocationType(ApprenticeshipLocationType.EmployerBased);
            flowModel.SetApprenticeshipIsNational(false);
            var mptxInstance = CreateMptxInstance(flowModel);

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("RegionIds", "E12000001")
                                 .ToContent();

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

            // Assert
            var regions = await RegionCache.GetAllRegions();

            var region = regions.Single(r => r.Id == "E12000001");
            var state  = GetMptxInstance <FlowModel>(mptxInstance.InstanceId).State;

            Assert.All(region.SubRegions, sr => state.ApprenticeshipLocationSubRegionIds.Contains(sr.Id));
        }
        public async Task Date(string day, string month, string year, string expectedErrorMessage)
        {
            // Arrange
            var content = new FormUrlEncodedContentBuilder()
                          .Add("DateOfBirth.Day", day)
                          .Add("DateOfBirth.Month", month)
                          .Add("DateOfBirth.Year", year)
                          .ToContent();

            var request = new HttpRequestMessage(HttpMethod.Post, "ValidatorBaseTests")
            {
                Content = content
            };

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

            // Assert
            response.EnsureSuccessStatusCode();

            var json   = JObject.Parse(await response.Content.ReadAsStringAsync());
            var errors = (JArray)json["errors"];
            var error  = Assert.Single(errors);

            Assert.Equal("DateOfBirth", error.SelectToken("propertyName").ToString());
            Assert.Equal(expectedErrorMessage, error.SelectToken("errorMessage").ToString());
        }
        public async Task Post_NameTooLong_RendersError()
        {
            // Arrange
            var provider = await TestData.CreateProvider();

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

            var requestContent = new FormUrlEncodedContentBuilder()
                                 .Add("Name", new string('x', 251)) // limit is 250
                                 .ToContent();

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

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

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

            var doc = await response.GetDocument();

            doc.AssertHasError("Name", "Location name must be 250 characters or fewer");
        }