コード例 #1
0
        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);
        }
コード例 #2
0
        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"]);
        }
コード例 #3
0
        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());
        }
コード例 #6
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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))));
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
        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);
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        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);
        }
コード例 #18
0
        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);
        }
コード例 #19
0
        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);
        }
コード例 #20
0
        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);
        }
コード例 #21
0
        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");
            }
        }
コード例 #22
0
        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}");
        }
コード例 #23
0
        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);
        }
コード例 #24
0
        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));
        }
コード例 #25
0
        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}");
        }
コード例 #26
0
        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);
        }
コード例 #28
0
        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);
        }
コード例 #29
0
        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");
            }
        }
コード例 #30
0
        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}");
        }