diff --git a/ansible_ai_connect_admin_portal/package-lock.json b/ansible_ai_connect_admin_portal/package-lock.json index 64622c8f2..0a55d446f 100644 --- a/ansible_ai_connect_admin_portal/package-lock.json +++ b/ansible_ai_connect_admin_portal/package-lock.json @@ -19,8 +19,7 @@ "i18next-http-backend": "^2.2.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-i18next": "^13.1.2", - "react-router-dom": "^6.15.0" + "react-i18next": "^13.1.2" }, "devDependencies": { "@testing-library/jest-dom": "^6.1.4", @@ -54,6 +53,7 @@ "happy-dom": "^15.11.0", "html-webpack-plugin": "^5.5.0", "i18next-browser-languagedetector": "^7.1.0", + "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-resolve": "^29.7.0", @@ -68,6 +68,7 @@ "prettier": "^3.0.2", "react-app-polyfill": "^3.0.0", "react-dev-utils": "^12.0.1", + "react-router-dom": "^6.28.0", "react-test-renderer": "^18.2.0", "resolve": "^1.20.0", "resolve-url-loader": "^5.0.0", @@ -110,9 +111,9 @@ } }, "node_modules/@ansible/ansible-ui-framework": { - "version": "2.4.2607", - "resolved": "https://registry.npmjs.org/@ansible/ansible-ui-framework/-/ansible-ui-framework-2.4.2607.tgz", - "integrity": "sha512-8Zv0a1+2PKc/CzjpErUcPfrWGPDs6d0vLZf+sXg78LzEHRDjToyLnXVrsWt0caCndlDuaLMK2BpT7SqP7g5JeQ==", + "version": "2.4.2611", + "resolved": "https://registry.npmjs.org/@ansible/ansible-ui-framework/-/ansible-ui-framework-2.4.2611.tgz", + "integrity": "sha512-UlIcfdLCiMh3SLCTY6LmqX+LmTLG+Ikta3d5OqnhvMU6+uDTtArx9V8snMmNqBWExGDbtOmWxGTEAVI6XNvHdg==", "license": "Apache-2.0", "peerDependencies": { "@patternfly/patternfly": "^5.4", @@ -3204,15 +3205,15 @@ "license": "MIT" }, "node_modules/@patternfly/react-core": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.8.tgz", - "integrity": "sha512-4KRsQsH39VmTiFPLdN34QqNZg6gKrTamJxKtWEPO1VKA0TpoRMwpFEGk9BDyxipxYST6WzXznAaLCidGkCDlWw==", + "version": "5.4.10", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-5.4.10.tgz", + "integrity": "sha512-lThdXKqHc9sN5AqPskZa1YmUmSwbjdkaT8neTCdMjfnBaBanYCmSCNUMYUsoB0L/2siu2Vlcp12RRaG5hZeN2g==", "license": "MIT", "dependencies": { "@patternfly/react-icons": "^5.4.2", "@patternfly/react-styles": "^5.4.1", "@patternfly/react-tokens": "^5.4.1", - "focus-trap": "7.6.0", + "focus-trap": "7.6.2", "react-dropzone": "^14.2.3", "tslib": "^2.7.0" }, @@ -3238,13 +3239,13 @@ "license": "MIT" }, "node_modules/@patternfly/react-table": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.4.9.tgz", - "integrity": "sha512-fSbBZRihVCAaUOKRFzzqYhBrTSI/VGU6O9I0a21T+bXwHz071OsefBdE/ZQiJhqHpJTC+WAZWM76/1CEEnrBFw==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-5.4.11.tgz", + "integrity": "sha512-TlEPx4G+49QYZxk649WUIHkRPA/JB//i29fUosrJdI6EEzpTe8keHLXe5wA9KkhCxOtna7iHPTPWv5qRiDJKSg==", "license": "MIT", "peer": true, "dependencies": { - "@patternfly/react-core": "^5.4.8", + "@patternfly/react-core": "^5.4.10", "@patternfly/react-icons": "^5.4.2", "@patternfly/react-styles": "^5.4.1", "@patternfly/react-tokens": "^5.4.1", @@ -3314,6 +3315,7 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==", + "dev": true, "license": "MIT", "engines": { "node": ">=14.0.0" @@ -4169,9 +4171,9 @@ } }, "node_modules/@types/node": { - "version": "22.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", - "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", + "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", "license": "MIT", "dependencies": { "undici-types": "~6.19.8" @@ -5883,9 +5885,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001680", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", - "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "version": "1.0.30001683", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", + "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==", "funding": [ { "type": "opencollective", @@ -8845,9 +8847,9 @@ "license": "ISC" }, "node_modules/focus-trap": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.0.tgz", - "integrity": "sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.2.tgz", + "integrity": "sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==", "license": "MIT", "dependencies": { "tabbable": "^6.2.0" @@ -9397,6 +9399,13 @@ "node": ">=18.0.0" } }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -9804,9 +9813,9 @@ } }, "node_modules/i18next": { - "version": "23.16.5", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.5.tgz", - "integrity": "sha512-KTlhE3EP9x6pPTAW7dy0WKIhoCpfOGhRQlO+jttQLgzVaoOjWwBWramu7Pp0i+8wDNduuzXfe3kkVbzrKyrbTA==", + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", "funding": [ { "type": "individual", @@ -9838,9 +9847,9 @@ } }, "node_modules/i18next-http-backend": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.6.2.tgz", - "integrity": "sha512-Hp/kd8/VuoxIHmxsknJXjkTYYHzivAyAF15pzliKzk2TiXC25rZCEerb1pUFoxz4IVrG3fCvQSY51/Lu4ECV4A==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.7.1.tgz", + "integrity": "sha512-vPksHIckysGgykCD8JwCr2YsJEml9Cyw+Yu2wtb4fQ7xIn9RH/hkUDh5UkwnIzb0kSL4SJ30Ab/sCInhQxbCgg==", "license": "MIT", "dependencies": { "cross-fetch": "4.0.0" @@ -9879,6 +9888,19 @@ "dev": true, "license": "ISC" }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -11689,9 +11711,9 @@ } }, "node_modules/jest-watch-typeahead/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", "dev": true, "license": "MIT", "engines": { @@ -12621,9 +12643,9 @@ } }, "node_modules/monaco-yaml/node_modules/yaml": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", - "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", "license": "ISC", "peer": true, "bin": { @@ -15100,9 +15122,9 @@ "license": "MIT" }, "node_modules/psl": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.10.0.tgz", - "integrity": "sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.11.0.tgz", + "integrity": "sha512-pjFdcBXT4g061k/SQkzNCRnav+1RdIOgrcX8hs5eL3CEQcFZP9qT8T1RWYxGKT11rH1DdIW+kJRfCYykBJuerQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15436,6 +15458,7 @@ "version": "6.28.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.0.tgz", "integrity": "sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==", + "dev": true, "license": "MIT", "dependencies": { "@remix-run/router": "1.21.0" @@ -15451,6 +15474,7 @@ "version": "6.28.0", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.0.tgz", "integrity": "sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==", + "dev": true, "license": "MIT", "dependencies": { "@remix-run/router": "1.21.0", diff --git a/ansible_ai_connect_admin_portal/package.json b/ansible_ai_connect_admin_portal/package.json index 64e2445ef..50d36a4ef 100644 --- a/ansible_ai_connect_admin_portal/package.json +++ b/ansible_ai_connect_admin_portal/package.json @@ -19,8 +19,7 @@ "i18next-http-backend": "^2.2.1", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-i18next": "^13.1.2", - "react-router-dom": "^6.15.0" + "react-i18next": "^13.1.2" }, "devDependencies": { "@testing-library/jest-dom": "^6.1.4", @@ -82,7 +81,9 @@ "webpack-dev-server": "^4.6.0", "webpack-manifest-plugin": "^4.0.2", "webpack-mock-server": "^1.0.18", - "workbox-webpack-plugin": "^6.4.1" + "workbox-webpack-plugin": "^6.4.1", + "react-router-dom": "^6.28.0", + "identity-obj-proxy": "^3.0.0" }, "scripts": { "start": "node scripts/start.js", @@ -145,9 +146,8 @@ "moduleNameMapper": { "^react-native$": "react-native-web", "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy", - "react-i18next": "/__mocks__/react-i18next.ts" - }, - "module.exports": { + "react-i18next": "/__mocks__/react-i18next.ts", + "\\.(css|less|scss|sass)$": "identity-obj-proxy", "monaco-editor": "/__mocks__/monaco-editor.ts", "monaco-yaml": "/__mocks__/monaco-yaml.ts" }, diff --git a/ansible_ai_connect_admin_portal/src/PageMastheadDropdown.tsx b/ansible_ai_connect_admin_portal/src/PageMastheadDropdown.tsx index 69bad28c9..275a444a7 100644 --- a/ansible_ai_connect_admin_portal/src/PageMastheadDropdown.tsx +++ b/ansible_ai_connect_admin_portal/src/PageMastheadDropdown.tsx @@ -32,7 +32,7 @@ export function PageMastheadDropdown(props: PageMastheadDropdownProps) { id={id} onSelect={onSelect} toggle={(toggleRef: React.Ref) => ( - + {_children} diff --git a/ansible_ai_connect_admin_portal/src/__tests__/App.test.tsx b/ansible_ai_connect_admin_portal/src/__tests__/App.test.tsx index c17f92677..afd7a4075 100644 --- a/ansible_ai_connect_admin_portal/src/__tests__/App.test.tsx +++ b/ansible_ai_connect_admin_portal/src/__tests__/App.test.tsx @@ -16,7 +16,7 @@ describe("App", () => { adminDashboardUrl={"http://admin_dashboard-url/"} />, ); - const accountMenu = await screen.findByTestId("page-masthead-dropdown"); + const accountMenu = await screen.findByTestId("page-masthead-dropdown__button"); expect(accountMenu).toBeInTheDocument(); expect(accountMenu).toHaveTextContent("Batman"); }); diff --git a/ansible_ai_connect_admin_portal/src/__tests__/AppHeader.test.tsx b/ansible_ai_connect_admin_portal/src/__tests__/AppHeader.test.tsx index 63cdff7fc..6393fdab9 100644 --- a/ansible_ai_connect_admin_portal/src/__tests__/AppHeader.test.tsx +++ b/ansible_ai_connect_admin_portal/src/__tests__/AppHeader.test.tsx @@ -1,7 +1,9 @@ -import { render, screen } from "@testing-library/react"; +import { render, screen, waitFor } from "@testing-library/react"; import "@testing-library/jest-dom"; import { AppHeader } from "../AppHeader"; import userEvent from "@testing-library/user-event"; +import { BrowserRouter } from 'react-router-dom'; +import { act } from 'react'; describe("AppHeader", () => { // Store the original 'location' object so that it can be restored for other tests. @@ -20,26 +22,40 @@ describe("AppHeader", () => { }); it("Rendering", async () => { - render(); - const accountMenu = await screen.findByTestId("page-masthead-dropdown"); + render( + + + + ); + const accountMenu = await screen.findByTestId("page-masthead-dropdown__button"); expect(accountMenu).toBeInTheDocument(); expect(accountMenu).toHaveTextContent("Batman"); // Check "Logout" option is not present expect(screen.queryByText("Logout")).toBeNull(); - - // Emulate click on menu button - const accountMenuToggle = await screen.findByTestId( - "page-masthead-dropdown__button", - ); - await userEvent.click(accountMenuToggle); - + const accountMenuToggle = await act(()=> { + screen.findByTestId( + "page-masthead-dropdown__button", + ); + }); + // const accountMenuToggle = await screen.findByTestId( + // "page-masthead-dropdown__button", + // ); + await act(() => { + userEvent.click(accountMenuToggle); + }); + // await userEvent.click(accountMenuToggle); // "Logout" menu option should now be present expect(await screen.findByText("Logout")).toBeInTheDocument(); // Emulate clicking on the logout button - const logoutMenuItem = await screen.findByTestId("app-header__logout"); + const logoutMenuItem = await act(() => { + screen.findByTestId("app-header__logout"); + }); + // await act(() => { + // userEvent.click(logoutMenuItem); + // }); await userEvent.click(logoutMenuItem); - expect(window.location.assign).toBeCalledWith("/logout"); + expect(window.location.assign).toHaveBeenCalledWith("/logout"); }); }); diff --git a/ansible_ai_connect_admin_portal/src/denied/__tests__/AppDenied.test.tsx b/ansible_ai_connect_admin_portal/src/denied/__tests__/AppDenied.test.tsx index 3a1a747ac..c36f2debb 100644 --- a/ansible_ai_connect_admin_portal/src/denied/__tests__/AppDenied.test.tsx +++ b/ansible_ai_connect_admin_portal/src/denied/__tests__/AppDenied.test.tsx @@ -6,7 +6,7 @@ describe("App", () => { it("Rendering::With Username", async () => { window.history.pushState({}, "Test page", "/console"); render(); - const accountMenu = await screen.findByTestId("page-masthead-dropdown"); + const accountMenu = await screen.findByTestId("page-masthead-dropdown__button"); expect(accountMenu).toBeInTheDocument(); expect(accountMenu).toHaveTextContent("Batman"); }); @@ -14,7 +14,7 @@ describe("App", () => { it("Rendering::Without Username", async () => { window.history.pushState({}, "Test page", "/console"); render(); - const accountMenu = await screen.findByTestId("page-masthead-dropdown"); + const accountMenu = await screen.findByTestId("page-masthead-dropdown__button"); expect(accountMenu).toBeInTheDocument(); expect(accountMenu).toHaveTextContent("UnknownUser"); });