Skip to content
Merged

Dev #2317

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
3a07dc9
enhancing the paymentflow
Apr 9, 2026
38dc069
fixing the tests
Apr 15, 2026
4ef2177
tests OS agonistic
Apr 15, 2026
6f8a41b
making test more robust
Apr 15, 2026
bb37a59
AB#32508 Fix detached row click in ApplicationsListPage during async …
Stephan-McColm Apr 16, 2026
de10525
merging dev and resolving few conflicts
Apr 16, 2026
53e7cdd
AB#32583 refine chefs toolbar layout
jacobwillsmith Apr 16, 2026
414ef56
AB#32583 rerun branch automation
jacobwillsmith Apr 17, 2026
960191b
AB#30833 Update application analysis quick review UI
jacobwillsmith Apr 9, 2026
d29e0dd
AB#30833 Align application analysis chevrons with page collapse pattern
jacobwillsmith Apr 9, 2026
644320c
AB#30833 Adjust application analysis header controls
jacobwillsmith Apr 9, 2026
4415dbf
AB#30833 Fix application analysis dismissed item separators
jacobwillsmith Apr 9, 2026
1c4b672
AB#30833 Fix application analysis visible item spacing
jacobwillsmith Apr 9, 2026
df9a2e7
AB#30833 Hide empty application analysis error and warning sections
jacobwillsmith Apr 9, 2026
a176ef3
AB#30833 Simplify application analysis section rendering
jacobwillsmith Apr 9, 2026
f4eb752
AB#30833 Align application analysis dismissed naming and labels
jacobwillsmith Apr 9, 2026
6368b31
AB#30833 Hide empty application analysis sections
jacobwillsmith Apr 9, 2026
2e29e5e
AB#30833 Align application analysis summary labels with contract
jacobwillsmith Apr 9, 2026
c23f997
AB#30833 refine AI analysis status display
jacobwillsmith Apr 10, 2026
70f3b4f
AB#30833 refine AI analysis section rendering
jacobwillsmith Apr 10, 2026
b27643d
AB#30833 align AI analysis badges and recommendation label
jacobwillsmith Apr 10, 2026
4199acb
AB#30833 simplify AI analysis section layout
jacobwillsmith Apr 11, 2026
b680943
AB#30833 refine AI analysis naming
jacobwillsmith Apr 17, 2026
4246e3b
AB#30833 fix AI migration and analysis polish
jacobwillsmith Apr 17, 2026
a5e55bd
AB#30833 simplify recommendation status text
jacobwillsmith Apr 17, 2026
30a2d93
Merge pull request #2290 from bcgov/feature/AB#30833-application-anal…
JamesPasta Apr 17, 2026
847a5c2
Merge pull request #2297 from bcgov/feature/AB#32508-EnhancePaymentFl…
JamesPasta Apr 17, 2026
251d970
Merge pull request #2301 from bcgov/bugfix/AB#32583-chefs-double-line…
JamesPasta Apr 17, 2026
1f9bd88
AB#32700 fix role updates for contact handler
AndreGAot Apr 17, 2026
c5247ce
Revert "Feature/ab#32508 enhance payment flows cypress tests"
JamesPasta Apr 17, 2026
b9316e0
Merge pull request #2306 from bcgov/revert-2297-feature/AB#32508-Enha…
JamesPasta Apr 17, 2026
ad76e01
AB#32299 split OpenAI service responsibilities
jacobwillsmith Apr 15, 2026
f346697
AB#32299 fix openai runtime accessibility and parsing
jacobwillsmith Apr 15, 2026
61d867b
AB#32299 split OpenAI service responsibilities
jacobwillsmith Apr 17, 2026
e284e12
AB#32299 simplify OpenAI runtime split
jacobwillsmith Apr 17, 2026
b9f7873
AB#32299 align response parser with dev contract
jacobwillsmith Apr 17, 2026
63ae49e
Merge pull request #2303 from bcgov/feature/AB#32299-split-openaiserv…
JamesPasta Apr 17, 2026
c776c6c
AB#32301 decouple AI runtime boundary
jacobwillsmith Apr 15, 2026
b1c8457
AB#32301 add AI boundary tests
jacobwillsmith Apr 15, 2026
636b676
AB#32301 simplify content orchestration
jacobwillsmith Apr 17, 2026
46841c1
AB#32301 remove stale pipeline helpers
jacobwillsmith Apr 17, 2026
791c16b
AB#32301 restore AI module registration
jacobwillsmith Apr 17, 2026
52eb5d1
Merge pull request #2304 from bcgov/feature/AB#32301-ai-module-integr…
JamesPasta Apr 17, 2026
ac4f8a8
AB#32700 copilot feedback and fix tests
AndreGAot Apr 17, 2026
3604400
Merge pull request #2305 from bcgov/bugfix/AB#32700-contact-role-portal
AndreGAot Apr 17, 2026
ea3ea12
initial commit
Apr 17, 2026
e476823
AB#32700 fix address edit flag for profile
AndreGAot Apr 17, 2026
99a3984
CR comments
Apr 17, 2026
1761f7f
Merge pull request #2307 from bcgov/bugfix/AB#32700-address-edit-flag
AndreGAot Apr 17, 2026
4b06e6e
Merge pull request #2308 from bcgov/feature/AB#32508-EnhancePaymentFl…
JamesPasta Apr 17, 2026
45fb273
AB#32299 simplify OpenAI runtime helpers
jacobwillsmith Apr 17, 2026
80b9b63
AB#32700 actual fix this time
AndreGAot Apr 17, 2026
4e577a5
AB#32299 rerun automation
jacobwillsmith Apr 17, 2026
9bf165b
Merge pull request #2310 from bcgov/feature/AB#32299-split-openaiserv…
JamesPasta Apr 17, 2026
5cf3bca
Merge pull request #2311 from bcgov/bugfix/AB#32700-address-edit-flag
AndreGAot Apr 17, 2026
7ff4ed6
AB#32299 clean up OpenAI runtime helpers
jacobwillsmith Apr 17, 2026
8004734
Merge pull request #2313 from bcgov/feature/AB#32299-split-openaiserv…
JamesPasta Apr 17, 2026
7d46b51
AB#32299 remove unused OpenAI runtime import
jacobwillsmith Apr 17, 2026
c5c8cd8
Merge pull request #2315 from bcgov/feature/AB#32299-split-openaiserv…
JamesPasta Apr 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
127 changes: 8 additions & 119 deletions applications/Unity.AutoUI/cypress/e2e/basicEmail.cy.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// cypress/e2e/basicEmail.cy.ts
import { LoginPageInstance, NavigationPageInstance } from "../utilities";

describe("Send an email", () => {
const TEST_EMAIL_TO = Cypress.env("TEST_EMAIL_TO") as string;
Expand Down Expand Up @@ -32,123 +33,8 @@ describe("Send an email", () => {
String(now.getSeconds()).padStart(2, "0");

const TEST_EMAIL_SUBJECT = `Smoke Test Email ${timestamp}`;

function ensureLoggedInToGrantApplications() {
// Headless runs specs sequentially in the same browser process.
// Do not assume logged-out or logged-in. Detect UI state like chefsdata.cy.ts does.
cy.visit(Cypress.env("webapp.url"));

cy.get("body", { timeout: STANDARD_TIMEOUT }).then(($body) => {
// Already authenticated
if ($body.find('button:contains("VIEW APPLICATIONS")').length > 0) {
cy.contains("VIEW APPLICATIONS", { timeout: STANDARD_TIMEOUT }).click({
force: true,
});
return;
}

// Not authenticated
if ($body.find('button:contains("LOGIN")').length > 0) {
cy.contains("LOGIN", { timeout: STANDARD_TIMEOUT })
.should("exist")
.click({ force: true });

cy.get("body", { timeout: STANDARD_TIMEOUT }).then(($loginBody) => {
// IDIR chooser may or may not appear
if ($loginBody.find(':contains("IDIR")').length > 0) {
cy.contains("IDIR", { timeout: STANDARD_TIMEOUT }).click({
force: true,
});
}

cy.get("body", { timeout: STANDARD_TIMEOUT }).then(($authBody) => {
// Only type creds if the login form is actually present
if ($authBody.find("#user").length > 0) {
cy.get("#user", { timeout: STANDARD_TIMEOUT }).type(
Cypress.env("test1username"),
);
cy.get("#password", { timeout: STANDARD_TIMEOUT }).type(
Cypress.env("test1password"),
);
cy.contains("Continue", { timeout: STANDARD_TIMEOUT }).click({
force: true,
});
} else {
cy.log("Already authenticated");
}
});
});

return;
}

throw new Error("Unable to determine authentication state");
});

cy.location("pathname", { timeout: 30000 }).should(
"include",
"/GrantApplications",
);
}

function switchToDefaultGrantsProgramIfAvailable() {
cy.get("body").then(($body) => {
const hasUserInitials = $body.find(".unity-user-initials").length > 0;

if (!hasUserInitials) {
cy.log("Skipping tenant: no user initials menu found");
return;
}

cy.get(".unity-user-initials").click();

cy.get("body").then(($body2) => {
const switchLink = $body2
.find("#user-dropdown a.dropdown-item")
.filter((_, el) => {
return (el.textContent || "").trim() === "Switch Grant Programs";
});

if (switchLink.length === 0) {
cy.log(
'Skipping tenant: "Switch Grant Programs" not present for this user/session',
);
cy.get("body").click(0, 0);
return;
}

cy.wrap(switchLink.first()).click();

cy.url({ timeout: STANDARD_TIMEOUT }).should(
"include",
"/GrantPrograms",
);

cy.get("#search-grant-programs", { timeout: STANDARD_TIMEOUT })
.should("be.visible")
.clear()
.type("Default Grants Program");

cy.get("#UserGrantProgramsTable", { timeout: STANDARD_TIMEOUT })
.should("be.visible")
.within(() => {
cy.contains("tbody tr", "Default Grants Program", {
timeout: STANDARD_TIMEOUT,
})
.should("exist")
.within(() => {
cy.contains("button", "Select").should("be.enabled").click();
});
});

cy.location("pathname", { timeout: STANDARD_TIMEOUT }).should((p) => {
expect(
p.indexOf("/GrantApplications") >= 0 || p.indexOf("/auth/") >= 0,
).to.eq(true);
});
});
});
}
const loginPage = LoginPageInstance();
const navPage = NavigationPageInstance();

function openSavedEmailFromHistoryBySubject(subject: string) {
cy.get("body", { timeout: STANDARD_TIMEOUT }).then(($body) => {
Expand Down Expand Up @@ -231,11 +117,12 @@ describe("Send an email", () => {
}

it("Login", () => {
ensureLoggedInToGrantApplications();
loginPage.login();
loginPage.verifyOnGrantApplications();
});

it("Switch to Default Grants Program if available", () => {
switchToDefaultGrantsProgramIfAvailable();
navPage.switchToDefaultGrantsProgramIfAvailable();
});

it("Handle IDIR if required", () => {
Expand Down Expand Up @@ -368,6 +255,7 @@ describe("Send an email", () => {
it("Save the email", () => {
cy.get("#btn-save", { timeout: STANDARD_TIMEOUT })
.should("exist")
.scrollIntoView()
.should("be.visible")
.click();

Expand All @@ -391,6 +279,7 @@ describe("Send an email", () => {
it("Send the email", () => {
cy.get("#btn-send", { timeout: STANDARD_TIMEOUT })
.should("exist")
.scrollIntoView()
.should("be.visible")
.should("not.be.disabled")
.click();
Expand Down
45 changes: 9 additions & 36 deletions applications/Unity.AutoUI/cypress/e2e/chefsdata.cy.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
/// <reference types="cypress" />

// cypress/e2e/chefsdata.cy.ts
import { LoginPageInstance, NavigationPageInstance } from "../utilities";

describe('Unity Login and check data from CHEFS', () => {
const STANDARD_TIMEOUT = 20000
const loginPage = LoginPageInstance()
const navPage = NavigationPageInstance()

// TEST renders the Submission tab inside an open shadow root (Form.io).
// Enabling this makes cy.get / cy.contains pierce shadow DOM consistently across envs.
Expand All @@ -12,42 +15,12 @@ describe('Unity Login and check data from CHEFS', () => {
})

it('Verify Login', () => {
// 1.) Always start from the base URL
cy.visit(Cypress.env('webapp.url'))

// 2.) Decide auth path based on visible UI
cy.get('body', { timeout: STANDARD_TIMEOUT }).then(($body) => {
// Already authenticated
if ($body.find('button:contains("VIEW APPLICATIONS")').length > 0) {
cy.contains('VIEW APPLICATIONS', { timeout: STANDARD_TIMEOUT }).click({ force: true })
return
}

// Not authenticated
if ($body.find('button:contains("LOGIN")').length > 0) {
cy.contains('LOGIN', { timeout: STANDARD_TIMEOUT }).should('exist').click({ force: true })
cy.contains('IDIR', { timeout: STANDARD_TIMEOUT }).should('exist').click({ force: true })

cy.get('body', { timeout: STANDARD_TIMEOUT }).then(($loginBody) => {
// Perform IDIR login only if prompted
if ($loginBody.find('#user').length > 0) {
cy.get('#user', { timeout: STANDARD_TIMEOUT }).type(Cypress.env('test1username'))
cy.get('#password', { timeout: STANDARD_TIMEOUT }).type(Cypress.env('test1password'))
cy.contains('Continue', { timeout: STANDARD_TIMEOUT }).should('exist').click({ force: true })
} else {
cy.log('Already logged in')
}
})

return
}

// Fail loudly if neither state is detectable
throw new Error('Unable to determine authentication state')
})
loginPage.login()
loginPage.verifyOnGrantApplications()
})

// 3.) Post-condition check
cy.url({ timeout: STANDARD_TIMEOUT }).should('include', '/GrantApplications')
it('Switch to Default Grants Program if available', () => {
navPage.switchToDefaultGrantsProgramIfAvailable()
})

// Verify that the details panel populates with mapped data
Expand Down Expand Up @@ -228,6 +201,6 @@ describe('Unity Login and check data from CHEFS', () => {
})

it('Verify Logout', () => {
cy.logout()
loginPage.quickLogout()
})
})
123 changes: 22 additions & 101 deletions applications/Unity.AutoUI/cypress/e2e/lists.cy.ts
Original file line number Diff line number Diff line change
@@ -1,56 +1,13 @@
describe('Grant Manager Login and List Navigation', () => {

function switchToDefaultGrantsProgramIfAvailable() {
cy.get('body').then(($body) => {
const hasUserInitials = $body.find('.unity-user-initials').length > 0

if (!hasUserInitials) {
cy.log('Skipping tenant switch: no user initials menu found')
return
}

cy.get('.unity-user-initials').click()

cy.get('body').then(($body2) => {
const switchLink = $body2.find('#user-dropdown a.dropdown-item').filter((_, el) => {
return (el.textContent || '').trim() === 'Switch Grant Programs'
})
import {
ApplicationsPageInstance,
LoginPageInstance,
NavigationPageInstance,
} from '../utilities'

if (switchLink.length === 0) {
cy.log('Skipping tenant switch: "Switch Grant Programs" not present')
cy.get('body').click(0, 0)
return
}

cy.wrap(switchLink.first()).click()
cy.url({ timeout: 20000 }).should('include', '/GrantPrograms')

cy.get('#search-grant-programs', { timeout: 20000 })
.should('be.visible')
.clear()
.type('Default Grants Program')

cy.get('#UserGrantProgramsTable', { timeout: 20000 })
.should('be.visible')
.within(() => {
cy.contains('tbody tr', 'Default Grants Program', { timeout: 20000 })
.should('exist')
.within(() => {
cy.contains('button', 'Select')
.should('be.enabled')
.click()
})
})

cy.location('pathname', { timeout: 20000 }).should((p) => {
expect(
p.indexOf('/GrantApplications') >= 0 ||
p.indexOf('/auth/') >= 0
).to.eq(true)
})
})
})
}
describe('Grant Manager Login and List Navigation', () => {
const loginPage = LoginPageInstance()
const navPage = NavigationPageInstance()
const appsPage = ApplicationsPageInstance()

function setDashboardIntakeToTestIfAvailable() {
const btnSel = 'button[data-id="dashboardIntakeId"]'
Expand Down Expand Up @@ -91,46 +48,12 @@ describe('Grant Manager Login and List Navigation', () => {
}

it('Verify Login', () => {

cy.visit(Cypress.env('webapp.url'))

cy.get('body').then(($body) => {

if ($body.find('button:contains("VIEW APPLICATIONS")').length > 0) {
cy.contains('VIEW APPLICATIONS').click()
return
}

if ($body.find('button:contains("LOGIN")').length > 0) {
cy.contains('LOGIN').click()

cy.get('body').then(($loginBody) => {
if ($loginBody.find(':contains("IDIR")').length > 0) {
cy.contains('IDIR').click()
}

cy.get('body').then(($authBody) => {
if ($authBody.find('#user').length > 0) {
cy.get('#user').type(Cypress.env('test1username'))
cy.get('#password').type(Cypress.env('test1password'))
cy.contains('Continue').click()
} else {
cy.log('Already authenticated')
}
})
})

return
}

throw new Error('Unable to determine authentication state')
})

cy.location('pathname', { timeout: 30000 }).should('include', '/GrantApplications')
loginPage.login()
loginPage.verifyOnGrantApplications()
})

it('Switch to Default Grants Program if available', () => {
switchToDefaultGrantsProgramIfAvailable()
navPage.switchToDefaultGrantsProgramIfAvailable()
})

it('Handle IDIR if required', () => {
Expand All @@ -145,26 +68,24 @@ describe('Grant Manager Login and List Navigation', () => {

it('Verify Applications, Roles, Users, Intakes, Forms, Dashboard lists are populated', () => {

cy.get('.unity-user-initials').should('exist').click()
cy.get('#user-dropdown .btn-dropdown span')
.should('contain', 'Default Grants Program')
navPage.verifyCurrentTenant('Default Grants Program')

cy.contains('Applications').click()
cy.get('tbody tr').should('have.length.at.least', 1)
navPage.goToApplications()
appsPage.verifyListHasData()

cy.contains('Roles').click()
navPage.goToRoles()
cy.get('tbody tr').should('have.length.at.least', 1)

cy.contains('Users').click()
navPage.goToUsers()
cy.get('tbody tr').should('have.length.at.least', 1)

cy.contains('Intakes').click()
navPage.goToIntakes()
cy.get('tbody tr').should('have.length.at.least', 1)

cy.contains('Forms').click()
navPage.goToForms()
cy.get('tbody tr').should('have.length.at.least', 1)

cy.contains('Dashboard').click()
navPage.goToDashboard()
cy.location('pathname', { timeout: 30000 }).should('include', '/Dashboard')
setDashboardIntakeToTestIfAvailable()

Expand All @@ -178,6 +99,6 @@ describe('Grant Manager Login and List Navigation', () => {
})

it('Verify Logout', () => {
cy.logout()
loginPage.quickLogout()
})
})
})
Loading
Loading