-
Notifications
You must be signed in to change notification settings - Fork 3
feat(#428): Add non-strategic hearing list types for SIAC, POAC, PAAC, FTT Tax Chamber, FTT LRT and FTT RPT #749
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
junaidiqbalmoj
merged 26 commits into
master
from
feature/428-tribunal-non-strategic-publishing
Jul 3, 2026
Merged
Changes from all commits
Commits
Show all changes
26 commits
Select commit
Hold shift + click to select a range
78bace2
feat(#428): Add non-strategic hearing list types for SIAC, POAC, PAAC…
junaidiqbalmoj 1a0ae8e
fix(#428): Address review feedback for non-strategic publishing
junaidiqbalmoj 4ed8e88
refactor(#428): Consolidate duplicate FTT RPT NJK templates into a si…
junaidiqbalmoj cd845fd
refactor(#428): Move hardcoded FTT RPT court names into locale files
junaidiqbalmoj fac2b76
fix(#428): Fix build:views script for ftt-rpt lib
junaidiqbalmoj 29a52bf
Merge branch 'master' into feature/428-tribunal-non-strategic-publishing
junaidiqbalmoj 87316c8
code review refactoring
junaidiqbalmoj bcf5755
Merge branch 'master' into feature/428-tribunal-non-strategic-publishing
junaidiqbalmoj b253e48
Fix code review comments
junaidiqbalmoj f9ae375
Merge branch 'master' into feature/428-tribunal-non-strategic-publishing
junaidiqbalmoj c92f656
Merge branch 'master' into feature/428-tribunal-non-strategic-publishing
junaidiqbalmoj adc4874
Merge remote-tracking branch into feature/428-tribunal-non-strategic-…
junaidiqbalmoj b035fe1
refactor(#428): Consolidate duplicate SIAC/POAC/PAAC NJK templates in…
junaidiqbalmoj f84461f
remove script not required
junaidiqbalmoj 3ffed41
fix(#428): Update SIAC/POAC/PAAC urlPath to point to consolidated page
junaidiqbalmoj 293d290
fix(#428): Mock @hmcts/azure-blob in pdf-generator tests to prevent u…
junaidiqbalmoj 329a30e
fix(#428): Mock @hmcts/azure-blob in ftt-tax-chamber pdf-generator te…
junaidiqbalmoj 6d5131b
fix(#428): Mock @hmcts/azure-blob in ftt-lrt pdf-generator tests to p…
junaidiqbalmoj 2202932
refactor(#428): Extract shared PDF generation logic into generateFttS…
junaidiqbalmoj 28ed713
fix bugs
junaidiqbalmoj 05aa2ee
merge(#428): Resolve conflicts between feature/428 and master branches
junaidiqbalmoj 416db8f
fix(#428): Update SIAC/FTT renderer tests to match zero-padded date f…
junaidiqbalmoj fc272c4
chore: sort package.json dependencies alphabetically
junaidiqbalmoj f03d8d6
fix: restore missing migration SQL files and remove orphan migration …
junaidiqbalmoj 5bee15d
Revert "fix: restore missing migration SQL files and remove orphan mi…
junaidiqbalmoj f1b27ab
fix bug (add new line for RR text)
junaidiqbalmoj File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
76 changes: 76 additions & 0 deletions
76
...tion-tribunal-weekly-hearing-list/ftt-lands-registration-tribunal-weekly-hearing-list.njk
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,76 @@ | ||
| {% extends "layouts/base-template.njk" %} | ||
|
|
||
|
|
||
| {% block page_content %} | ||
| <div class="govuk-grid-row"> | ||
| <div class="govuk-grid-column-full"> | ||
|
|
||
| <h1 class="govuk-heading-l" id="top">{{ header.listTitle }}</h1> | ||
|
|
||
| <p class="govuk-body"> | ||
| <a href="{{ t.factLinkUrl }}" class="govuk-link">{{ t.factLinkText }}</a> {{ t.factAdditionalText }} | ||
| </p> | ||
|
|
||
| <p class="govuk-body govuk-!-font-weight-bold govuk-!-margin-bottom-1">{{ t.listForWeekCommencing }} {{ header.weekCommencingDate }}</p> | ||
| <p class="govuk-body">{{ t.lastUpdated }} {{ header.lastUpdatedDate }} {{ t.at }} {{ header.lastUpdatedTime }}</p> | ||
|
|
||
| <details class="govuk-details govuk-!-margin-top-6" data-module="govuk-details" open> | ||
| <summary class="govuk-details__summary"> | ||
| <span class="govuk-details__summary-text"> | ||
| {{ t.importantInformationTitle }} | ||
| </span> | ||
| </summary> | ||
| <div class="govuk-details__text"> | ||
| <p class="govuk-body">{{ t.importantInformationText }}</p> | ||
| <p class="govuk-body"> | ||
| <a href="{{ t.importantInformationLinkUrl }}" class="govuk-link" target="_blank" rel="noopener noreferrer"> | ||
| {{ t.importantInformationLinkText }} | ||
| </a> | ||
| </p> | ||
| </div> | ||
| </details> | ||
|
|
||
| <div class="govuk-form-group govuk-!-margin-top-6"> | ||
| <h2 class="govuk-heading-s">{{ t.searchCasesTitle }}</h2> | ||
| <label class="govuk-label govuk-visually-hidden" for="case-search-input"> | ||
| {{ t.searchCasesLabel }} | ||
| </label> | ||
| <input class="govuk-input govuk-!-width-one-half" id="case-search-input" name="search" type="text" aria-label="{{ t.searchCasesLabel }}"> | ||
| </div> | ||
|
|
||
| <div id="hearings-table-container"> | ||
| <table class="govuk-table" id="hearings-table" role="table" aria-label="{{ header.listTitle }}"> | ||
| <thead class="govuk-table__head"> | ||
| <tr class="govuk-table__row"> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.date }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.hearingTime }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.caseName }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.caseReferenceNumber }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.judge }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.venuePlatform }}</th> | ||
| </tr> | ||
| </thead> | ||
| <tbody class="govuk-table__body"> | ||
| {% for hearing in hearings %} | ||
| <tr class="govuk-table__row"> | ||
| <td class="govuk-table__cell">{{ hearing.date }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.hearingTime }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.caseName }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.caseReferenceNumber }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.judge }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.venuePlatform }}</td> | ||
| </tr> | ||
| {% endfor %} | ||
| </tbody> | ||
| </table> | ||
| </div> | ||
|
|
||
| <p class="govuk-body-s govuk-!-margin-top-6">{{ t.dataSource }}: {{ dataSource }}</p> | ||
|
|
||
| <div class="govuk-!-margin-top-6"> | ||
| <a href="#top" class="govuk-link">{{ t.backToTop }}</a> | ||
| </div> | ||
|
|
||
| </div> | ||
| </div> | ||
| {% endblock %} |
146 changes: 146 additions & 0 deletions
146
.../src/pages/(list-types)/ftt-lands-registration-tribunal-weekly-hearing-list/index.test.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,146 @@ | ||
| import type { Request, Response } from "express"; | ||
| import { beforeEach, describe, expect, it, vi } from "vitest"; | ||
|
|
||
| const mockValidate = vi.hoisted(() => vi.fn()); | ||
|
|
||
| vi.mock("@hmcts/list-types-common", () => ({ | ||
| createJsonValidator: () => mockValidate, | ||
| provenanceLabelsEn: { MANUAL_UPLOAD: "Manual Upload", SNL: "ListAssist", COMMON_PLATFORM: "Common Platform", CP_CATH: "Libra", PDDA: "PDDA" }, | ||
| provenanceLabelsCy: { MANUAL_UPLOAD: "Lanlwytho â Llaw", SNL: "ListAssist", COMMON_PLATFORM: "Common Platform", CP_CATH: "Libra", PDDA: "PDDA" } | ||
| })); | ||
|
|
||
| vi.mock("@hmcts/publication", () => ({ | ||
| getArtefactById: vi.fn(), | ||
| getPublicationJson: vi.fn(), | ||
| PROVENANCE_LABELS: { MANUAL_UPLOAD: "Manual Upload", SNL: "ListAssist" } | ||
| })); | ||
|
|
||
| vi.mock("@hmcts/ftt-lands-registration-tribunal-weekly-hearing-list", () => ({ | ||
| fttLrtWeeklyHearingListEn: { | ||
| pageTitle: "First-tier Tribunal (Land Registration Tribunal) Weekly Hearing List", | ||
| provenanceLabels: { MANUAL_UPLOAD: "Manual Upload", SNL: "ListAssist" } | ||
| }, | ||
| fttLrtWeeklyHearingListCy: { | ||
| pageTitle: "First-tier Tribunal (Land Registration Tribunal) Weekly Hearing List", | ||
| provenanceLabels: { MANUAL_UPLOAD: "Lanlwytho â Llaw", SNL: "ListAssist" } | ||
| }, | ||
| renderFttLrtData: vi.fn() | ||
| })); | ||
|
|
||
| import { renderFttLrtData } from "@hmcts/ftt-lands-registration-tribunal-weekly-hearing-list"; | ||
| import { getArtefactById, getPublicationJson } from "@hmcts/publication"; | ||
| import { GET } from "./index.js"; | ||
|
|
||
| const MOCK_ARTEFACT = { | ||
| artefactId: "test-artefact-123", | ||
| listTypeId: 32, | ||
| contentDate: new Date("2026-01-01"), | ||
| lastReceivedDate: new Date("2026-01-01T12:00:00Z"), | ||
| provenance: "MANUAL_UPLOAD" | ||
| }; | ||
|
|
||
| const MOCK_JSON_DATA = [ | ||
| { | ||
| date: "01/01/2026", | ||
| hearingTime: "10:00am", | ||
| caseName: "A Vs B", | ||
| caseReferenceNumber: "LRT/00001/2026", | ||
| judge: "Judge Smith", | ||
| venuePlatform: "London" | ||
| } | ||
| ]; | ||
|
|
||
| describe("FTT Land Registration Tribunal Weekly Hearing List page controller", () => { | ||
| let req: Partial<Request>; | ||
| let res: Partial<Response>; | ||
|
|
||
| beforeEach(() => { | ||
| vi.clearAllMocks(); | ||
| req = { query: {} }; | ||
| res = { status: vi.fn().mockReturnThis(), render: vi.fn(), locals: { locale: "en" } }; | ||
| }); | ||
|
|
||
| describe("GET handler", () => { | ||
| it("should render the list successfully with valid data", async () => { | ||
| // Arrange | ||
| const mockRenderedData = { | ||
| header: { | ||
| listTitle: "First-tier Tribunal (Land Registration Tribunal) Weekly Hearing List", | ||
| weekCommencingDate: "1 January 2026", | ||
| lastUpdatedDate: "1 January 2026", | ||
| lastUpdatedTime: "12pm" | ||
| }, | ||
| hearings: [] | ||
| }; | ||
|
|
||
| req.query = { artefactId: "test-artefact-123" }; | ||
| vi.mocked(getArtefactById).mockResolvedValue(MOCK_ARTEFACT as any); | ||
| vi.mocked(getPublicationJson).mockResolvedValue(MOCK_JSON_DATA); | ||
| mockValidate.mockReturnValue({ isValid: true, errors: [] }); | ||
| vi.mocked(renderFttLrtData).mockReturnValue(mockRenderedData as any); | ||
|
|
||
| // Act | ||
| await GET(req as Request, res as Response); | ||
|
|
||
| // Assert | ||
| expect(getPublicationJson).toHaveBeenCalledWith("test-artefact-123"); | ||
| expect(renderFttLrtData).toHaveBeenCalledWith(MOCK_JSON_DATA, expect.objectContaining({ courtName: "First-tier Tribunal (Land Registration Tribunal)" })); | ||
| expect(res.render).toHaveBeenCalledWith("ftt-lands-registration-tribunal-weekly-hearing-list", expect.objectContaining({ dataSource: "Manual Upload" })); | ||
| }); | ||
|
|
||
| it("should return 400 when artefactId is missing", async () => { | ||
| req.query = {}; | ||
| await GET(req as Request, res as Response); | ||
| expect(res.status).toHaveBeenCalledWith(400); | ||
| expect(res.render).toHaveBeenCalledWith("errors/common", expect.objectContaining({ errorTitle: "Bad Request" })); | ||
| }); | ||
|
|
||
| it("should return 404 when artefact is not found", async () => { | ||
| req.query = { artefactId: "non-existent" }; | ||
| vi.mocked(getArtefactById).mockResolvedValue(null); | ||
| await GET(req as Request, res as Response); | ||
| expect(res.status).toHaveBeenCalledWith(404); | ||
| }); | ||
|
|
||
| it("should return 404 when blob is not found", async () => { | ||
| req.query = { artefactId: "test-artefact-123" }; | ||
| vi.mocked(getArtefactById).mockResolvedValue(MOCK_ARTEFACT as any); | ||
| vi.mocked(getPublicationJson).mockResolvedValue(null); | ||
| await GET(req as Request, res as Response); | ||
| expect(res.status).toHaveBeenCalledWith(404); | ||
| }); | ||
|
|
||
| it("should return 500 on server error", async () => { | ||
| req.query = { artefactId: "test-artefact-123" }; | ||
| vi.mocked(getArtefactById).mockRejectedValue(new Error("Database error")); | ||
| await GET(req as Request, res as Response); | ||
| expect(res.status).toHaveBeenCalledWith(500); | ||
| expect(res.render).toHaveBeenCalledWith("errors/common", expect.objectContaining({ errorTitle: "Server Error" })); | ||
| }); | ||
|
|
||
| it("should render in Welsh when locale is cy", async () => { | ||
| // Arrange | ||
| res.locals = { locale: "cy" }; | ||
| const mockRenderedData = { | ||
| header: { listTitle: "title", weekCommencingDate: "", lastUpdatedDate: "", lastUpdatedTime: "" }, | ||
| hearings: [] | ||
| }; | ||
|
|
||
| req.query = { artefactId: "test-artefact-123" }; | ||
| vi.mocked(getArtefactById).mockResolvedValue(MOCK_ARTEFACT as any); | ||
| vi.mocked(getPublicationJson).mockResolvedValue(MOCK_JSON_DATA); | ||
| mockValidate.mockReturnValue({ isValid: true, errors: [] }); | ||
| vi.mocked(renderFttLrtData).mockReturnValue(mockRenderedData as any); | ||
|
|
||
| // Act | ||
| await GET(req as Request, res as Response); | ||
|
|
||
| // Assert | ||
| expect(renderFttLrtData).toHaveBeenCalledWith(MOCK_JSON_DATA, expect.objectContaining({ locale: "cy" })); | ||
| expect(res.render).toHaveBeenCalledWith( | ||
| "ftt-lands-registration-tribunal-weekly-hearing-list", | ||
| expect.objectContaining({ dataSource: "Lanlwytho â Llaw" }) | ||
| ); | ||
| }); | ||
| }); | ||
| }); | ||
34 changes: 34 additions & 0 deletions
34
apps/web/src/pages/(list-types)/ftt-lands-registration-tribunal-weekly-hearing-list/index.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| import { | ||
| fttLrtWeeklyHearingListCy as cy, | ||
| fttLrtWeeklyHearingListEn as en, | ||
| type FttLrtHearingList, | ||
| renderFttLrtData | ||
| } from "@hmcts/ftt-lands-registration-tribunal-weekly-hearing-list"; | ||
| import { schemaPath } from "@hmcts/ftt-lands-registration-tribunal-weekly-hearing-list/config"; | ||
| import { createJsonValidator } from "@hmcts/list-types-common"; | ||
| import { createSimpleListTypeHandler, resolveDataSource } from "../list-type-handler.js"; | ||
|
|
||
| const validate = createJsonValidator(schemaPath); | ||
|
|
||
| export const GET = createSimpleListTypeHandler<FttLrtHearingList>({ | ||
| en, | ||
| cy, | ||
| validate, | ||
| logPrefix: "ftt-lands-registration-tribunal-weekly-hearing-list", | ||
| serverError: { errorTitle: "Server Error", errorMessage: "An error occurred while loading the list" }, | ||
| render: ({ artefact, jsonData, locale, res }) => { | ||
| const t = locale === "cy" ? cy : en; | ||
|
|
||
| const { header, hearings } = renderFttLrtData(jsonData, { | ||
| locale, | ||
| courtName: "First-tier Tribunal (Land Registration Tribunal)", | ||
| contentDate: artefact.contentDate, | ||
| lastReceivedDate: artefact.lastReceivedDate.toISOString(), | ||
| listTitle: t.pageTitle | ||
| }); | ||
|
|
||
| const dataSource = resolveDataSource(artefact.provenance, t as { provenanceLabels?: Record<string, string> }); | ||
|
|
||
| res.render("ftt-lands-registration-tribunal-weekly-hearing-list", { en, cy, t, title: header.listTitle, header, hearings, dataSource }); | ||
| } | ||
| }); |
82 changes: 82 additions & 0 deletions
82
apps/web/src/pages/(list-types)/ftt-rpt-weekly-hearing-list/ftt-rpt-weekly-hearing-list.njk
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| {% extends "layouts/base-template.njk" %} | ||
|
|
||
|
|
||
| {% block page_content %} | ||
| <div class="govuk-grid-row"> | ||
| <div class="govuk-grid-column-full"> | ||
|
|
||
| <h1 class="govuk-heading-l" id="top">{{ header.listTitle }}</h1> | ||
|
|
||
| <p class="govuk-body"> | ||
| <a href="{{ t.factLinkUrl }}" class="govuk-link">{{ t.factLinkText }}</a> {{ t.factAdditionalText }} | ||
| </p> | ||
|
|
||
| <p class="govuk-body govuk-!-font-weight-bold govuk-!-margin-bottom-1">{{ t.listForWeekCommencing }} {{ header.weekCommencingDate }}</p> | ||
| <p class="govuk-body">{{ t.lastUpdated }} {{ header.lastUpdatedDate }} {{ t.at }} {{ header.lastUpdatedTime }}</p> | ||
|
|
||
| <details class="govuk-details govuk-!-margin-top-6" data-module="govuk-details" open> | ||
| <summary class="govuk-details__summary"> | ||
| <span class="govuk-details__summary-text"> | ||
| {{ t.importantInformationTitle }} | ||
| </span> | ||
| </summary> | ||
| <div class="govuk-details__text"> | ||
| <p class="govuk-body">{{ t.importantInformationText }}</p> | ||
| <p class="govuk-body"> | ||
| <a href="{{ t.importantInformationLinkUrl }}" class="govuk-link" target="_blank" rel="noopener noreferrer"> | ||
| {{ t.importantInformationLinkText }} | ||
| </a> | ||
| </p> | ||
| </div> | ||
| </details> | ||
|
|
||
| <div class="govuk-form-group govuk-!-margin-top-6"> | ||
| <h2 class="govuk-heading-s">{{ t.searchCasesTitle }}</h2> | ||
| <label class="govuk-label govuk-visually-hidden" for="case-search-input"> | ||
| {{ t.searchCasesLabel }} | ||
| </label> | ||
| <input class="govuk-input govuk-!-width-one-half" id="case-search-input" name="search" type="text" aria-label="{{ t.searchCasesLabel }}"> | ||
| </div> | ||
|
|
||
| <div id="hearings-table-container"> | ||
| <table class="govuk-table" id="hearings-table" role="table" aria-label="{{ header.listTitle }}"> | ||
| <thead class="govuk-table__head"> | ||
| <tr class="govuk-table__row"> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.date }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.time }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.venue }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.caseType }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.caseReferenceNumber }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.judges }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.members }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.hearingMethod }}</th> | ||
| <th scope="col" class="govuk-table__header">{{ t.tableHeaders.additionalInformation }}</th> | ||
| </tr> | ||
| </thead> | ||
| <tbody class="govuk-table__body"> | ||
| {% for hearing in hearings %} | ||
| <tr class="govuk-table__row"> | ||
| <td class="govuk-table__cell">{{ hearing.date }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.time }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.venue }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.caseType }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.caseReferenceNumber }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.judges }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.members }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.hearingMethod }}</td> | ||
| <td class="govuk-table__cell">{{ hearing.additionalInformation }}</td> | ||
| </tr> | ||
| {% endfor %} | ||
| </tbody> | ||
| </table> | ||
| </div> | ||
|
|
||
| <p class="govuk-body-s govuk-!-margin-top-6">{{ t.dataSource }}: {{ dataSource }}</p> | ||
|
|
||
| <div class="govuk-!-margin-top-6"> | ||
| <a href="#top" class="govuk-link">{{ t.backToTop }}</a> | ||
| </div> | ||
|
|
||
| </div> | ||
| </div> | ||
| {% endblock %} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Use a distinct Welsh title in the locale mock.
pageTitleis identical in both locale fixtures, so the Welsh test only proves the provenance label changed. If the controller stopped forwarding the Welsh title intorenderFttLrtData, this test would still pass. Give the Welsh mock a different title and assert thatlistTitlematches it. As per coding guidelines, "Implement Welsh language support on all user-facing text with separateen.tsandcy.tscontent files".Also applies to: 121-143
Source: Coding guidelines