private async Task CourseDescription_NavigateToAddWithoutSelectingFromSearchResultsScreen_ReturnsError() { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); var request = new HttpRequestMessage(HttpMethod.Post, $"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("WhoThisCourseIsFor", "f") .Add("EntryRequirements", "") .Add("WhatYouWillLearn", "") .Add("HowYouWillLearn", "") .Add("WhatYouWillNeedToBring", "") .Add("HowYouWillBeAssessed", "") .Add("WhereNext", "") .ToContent() }; // Act var response = await HttpClient.SendAsync(request); // Assert response.StatusCode.Should().Be(HttpStatusCode.BadRequest); }
public async Task InstanceContextWithParent_BindsSuccessfully() { // Arrange var parentInstance = MptxManager.CreateInstance( new MptxInstanceContextModelBinderTestsFlowState() { Foo = 42 }); var instance = MptxManager.CreateInstance( parentInstance, new MptxInstanceContextModelBinderTestsChildFlowState() { Bar = 69 }); // Act var response = await HttpClient.GetAsync( $"MptxInstanceContextModelBinderTests/child?ffiid={instance.InstanceId}"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); var contentJson = JObject.Parse(content); Assert.Equal(42, contentJson["foo"]); Assert.Equal(69, contentJson["bar"]); }
private async Task CourseDescription_ValidPost_ReturnsRedirect() { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); var get1 = await HttpClient.GetAsync( $"/courses/course-selected?ffiid={mpx.InstanceId}&LearnAimRef=00238422"); var request = new HttpRequestMessage(HttpMethod.Post, $"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("WhoThisCourseIsFor", "fffffff") .Add("EntryRequirements", "") .Add("WhatYouWillLearn", "") .Add("HowYouWillLearn", "") .Add("WhatYouWillNeedToBring", "") .Add("HowYouWillBeAssessed", "") .Add("WhereNext", "") .ToContent() }; // Act var response = await HttpClient.SendAsync(request); // Assert response.StatusCode.Should().Be(HttpStatusCode.Redirect); }
public async Task <IActionResult> ClassroomLocation( ClassroomLocation.Command command, [FromForm(Name = "Action")] string action, [FromServices] MptxInstanceContext <ClassroomLocation.FlowModel, ClassroomLocation.IFlowModelCallback> flow, [FromServices] MptxManager mptxManager) { return(await _mediator.SendAndMapResponse( command, response => response.Match <IActionResult>( errors => this.ViewFromErrors(errors).WithViewData("CompletionUrl", flow.Items["ReturnUrl"]), success => { if (action == "AddAnother") { // Create a sibling flow to this one var addAnotherInstance = mptxManager.CreateInstance <ClassroomLocation.FlowModel, ClassroomLocation.IFlowModelCallback>( flow.ParentInstanceId, Apprenticeships.ClassroomLocation.FlowModel.Add(flow.State.ProviderId, cancelable: true), flow.Items); return RedirectToAction(nameof(ClassroomLocation)) .WithMptxInstanceId(addAnotherInstance); } else { return Redirect(flow.Items["ReturnUrl"].ToString()); } }))); }
public async Task Get_ValidRequest_RendersExpectedOutput() { // Arrange var provider = await TestData.CreateProvider(providerType : ProviderType.Apprenticeships); await TestData.CreateVenue(provider.ProviderId, venueName : "Venue 1"); await TestData.CreateVenue(provider.ProviderId, venueName : "Venue 2"); 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); // Act var response = await HttpClient.GetAsync( $"/apprenticeships/classroom-location?ffiid={childMptxInstance.InstanceId}"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var doc = await response.GetDocument(); var venues = doc.GetElementById("VenueId").GetElementsByTagName("option"); Assert.Equal(3, venues.Length); Assert.Equal("Venue 1", venues[1].TextContent.Trim()); Assert.Equal("Venue 2", venues[2].TextContent.Trim()); }
private async Task CourseDescription_WhoThisCourseIsForTooLargeText_ReturnsError() { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); var get1 = await HttpClient.GetAsync( $"/courses/course-selected?ffiid={mpx.InstanceId}&LearnAimRef=00238422"); var request = new HttpRequestMessage(HttpMethod.Post, $"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("WhoThisCourseIsFor", "dfdfddfdfddfdfddfdfddfdfddfdfddfdfdddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfdfddfdfddfdfdfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfddfdfd") .Add("EntryRequirements", "") .Add("WhatYouWillLearn", "") .Add("HowYouWillLearn", "") .Add("WhatYouWillNeedToBring", "") .Add("HowYouWillBeAssessed", "") .Add("WhereNext", "") .ToContent() }; // Act var response = await HttpClient.SendAsync(request); // Assert var doc = await response.GetDocument(); doc.AssertHasError("WhoThisCourseIsFor", "Who this course is for must be 2000 characters or fewer"); }
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"); }
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); }
public async Task GetRemove_ValidRequest_ReturnsExpectedContent() { // Arrange var provider = await TestData.CreateProvider(providerType : ProviderType.Apprenticeships); var venueId = (await TestData.CreateVenue(provider.ProviderId, venueName: "The Venue")).Id; var parentMptxInstance = MptxManager.CreateInstance(new ParentFlow()); var childMptxInstance = MptxManager.CreateInstance <FlowModel, IFlowModelCallback>( parentMptxInstance.InstanceId, FlowModel.Edit( provider.ProviderId, venueId, radius: 5, new[] { ApprenticeshipDeliveryMode.BlockRelease }), new Dictionary <string, object>() { { "ReturnUrl", "callback" } }); await User.AsProviderUser(provider.ProviderId, ProviderType.Apprenticeships); // Act var response = await HttpClient.GetAsync( $"apprenticeships/remove-classroom-location?ffiid={childMptxInstance.InstanceId}"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var doc = await response.GetDocument(); Assert.Equal("The Venue", doc.GetElementsByTagName("h2").First().TextContent); }
public async Task IncorrectStateTypeParameter_ReturnsBadRequest() { // Arrange var instance = MptxManager.CreateInstance(new MptxControllerActionFilterTestsDifferentFlowState()); // Act var response = await HttpClient.GetAsync( $"MptxControllerActionFilterTests?ffiid={instance.InstanceId}"); // Assert Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); }
public async Task <IActionResult> Search(SearchQuery query, [FromServices] MptxManager mptxManager) { Flow = mptxManager.CreateInstance(new FlowModel()); var returnUrl = new Url(Url.Action(nameof(CourseSelected))) .WithMptxInstanceId(Flow.InstanceId) .WithProviderContext(_providerContext); ViewData["ReturnUrl"] = returnUrl.ToString(); return(await _mediator.SendAndMapResponse(query, response => response.Match <IActionResult>( errors => this.ViewFromErrors(nameof(ChooseQualification), errors), success => View("ChooseQualification", success)))); }
private async Task ChooseQualification_SelectCourseNavigatesToAddCourseDescription() { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); // Act var response = await HttpClient.GetAsync( $"/courses/course-selected?ffiid={mpx.InstanceId}&LearnAimRef=00238422"); // Assert Assert.Equal($"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}", response.Headers.Location.OriginalString); }
public async Task InstanceIdInRequest_ChoosesActionWithMptxActionAttribute() { // Arrange var instance = MptxManager.CreateInstance(new ActionResolutionTestsFlowState()); // Act var response = await HttpClient.GetAsync($"ActionResolutionTests?ffiid={instance.InstanceId}"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("Get", content); }
public async Task IncorrectStateTypeParameter_ReturnsBadRequest() { // Arrange var instance = MptxManager.CreateInstance(new MptxInstanceContextModelBinderTestsFlowState() { Foo = 42 }); // Act var response = await HttpClient.GetAsync( $"MptxInstanceContextModelBinderTests/wrong-state-type?ffiid={instance.InstanceId}"); // Assert Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); }
public async Task ActionDecoratedWithMptxActionAttributeAndValidInstanceSpecified_AssignsMptxInstanceContextFeature() { // Arrange var instance = MptxManager.CreateInstance(new MptxResourceFilterTestsFlowState()); // Act var response = await HttpClient.GetAsync($"MptxResourceFilterTests?ffiid={instance.InstanceId}"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal(instance.InstanceId, content); }
private async Task Get_CourseRunWithoutMptxId_ReturnsError() { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); // Act var get = await HttpClient.GetAsync( $"/courses/add-courserun?deliveryMode=classroom&providerId={provider.ProviderId}"); // Assert get.StatusCode.Should().Be(HttpStatusCode.NotFound); }
public void CreateInstance_CreatesNewStateForTypeNotInServices() { // Arrange var stateProvider = new InMemoryMptxStateProvider(); var services = new ServiceCollection(); var serviceProvider = services.BuildServiceProvider(); var instanceContextFactory = new MptxInstanceContextFactory(stateProvider); var manager = new MptxManager(stateProvider, instanceContextFactory, serviceProvider); // Act var instance = manager.CreateInstance(typeof(FlowModel), contextItems: null); // Assert Assert.IsType <FlowModel>(instance.State); }
public void CreateInstance_StateTypeDoesNotInheritFromIMptxStateThrowsInvalidOperationException() { // Arrange var stateProvider = new InMemoryMptxStateProvider(); var services = new ServiceCollection(); var serviceProvider = services.BuildServiceProvider(); var instanceContextFactory = new MptxInstanceContextFactory(stateProvider); var manager = new MptxManager(stateProvider, instanceContextFactory, serviceProvider); // Act & Assert var ex = Assert.Throws <ArgumentException>( () => manager.CreateInstance(typeof(BadFlowModel), contextItems: null)); Assert.Equal($"State type must implement {typeof(IMptxState).FullName}. (Parameter 'stateType')", ex.Message); }
public async Task HaveInstance_SetsFlowProperty() { // Arrange var instance = MptxManager.CreateInstance(new MptxControllerActionFilterTestsFlowState() { Foo = 42 }); // Act var response = await HttpClient.GetAsync( $"MptxControllerActionFilterTests?ffiid={instance.InstanceId}"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("42", content); }
public async Task InstanceContextForDerivedType_BindsSuccessfully() { // Arrange var instance = MptxManager.CreateInstance(new MptxInstanceContextModelBinderTestsFlowState() { Foo = 42 }); // Act var response = await HttpClient.GetAsync( $"MptxInstanceContextModelBinderTests/derived?ffiid={instance.InstanceId}"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var content = await response.Content.ReadAsStringAsync(); Assert.Equal("42", content); }
private async Task CourseDescription_NavigatingBackToPage_RetainsInformation() { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); var get1 = await HttpClient.GetAsync( $"/courses/course-selected?ffiid={mpx.InstanceId}&LearnAimRef=00238422"); var request = new HttpRequestMessage(HttpMethod.Post, $"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("WhoThisCourseIsFor", "WhoThisCourseIsFor text") .Add("EntryRequirements", "EntryRequirements text") .Add("WhatYouWillLearn", "WhatYouWillLearn sometext") .Add("HowYouWillLearn", "HowYouWillLearn this text") .Add("WhatYouWillNeedToBring", "WhatYouWillNeedToBring that text") .Add("HowYouWillBeAssessed", "HowYouWillBeAssessed this text") .Add("WhereNext", "somewhere") .ToContent() }; await HttpClient.SendAsync(request); // Act var getResponse = await HttpClient.GetAsync($"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}"); var doc = await getResponse.GetDocument(); // Assert using (new AssertionScope()) { doc.GetElementById("WhoThisCourseIsFor").TextContent.Should().Be("WhoThisCourseIsFor text"); doc.GetElementById("EntryRequirements").TextContent.Should().Be("EntryRequirements text"); doc.GetElementById("WhatYouWillLearn").TextContent.Should().Be("WhatYouWillLearn sometext"); doc.GetElementById("HowYouWillLearn").TextContent.Should().Be("HowYouWillLearn this text"); doc.GetElementById("WhatYouWillNeedToBring").TextContent.Should().Be("WhatYouWillNeedToBring that text"); doc.GetElementById("HowYouWillBeAssessed").TextContent.Should().Be("HowYouWillBeAssessed this text"); doc.GetElementById("WhereNext").TextContent.Should().Be("somewhere"); } }
private async Task Post_SelectDeliveryMode_RedirectsToCourseRun(CourseDeliveryMode deliveryMode) { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); var deliverystr = DeliveryModeToString(deliveryMode); var get1 = await HttpClient.GetAsync( $"/courses/course-selected?ffiid={mpx.InstanceId}&LearnAimRef=00238422"); var request = new HttpRequestMessage(HttpMethod.Post, $"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("WhoThisCourseIsFor", "Some Details") .Add("EntryRequirements", "") .Add("WhatYouWillLearn", "") .Add("HowYouWillLearn", "") .Add("WhatYouWillNeedToBring", "") .Add("HowYouWillBeAssessed", "") .Add("WhereNext", "") .ToContent() }; await HttpClient.SendAsync(request); // Act var postDeliveryRequest = new HttpRequestMessage(HttpMethod.Post, $"/courses/add/delivery?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("DeliveryMode", deliveryMode) .ToContent() }; var postDeliveryResponse = await HttpClient.SendAsync(postDeliveryRequest); // Assert postDeliveryResponse.StatusCode.Should().Be(HttpStatusCode.Redirect); postDeliveryResponse.Headers.Location.Should().Be($"/courses/add-courserun?deliveryMode={deliverystr}&ffiid={mpx.InstanceId}&providerId={provider.ProviderId}"); }
public void CreateInstance_CreatesNewStateWithDependencies() { // Arrange var stateProvider = new InMemoryMptxStateProvider(); var services = new ServiceCollection(); services.AddSingleton <Dependency>(); var serviceProvider = services.BuildServiceProvider(); var instanceContextFactory = new MptxInstanceContextFactory(stateProvider); var manager = new MptxManager(stateProvider, instanceContextFactory, serviceProvider); // Act var instance = manager.CreateInstance(typeof(FlowModelWithDI), contextItems: null); // Assert Assert.IsType <FlowModelWithDI>(instance.State); }
public IActionResult AddApprenticeshipClassroomLocation([FromServices] MptxManager mptxManager) { var childFlow = mptxManager.CreateInstance <ClassroomLocation.FlowModel, ClassroomLocation.IFlowModelCallback>( Flow.InstanceId, ClassroomLocation.FlowModel.Add( _providerContext.ProviderInfo.ProviderId, cancelable: (Flow.State.ApprenticeshipClassroomLocations?.Count ?? 0) > 0), contextItems: new Dictionary <string, object>() { { "ReturnUrl", new Url(Url.Action(nameof(ApprenticeshipSummary))) .WithMptxInstanceId(Flow.InstanceId) .WithProviderContext(_providerContext) } }); return(RedirectToAction("ClassroomLocation", "Apprenticeships") .WithMptxInstanceId(childFlow.InstanceId)); }
private async Task Get_CancelLinkNavigatesToCourseDescription_ReturnsError() { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); var get1 = await HttpClient.GetAsync( $"/courses/course-selected?ffiid={mpx.InstanceId}&LearnAimRef=00238422"); var request = new HttpRequestMessage(HttpMethod.Post, $"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("WhoThisCourseIsFor", "Some Details") .Add("EntryRequirements", "") .Add("WhatYouWillLearn", "") .Add("HowYouWillLearn", "") .Add("WhatYouWillNeedToBring", "") .Add("HowYouWillBeAssessed", "") .Add("WhereNext", "") .ToContent() }; await HttpClient.SendAsync(request); // Act var postDeliveryRequest = new HttpRequestMessage(HttpMethod.Post, $"/courses/add/delivery?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .ToContent() }; var postDeliveryResponse = await HttpClient.SendAsync(postDeliveryRequest); // Assert var doc = await postDeliveryResponse.GetDocument(); var btn = doc.GetElementByTestId("CancelButton"); btn.Attributes["href"].Value.Should().Be($"/courses/add?providerId={provider.ProviderId}&ffiid={mpx.InstanceId}"); }
private async Task Post_SelectDeliveryModeNoSelection_ReturnsError() { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); var get1 = await HttpClient.GetAsync( $"/courses/course-selected?ffiid={mpx.InstanceId}&LearnAimRef=00238422"); var request = new HttpRequestMessage(HttpMethod.Post, $"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("WhoThisCourseIsFor", "Some Details") .Add("EntryRequirements", "") .Add("WhatYouWillLearn", "") .Add("HowYouWillLearn", "") .Add("WhatYouWillNeedToBring", "") .Add("HowYouWillBeAssessed", "") .Add("WhereNext", "") .ToContent() }; await HttpClient.SendAsync(request); // Act var postDeliveryRequest = new HttpRequestMessage(HttpMethod.Post, $"/courses/add/delivery?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .ToContent() }; var postDeliveryResponse = await HttpClient.SendAsync(postDeliveryRequest); // Assert postDeliveryResponse.StatusCode.Should().Be(HttpStatusCode.BadRequest); var doc = await postDeliveryResponse.GetDocument(); doc.AssertHasError("DeliveryMode", "Select how the course will be delivered"); }
public async Task Post_ValidRequest_UpdatesParentStateAndRedirects() { // Arrange var provider = await TestData.CreateProvider(providerType : ProviderType.Apprenticeships); var venueId = (await TestData.CreateVenue(provider.ProviderId)).Id; 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("VenueId", venueId) .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.Found, response.StatusCode); Assert.Equal("callback", response.Headers.Location.OriginalString); Assert.Equal(venueId, parentMptxInstance.State.VenueId); Assert.Equal(15, parentMptxInstance.State.Radius); Assert.Contains(ApprenticeshipDeliveryMode.BlockRelease, parentMptxInstance.State.DeliveryModes); Assert.Contains(ApprenticeshipDeliveryMode.DayRelease, parentMptxInstance.State.DeliveryModes); }
public async Task PostRemove_ValidRequest_UpdatesParentStateAndRedirects() { // Arrange var providerId = await TestData.CreateProvider(providerType : ProviderType.Apprenticeships); var venueId = await TestData.CreateVenue(providerId); var parentMptxInstance = MptxManager.CreateInstance(new ParentFlow()); var childMptxInstance = MptxManager.CreateInstance <FlowModel, IFlowModelCallback>( parentMptxInstance.InstanceId, FlowModel.Edit( providerId, venueId, radius: 5, new[] { ApprenticeshipDeliveryMode.BlockRelease }), new Dictionary <string, object>() { { "ReturnUrl", "callback" } }); await User.AsProviderUser(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.Found, response.StatusCode); Assert.Equal("callback", response.Headers.Location.OriginalString); Assert.Null(parentMptxInstance.State.VenueId); Assert.Null(parentMptxInstance.State.Radius); Assert.Null(parentMptxInstance.State.DeliveryModes); }
private async Task Post_InvalidCourseWebpage_ReturnsError(CourseDeliveryMode deliveryMode) { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); await HttpClient.GetAsync( $"/courses/course-selected?ffiid={mpx.InstanceId}&LearnAimRef=00238422"); var request = new HttpRequestMessage(HttpMethod.Post, $"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("WhoThisCourseIsFor", "Some Details") .Add("EntryRequirements", "") .Add("WhatYouWillLearn", "") .Add("HowYouWillLearn", "") .Add("WhatYouWillNeedToBring", "") .Add("HowYouWillBeAssessed", "") .Add("WhereNext", "") .ToContent() }; await HttpClient.SendAsync(request); var postDeliveryRequest = new HttpRequestMessage(HttpMethod.Post, $"/courses/add/delivery?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("DeliveryMode", CourseDeliveryMode.ClassroomBased) .ToContent() }; await HttpClient.SendAsync(postDeliveryRequest); // Act var postCourseRun = new HttpRequestMessage(HttpMethod.Post, $"/courses/add-courserun?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("DeliveryMode", deliveryMode) .Add("CourseName", "Some Details") .Add("ProviderCourseRef", "someEf") .Add("StartDate", "") .Add("FlexibleStartDate", "true") .Add("NationalDelivery", "") .Add("SubRegionIds", "") .Add("CourseWebPage", "someInvalid-com") .Add("Cost", "1000") .Add("CostDescription", "") .Add("Duration", "12") .Add("DurationUnit", "") .Add("StudyMode", "") .Add("AttendancePattern", "") .Add("VenueId", "") .ToContent() }; var postCourseRunResponse = await HttpClient.SendAsync(postCourseRun); // Assert postCourseRunResponse.StatusCode.Should().Be(HttpStatusCode.BadRequest); var doc = await postCourseRunResponse.GetDocument(); using (new AssertionScope()) { doc.AssertHasError("CourseWebPage", "Course webpage must be a real website"); } }
private async Task Post_WorkbasedCourseRunWithRegionsIsValid_ReturnsRedirectToCheckAndPublish() { // Arrange var provider = await TestData.CreateProvider(); var mpx = MptxManager.CreateInstance(new FlowModel()); await User.AsTestUser(TestUserType.ProviderSuperUser, provider.ProviderId); await HttpClient.GetAsync( $"/courses/course-selected?ffiid={mpx.InstanceId}&LearnAimRef=00238422"); var request = new HttpRequestMessage(HttpMethod.Post, $"/courses/add?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("WhoThisCourseIsFor", "Some Details") .Add("EntryRequirements", "") .Add("WhatYouWillLearn", "") .Add("HowYouWillLearn", "") .Add("WhatYouWillNeedToBring", "") .Add("HowYouWillBeAssessed", "") .Add("WhereNext", "") .ToContent() }; await HttpClient.SendAsync(request); var postDeliveryRequest = new HttpRequestMessage(HttpMethod.Post, $"/courses/add/delivery?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("DeliveryMode", CourseDeliveryMode.WorkBased) .ToContent() }; await HttpClient.SendAsync(postDeliveryRequest); // Act var postCourseRun = new HttpRequestMessage(HttpMethod.Post, $"/courses/add-courserun?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}") { Content = new FormUrlEncodedContentBuilder() .Add("DeliveryMode", CourseDeliveryMode.WorkBased) .Add("CourseName", "Some Details") .Add("ProviderCourseRef", "someEf") .Add("StartDate", "") .Add("FlexibleStartDate", "true") .Add("NationalDelivery", "false") .Add("SubRegionIds", new string[] { "E06000015" }) .Add("CourseWebPage", "") .Add("Cost", "1000") .Add("CostDescription", "") .Add("Duration", "12") .Add("DurationUnit", CourseDurationUnit.Years) .Add("StudyMode", "") .Add("AttendancePattern", "") .Add("VenueId", "") .ToContent() }; var postCourseRunResponse = await HttpClient.SendAsync(postCourseRun); // Assert postCourseRunResponse.StatusCode.Should().Be(HttpStatusCode.Redirect); postCourseRunResponse.Headers.Location.Should().Be($"/courses/add/check-and-publish?ffiid={mpx.InstanceId}&providerId={provider.ProviderId}"); }