From e7da79f49193cf723b05992f23f26e14cf5311e4 Mon Sep 17 00:00:00 2001 From: Kevin Joy Date: Mon, 20 Jan 2025 09:16:46 +0000 Subject: [PATCH] Updated get a trn journey --- .../AuthorizeAccessLinkGenerator.cs | 26 +- .../Pages/RequestTrn/Address.cshtml.cs | 2 +- .../Pages/RequestTrn/CheckAnswers.cshtml | 75 ++- .../Pages/RequestTrn/CheckAnswers.cshtml.cs | 35 +- .../Pages/RequestTrn/DateOfBirth.cshtml | 2 +- .../Pages/RequestTrn/DateOfBirth.cshtml.cs | 2 + .../Pages/RequestTrn/EmailInUse.cshtml | 2 +- .../Pages/RequestTrn/EmailInUse.cshtml.cs | 4 +- .../Pages/RequestTrn/Identity.cshtml | 9 +- .../Pages/RequestTrn/Index.cshtml | 17 +- .../Pages/RequestTrn/Name.cshtml | 2 +- .../Pages/RequestTrn/Name.cshtml.cs | 10 +- .../Pages/RequestTrn/NotEligible.cshtml | 4 +- .../Pages/RequestTrn/NotEligible.cshtml.cs | 4 +- .../Pages/RequestTrn/NpqApplication.cshtml | 36 ++ .../Pages/RequestTrn/NpqApplication.cshtml.cs | 41 ++ .../Pages/RequestTrn/NpqCheck.cshtml | 6 +- .../Pages/RequestTrn/NpqCheck.cshtml.cs | 16 +- .../{Email.cshtml => NpqName.cshtml} | 10 +- .../Pages/RequestTrn/NpqName.cshtml.cs | 43 ++ .../RequestTrn/NpqTrainingProvider.cshtml | 22 + .../RequestTrn/NpqTrainingProvider.cshtml.cs | 43 ++ .../Pages/RequestTrn/PersonalEmail.cshtml | 22 + ...mail.cshtml.cs => PersonalEmail.cshtml.cs} | 14 +- .../RequestTrn/RequestTrnJourneyState.cs | 10 +- .../SchoolOrEducationalSetting.cshtml | 25 + .../SchoolOrEducationalSetting.cshtml.cs | 32 ++ .../Pages/RequestTrn/TakingNpq.cshtml | 26 + .../Pages/RequestTrn/TakingNpq.cshtml.cs | 32 ++ .../Pages/RequestTrn/WorkEmail.cshtml | 22 + .../Pages/RequestTrn/WorkEmail.cshtml.cs | 41 ++ .../HostFixture.cs | 2 + .../RequestTrnTests.cs | 173 +++++- .../PageTests/RequestTrn/AddressTests.cs | 10 +- .../PageTests/RequestTrn/CheckAnswersTests.cs | 508 ++++++++++++++++-- .../PageTests/RequestTrn/DateOfBirthTests.cs | 8 +- .../PageTests/RequestTrn/EmailInUseTests.cs | 6 +- .../PageTests/RequestTrn/IdentityTests.cs | 8 +- .../PageTests/RequestTrn/NameTests.cs | 61 ++- .../NationalInsuranceNumberTests.cs | 10 +- .../PageTests/RequestTrn/NotEligibleTests.cs | 11 +- .../RequestTrn/NpqApplicationTests.cs | 87 +++ .../PageTests/RequestTrn/NpqCheckTests.cs | 72 ++- .../PageTests/RequestTrn/NpqNameTests.cs | 87 +++ .../PageTests/RequestTrn/NpqProviderTests.cs | 87 +++ .../{EmailTests.cs => PersonalEmailTests.cs} | 84 ++- .../PageTests/RequestTrn/PreviousNameTests.cs | 8 +- .../SchoolOrEducationalSettingTests.cs | 87 +++ .../PageTests/RequestTrn/TakingNpqTests.cs | 82 +++ .../PageTests/RequestTrn/TestBase.cs | 2 +- .../PageTests/RequestTrn/WorkEmailTests.cs | 131 +++++ 51 files changed, 1890 insertions(+), 269 deletions(-) create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqApplication.cshtml create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqApplication.cshtml.cs rename TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/{Email.cshtml => NpqName.cshtml} (59%) create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqName.cshtml.cs create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqTrainingProvider.cshtml create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqTrainingProvider.cshtml.cs create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/PersonalEmail.cshtml rename TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/{Email.cshtml.cs => PersonalEmail.cshtml.cs} (74%) create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/SchoolOrEducationalSetting.cshtml create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/SchoolOrEducationalSetting.cshtml.cs create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/TakingNpq.cshtml create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/TakingNpq.cshtml.cs create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/WorkEmail.cshtml create mode 100644 TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/WorkEmail.cshtml.cs create mode 100644 TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqApplicationTests.cs create mode 100644 TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqNameTests.cs create mode 100644 TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqProviderTests.cs rename TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/{EmailTests.cs => PersonalEmailTests.cs} (68%) create mode 100644 TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/SchoolOrEducationalSettingTests.cs create mode 100644 TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/TakingNpqTests.cs create mode 100644 TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/WorkEmailTests.cs diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/AuthorizeAccessLinkGenerator.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/AuthorizeAccessLinkGenerator.cs index d8d533501..ff262fd3e 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/AuthorizeAccessLinkGenerator.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/AuthorizeAccessLinkGenerator.cs @@ -35,17 +35,32 @@ public string NotFound(JourneyInstanceId journeyInstanceId) => public string SignOut(JourneyInstanceId journeyInstanceId) => GetRequiredPathByPage("/SignOut", journeyInstanceId: journeyInstanceId); - public string RequestTrn(JourneyInstanceId journeyInstanceId) => - GetRequiredPathByPage("/RequestTrn/Index", journeyInstanceId: journeyInstanceId); + public string RequestTrn(JourneyInstanceId journeyInstanceId, string? AccessToken = null) => + GetRequiredPathByPage("/RequestTrn/Index", routeValues: new { AccessToken }, journeyInstanceId: journeyInstanceId); + + public string TakingNpqRequireTrn(JourneyInstanceId journeyInstanceId) => + GetRequiredPathByPage("/RequestTrn/TakingNpq", journeyInstanceId: journeyInstanceId); public string RequestTrnNpqCheck(JourneyInstanceId journeyInstanceId) => GetRequiredPathByPage("/RequestTrn/NpqCheck", journeyInstanceId: journeyInstanceId); + public string RequestTrnWorkingInSchoolOrEducationalSetting(JourneyInstanceId journeyInstanceId) => + GetRequiredPathByPage("/RequestTrn/SchoolOrEducationalSetting", journeyInstanceId: journeyInstanceId); + + public string RequestTrnNpqApplication(JourneyInstanceId journeyInstanceId, bool? fromCheckAnswers = null) => + GetRequiredPathByPage("/RequestTrn/NpqApplication", routeValues: new { fromCheckAnswers }, journeyInstanceId: journeyInstanceId); + + public string RequestTrnNpqName(JourneyInstanceId journeyInstanceId, bool? fromCheckAnswers = null) => + GetRequiredPathByPage("/RequestTrn/NpqName", routeValues: new { fromCheckAnswers }, journeyInstanceId: journeyInstanceId); + public string RequestTrnNotEligible(JourneyInstanceId journeyInstanceId) => GetRequiredPathByPage("/RequestTrn/NotEligible", journeyInstanceId: journeyInstanceId); - public string RequestTrnEmail(JourneyInstanceId journeyInstanceId, bool? fromCheckAnswers = null) => - GetRequiredPathByPage("/RequestTrn/Email", routeValues: new { fromCheckAnswers }, journeyInstanceId: journeyInstanceId); + public string RequestTrnWorkEmail(JourneyInstanceId journeyInstanceId, bool? fromCheckAnswers = null) => + GetRequiredPathByPage("/RequestTrn/WorkEmail", routeValues: new { fromCheckAnswers }, journeyInstanceId: journeyInstanceId); + + public string RequestTrnPersonalEmail(JourneyInstanceId journeyInstanceId, bool? fromCheckAnswers = null) => + GetRequiredPathByPage("/RequestTrn/PersonalEmail", routeValues: new { fromCheckAnswers }, journeyInstanceId: journeyInstanceId); public string RequestTrnName(JourneyInstanceId journeyInstanceId, bool? fromCheckAnswers = null) => GetRequiredPathByPage("/RequestTrn/Name", routeValues: new { fromCheckAnswers }, journeyInstanceId: journeyInstanceId); @@ -68,6 +83,9 @@ public string RequestTrnAddress(JourneyInstanceId journeyInstanceId, bool? fromC public string RequestTrnCheckAnswers(JourneyInstanceId journeyInstanceId) => GetRequiredPathByPage("/RequestTrn/CheckAnswers", journeyInstanceId: journeyInstanceId); + public string RequestTrnNpqTrainingProvider(JourneyInstanceId journeyInstanceId, bool? fromCheckAnswers = null) => + GetRequiredPathByPage("/RequestTrn/NpqTrainingProvider", routeValues: new { fromCheckAnswers }, journeyInstanceId: journeyInstanceId); + public string RequestTrnEmailInUse(JourneyInstanceId journeyInstanceId) => GetRequiredPathByPage("/RequestTrn/EmailInUse", journeyInstanceId: journeyInstanceId); diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Address.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Address.cshtml.cs index 568d8a755..ebdaec718 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Address.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Address.cshtml.cs @@ -16,7 +16,7 @@ public class AddressModel(AuthorizeAccessLinkGenerator linkGenerator) : PageMode [BindProperty] [Display(Name = "Address line 1")] - [Required(ErrorMessage = "Enter address line 1")] + [Required(ErrorMessage = "Enter address line 1, typically the building and street")] [MaxLength(200, ErrorMessage = "Address line 1 must be 200 characters or less")] public string? AddressLine1 { get; set; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/CheckAnswers.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/CheckAnswers.cshtml index b9318e85a..ab9a7f04b 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/CheckAnswers.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/CheckAnswers.cshtml @@ -14,13 +14,53 @@

@ViewBag.Title

- - Email - @Model.Email - - Change - - + @if (!string.IsNullOrEmpty(Model.NpqApplicationId)) + { + + NPQ application ID + @Model.NpqApplicationId + + Change + + + } + else + { + + NPQ + @Model.NpqName + + Change + + + + NPQ Provider + @Model.NpqProvider + + Change + + + } + @if (!string.IsNullOrEmpty(Model.WorkEmail)) + { + + Work email + @Model.WorkEmail + + Change + + + } + @if (!string.IsNullOrEmpty(Model.PersonalEmail)) + { + + Personal email + @Model.PersonalEmail + + Change + + + } Name @Model.Name @@ -28,13 +68,16 @@ Change - - Previous name - @Model.PreviousName - - Change - - + @if (!string.IsNullOrEmpty(Model.PreviousName)) + { + + Previous name + @Model.PreviousName + + Change + + + } Date of birth @Model.DateOfBirth!.Value.ToString("d MMMM yyyy") @@ -64,7 +107,9 @@ @Model.AddressLine1
@if (!string.IsNullOrWhiteSpace(Model.AddressLine2)) { - @Model.AddressLine2
+ @Model.AddressLine2 + +
} @Model.TownOrCity
@Model.PostalCode
diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/CheckAnswers.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/CheckAnswers.cshtml.cs index 9a4c1533d..8e249fcc8 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/CheckAnswers.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/CheckAnswers.cshtml.cs @@ -18,7 +18,7 @@ public class CheckAnswersModel(AuthorizeAccessLinkGenerator linkGenerator, ICrmQ public RequestTrnJourneyState? JourneyState { get; set; } - public string? Email { get; set; } + public string? WorkEmail { get; set; } public string? Name { get; set; } @@ -45,10 +45,14 @@ public class CheckAnswersModel(AuthorizeAccessLinkGenerator linkGenerator, ICrmQ public string? PostalCode { get; set; } public string? Country { get; set; } + public string? NpqApplicationId { get; set; } + public string? PersonalEmail { get; set; } + public string? NpqName { get; set; } + public string? NpqProvider { get; set; } public async Task OnGetAsync() { - Email = JourneyInstance!.State.Email; + WorkEmail = JourneyInstance!.State.WorkEmail; Name = JourneyInstance!.State.Name; PreviousName = JourneyInstance!.State.PreviousName; DateOfBirth = JourneyInstance!.State.DateOfBirth; @@ -64,6 +68,10 @@ await fileService.GetFileUrlAsync(JourneyInstance!.State.EvidenceFileId!.Value, TownOrCity = JourneyInstance!.State.TownOrCity; PostalCode = JourneyInstance!.State.PostalCode; Country = JourneyInstance!.State.Country; + NpqApplicationId = JourneyInstance!.State.NpqApplicationId; + PersonalEmail = JourneyInstance!.State.PersonalEmail; + NpqName = JourneyInstance!.State.NpqName; + NpqProvider = JourneyInstance!.State.NpqTrainingProvider; } public async Task OnPostAsync() @@ -71,11 +79,17 @@ public async Task OnPostAsync() var state = JourneyInstance!.State; var description = $""" - Email: {state.Email} + Working In School or Educational Setting: {(state.WorkingInSchoolOrEducationalSetting == true ? "Yes" : "No")} + Personal Email: {state.PersonalEmail} + Work Email: {state.WorkEmail} Name: {state.Name} Previous name: {state.PreviousName} Date of birth: {state.DateOfBirth:dd/MM/yyyy} National Insurance number: {NationalInsuranceNumberHelper.Normalize(state.NationalInsuranceNumber)} + Registered For NPQ: {(state.HaveRegisteredForAnNpq == true ? "Yes" : "No")} + NPQ application ID: {state.NpqApplicationId} + NPQ name: {state.NpqName} + NPQ training provider: {state.NpqTrainingProvider} """; if (state.HasNationalInsuranceNumber == false) { @@ -104,7 +118,7 @@ await crmQueryDispatcher.ExecuteQueryAsync( EvidenceFileName = JourneyInstance!.State.EvidenceFileName!, EvidenceFileContent = stream, EvidenceFileMimeType = evidenceFileMimeType, - EmailAddress = JourneyInstance!.State.Email! + EmailAddress = JourneyInstance!.State.PersonalEmail! }); await JourneyInstance!.UpdateStateAsync(state => state.HasPendingTrnRequest = true); @@ -119,9 +133,18 @@ public override void OnPageHandlerExecuting(PageHandlerExecutingContext context) { context.Result = Redirect(linkGenerator.RequestTrnSubmitted(JourneyInstance!.InstanceId)); } - else if (state.Email is null) + else if (state.HaveRegisteredForAnNpq is null && state.NpqApplicationId is null) { - context.Result = Redirect(linkGenerator.RequestTrnEmail(JourneyInstance.InstanceId)); + context.Result = Redirect(linkGenerator.RequestTrnNpqApplication(JourneyInstance.InstanceId)); + } + else if (state.WorkEmail is null && state.WorkingInSchoolOrEducationalSetting == true) + { + context.Result = Redirect(linkGenerator.RequestTrnWorkEmail(JourneyInstance.InstanceId)); + } + else if (state.PersonalEmail is null) + { + // personal email is required for either WorkingInSchoolOrEducationalSetting being true or false + context.Result = Redirect(linkGenerator.RequestTrnPersonalEmail(JourneyInstance.InstanceId)); } else if (state.Name is null) { diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/DateOfBirth.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/DateOfBirth.cshtml index dc343f1f6..8ec03509d 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/DateOfBirth.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/DateOfBirth.cshtml @@ -13,7 +13,7 @@
- + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/DateOfBirth.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/DateOfBirth.cshtml.cs index 8e65af1a9..be90574d6 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/DateOfBirth.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/DateOfBirth.cshtml.cs @@ -1,4 +1,5 @@ using System.ComponentModel.DataAnnotations; +using GovUk.Frontend.AspNetCore; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.RazorPages; @@ -16,6 +17,7 @@ public class DateOfBirthModel(AuthorizeAccessLinkGenerator linkGenerator, IClock [BindProperty] [Display(Name = "What is your date of birth?")] + [DateInput(ErrorMessagePrefix = "Date of birth")] [Required(ErrorMessage = "Enter your date of birth")] public DateOnly? DateOfBirth { get; set; } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/EmailInUse.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/EmailInUse.cshtml index 8e67fe9ab..2bcde42dd 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/EmailInUse.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/EmailInUse.cshtml @@ -5,7 +5,7 @@ } @section BeforeContent { - + }
diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/EmailInUse.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/EmailInUse.cshtml.cs index 58e655e87..44c3a5e36 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/EmailInUse.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/EmailInUse.cshtml.cs @@ -12,9 +12,9 @@ public class EmailInUseModel(AuthorizeAccessLinkGenerator linkGenerator) : PageM public override void OnPageHandlerExecuting(PageHandlerExecutingContext context) { var state = JourneyInstance!.State; - if (state.Email is null) + if (state.PersonalEmail is null) { - context.Result = Redirect(linkGenerator.RequestTrnEmail(JourneyInstance.InstanceId)); + context.Result = Redirect(linkGenerator.RequestTrnPersonalEmail(JourneyInstance.InstanceId)); } } } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Identity.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Identity.cshtml index d01537989..84e535aa8 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Identity.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Identity.cshtml @@ -34,7 +34,14 @@ } - Upload file + +
+ Upload File +

+ File must be a JPEG, JPG, PDF or PNG and smaller than 3MB. +

+
+
Continue diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Index.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Index.cshtml index 3bcb3dba0..60b931be8 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Index.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Index.cshtml @@ -1,13 +1,24 @@ @page "/request-trn" @model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.IndexModel @{ - ViewBag.Title = "Get a teacher reference number (TRN)"; + ViewBag.Title = "Request a teacher reference number for a national professional qualification"; }

@ViewBag.Title

-

Use this service to get a teacher reference number (TRN) if you’re registering for a national professional qualification (NPQ).

+

Use this service to get a teacher reference number (TRN) if you plan on taking a national professional qualification (NPQ).

+
+
+ +
+
+

Do not use this service if:

+
    +
  • you’ve forgotten your TRN or you’re not sure if you have one - use the Find a lost TRN service instead
  • +
  • you need a TRN because you’re a mentor for a trainee or early career teacher - request one via Galaxkey instead
  • +
  • you need a TRN for a different reason - find out what you need a TRN for
  • +
@@ -24,4 +35,4 @@
-Start now +Start now diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Name.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Name.cshtml index 017902ab7..446f87396 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Name.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Name.cshtml @@ -5,7 +5,7 @@ } @section BeforeContent { - + }
diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Name.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Name.cshtml.cs index 7268ade55..bd0a0fecf 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Name.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Name.cshtml.cs @@ -16,7 +16,7 @@ public class NameModel(AuthorizeAccessLinkGenerator linkGenerator) : PageModel [BindProperty] [Display(Name = "What is your name?", Description = "Full name")] - [Required(ErrorMessage = "Enter your full name")] + [Required(ErrorMessage = "Enter your name")] [MaxLength(200, ErrorMessage = "Name must be 200 characters or less")] public string? Name { get; set; } @@ -49,9 +49,13 @@ public override void OnPageHandlerExecuting(PageHandlerExecutingContext context) { context.Result = Redirect(linkGenerator.RequestTrnSubmitted(JourneyInstance!.InstanceId)); } - else if (state.Email is null) + else if (state.PersonalEmail is null) { - context.Result = Redirect(linkGenerator.RequestTrnEmail(JourneyInstance.InstanceId)); + context.Result = Redirect(linkGenerator.RequestTrnPersonalEmail(JourneyInstance.InstanceId)); + } + else if (state.WorkEmail is null && state.WorkingInSchoolOrEducationalSetting == true) + { + context.Result = Redirect(linkGenerator.RequestTrnWorkEmail(JourneyInstance.InstanceId)); } } } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NotEligible.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NotEligible.cshtml index 807f23057..ab9ae9ead 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NotEligible.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NotEligible.cshtml @@ -5,14 +5,14 @@ } @section BeforeContent { - + }

@ViewBag.Title

-

You can only use this service if you need a TRN to register for an NPQ.

+

You can only use this service if you need a TRN because you’re taking an NPQ.

Find out how to get a TRN if you’re a mentor for a trainee or early career teacher.

diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NotEligible.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NotEligible.cshtml.cs index 4a5d8d3c9..8ffb24e65 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NotEligible.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NotEligible.cshtml.cs @@ -16,9 +16,9 @@ public override void OnPageHandlerExecuting(PageHandlerExecutingContext context) { context.Result = Redirect(linkGenerator.RequestTrnSubmitted(JourneyInstance!.InstanceId)); } - else if (state.IsPlanningToTakeAnNpq is null) + else if (state.IsTakingNpq is null) { - context.Result = Redirect(linkGenerator.RequestTrnNpqCheck(JourneyInstance!.InstanceId)); + context.Result = Redirect(linkGenerator.TakingNpqRequireTrn(JourneyInstance!.InstanceId)); } } } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqApplication.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqApplication.cshtml new file mode 100644 index 000000000..f9f53223c --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqApplication.cshtml @@ -0,0 +1,36 @@ +@page "/request-trn/npq-application" +@model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.NpqApplicationModel +@{ + ViewBag.Title = Html.DisplayNameFor(m => m.NpqApplicationId); +} + +@section BeforeContent { + +} + +
+
+ + + + + + + Where to find this + +

You can find your NPQ application ID:

+
    +
  • by signing in to your NPQ online account
  • +
  • on your NPQ registration confirmation email
  • +
+ +
+
+

+ + I cannot find my NPQ application ID +

+ Continue + +
+
diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqApplication.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqApplication.cshtml.cs new file mode 100644 index 000000000..89c724792 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqApplication.cshtml.cs @@ -0,0 +1,41 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TeachingRecordSystem.WebCommon.FormFlow; + +namespace TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn; + +[Journey(RequestTrnJourneyState.JourneyName), RequireJourneyInstance] + +public class NpqApplicationModel(AuthorizeAccessLinkGenerator linkGenerator) : PageModel +{ + public JourneyInstance? JourneyInstance { get; set; } + + [FromQuery] + public bool? FromCheckAnswers { get; set; } + + [BindProperty] + [Display(Name = "What is your NPQ application ID?", Description = "We’ll use this to check your registration details.")] + [Required(ErrorMessage = "Enter your NPQ application ID")] + public string? NpqApplicationId { get; set; } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return this.PageWithErrors(); + } + + await JourneyInstance!.UpdateStateAsync(state => state.NpqApplicationId = NpqApplicationId); + + if (FromCheckAnswers == true) + { + return Redirect(linkGenerator.RequestTrnCheckAnswers(JourneyInstance!.InstanceId)); + } + else + { + return Redirect(linkGenerator.RequestTrnWorkingInSchoolOrEducationalSetting(JourneyInstance.InstanceId)); + } + + } +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqCheck.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqCheck.cshtml index 9982e6b89..f856dcc83 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqCheck.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqCheck.cshtml @@ -1,17 +1,17 @@ @page "/request-trn/npq-check" @model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.NpqCheckModel @{ - ViewBag.Title = Html.DisplayNameFor(m => m.IsPlanningToTakeAnNpq); + ViewBag.Title = Html.DisplayNameFor(m => m.HaveRegisteredForAnNpq); } @section BeforeContent { - + }
- + Yes diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqCheck.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqCheck.cshtml.cs index 3d3ab31a9..46ebca421 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqCheck.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqCheck.cshtml.cs @@ -12,13 +12,13 @@ public class NpqCheckModel(AuthorizeAccessLinkGenerator linkGenerator) : PageMod public JourneyInstance? JourneyInstance { get; set; } [BindProperty] - [Display(Name = "Do you plan on taking a national professional qualification (NPQ)?")] - [Required(ErrorMessage = "Tell us whether you plan on taking a national professional qualification (NPQ)")] - public bool? IsPlanningToTakeAnNpq { get; set; } + [Display(Name = "Have you already registered for an NPQ?")] + [Required(ErrorMessage = "Select yes if you’ve already registered for an NPQ")] + public bool? HaveRegisteredForAnNpq { get; set; } public void OnGet() { - IsPlanningToTakeAnNpq = JourneyInstance!.State.IsPlanningToTakeAnNpq; + HaveRegisteredForAnNpq = JourneyInstance!.State.HaveRegisteredForAnNpq; } public async Task OnPostAsync() @@ -28,11 +28,11 @@ public async Task OnPostAsync() return this.PageWithErrors(); } - await JourneyInstance!.UpdateStateAsync(state => state.IsPlanningToTakeAnNpq = IsPlanningToTakeAnNpq); + await JourneyInstance!.UpdateStateAsync(state => state.HaveRegisteredForAnNpq = HaveRegisteredForAnNpq); - return IsPlanningToTakeAnNpq == true ? - Redirect(linkGenerator.RequestTrnEmail(JourneyInstance!.InstanceId)) : - Redirect(linkGenerator.RequestTrnNotEligible(JourneyInstance.InstanceId)); + return HaveRegisteredForAnNpq == true ? + Redirect(linkGenerator.RequestTrnNpqApplication(JourneyInstance!.InstanceId)) : + Redirect(linkGenerator.RequestTrnNpqName(JourneyInstance.InstanceId)); } public override void OnPageHandlerExecuting(PageHandlerExecutingContext context) diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Email.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqName.cshtml similarity index 59% rename from TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Email.cshtml rename to TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqName.cshtml index 7f4f8120e..4cc260d52 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Email.cshtml +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqName.cshtml @@ -1,7 +1,7 @@ -@page "/request-trn/email" -@model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.EmailModel +@page "/request-trn/npq-name" +@model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.WhatNpqModel @{ - ViewBag.Title = Html.DisplayNameFor(m => m.Email); + ViewBag.Title = Html.DisplayNameFor(m => m.NpqName); } @section BeforeContent { @@ -10,9 +10,9 @@
- + - + diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqName.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqName.cshtml.cs new file mode 100644 index 000000000..315c9428b --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqName.cshtml.cs @@ -0,0 +1,43 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TeachingRecordSystem.WebCommon.FormFlow; + +namespace TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn; + +[Journey(RequestTrnJourneyState.JourneyName), RequireJourneyInstance] +public class WhatNpqModel(AuthorizeAccessLinkGenerator linkGenerator) : PageModel +{ + public JourneyInstance? JourneyInstance { get; set; } + + [FromQuery] + public bool? FromCheckAnswers { get; set; } + + [BindProperty] + [Display(Name = "Which NPQ do you plan on taking?")] + [Required(ErrorMessage = "Enter the NPQ you plan on taking")] + [MaxLength(200, ErrorMessage = "NPQ Name must be 200 characters or less")] + public string? NpqName { get; set; } + + public void OnGet() + { + NpqName = JourneyInstance!.State.NpqName; + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return this.PageWithErrors(); + } + + await JourneyInstance!.UpdateStateAsync(state => + { + state.NpqName = NpqName; + }); + + return FromCheckAnswers == true ? + Redirect(linkGenerator.RequestTrnCheckAnswers(JourneyInstance!.InstanceId)) : + Redirect(linkGenerator.RequestTrnNpqTrainingProvider(JourneyInstance!.InstanceId)); + } +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqTrainingProvider.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqTrainingProvider.cshtml new file mode 100644 index 000000000..b613141b6 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqTrainingProvider.cshtml @@ -0,0 +1,22 @@ +@page "/request-trn/npq-provider" +@model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.NpqTrainingProviderModel +@{ + ViewBag.Title = Html.DisplayNameFor(m => m.NpqTrainingProvider); +} + +@section BeforeContent { + +} + +
+
+ + + + + + + Continue + +
+
diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqTrainingProvider.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqTrainingProvider.cshtml.cs new file mode 100644 index 000000000..359294207 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/NpqTrainingProvider.cshtml.cs @@ -0,0 +1,43 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TeachingRecordSystem.WebCommon.FormFlow; + +namespace TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn; + +[Journey(RequestTrnJourneyState.JourneyName), RequireJourneyInstance] +public class NpqTrainingProviderModel(AuthorizeAccessLinkGenerator linkGenerator) : PageModel +{ + public JourneyInstance? JourneyInstance { get; set; } + + [FromQuery] + public bool? FromCheckAnswers { get; set; } + + [BindProperty] + [Display(Name = "Who is your NPQ training provider?")] + [Required(ErrorMessage = "Enter your NPQ training provider")] + [MaxLength(200, ErrorMessage = "NPQ training provider must be 200 characters or less")] + public string? NpqTrainingProvider { get; set; } + + public void OnGet() + { + NpqTrainingProvider = JourneyInstance!.State.NpqTrainingProvider; + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return this.PageWithErrors(); + } + + await JourneyInstance!.UpdateStateAsync(state => + { + state.NpqTrainingProvider = NpqTrainingProvider; + }); + + return FromCheckAnswers == true ? + Redirect(linkGenerator.RequestTrnCheckAnswers(JourneyInstance!.InstanceId)) : + Redirect(linkGenerator.RequestTrnWorkingInSchoolOrEducationalSetting(JourneyInstance!.InstanceId)); + } +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/PersonalEmail.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/PersonalEmail.cshtml new file mode 100644 index 000000000..a6112f298 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/PersonalEmail.cshtml @@ -0,0 +1,22 @@ +@page "/request-trn/personal-email" +@model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.PersonalEmailModel +@{ + ViewBag.Title = Html.DisplayNameFor(m => m.PersonalEmail); +} + +@section BeforeContent { + +} + +
+
+
+ + + + + + Continue +
+
+
diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Email.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/PersonalEmail.cshtml.cs similarity index 74% rename from TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Email.cshtml.cs rename to TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/PersonalEmail.cshtml.cs index 33019c11a..b8dd51368 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/Email.cshtml.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/PersonalEmail.cshtml.cs @@ -10,7 +10,7 @@ namespace TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn; [Journey(RequestTrnJourneyState.JourneyName), RequireJourneyInstance] -public class EmailModel(AuthorizeAccessLinkGenerator linkGenerator, ICrmQueryDispatcher crmQueryDispatcher) : PageModel +public class PersonalEmailModel(AuthorizeAccessLinkGenerator linkGenerator, ICrmQueryDispatcher crmQueryDispatcher) : PageModel { public JourneyInstance? JourneyInstance { get; set; } @@ -18,14 +18,14 @@ public class EmailModel(AuthorizeAccessLinkGenerator linkGenerator, ICrmQueryDis public bool? FromCheckAnswers { get; set; } [BindProperty] - [Display(Name = "What is your email address?", Description = "We’ll only use this to send you your TRN if you’re eligible for one.")] - [Required(ErrorMessage = "Enter your email address")] + [Display(Name = "What is your personal email address?", Description = "We need this to send you your TRN if you’re eligible for one. Do not use your work email address.")] + [Required(ErrorMessage = "Enter your personal email address")] [@EmailAddress(ErrorMessage = "Enter an email address in the correct format, like name@example.com")] - public string? Email { get; set; } + public string? PersonalEmail { get; set; } public void OnGet() { - Email = JourneyInstance!.State.Email; + PersonalEmail = JourneyInstance!.State.PersonalEmail; } public async Task OnPostAsync() @@ -35,10 +35,10 @@ public async Task OnPostAsync() return this.PageWithErrors(); } - await JourneyInstance!.UpdateStateAsync(state => state.Email = Email); + await JourneyInstance!.UpdateStateAsync(state => state.PersonalEmail = PersonalEmail); var openTasks = await crmQueryDispatcher.ExecuteQueryAsync( - new GetOpenTasksForEmailAddressQuery(EmailAddress: JourneyInstance!.State.Email!)); + new GetOpenTasksForEmailAddressQuery(EmailAddress: JourneyInstance!.State.PersonalEmail!)); if (openTasks.Any()) { diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/RequestTrnJourneyState.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/RequestTrnJourneyState.cs index 31d781fa3..9b6977c25 100644 --- a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/RequestTrnJourneyState.cs +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/RequestTrnJourneyState.cs @@ -9,8 +9,7 @@ public class RequestTrnJourneyState() public static JourneyDescriptor JourneyDescriptor { get; } = new JourneyDescriptor(JourneyName, typeof(RequestTrnJourneyState), requestDataKeys: [], appendUniqueKey: true); - public bool? IsPlanningToTakeAnNpq { get; set; } - public string? Email { get; set; } + public string? WorkEmail { get; set; } public string? Name { get; set; } public bool? HasPreviousName { get; set; } public string? PreviousName { get; set; } @@ -26,4 +25,11 @@ public class RequestTrnJourneyState() public string? Country { get; set; } public string? PostalCode { get; set; } public bool HasPendingTrnRequest { get; set; } + public bool? IsTakingNpq { get; set; } + public string? NpqApplicationId { get; set; } + public string? NpqTrainingProvider { get; set; } + public string? PersonalEmail { get; set; } + public bool? WorkingInSchoolOrEducationalSetting { get; set; } + public bool? HaveRegisteredForAnNpq { get; set; } + public string? NpqName { get; set; } } diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/SchoolOrEducationalSetting.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/SchoolOrEducationalSetting.cshtml new file mode 100644 index 000000000..1cd373e05 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/SchoolOrEducationalSetting.cshtml @@ -0,0 +1,25 @@ +@page "/request-trn/school-or-educational-setting" +@model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.SchoolOrEducationalSettingModel +@{ + ViewBag.Title = Html.DisplayNameFor(m => m.IsWorkingInSchoolOrEducationalSetting); +} + +@section BeforeContent { + +} + +
+
+
+ + + + Yes + No + + + Continue +
+
+
+ diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/SchoolOrEducationalSetting.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/SchoolOrEducationalSetting.cshtml.cs new file mode 100644 index 000000000..748146f96 --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/SchoolOrEducationalSetting.cshtml.cs @@ -0,0 +1,32 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TeachingRecordSystem.WebCommon.FormFlow; + +namespace TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn; + +[Journey(RequestTrnJourneyState.JourneyName), RequireJourneyInstance] + +public class SchoolOrEducationalSettingModel(AuthorizeAccessLinkGenerator linkGenerator) : PageModel +{ + public JourneyInstance? JourneyInstance { get; set; } + + [BindProperty] + [Display(Name = "Are you currently working in a school or other educational setting?")] + [Required(ErrorMessage = "Select yes if you’re currently working in a school or other educational setting")] + public bool? IsWorkingInSchoolOrEducationalSetting { get; set; } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return this.PageWithErrors(); + } + + await JourneyInstance!.UpdateStateAsync(state => state.WorkingInSchoolOrEducationalSetting = IsWorkingInSchoolOrEducationalSetting); + + return IsWorkingInSchoolOrEducationalSetting == false ? + Redirect(linkGenerator.RequestTrnPersonalEmail(JourneyInstance!.InstanceId)) : + Redirect(linkGenerator.RequestTrnWorkEmail(JourneyInstance.InstanceId)); + } +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/TakingNpq.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/TakingNpq.cshtml new file mode 100644 index 000000000..1829f4cbe --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/TakingNpq.cshtml @@ -0,0 +1,26 @@ +@page "/request-trn/taking-npq" +@model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.TakingNpqModel +@{ + ViewBag.Title = Html.DisplayNameFor(m => m.IsTakingAnNpq); +} +@inject IConfiguration config; + +@section BeforeContent { + +} + +
+
+
+ + + + Yes + No + + + Continue +
+
+
+ diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/TakingNpq.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/TakingNpq.cshtml.cs new file mode 100644 index 000000000..a11e32f8c --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/TakingNpq.cshtml.cs @@ -0,0 +1,32 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TeachingRecordSystem.WebCommon.FormFlow; + +namespace TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn; + +[Journey(RequestTrnJourneyState.JourneyName), RequireJourneyInstance] + +public class TakingNpqModel(AuthorizeAccessLinkGenerator linkGenerator) : PageModel +{ + public JourneyInstance? JourneyInstance { get; set; } + + [BindProperty] + [Display(Name = "Do you need a TRN because you’re taking an NPQ?")] + [Required(ErrorMessage = "Select yes if you need a TRN because you’re taking an NPQ")] + public bool? IsTakingAnNpq { get; set; } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return this.PageWithErrors(); + } + + await JourneyInstance!.UpdateStateAsync(state => state.IsTakingNpq = IsTakingAnNpq); + + return IsTakingAnNpq == true ? + Redirect(linkGenerator.RequestTrnNpqCheck(JourneyInstance!.InstanceId)) : + Redirect(linkGenerator.RequestTrnNotEligible(JourneyInstance.InstanceId)); + } +} diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/WorkEmail.cshtml b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/WorkEmail.cshtml new file mode 100644 index 000000000..a1b1014da --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/WorkEmail.cshtml @@ -0,0 +1,22 @@ +@page "/request-trn/work-email" +@model TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn.WorkEmailModel +@{ + ViewBag.Title = Html.DisplayNameFor(m => m.WorkEmail); +} + +@section BeforeContent { + +} + +
+
+
+ + + + + + Continue +
+
+
diff --git a/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/WorkEmail.cshtml.cs b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/WorkEmail.cshtml.cs new file mode 100644 index 000000000..88dc96bce --- /dev/null +++ b/TeachingRecordSystem/src/TeachingRecordSystem.AuthorizeAccess/Pages/RequestTrn/WorkEmail.cshtml.cs @@ -0,0 +1,41 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using TeachingRecordSystem.WebCommon.FormFlow; +using EmailAddress = TeachingRecordSystem.AuthorizeAccess.DataAnnotations.EmailAddressAttribute; + +namespace TeachingRecordSystem.AuthorizeAccess.Pages.RequestTrn; + +[Journey(RequestTrnJourneyState.JourneyName), RequireJourneyInstance] +public class WorkEmailModel(AuthorizeAccessLinkGenerator linkGenerator) : PageModel +{ + public JourneyInstance? JourneyInstance { get; set; } + + [FromQuery] + public bool? FromCheckAnswers { get; set; } + + [BindProperty] + [Display(Name = "What is your work email address?", Description = "We’ll use this to check if you need a TRN.")] + [Required(ErrorMessage = "Enter your work email address")] + [@EmailAddress(ErrorMessage = "Enter an email address in the correct format, like name@example.com")] + public string? WorkEmail { get; set; } + + public void OnGet() + { + WorkEmail = JourneyInstance!.State.WorkEmail; + } + + public async Task OnPostAsync() + { + if (!ModelState.IsValid) + { + return this.PageWithErrors(); + } + + await JourneyInstance!.UpdateStateAsync(state => state.WorkEmail = WorkEmail); + + return FromCheckAnswers == true ? + Redirect(linkGenerator.RequestTrnCheckAnswers(JourneyInstance!.InstanceId)) : + Redirect(linkGenerator.RequestTrnPersonalEmail(JourneyInstance.InstanceId)); + } +} diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.EndToEndTests/HostFixture.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.EndToEndTests/HostFixture.cs index fc021bed6..9ea51a324 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.EndToEndTests/HostFixture.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.EndToEndTests/HostFixture.cs @@ -26,6 +26,8 @@ public sealed class HostFixture(IConfiguration configuration) : IAsyncDisposable private IPlaywright? _playwright; private IBrowser? _browser; + public IConfiguration Configuration => configuration; + public IBrowser Browser { get diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.EndToEndTests/RequestTrnTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.EndToEndTests/RequestTrnTests.cs index 0bfac021e..38f4c73c3 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.EndToEndTests/RequestTrnTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.EndToEndTests/RequestTrnTests.cs @@ -4,51 +4,71 @@ namespace TeachingRecordSystem.AuthorizeAccess.EndToEndTests; public class RequestTrnTests(HostFixture hostFixture) : TestBase(hostFixture) { - [Theory(Skip = "Flaky on CI")] + [Theory(Skip = "CI FLAKY TEST")] [InlineData(true, true)] [InlineData(true, false)] [InlineData(false, false)] - public async Task RequestTrn(bool isPlanningToTakeAnNpq, bool hasNationalInsuranceNumber) + public async Task RequestTrnWithApplicationId(bool isTakingNpq, bool hasNationalInsuranceNumber) { await using var context = await HostFixture.CreateBrowserContext(); var page = await context.NewPageAsync(); - - await page.GotoAsync("/request-trn"); + var accessToken = HostFixture.Configuration["RequestTrnAccessToken"]; + await page.GotoAsync($"/request-trn?AccessToken={accessToken}"); await page.ClickButtonAsync("Start now"); - await page.WaitForUrlPathAsync("/request-trn/npq-check"); + await page.WaitForUrlPathAsync("/request-trn/taking-npq"); - if (isPlanningToTakeAnNpq) + //Is Taking NPQ + if (isTakingNpq) { await page.CheckAsync("text=Yes"); await page.ClickButtonAsync("Continue"); - await page.WaitForUrlPathAsync("/request-trn/email"); + //npq check + await page.WaitForUrlPathAsync("/request-trn/npq-check"); + await page.CheckAsync("text=Yes"); + await page.ClickButtonAsync("Continue"); - var email = Faker.Internet.Email(); - await page.FillAsync("input[name=Email]", email); + //npq applicationid + await page.WaitForUrlPathAsync("/request-trn/npq-application"); + await page.FillAsync("input[name=NpqApplicationId]", "SomeApplicationID"); await page.ClickButtonAsync("Continue"); - await page.WaitForUrlPathAsync("/request-trn/name"); + //working in school or educational setting + await page.WaitForUrlPathAsync("/request-trn/school-or-educational-setting"); + await page.CheckAsync("text=Yes"); + await page.ClickButtonAsync("Continue"); + //work email + await page.WaitForUrlPathAsync("/request-trn/work-email"); + await page.FillAsync("input[name=WorkEmail]", Faker.Internet.Email()); + await page.ClickButtonAsync("Continue"); + + //personal email + await page.WaitForUrlPathAsync("/request-trn/personal-email"); + await page.FillAsync("input[name=PersonalEmail]", Faker.Internet.Email()); + await page.ClickButtonAsync("Continue"); + + //name + await page.WaitForUrlPathAsync("/request-trn/name"); var name = Faker.Name.FullName(); var previousName = Faker.Name.FullName(); await page.FillAsync("input[name=Name]", name); await page.ClickButtonAsync("Continue"); + //previous name await page.WaitForUrlPathAsync("/request-trn/previous-name"); - await page.CheckAsync("text=Yes"); await page.FillAsync("input[name=PreviousName]", previousName); await page.ClickButtonAsync("Continue"); + //dob await page.WaitForUrlPathAsync("/request-trn/date-of-birth"); - var dateOfBirth = new DateOnly(1980, 10, 12); await page.FillDateInputAsync(dateOfBirth); await page.ClickButtonAsync("Continue"); + //identity await page.WaitForUrlPathAsync("/request-trn/identity"); - await page .GetByLabel("Upload file") .SetInputFilesAsync( @@ -60,6 +80,7 @@ await page }); await page.ClickButtonAsync("Continue"); + //NI await page.WaitForUrlPathAsync("/request-trn/national-insurance-number"); var nationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); @@ -92,17 +113,137 @@ await page await page.WaitForUrlPathAsync("/request-trn/check-answers"); } + } + else + { + await page.CheckAsync("text=No"); + await page.ClickButtonAsync("Continue"); - await page.ClickButtonAsync("Submit request"); + await page.WaitForUrlPathAsync("/request-trn/not-eligible"); + } + } - await page.WaitForUrlPathAsync("/request-trn/submitted"); + [Theory(Skip = "CI FLAKY TEST")] + [InlineData(true, true)] + [InlineData(true, false)] + [InlineData(false, false)] + [InlineData(false, true)] + public async Task RequestTrnWithNpqNameAndNpqProvider(bool hasNationalInsuranceNumber, bool isWorkingInSchoolOrEducationalSetting) + { + await using var context = await HostFixture.CreateBrowserContext(); + var page = await context.NewPageAsync(); + var accessToken = HostFixture.Configuration["RequestTrnAccessToken"]; + await page.GotoAsync($"/request-trn?AccessToken={accessToken}"); + await page.ClickButtonAsync("Start now"); + await page.WaitForUrlPathAsync("/request-trn/taking-npq"); + + + await page.CheckAsync("text=Yes"); + await page.ClickButtonAsync("Continue"); + + //npq check + await page.WaitForUrlPathAsync("/request-trn/npq-check"); + await page.CheckAsync("text=no"); + await page.ClickButtonAsync("Continue"); + + //npq name + await page.WaitForUrlPathAsync("/request-trn/npq-name"); + await page.FillAsync("input[name=NpqName]", "SomeNPQName"); + await page.ClickButtonAsync("Continue"); + + //npq provider + await page.WaitForUrlPathAsync("/request-trn/npq-provider"); + await page.FillAsync("input[name=NpqTrainingProvider]", "SOME PROVIDER"); + await page.ClickButtonAsync("Continue"); + + //working in school or educational setting + if (isWorkingInSchoolOrEducationalSetting) + { + await page.WaitForUrlPathAsync("/request-trn/school-or-educational-setting"); + await page.CheckAsync("text=Yes"); + await page.ClickButtonAsync("Continue"); + + //work email + await page.WaitForUrlPathAsync("/request-trn/work-email"); + await page.FillAsync("input[name=WorkEmail]", Faker.Internet.Email()); + await page.ClickButtonAsync("Continue"); } else { + await page.WaitForUrlPathAsync("/request-trn/school-or-educational-setting"); await page.CheckAsync("text=No"); await page.ClickButtonAsync("Continue"); + } - await page.WaitForUrlPathAsync("/request-trn/not-eligible"); + //personal email + await page.WaitForUrlPathAsync("/request-trn/personal-email"); + await page.FillAsync("input[name=PersonalEmail]", Faker.Internet.Email()); + await page.ClickButtonAsync("Continue"); + + //name + await page.WaitForUrlPathAsync("/request-trn/name"); + var name = Faker.Name.FullName(); + var previousName = Faker.Name.FullName(); + await page.FillAsync("input[name=Name]", name); + await page.ClickButtonAsync("Continue"); + + //previous name + await page.WaitForUrlPathAsync("/request-trn/previous-name"); + await page.CheckAsync("text=Yes"); + await page.FillAsync("input[name=PreviousName]", previousName); + await page.ClickButtonAsync("Continue"); + + //dob + await page.WaitForUrlPathAsync("/request-trn/date-of-birth"); + var dateOfBirth = new DateOnly(1980, 10, 12); + await page.FillDateInputAsync(dateOfBirth); + await page.ClickButtonAsync("Continue"); + + //identity + await page.WaitForUrlPathAsync("/request-trn/identity"); + await page + .GetByLabel("Upload file") + .SetInputFilesAsync( + new FilePayload() + { + Name = "evidence.jpg", + MimeType = "image/jpeg", + Buffer = TestData.JpegImage + }); + await page.ClickButtonAsync("Continue"); + + //NI + await page.WaitForUrlPathAsync("/request-trn/national-insurance-number"); + + var nationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); + if (hasNationalInsuranceNumber) + { + await page.CheckAsync("text=Yes"); + await page.FillAsync("input[name=NationalInsuranceNumber]", nationalInsuranceNumber); + await page.ClickButtonAsync("Continue"); + + await page.WaitForUrlPathAsync("/request-trn/check-answers"); + } + else + { + await page.CheckAsync("text=No"); + await page.ClickButtonAsync("Continue"); + await page.WaitForUrlPathAsync("/request-trn/address"); + + var addressLine1 = Faker.Address.StreetAddress(); + var addressLine2 = Faker.Address.SecondaryAddress(); + var townOrCity = Faker.Address.City(); + var postalCode = Faker.Address.ZipCode(); + var country = Faker.Address.Country(); + + await page.FillAsync("input[name=AddressLine1]", addressLine1); + await page.FillAsync("input[name=AddressLine2]", addressLine2); + await page.FillAsync("input[name=TownOrCity]", townOrCity); + await page.FillAsync("input[name=PostalCode]", postalCode); + await page.FillAsync("input[name=Country]", country); + await page.ClickButtonAsync("Continue"); + + await page.WaitForUrlPathAsync("/request-trn/check-answers"); } } } diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/AddressTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/AddressTests.cs index aa46d1eae..7989d9e80 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/AddressTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/AddressTests.cs @@ -42,7 +42,7 @@ public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModel { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.PreviousName = Faker.Name.FullName(); state.HasPreviousName = true; @@ -105,7 +105,7 @@ public async Task Post_HasNationalInsuranceNumberMissingFromState_RedirectsToNat } [Theory] - [InlineData(AddressLineType.AddressLine1, "Enter address line 1")] + [InlineData(AddressLineType.AddressLine1, "Enter address line 1, typically the building and street")] [InlineData(AddressLineType.TownOrCity, "Enter town or city")] [InlineData(AddressLineType.PostalCode, "Enter postal code")] [InlineData(AddressLineType.Country, "Enter country")] @@ -113,7 +113,7 @@ public async Task Post_EmptyMandatoryAddressLine_ReturnsError(AddressLineType em { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.PreviousName = Faker.Name.FullName(); state.HasPreviousName = true; @@ -169,7 +169,7 @@ public async Task Post_AddressLinesTooManyCharacters_ReturnsError(AddressLineTyp { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.PreviousName = Faker.Name.FullName(); state.HasPreviousName = true; @@ -208,7 +208,7 @@ public async Task Post_ValidRequest_UpdatesStateAndRedirectsToNextPage() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.PreviousName = Faker.Name.FullName(); state.HasPreviousName = true; diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/CheckAnswersTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/CheckAnswersTests.cs index ee5c89be7..fbd160ddc 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/CheckAnswersTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/CheckAnswersTests.cs @@ -21,11 +21,57 @@ public async Task Get_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() } [Fact] - public async Task Get_HasEmailMissingFromState_RedirectsToEmail() + public async Task Get_HasWorkEmailMissingFromState_RedirectsToWorkEmail() { // Arrange var state = CreateNewState(); - state.Email = null; + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = null; + state.PersonalEmail = Faker.Internet.Email(); + state.Name = Faker.Name.FullName(); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } + + [Fact] + public async Task Get_HasPersonalEmailMissingFromState_RedirectsToPersonalEmail() + { + // Arrange + var state = CreateNewState(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = null; + state.Name = Faker.Name.FullName(); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -35,7 +81,7 @@ public async Task Get_HasEmailMissingFromState_RedirectsToEmail() // Assert Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + Assert.Equal($"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } [Fact] @@ -43,8 +89,21 @@ public async Task Get_HasNameMissingFromState_RedirectsToName() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = null; + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -62,9 +121,21 @@ public async Task Get_HasHasPreviousNameMissingFromState_RedirectsToPreviousName { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = null; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -82,10 +153,20 @@ public async Task Get_HasPreviousNameMissingFromState_RedirectsToPreviousName() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = true; state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -103,11 +184,22 @@ public async Task Get_HasDateOfBirthMissingFromState_RedirectsToDateOfBirth() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); + state.HasPreviousName = false; + state.PreviousName = null; state.DateOfBirth = null; + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = "qq 12 34 56 56 c"; + var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -125,12 +217,21 @@ public async Task Get_HasEvidenceFileIdMissingFromState_RedirectsToIdentity() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); state.EvidenceFileId = null; + state.EvidenceFileName = null; + state.EvidenceFileSizeDescription = null; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = "qq 12 34 56 56 c"; var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -148,13 +249,21 @@ public async Task Get_HasHasNationalInsuranceNumberMissingFromState_RedirectsToN { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; state.HasNationalInsuranceNumber = null; + state.NationalInsuranceNumber = null; var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -172,12 +281,19 @@ public async Task Get_HasNationalInsuranceNumberTrueAndNationalInsuranceNumberMi { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; state.HasNationalInsuranceNumber = true; state.NationalInsuranceNumber = null; var journeyInstance = await CreateJourneyInstance(state); @@ -197,13 +313,21 @@ public async Task Get_HasNationalInsuranceNumberFalseAndAddressLine1MissingFromS { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; state.HasNationalInsuranceNumber = false; + state.NationalInsuranceNumber = null; state.AddressLine1 = null; var journeyInstance = await CreateJourneyInstance(state); @@ -224,16 +348,22 @@ public async Task Get_ValidRequest_PopulatesModelFromJourneyState(bool hasNation { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOMEID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = true; state.PreviousName = Faker.Name.FullName(); - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.DateOfBirth = new DateOnly(1999, 01, 01); state.EvidenceFileId = Guid.NewGuid(); state.EvidenceFileName = "evidence-file-name.jpg"; state.EvidenceFileSizeDescription = "1.2 MB"; state.HasNationalInsuranceNumber = hasNationalInsuranceNumber; state.NationalInsuranceNumber = hasNationalInsuranceNumber ? Faker.Identification.UkNationalInsuranceNumber() : null; + if (!hasNationalInsuranceNumber) { state.AddressLine1 = Faker.Address.StreetAddress(); @@ -252,7 +382,8 @@ public async Task Get_ValidRequest_PopulatesModelFromJourneyState(bool hasNation // Assert var doc = await AssertEx.HtmlResponseAsync(response); - Assert.Equal(state.Email, doc.GetSummaryListValueForKey("Email")); + Assert.Equal(state.WorkEmail, doc.GetSummaryListValueForKey("Work email")); + Assert.Equal(state.PersonalEmail, doc.GetSummaryListValueForKey("Personal email")); Assert.Equal(state.Name, doc.GetSummaryListValueForKey("Name")); Assert.Equal(state.PreviousName, doc.GetSummaryListValueForKey("Previous name")); Assert.Equal(state.DateOfBirth?.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Date of birth")); @@ -273,6 +404,139 @@ public async Task Get_ValidRequest_PopulatesModelFromJourneyState(bool hasNation } } + [Fact] + public async Task Get_GetValidRequestWithNpqNameAndProvider_ShowsNpqNameAndProviderAndHidesNpqApplicationId() + { + // Arrange + var npqApplicationId = default(string?); + var npqName = "Some NPQ Name"; + var npqTrainingProvider = "NPQ TRAINING PROVIDER"; + var state = CreateNewState(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = false; + state.NpqApplicationId = npqApplicationId; + state.NpqName = npqName; + state.NpqTrainingProvider = npqTrainingProvider; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); + state.Name = Faker.Name.FullName(); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = "qq 12 34 56 56 c"; + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + var doc = await AssertEx.HtmlResponseAsync(response); + Assert.Null(doc.GetSummaryListValueForKey("NPQ application ID")); + Assert.Equal(state.WorkEmail, doc.GetSummaryListValueForKey("Work email")); + Assert.Equal(state.PersonalEmail, doc.GetSummaryListValueForKey("Personal email")); + Assert.Equal(state.Name, doc.GetSummaryListValueForKey("Name")); + Assert.Null(doc.GetSummaryListValueForKey("Previous name")); + Assert.Equal(state.DateOfBirth?.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Date of birth")); + Assert.Equal(state.EvidenceFileName, doc.GetSummaryListValueForKey("Proof of identity")); + Assert.Equal(state.NationalInsuranceNumber, doc.GetSummaryListValueForKey("National Insurance number")); + Assert.Equal(npqName, doc.GetSummaryListValueForKey("NPQ")); + Assert.Equal(npqTrainingProvider, doc.GetSummaryListValueForKey("NPQ Provider")); + Assert.Equal(StatusCodes.Status200OK, (int)response.StatusCode); + } + + [Fact] + public async Task Get_GetValidRequestNpqApplicationIdProvided_HidesNpqNameAndProvider() + { + // Arrange + var npqApplicationId = "ApplicationId-12345"; + var state = CreateNewState(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = npqApplicationId; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); + state.Name = Faker.Name.FullName(); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = "qq 12 34 56 56 c"; + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + var doc = await AssertEx.HtmlResponseAsync(response); + Assert.Equal(state.NpqApplicationId, doc.GetSummaryListValueForKey("NPQ application ID")); + Assert.Equal(state.WorkEmail, doc.GetSummaryListValueForKey("Work email")); + Assert.Equal(state.PersonalEmail, doc.GetSummaryListValueForKey("Personal email")); + Assert.Equal(state.Name, doc.GetSummaryListValueForKey("Name")); + Assert.Null(doc.GetSummaryListValueForKey("Previous name")); + Assert.Equal(state.DateOfBirth?.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Date of birth")); + Assert.Equal(state.EvidenceFileName, doc.GetSummaryListValueForKey("Proof of identity")); + Assert.Equal(state.NationalInsuranceNumber, doc.GetSummaryListValueForKey("National Insurance number")); + Assert.Null(doc.GetSummaryListValueForKey("NPQ")); + Assert.Null(doc.GetSummaryListValueForKey("NPQ Provider")); + Assert.Equal(StatusCodes.Status200OK, (int)response.StatusCode); + } + + [Fact] + public async Task Get_GetValidRequestWorkingInSchoolOrEducationalSettingFalse_HidesWorkEmail() + { + // Arrange + var npqApplicationId = "ApplicationId-12345"; + var state = CreateNewState(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = npqApplicationId; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = null; + state.PersonalEmail = Faker.Internet.Email(); + state.Name = Faker.Name.FullName(); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + var doc = await AssertEx.HtmlResponseAsync(response); + Assert.Equal(state.NpqApplicationId, doc.GetSummaryListValueForKey("NPQ application ID")); + Assert.Null(doc.GetSummaryListValueForKey("Work email")); + Assert.Equal(state.PersonalEmail, doc.GetSummaryListValueForKey("Personal email")); + Assert.Equal(state.Name, doc.GetSummaryListValueForKey("Name")); + Assert.Null(doc.GetSummaryListValueForKey("Previous name")); + Assert.Equal(state.DateOfBirth?.ToString("d MMMM yyyy"), doc.GetSummaryListValueForKey("Date of birth")); + Assert.Equal(state.EvidenceFileName, doc.GetSummaryListValueForKey("Proof of identity")); + Assert.Equal(state.NationalInsuranceNumber, doc.GetSummaryListValueForKey("National Insurance number")); + Assert.Null(doc.GetSummaryListValueForKey("NPQ")); + Assert.Null(doc.GetSummaryListValueForKey("NPQ Provider")); + Assert.Equal(StatusCodes.Status200OK, (int)response.StatusCode); + } + [Fact] public async Task Post_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() { @@ -292,11 +556,57 @@ public async Task Post_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() } [Fact] - public async Task Post_HasEmailMissingFromState_RedirectsToEmail() + public async Task Post_HasWorkEmailMissingFromState_RedirectsToWorkEmail() + { + // Arrange + var state = CreateNewState(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = null; + state.PersonalEmail = Faker.Internet.Email(); + state.Name = Faker.Name.FullName(); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1998, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "Filename.jpg"; + state.EvidenceFileSizeDescription = "1.1 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } + + [Fact] + public async Task Post_HasPersonalEmailMissingFromState_RedirectsToPersonalEmail() { // Arrange var state = CreateNewState(); - state.Email = null; + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = null; + state.Name = Faker.Name.FullName(); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -306,7 +616,7 @@ public async Task Post_HasEmailMissingFromState_RedirectsToEmail() // Assert Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + Assert.Equal($"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } [Fact] @@ -314,8 +624,21 @@ public async Task Post_HasNameMissingFromState_RedirectsToName() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = null; + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -333,9 +656,21 @@ public async Task Post_HasHasPreviousNameMissingFromState_RedirectsToPreviousNam { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = null; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1999, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -353,10 +688,21 @@ public async Task Post_HasPreviousNameMissingFromState_RedirectsToPreviousName() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = true; state.PreviousName = null; + state.DateOfBirth = new DateOnly(1998, 01, 01); + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "Filename.jpg"; + state.EvidenceFileSizeDescription = "1.1 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -374,11 +720,21 @@ public async Task Post_HasDateOfBirthMissingFromState_RedirectsToDateOfBirth() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); + state.HasPreviousName = false; + state.PreviousName = null; state.DateOfBirth = null; + state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "evidence-file-name.jpg"; + state.EvidenceFileSizeDescription = "1.2 MB"; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -396,12 +752,21 @@ public async Task Post_HasEvidenceFileIdMissingFromState_RedirectsToIdentity() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1998, 01, 01); state.EvidenceFileId = null; + state.EvidenceFileName = null; + state.EvidenceFileSizeDescription = null; + state.HasNationalInsuranceNumber = true; + state.NationalInsuranceNumber = Faker.Identification.UkNationalInsuranceNumber(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -419,13 +784,21 @@ public async Task Post_HasHasNationalInsuranceNumberMissingFromState_RedirectsTo { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1998, 01, 01); state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "Filename.jpg"; + state.EvidenceFileSizeDescription = "1.1 MB"; state.HasNationalInsuranceNumber = null; + state.NationalInsuranceNumber = null; var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -443,12 +816,19 @@ public async Task Post_HasNationalInsuranceNumberTrueAndNationalInsuranceNumberM { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1998, 01, 01); state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "Filename.jpg"; + state.EvidenceFileSizeDescription = "1.1 MB"; state.HasNationalInsuranceNumber = true; state.NationalInsuranceNumber = null; var journeyInstance = await CreateJourneyInstance(state); @@ -468,13 +848,21 @@ public async Task Post_HasNationalInsuranceNumberFalseAndAddressLine1MissingFrom { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = false; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); - state.HasPreviousName = true; - state.PreviousName = Faker.Name.FullName(); - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.HasPreviousName = false; + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1998, 01, 01); state.EvidenceFileId = Guid.NewGuid(); + state.EvidenceFileName = "Filename.jpg"; + state.EvidenceFileSizeDescription = "1.1 MB"; state.HasNationalInsuranceNumber = false; + state.NationalInsuranceNumber = null; state.AddressLine1 = null; var journeyInstance = await CreateJourneyInstance(state); @@ -495,13 +883,19 @@ public async Task Post_ValidRequest_UpdatesStateAndAndRedirectsToSubmitted(bool { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.IsTakingNpq = true; + state.HaveRegisteredForAnNpq = true; + state.NpqApplicationId = "SOME ID"; + state.WorkingInSchoolOrEducationalSetting = true; + state.WorkEmail = Faker.Internet.Email(); + state.PersonalEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; - state.DateOfBirth = new DateOnly(1980, 3, 1); + state.PreviousName = null; + state.DateOfBirth = new DateOnly(1998, 01, 01); state.EvidenceFileId = Guid.NewGuid(); - state.EvidenceFileName = "evidence-file-name.jpg"; - state.EvidenceFileSizeDescription = "1.2 MB"; + state.EvidenceFileName = "Filename.jpg"; + state.EvidenceFileSizeDescription = "1.1 MB"; state.HasNationalInsuranceNumber = hasNationalInsuranceNumber; state.NationalInsuranceNumber = hasNationalInsuranceNumber ? Faker.Identification.UkNationalInsuranceNumber() : null; if (!hasNationalInsuranceNumber) diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/DateOfBirthTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/DateOfBirthTests.cs index 232f37b64..98b8186e6 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/DateOfBirthTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/DateOfBirthTests.cs @@ -42,7 +42,7 @@ public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModel { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.PreviousName = Faker.Name.FullName(); state.HasPreviousName = true; @@ -84,7 +84,7 @@ public async Task Post_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() public async Task Post_WhenNoDateOfBirthIsEntered_ReturnsError() { var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.PreviousName = Faker.Name.FullName(); state.HasPreviousName = true; @@ -106,7 +106,7 @@ public async Task Post_WhenNoDateOfBirthIsEntered_ReturnsError() public async Task Post_WhenDateOfBirthIsInTheFuture_ReturnsError() { var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.PreviousName = Faker.Name.FullName(); state.HasPreviousName = true; @@ -161,7 +161,7 @@ public async Task Post_ValidRequest_UpdatesStateAndRedirectsToNextPage() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.PreviousName = Faker.Name.FullName(); state.HasPreviousName = true; diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/EmailInUseTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/EmailInUseTests.cs index d14ea3b30..3d28b5216 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/EmailInUseTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/EmailInUseTests.cs @@ -3,7 +3,7 @@ namespace TeachingRecordSystem.AuthorizeAccess.Tests.PageTests.RequestTrn; public class EmailInUseTests(HostFixture hostFixture) : TestBase(hostFixture) { [Fact] - public async Task Get_WithoutEmailAddress_RedirectsToEmail() + public async Task Get_WithoutPersonalEmailAddress_RedirectsToEmail() { // Arrange var state = CreateNewState(); @@ -17,11 +17,11 @@ public async Task Get_WithoutEmailAddress_RedirectsToEmail() // Assert Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + Assert.Equal($"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } [Fact] - public async Task Get_WithEmailAddress_RendersExpectedContent() + public async Task Get_WithPersonalEmailAddress_RendersExpectedContent() { // Arrange var email = Faker.Internet.Email(); diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/IdentityTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/IdentityTests.cs index c71784bdf..6a6078a76 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/IdentityTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/IdentityTests.cs @@ -42,7 +42,7 @@ public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModel { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; state.DateOfBirth = new DateOnly(1980, 3, 1); @@ -107,7 +107,7 @@ public async Task Post_WhenNoEvidenceFileIsSelected_ReturnsError() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; state.DateOfBirth = new DateOnly(1980, 3, 1); @@ -127,7 +127,7 @@ public async Task Post_WhenEvidenceFileIsInvalidType_ReturnsError() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; state.DateOfBirth = new DateOnly(1980, 3, 1); @@ -152,7 +152,7 @@ public async Task Post_ValidRequest_UpdatesStateAndRedirectsToNextPage() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; state.DateOfBirth = new DateOnly(1980, 3, 1); diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NameTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NameTests.cs index 313703d19..5413e5437 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NameTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NameTests.cs @@ -21,10 +21,13 @@ public async Task Get_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() } [Fact] - public async Task Get_EmailMissingFromState_RedirectsToEmail() + public async Task Get_PersonalEmailMissingFromState_RedirectsToPersonalEmail() { // Arrange var state = CreateNewState(); + state.WorkingInSchoolOrEducationalSetting = true; + state.PersonalEmail = null; + state.WorkEmail = Faker.Internet.Email(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/name?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -34,7 +37,7 @@ public async Task Get_EmailMissingFromState_RedirectsToEmail() // Assert Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + Assert.Equal($"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } [Fact] @@ -42,7 +45,9 @@ public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModel { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkingInSchoolOrEducationalSetting = true; + state.PersonalEmail = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); var journeyInstance = await CreateJourneyInstance(state); @@ -79,7 +84,9 @@ public async Task Post_EmptyNameEntered_ReturnsError() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkingInSchoolOrEducationalSetting = true; + state.PersonalEmail = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/name?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -88,24 +95,58 @@ public async Task Post_EmptyNameEntered_ReturnsError() var response = await HttpClient.SendAsync(request); // Assert - await AssertEx.HtmlResponseHasErrorAsync(response, "Name", "Enter your full name"); + await AssertEx.HtmlResponseHasErrorAsync(response, "Name", "Enter your name"); } [Fact] - public async Task Post_EmailMissingFromState_RedirectsToEmail() + public async Task Post_PersonalEmailMissingFromState_RedirectsToPersonalEmail() { // Arrange var state = CreateNewState(); + state.WorkingInSchoolOrEducationalSetting = true; + state.PersonalEmail = null; var journeyInstance = await CreateJourneyInstance(state); - var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/name?{journeyInstance.GetUniqueIdQueryParameter()}"); + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/name?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + ["Name"] = Faker.Name.FullName() + }), + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } + + [Fact] + public async Task Post_WorkEmailMissingFromState_RedirectsToWorkEmail() + { + // Arrange + var state = CreateNewState(); + state.WorkingInSchoolOrEducationalSetting = true; + state.PersonalEmail = Faker.Internet.Email(); + state.WorkEmail = null; + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/name?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + ["Name"] = Faker.Name.FullName() + }), + }; // Act var response = await HttpClient.SendAsync(request); // Assert Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + Assert.Equal($"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } [Fact] @@ -113,7 +154,9 @@ public async Task Post_ValidRequest_UpdatesStateAndRedirectsToNextPage() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkingInSchoolOrEducationalSetting = true; + state.PersonalEmail = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); var journeyInstance = await CreateJourneyInstance(state); var name = Faker.Name.FullName(); diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NationalInsuranceNumberTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NationalInsuranceNumberTests.cs index 1510617b4..e23ac2ede 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NationalInsuranceNumberTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NationalInsuranceNumberTests.cs @@ -42,7 +42,7 @@ public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModel { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; state.DateOfBirth = new DateOnly(1980, 3, 1); @@ -103,7 +103,7 @@ public async Task Post_WhenHasNationalInsuranceNumberHasNoSelection_ReturnsError { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; state.DateOfBirth = new DateOnly(1980, 3, 1); @@ -132,7 +132,7 @@ public async Task Post_WhenHasNationalInsuranceNumberIsTrueAndNationalInsuranceN { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; state.DateOfBirth = new DateOnly(1980, 3, 1); @@ -161,7 +161,7 @@ public async Task Post_WhenHasNationalInsuranceNumberIsTrueAndNationalInsuranceN { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; state.DateOfBirth = new DateOnly(1980, 3, 1); @@ -193,7 +193,7 @@ public async Task Post_ValidRequest_UpdatesStateAndRedirectsToNextPage(bool hasN { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.HasPreviousName = false; state.DateOfBirth = new DateOnly(1980, 3, 1); diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NotEligibleTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NotEligibleTests.cs index f65d89448..3b6799169 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NotEligibleTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NotEligibleTests.cs @@ -21,7 +21,7 @@ public async Task Get_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() } [Fact] - public async Task Get_HasIsPlanningToTakeAnNpqMissingFromState_RedirectsToNpqCheck() + public async Task Get_IsTakingAnNpqMissingFromState_RedirectsToNpqCheck() { // Arrange var state = CreateNewState(); @@ -34,7 +34,7 @@ public async Task Get_HasIsPlanningToTakeAnNpqMissingFromState_RedirectsToNpqChe // Assert Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + Assert.Equal($"/request-trn/taking-npq?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } [Fact] @@ -42,7 +42,7 @@ public async Task Get_ValidRequest_RendersExpectedContent() { // Arrange var state = CreateNewState(); - state.IsPlanningToTakeAnNpq = false; + state.IsTakingNpq = false; var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/not-eligible?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -73,10 +73,11 @@ public async Task Post_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() } [Fact] - public async Task Post_HasIsPlanningToTakeAnNpqMissingFromState_RedirectsToNpqCheck() + public async Task Post_IsTakingAnNpqMissingFromState_RedirectsToNpqCheck() { // Arrange var state = CreateNewState(); + state.IsTakingNpq = null; var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/not-eligible?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -86,6 +87,6 @@ public async Task Post_HasIsPlanningToTakeAnNpqMissingFromState_RedirectsToNpqCh // Assert Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + Assert.Equal($"/request-trn/taking-npq?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } } diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqApplicationTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqApplicationTests.cs new file mode 100644 index 000000000..74133b270 --- /dev/null +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqApplicationTests.cs @@ -0,0 +1,87 @@ +namespace TeachingRecordSystem.AuthorizeAccess.Tests.PageTests.RequestTrn; + +public class NpqApplicationTests(HostFixture hostFixture) : TestBase(hostFixture) +{ + [Fact] + public async Task Get_ValidRequest_RendersExpectedContent() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/npq-application?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseAsync(response); + } + + [Fact] + public async Task Post_EmptyNpqApplicationIdEntered_ReturnsError() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-application?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContentBuilder + { + } + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseHasErrorAsync(response, "NpqApplicationId", "Enter your NPQ application ID"); + } + + [Fact] + public async Task Post_NpqApplicationId_RedirectsToSchoolOrEducationalSetting() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-application?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + ["NpqApplicationId"] = "NPQ APPLICATION ID" + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/school-or-educational-setting?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } + + [Fact] + public async Task Post_NpqApplicationIdWithCheckAnswersTrue_RedirectsToCheckAnswers() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-application?{journeyInstance.GetUniqueIdQueryParameter()}&FromCheckAnswers=true") + { + Content = new FormUrlEncodedContent(new Dictionary + { + ["NpqApplicationId"] = "NPQ APPLICATION ID" + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } +} diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqCheckTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqCheckTests.cs index aed7e9c48..fa672f4fe 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqCheckTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqCheckTests.cs @@ -3,11 +3,10 @@ namespace TeachingRecordSystem.AuthorizeAccess.Tests.PageTests.RequestTrn; public class NpqCheckTests(HostFixture hostFixture) : TestBase(hostFixture) { [Fact] - public async Task Get_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() + public async Task Get_ValidRequest_RendersExpectedContent() { // Arrange var state = CreateNewState(); - state.HasPendingTrnRequest = true; var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}"); @@ -16,59 +15,60 @@ public async Task Get_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() var response = await HttpClient.SendAsync(request); // Assert - Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/submitted?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + await AssertEx.HtmlResponseAsync(response); } [Fact] - public async Task Get_ValidRequest_RendersExpectedContent() + public async Task Post_WhenIsTakingAnNpqHasNoSelection_ReturnsError() { // Arrange var state = CreateNewState(); var journeyInstance = await CreateJourneyInstance(state); - var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}"); + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}"); // Act var response = await HttpClient.SendAsync(request); // Assert - await AssertEx.HtmlResponseAsync(response); + await AssertEx.HtmlResponseHasErrorAsync(response, "HaveRegisteredForAnNpq", "Select yes if you’ve already registered for an NPQ"); } [Fact] - public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModelFromJourneyState() + public async Task Post_Yes_RedirectsToNotNotEligible() { // Arrange var state = CreateNewState(); - state.IsPlanningToTakeAnNpq = true; var journeyInstance = await CreateJourneyInstance(state); - var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}"); + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + ["HaveRegisteredForAnNpq"] = "true" + }) + }; // Act var response = await HttpClient.SendAsync(request); // Assert - var doc = await AssertEx.HtmlResponseAsync(response); - var radioButtons = doc.GetElementsByName("IsPlanningToTakeAnNpq"); - var selectedRadioButton = radioButtons.Single(r => r.HasAttribute("checked")); - Assert.Equal("True", selectedRadioButton.GetAttribute("value")); + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/npq-application?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } [Fact] - public async Task Post_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() + public async Task Post_No_RedirectsToNotNotEligible() { // Arrange var state = CreateNewState(); - state.HasPendingTrnRequest = true; var journeyInstance = await CreateJourneyInstance(state); var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}") { Content = new FormUrlEncodedContent(new Dictionary { - ["IsPlanningToTakeAnNpq"] = "true" + ["HaveRegisteredForAnNpq"] = "false" }) }; @@ -77,54 +77,44 @@ public async Task Post_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() // Assert Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/submitted?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + Assert.Equal($"/request-trn/npq-name?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } [Fact] - public async Task Post_WhenIsPlanningToTakeAnNpqHasNoSelection_ReturnsError() + public async Task Get_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() { // Arrange var state = CreateNewState(); + state.HasPendingTrnRequest = true; var journeyInstance = await CreateJourneyInstance(state); - var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}"); + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}"); // Act var response = await HttpClient.SendAsync(request); // Assert - await AssertEx.HtmlResponseHasErrorAsync(response, "IsPlanningToTakeAnNpq", "Tell us whether you plan on taking a national professional qualification (NPQ)"); + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/submitted?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } - [Theory] - [InlineData("true")] - [InlineData("false")] - public async Task Post_ValidRequest_UpdatesJourneyStateAndRedirects(string isPlanningToTakeAnNpq) + [Fact] + public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModelFromJourneyState() { // Arrange var state = CreateNewState(); + state.HaveRegisteredForAnNpq = true; var journeyInstance = await CreateJourneyInstance(state); - var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}") - { - Content = new FormUrlEncodedContent(new Dictionary - { - ["IsPlanningToTakeAnNpq"] = isPlanningToTakeAnNpq - }) - }; + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}"); // Act var response = await HttpClient.SendAsync(request); // Assert - Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - if (isPlanningToTakeAnNpq == "true") - { - Assert.Equal($"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); - } - else - { - Assert.Equal($"/request-trn/not-eligible?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); - } + var doc = await AssertEx.HtmlResponseAsync(response); + var radioButtons = doc.GetElementsByName("HaveRegisteredForAnNpq"); + var selectedRadioButton = radioButtons.Single(r => r.HasAttribute("checked")); + Assert.Equal("True", selectedRadioButton.GetAttribute("value")); } } diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqNameTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqNameTests.cs new file mode 100644 index 000000000..220c36019 --- /dev/null +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqNameTests.cs @@ -0,0 +1,87 @@ +namespace TeachingRecordSystem.AuthorizeAccess.Tests.PageTests.RequestTrn; + +public class NpqNameTests(HostFixture hostFixture) : TestBase(hostFixture) +{ + [Fact] + public async Task Get_ValidRequest_RendersExpectedContent() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/npq-name?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseAsync(response); + } + + [Fact] + public async Task Post_EmptyNpqNameEntered_ReturnsError() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-name?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContentBuilder + { + } + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseHasErrorAsync(response, "NpqName", "Enter the NPQ you plan on taking"); + } + + [Fact] + public async Task Post_ValidRequestWithValidData_RedirectsToNpqProviderPage() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-name?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + { "NpqName", "SOME NPQ" } + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/npq-provider?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } + + [Fact] + public async Task Post_ValidRequestWithValidDataAndFromCheckAnswersTrue_RedirectsToCheckAnswers() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-name?{journeyInstance.GetUniqueIdQueryParameter()}&FromCheckAnswers=true") + { + Content = new FormUrlEncodedContent(new Dictionary + { + { "NpqName", "SOME NPQ" } + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } +} diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqProviderTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqProviderTests.cs new file mode 100644 index 000000000..7e4488ca3 --- /dev/null +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/NpqProviderTests.cs @@ -0,0 +1,87 @@ +namespace TeachingRecordSystem.AuthorizeAccess.Tests.PageTests.RequestTrn; + +public class NpqProviderTests(HostFixture hostFixture) : TestBase(hostFixture) +{ + [Fact] + public async Task Get_ValidRequest_RendersExpectedContent() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/npq-provider?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseAsync(response); + } + + [Fact] + public async Task Post_EmptyNpqTrainingProviderEntered_ReturnsError() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-provider?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContentBuilder + { + } + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseHasErrorAsync(response, "NpqTrainingProvider", "Enter your NPQ training provider"); + } + + [Fact] + public async Task Post_ValidRequestWithValidData_RedirectsToNpqProviderPage() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-provider?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + { "NpqTrainingProvider", "SOME NPQ Provider" } + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/school-or-educational-setting?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } + + [Fact] + public async Task Post_ValidRequestWithValidDataWithFromCheckAnswersTrue_RedirectsToCheckAnswersPage() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/npq-provider?{journeyInstance.GetUniqueIdQueryParameter()}&FromCheckAnswers=true") + { + Content = new FormUrlEncodedContent(new Dictionary + { + { "NpqTrainingProvider", "SOME NPQ Provider" } + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } +} diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/EmailTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/PersonalEmailTests.cs similarity index 68% rename from TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/EmailTests.cs rename to TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/PersonalEmailTests.cs index 04adcfe85..045097704 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/EmailTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/PersonalEmailTests.cs @@ -1,6 +1,6 @@ namespace TeachingRecordSystem.AuthorizeAccess.Tests.PageTests.RequestTrn; -public class EmailTests(HostFixture hostFixture) : TestBase(hostFixture) +public class PersonalEmailTests(HostFixture hostFixture) : TestBase(hostFixture) { [Fact] public async Task Get_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() @@ -10,7 +10,7 @@ public async Task Get_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() state.HasPendingTrnRequest = true; var journeyInstance = await CreateJourneyInstance(state); - var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}"); + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}"); // Act var response = await HttpClient.SendAsync(request); @@ -21,65 +21,59 @@ public async Task Get_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() } [Fact] - public async Task Get_ValidRequest_RendersExpectedContent() - { - // Arrange - var state = CreateNewState(); - var journeyInstance = await CreateJourneyInstance(state); - - var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}"); - - // Act - var response = await HttpClient.SendAsync(request); - - // Assert - await AssertEx.HtmlResponseAsync(response); - } - - [Fact] - public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModelFromJourneyState() + public async Task Post_RequestForEmailWithOpenTasks_RedirectsToEmailInUse() { // Arrange var email = Faker.Internet.Email(); - var state = CreateNewState(email); + var state = CreateNewState(); var journeyInstance = await CreateJourneyInstance(state); + var person = await TestData.CreatePersonAsync(); + await TestData.CreateCrmTaskAsync(x => + { + x.WithPersonId(person.ContactId); + x.WithEmailAddress(email); + }); - var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}"); + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + { "PersonalEmail", email } + }) + }; // Act var response = await HttpClient.SendAsync(request); // Assert - var doc = await AssertEx.HtmlResponseAsync(response); - Assert.Equal(email, doc.GetElementById("Email")?.GetAttribute("value")); + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/emailinuse?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } [Fact] - public async Task Post_HasPendingTrnRequestSetTrue_RedirectsToSubmitted() + public async Task Get_ValidRequest_RendersExpectedContent() { // Arrange var state = CreateNewState(); - state.HasPendingTrnRequest = true; var journeyInstance = await CreateJourneyInstance(state); - var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}"); + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}"); // Act var response = await HttpClient.SendAsync(request); // Assert - Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/submitted?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + await AssertEx.HtmlResponseAsync(response); } [Fact] - public async Task Post_EmptyEmailAddressEntered_ReturnsError() + public async Task Post_EmptyPersonalEmailAddressEntered_ReturnsError() { // Arrange var state = CreateNewState(); var journeyInstance = await CreateJourneyInstance(state); - var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}") + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}") { Content = new FormUrlEncodedContentBuilder { @@ -90,22 +84,22 @@ public async Task Post_EmptyEmailAddressEntered_ReturnsError() var response = await HttpClient.SendAsync(request); // Assert - await AssertEx.HtmlResponseHasErrorAsync(response, "Email", "Enter your email address"); + await AssertEx.HtmlResponseHasErrorAsync(response, "PersonalEmail", "Enter your personal email address"); } [Fact] - public async Task Post_InvalidFormatEmailAddress_ReturnsError() + public async Task Post_InvalidFormatPersonalEmailAddress_ReturnsError() { // Arrange var state = CreateNewState(); var journeyInstance = await CreateJourneyInstance(state); var invalidEmail = "invalid-email"; - var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}") + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}") { Content = new FormUrlEncodedContentBuilder { - { "Email", invalidEmail } + { "PersonalEmail", invalidEmail } } }; @@ -113,7 +107,7 @@ public async Task Post_InvalidFormatEmailAddress_ReturnsError() var response = await HttpClient.SendAsync(request); // Assert - await AssertEx.HtmlResponseHasErrorAsync(response, "Email", "Enter an email address in the correct format, like name@example.com"); + await AssertEx.HtmlResponseHasErrorAsync(response, "PersonalEmail", "Enter an email address in the correct format, like name@example.com"); } [Fact] @@ -124,11 +118,11 @@ public async Task Post_ValidRequestWithValidData_RedirectsToNamePage() var journeyInstance = await CreateJourneyInstance(state); var email = Faker.Internet.Email(); - var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}") + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}") { Content = new FormUrlEncodedContent(new Dictionary { - { "Email", email } + { "PersonalEmail", email } }) }; @@ -141,24 +135,18 @@ public async Task Post_ValidRequestWithValidData_RedirectsToNamePage() } [Fact] - public async Task Post_RequestForEmailWithOpenTasks_RedirectsToEmailInUse() + public async Task Post_ValidRequestWithValidDataAndFromCheckAnswersTrue_RedirectsToNamePage() { // Arrange - var email = Faker.Internet.Email(); var state = CreateNewState(); var journeyInstance = await CreateJourneyInstance(state); - var person = await TestData.CreatePersonAsync(); - await TestData.CreateCrmTaskAsync(x => - { - x.WithPersonId(person.ContactId); - x.WithEmailAddress(email); - }); - var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/email?{journeyInstance.GetUniqueIdQueryParameter()}") + var email = Faker.Internet.Email(); + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}&FromCheckAnswers=true") { Content = new FormUrlEncodedContent(new Dictionary { - { "Email", email } + { "PersonalEmail", email } }) }; @@ -167,6 +155,6 @@ await TestData.CreateCrmTaskAsync(x => // Assert Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); - Assert.Equal($"/request-trn/emailinuse?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + Assert.Equal($"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); } } diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/PreviousNameTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/PreviousNameTests.cs index 9fac2dabd..7ba4c1624 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/PreviousNameTests.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/PreviousNameTests.cs @@ -42,7 +42,7 @@ public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModel { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); state.PreviousName = Faker.Name.FullName(); state.HasPreviousName = true; @@ -101,7 +101,7 @@ public async Task Post_WhenHasPreviousNameHasNoSelection_ReturnsError() { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); var journeyInstance = await CreateJourneyInstance(state); @@ -125,7 +125,7 @@ public async Task Post_WhenHasPreviousNameIsTrueAndPreviousNameIsEmpty_ReturnsEr { // Arrange var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); var journeyInstance = await CreateJourneyInstance(state); @@ -148,7 +148,7 @@ public async Task Post_WhenHasPreviousNameIsTrueAndPreviousNameIsEmpty_ReturnsEr public async Task Post_ValidRequest_UpdatesStateAndRedirectsToNextPage() { var state = CreateNewState(); - state.Email = Faker.Internet.Email(); + state.WorkEmail = Faker.Internet.Email(); state.Name = Faker.Name.FullName(); var journeyInstance = await CreateJourneyInstance(state); diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/SchoolOrEducationalSettingTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/SchoolOrEducationalSettingTests.cs new file mode 100644 index 000000000..59ed701d4 --- /dev/null +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/SchoolOrEducationalSettingTests.cs @@ -0,0 +1,87 @@ +namespace TeachingRecordSystem.AuthorizeAccess.Tests.PageTests.RequestTrn; + +public class SchoolOrEducationalSettingTests(HostFixture hostFixture) : TestBase(hostFixture) +{ + [Fact] + public async Task Get_ValidRequest_RendersExpectedContent() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/school-or-educational-setting?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseAsync(response); + } + + [Fact] + public async Task Post_EmptyIsWorkingInSchoolOrEducationalSettingEntered_ReturnsError() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/school-or-educational-setting?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContentBuilder + { + } + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseHasErrorAsync(response, "IsWorkingInSchoolOrEducationalSetting", "Select yes if you’re currently working in a school or other educational setting"); + } + + [Fact] + public async Task Post_Yes_RedirectsToEmail() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/school-or-educational-setting?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + ["IsWorkingInSchoolOrEducationalSetting"] = "true" + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } + + [Fact] + public async Task Post_No_RedirectsToPersonalEmail() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/school-or-educational-setting?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + ["IsWorkingInSchoolOrEducationalSetting"] = "false" + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } +} diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/TakingNpqTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/TakingNpqTests.cs new file mode 100644 index 000000000..e36f48253 --- /dev/null +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/TakingNpqTests.cs @@ -0,0 +1,82 @@ +namespace TeachingRecordSystem.AuthorizeAccess.Tests.PageTests.RequestTrn; + +public class TakingNpqTests(HostFixture hostFixture) : TestBase(hostFixture) +{ + [Fact] + public async Task Get_ValidRequest_RendersExpectedContent() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/taking-npq?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseAsync(response); + } + + [Fact] + public async Task Post_WhenIsTakingAnNpqHasNoSelection_ReturnsError() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/taking-npq?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseHasErrorAsync(response, "IsTakingAnNpq", "Select yes if you need a TRN because you’re taking an NPQ"); + } + + [Fact] + public async Task Post_No_RedirectsToNotNotEligible() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/taking-npq?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + ["IsTakingAnNpq"] = "false" + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/not-eligible?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } + + [Fact] + public async Task Post_Yes_RedirectsToNpqCheck() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/taking-npq?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + ["IsTakingAnNpq"] = "true" + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/npq-check?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } +} diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/TestBase.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/TestBase.cs index 876a03ad2..001e38d2a 100644 --- a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/TestBase.cs +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/TestBase.cs @@ -65,7 +65,7 @@ public async Task> ReloadJourneyInstance return (JourneyInstance)reloadedInstance!; } - public RequestTrnJourneyState CreateNewState(string? email = null) => new RequestTrnJourneyState() { Email = email }; + public RequestTrnJourneyState CreateNewState(string? email = null) => new RequestTrnJourneyState() { PersonalEmail = email }; public virtual void Dispose() { diff --git a/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/WorkEmailTests.cs b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/WorkEmailTests.cs new file mode 100644 index 000000000..be99d24c1 --- /dev/null +++ b/TeachingRecordSystem/tests/TeachingRecordSystem.AuthorizeAccess.Tests/PageTests/RequestTrn/WorkEmailTests.cs @@ -0,0 +1,131 @@ +namespace TeachingRecordSystem.AuthorizeAccess.Tests.PageTests.RequestTrn; + +public class WorkEmailTests(HostFixture hostFixture) : TestBase(hostFixture) +{ + [Fact] + public async Task Get_ValidRequest_RendersExpectedContent() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseAsync(response); + } + + [Fact] + public async Task Get_ValidRequestWithPopulatedDataInJourneyState_PopulatesModelFromJourneyState() + { + // Arrange + var email = Faker.Internet.Email(); + var state = CreateNewState(); + state.WorkEmail = email; + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Get, $"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}"); + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + var doc = await AssertEx.HtmlResponseAsync(response); + Assert.Equal(email, doc.GetElementById("WorkEmail")?.GetAttribute("value")); + } + + [Fact] + public async Task Post_EmptyEmailAddressEntered_ReturnsError() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContentBuilder + { + } + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseHasErrorAsync(response, "WorkEmail", "Enter your work email address"); + } + + [Fact] + public async Task Post_InvalidFormatEmailAddress_ReturnsError() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + var invalidEmail = "invalid-email"; + + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContentBuilder + { + { "WorkEmail", invalidEmail } + } + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + await AssertEx.HtmlResponseHasErrorAsync(response, "WorkEmail", "Enter an email address in the correct format, like name@example.com"); + } + + [Fact] + public async Task Post_ValidRequestWithValidData_RedirectsToPersonalEmailPage() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var email = Faker.Internet.Email(); + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}") + { + Content = new FormUrlEncodedContent(new Dictionary + { + { "WorkEmail", email } + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/personal-email?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } + + [Fact] + public async Task Post_ValidRequestWithValidDataAndFromCheckAnswersTrue_RedirectsToCheckAnswers() + { + // Arrange + var state = CreateNewState(); + var journeyInstance = await CreateJourneyInstance(state); + + var email = Faker.Internet.Email(); + var request = new HttpRequestMessage(HttpMethod.Post, $"/request-trn/work-email?{journeyInstance.GetUniqueIdQueryParameter()}&FromCheckAnswers=true") + { + Content = new FormUrlEncodedContent(new Dictionary + { + { "WorkEmail", email } + }) + }; + + // Act + var response = await HttpClient.SendAsync(request); + + // Assert + Assert.Equal(StatusCodes.Status302Found, (int)response.StatusCode); + Assert.Equal($"/request-trn/check-answers?{journeyInstance.GetUniqueIdQueryParameter()}", response.Headers.Location?.OriginalString); + } +}