1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Merge branch 'master' into show-extension-preferences-in-separate-page

This commit is contained in:
Alex Andreev 2022-06-17 09:56:10 +03:00
commit e3153d1eba
305 changed files with 25721 additions and 3535 deletions

18
.swcrc Normal file
View File

@ -0,0 +1,18 @@
{
"module": {
"type": "commonjs"
},
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": true,
"dynamicImport": false
},
"transform": {
"legacyDecorator": true,
"decoratorMetadata": true
},
"target": "es2019"
}
}

View File

@ -1,4 +1,4 @@
Copyright (c) 2021 OpenLens Authors. Copyright (c) 2022 OpenLens Authors.
Portions of this software are licensed as follows: Portions of this software are licensed as follows:

View File

@ -3,9 +3,9 @@
"productName": "OpenLens", "productName": "OpenLens",
"description": "OpenLens - Open Source IDE for Kubernetes", "description": "OpenLens - Open Source IDE for Kubernetes",
"homepage": "https://github.com/lensapp/lens", "homepage": "https://github.com/lensapp/lens",
"version": "5.6.0-alpha.0", "version": "5.6.0-alpha.2",
"main": "static/build/main.js", "main": "static/build/main.js",
"copyright": "© 2021 OpenLens Authors", "copyright": "© 2022 OpenLens Authors",
"license": "MIT", "license": "MIT",
"author": { "author": {
"name": "OpenLens Authors", "name": "OpenLens Authors",
@ -50,7 +50,7 @@
"bundledKubectlVersion": "1.23.3", "bundledKubectlVersion": "1.23.3",
"bundledHelmVersion": "3.7.2", "bundledHelmVersion": "3.7.2",
"sentryDsn": "", "sentryDsn": "",
"contentSecurityPolicy": "script-src 'unsafe-eval' 'self'; frame-src http://*.localhost:*/; img-src *" "contentSecurityPolicy": "script-src 'unsafe-eval' 'self'; frame-src http://*.localhost:*/; img-src * data:"
}, },
"engines": { "engines": {
"node": ">=16 <17" "node": ">=16 <17"
@ -59,8 +59,12 @@
"collectCoverage": false, "collectCoverage": false,
"verbose": true, "verbose": true,
"transform": { "transform": {
"^.+\\.tsx?$": "ts-jest" "^.+\\.(t|j)sx?$": [
"@swc/jest"
]
}, },
"testEnvironment": "jsdom",
"resolver": "<rootDir>/src/jest-28-resolver.js",
"moduleNameMapper": { "moduleNameMapper": {
"\\.(css|scss)$": "identity-obj-proxy", "\\.(css|scss)$": "identity-obj-proxy",
"\\.(svg|png|jpg|eot|woff2?|ttf)$": "<rootDir>/__mocks__/assetMock.ts" "\\.(svg|png|jpg|eot|woff2?|ttf)$": "<rootDir>/__mocks__/assetMock.ts"
@ -76,11 +80,7 @@
"setupFilesAfterEnv": [ "setupFilesAfterEnv": [
"<rootDir>/src/jest-after-env.setup.ts" "<rootDir>/src/jest-after-env.setup.ts"
], ],
"globals": { "runtime": "@side/jest-runtime"
"ts-jest": {
"isolatedModules": true
}
}
}, },
"build": { "build": {
"generateUpdatesFilesForAllChannels": true, "generateUpdatesFilesForAllChannels": true,
@ -204,16 +204,17 @@
}, },
"dependencies": { "dependencies": {
"@astronautlabs/jsonpath": "^1.1.0", "@astronautlabs/jsonpath": "^1.1.0",
"@hapi/call": "^8.0.1", "@hapi/call": "^9.0.0",
"@hapi/subtext": "^7.0.3", "@hapi/subtext": "^7.0.3",
"@kubernetes/client-node": "^0.16.3", "@kubernetes/client-node": "^0.16.3",
"@material-ui/styles": "^4.11.5", "@material-ui/styles": "^4.11.5",
"@ogre-tools/injectable": "7.1.0",
"@ogre-tools/injectable-react": "7.1.0",
"@ogre-tools/fp": "7.1.0", "@ogre-tools/fp": "7.1.0",
"@ogre-tools/injectable": "7.1.0",
"@ogre-tools/injectable-extension-for-auto-registration": "7.1.0", "@ogre-tools/injectable-extension-for-auto-registration": "7.1.0",
"@ogre-tools/injectable-react": "7.1.0",
"@sentry/electron": "^3.0.7", "@sentry/electron": "^3.0.7",
"@sentry/integrations": "^6.19.3", "@sentry/integrations": "^6.19.3",
"@side/jest-runtime": "^1.0.0",
"@types/circular-dependency-plugin": "5.0.5", "@types/circular-dependency-plugin": "5.0.5",
"abort-controller": "^3.0.0", "abort-controller": "^3.0.0",
"auto-bind": "^4.0.0", "auto-bind": "^4.0.0",
@ -233,15 +234,15 @@
"handlebars": "^4.7.7", "handlebars": "^4.7.7",
"history": "^4.10.1", "history": "^4.10.1",
"http-proxy": "^1.18.1", "http-proxy": "^1.18.1",
"immer": "^9.0.14", "immer": "^9.0.15",
"joi": "^17.6.0", "joi": "^17.6.0",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"jsdom": "^16.7.0", "jsdom": "^16.7.0",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"mac-ca": "^1.0.6", "mac-ca": "^1.0.6",
"marked": "^4.0.16", "marked": "^4.0.17",
"md5-file": "^5.0.0", "md5-file": "^5.0.0",
"mobx": "^6.5.0", "mobx": "^6.6.0",
"mobx-observable-history": "^2.0.3", "mobx-observable-history": "^2.0.3",
"mobx-react": "^7.5.0", "mobx-react": "^7.5.0",
"mobx-utils": "^6.0.4", "mobx-utils": "^6.0.4",
@ -279,7 +280,7 @@
"winston": "^3.7.2", "winston": "^3.7.2",
"winston-console-format": "^1.0.8", "winston-console-format": "^1.0.8",
"winston-transport-browserconsole": "^1.0.5", "winston-transport-browserconsole": "^1.0.5",
"ws": "^8.7.0" "ws": "^8.8.0"
}, },
"devDependencies": { "devDependencies": {
"@async-fn/jest": "1.6.1", "@async-fn/jest": "1.6.1",
@ -288,6 +289,8 @@
"@material-ui/lab": "^4.0.0-alpha.60", "@material-ui/lab": "^4.0.0-alpha.60",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7",
"@sentry/types": "^6.19.7", "@sentry/types": "^6.19.7",
"@swc/core": "^1.2.197",
"@swc/jest": "^0.2.21",
"@testing-library/dom": "^7.31.2", "@testing-library/dom": "^7.31.2",
"@testing-library/jest-dom": "^5.16.4", "@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^12.1.5", "@testing-library/react": "^12.1.5",
@ -304,9 +307,11 @@
"@types/fs-extra": "^9.0.13", "@types/fs-extra": "^9.0.13",
"@types/glob-to-regexp": "^0.4.1", "@types/glob-to-regexp": "^0.4.1",
"@types/gunzip-maybe": "^1.4.0", "@types/gunzip-maybe": "^1.4.0",
"@types/hapi__call": "^9.0.0",
"@types/hapi__subtext": "^7.0.0",
"@types/html-webpack-plugin": "^3.2.6", "@types/html-webpack-plugin": "^3.2.6",
"@types/http-proxy": "^1.17.9", "@types/http-proxy": "^1.17.9",
"@types/jest": "^26.0.24", "@types/jest": "^28.1.1",
"@types/js-yaml": "^4.0.5", "@types/js-yaml": "^4.0.5",
"@types/jsdom": "^16.2.14", "@types/jsdom": "^16.2.14",
"@types/lodash": "^4.14.181", "@types/lodash": "^4.14.181",
@ -314,7 +319,7 @@
"@types/md5-file": "^4.0.2", "@types/md5-file": "^4.0.2",
"@types/mini-css-extract-plugin": "^2.4.0", "@types/mini-css-extract-plugin": "^2.4.0",
"@types/mock-fs": "^4.13.1", "@types/mock-fs": "^4.13.1",
"@types/node": "^16.11.39", "@types/node": "^16.11.40",
"@types/node-fetch": "^2.6.1", "@types/node-fetch": "^2.6.1",
"@types/npm": "^2.0.32", "@types/npm": "^2.0.32",
"@types/proper-lockfile": "^4.1.2", "@types/proper-lockfile": "^4.1.2",
@ -331,7 +336,7 @@
"@types/request": "^2.48.7", "@types/request": "^2.48.7",
"@types/request-promise-native": "^1.0.18", "@types/request-promise-native": "^1.0.18",
"@types/semver": "^7.3.9", "@types/semver": "^7.3.9",
"@types/sharp": "^0.30.2", "@types/sharp": "^0.30.4",
"@types/spdy": "^3.4.5", "@types/spdy": "^3.4.5",
"@types/tar": "^4.0.5", "@types/tar": "^4.0.5",
"@types/tar-stream": "^2.2.2", "@types/tar-stream": "^2.2.2",
@ -344,7 +349,7 @@
"@types/webpack-dev-server": "^4.7.2", "@types/webpack-dev-server": "^4.7.2",
"@types/webpack-env": "^1.17.0", "@types/webpack-env": "^1.17.0",
"@types/webpack-node-externals": "^2.5.3", "@types/webpack-node-externals": "^2.5.3",
"@typescript-eslint/eslint-plugin": "^5.27.1", "@typescript-eslint/eslint-plugin": "^5.28.0",
"@typescript-eslint/parser": "^5.27.0", "@typescript-eslint/parser": "^5.27.0",
"ansi_up": "^5.1.0", "ansi_up": "^5.1.0",
"chart.js": "^2.9.4", "chart.js": "^2.9.4",
@ -352,20 +357,20 @@
"cli-progress": "^3.11.1", "cli-progress": "^3.11.1",
"color": "^3.2.1", "color": "^3.2.1",
"command-line-args": "^5.2.1", "command-line-args": "^5.2.1",
"concurrently": "^7.2.1", "concurrently": "^7.2.2",
"css-loader": "^6.7.1", "css-loader": "^6.7.1",
"deepdash": "^5.3.9", "deepdash": "^5.3.9",
"dompurify": "^2.3.8", "dompurify": "^2.3.8",
"electron": "^15.5.7", "electron": "^15.5.7",
"electron-builder": "^23.0.3", "electron-builder": "^23.0.3",
"electron-notarize": "^0.3.0", "electron-notarize": "^0.3.0",
"esbuild": "^0.14.38", "esbuild": "^0.14.43",
"esbuild-loader": "^2.19.0", "esbuild-loader": "^2.19.0",
"eslint": "^8.16.0", "eslint": "^8.17.0",
"eslint-plugin-header": "^3.1.1", "eslint-plugin-header": "^3.1.1",
"eslint-plugin-import": "^2.26.0", "eslint-plugin-import": "^2.26.0",
"eslint-plugin-react": "^7.30.0", "eslint-plugin-react": "^7.30.0",
"eslint-plugin-react-hooks": "^4.5.0", "eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-unused-imports": "^2.0.0", "eslint-plugin-unused-imports": "^2.0.0",
"flex.box": "^3.4.4", "flex.box": "^3.4.4",
"fork-ts-checker-webpack-plugin": "^6.5.2", "fork-ts-checker-webpack-plugin": "^6.5.2",
@ -374,10 +379,11 @@
"identity-obj-proxy": "^3.0.0", "identity-obj-proxy": "^3.0.0",
"ignore-loader": "^0.1.2", "ignore-loader": "^0.1.2",
"include-media": "^1.4.9", "include-media": "^1.4.9",
"jest": "26.6.3", "jest": "^28.1.1",
"jest-canvas-mock": "^2.3.1", "jest-canvas-mock": "^2.3.1",
"jest-environment-jsdom": "^28.1.1",
"jest-fetch-mock": "^3.0.3", "jest-fetch-mock": "^3.0.3",
"jest-mock-extended": "^1.0.18", "jest-mock-extended": "^2.0.6",
"make-plural": "^6.2.2", "make-plural": "^6.2.2",
"mini-css-extract-plugin": "^2.6.0", "mini-css-extract-plugin": "^2.6.0",
"mock-http": "^1.1.0", "mock-http": "^1.1.0",
@ -396,24 +402,23 @@
"react-select-event": "^5.5.0", "react-select-event": "^5.5.0",
"react-table": "^7.8.0", "react-table": "^7.8.0",
"react-window": "^1.8.7", "react-window": "^1.8.7",
"sass": "^1.52.2", "sass": "^1.52.3",
"sass-loader": "^12.6.0", "sass-loader": "^12.6.0",
"sharp": "^0.30.6", "sharp": "^0.30.6",
"style-loader": "^3.3.1", "style-loader": "^3.3.1",
"tailwindcss": "^3.0.23", "tailwindcss": "^3.0.23",
"tar-stream": "^2.2.0", "tar-stream": "^2.2.0",
"ts-jest": "26.5.6",
"ts-loader": "^9.2.8", "ts-loader": "^9.2.8",
"ts-node": "^10.7.0", "ts-node": "^10.8.1",
"type-fest": "^2.13.0", "type-fest": "^2.13.1",
"typed-emitter": "^1.4.0", "typed-emitter": "^1.4.0",
"typedoc": "0.22.17", "typedoc": "0.22.17",
"typedoc-plugin-markdown": "^3.11.12", "typedoc-plugin-markdown": "^3.11.12",
"typescript": "^4.5.5", "typescript": "^4.7.3",
"typescript-plugin-css-modules": "^3.4.0", "typescript-plugin-css-modules": "^3.4.0",
"webpack": "^5.73.0", "webpack": "^5.73.0",
"webpack-cli": "^4.9.2", "webpack-cli": "^4.9.2",
"webpack-dev-server": "^4.9.1", "webpack-dev-server": "^4.9.2",
"webpack-node-externals": "^3.0.0", "webpack-node-externals": "^3.0.0",
"xterm": "^4.18.0", "xterm": "^4.18.0",
"xterm-addon-fit": "^0.5.0" "xterm-addon-fit": "^0.5.0"

View File

@ -133,7 +133,8 @@ const relaventPrsQuery = await Promise.all(
); );
const relaventPrs = relaventPrsQuery const relaventPrs = relaventPrsQuery
.filter(query => query.stdout) .filter(query => query.stdout)
.map(query => query.pr); .map(query => query.pr)
.filter(pr => pr.labels.every(label => label.name !== "skip-changelog"));
const enhancementPrLabelName = "enhancement"; const enhancementPrLabelName = "enhancement";
const bugfixPrLabelName = "bug"; const bugfixPrLabelName = "bug";
@ -152,11 +153,15 @@ const prBodyLines = [
"", "",
]; ];
function getPrEntry(pr) {
return `- ${pr.title} (**[#${pr.number}](https://github.com/lensapp/lens/pull/${pr.number})**) https://github.com/${pr.author.login}`;
}
if (enhancementPrs.length > 0) { if (enhancementPrs.length > 0) {
prBodyLines.push( prBodyLines.push(
"## 🚀 Features", "## 🚀 Features",
"", "",
...enhancementPrs.map(pr => `- ${pr.title} (**#${pr.number}**) https://github.com/${pr.author.login}`), ...enhancementPrs.map(getPrEntry),
"", "",
); );
} }
@ -165,7 +170,7 @@ if (bugfixPrs.length > 0) {
prBodyLines.push( prBodyLines.push(
"## 🐛 Bug Fixes", "## 🐛 Bug Fixes",
"", "",
...bugfixPrs.map(pr => `- ${pr.title} (**#${pr.number}**) https://github.com/${pr.author.login}`), ...bugfixPrs.map(getPrEntry),
"", "",
); );
} }
@ -174,7 +179,7 @@ if (maintenencePrs.length > 0) {
prBodyLines.push( prBodyLines.push(
"## 🧰 Maintenance", "## 🧰 Maintenance",
"", "",
...maintenencePrs.map(pr => `- ${pr.title} (**#${pr.number}**) https://github.com/${pr.author.login}`), ...maintenencePrs.map(getPrEntry),
"", "",
); );
} }

View File

@ -2,6 +2,16 @@
exports[`extension special characters in page registrations renders 1`] = ` exports[`extension special characters in page registrations renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -10,6 +20,16 @@ exports[`extension special characters in page registrations renders 1`] = `
exports[`extension special characters in page registrations when navigating to route with ID having special characters renders 1`] = ` exports[`extension special characters in page registrations when navigating to route with ID having special characters renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div> <div>
Some page Some page
</div> </div>

View File

@ -2,6 +2,16 @@
exports[`navigate to extension page renders 1`] = ` exports[`navigate to extension page renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -10,6 +20,16 @@ exports[`navigate to extension page renders 1`] = `
exports[`navigate to extension page when extension navigates to child route renders 1`] = ` exports[`navigate to extension page when extension navigates to child route renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div> <div>
Child page Child page
</div> </div>
@ -21,6 +41,16 @@ exports[`navigate to extension page when extension navigates to child route rend
exports[`navigate to extension page when extension navigates to route with parameters renders 1`] = ` exports[`navigate to extension page when extension navigates to route with parameters renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div> <div>
<ul> <ul>
<li> <li>
@ -48,6 +78,16 @@ exports[`navigate to extension page when extension navigates to route with param
exports[`navigate to extension page when extension navigates to route without parameters renders 1`] = ` exports[`navigate to extension page when extension navigates to route without parameters renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div> <div>
<ul> <ul>
<li> <li>
@ -75,6 +115,16 @@ exports[`navigate to extension page when extension navigates to route without pa
exports[`navigate to extension page when extension navigates to route without parameters when changing page parameters renders 1`] = ` exports[`navigate to extension page when extension navigates to route without parameters when changing page parameters renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div> <div>
<ul> <ul>
<li> <li>

View File

@ -2,6 +2,16 @@
exports[`navigating between routes given route with optional path parameters when navigating to route with path parameters renders 1`] = ` exports[`navigating between routes given route with optional path parameters when navigating to route with path parameters renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<pre> <pre>
{ {
"someParameter": "some-value", "someParameter": "some-value",
@ -16,6 +26,16 @@ exports[`navigating between routes given route with optional path parameters whe
exports[`navigating between routes given route without path parameters when navigating to route renders 1`] = ` exports[`navigating between routes given route without path parameters when navigating to route renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div> <div>
Some component Some component
</div> </div>

View File

@ -2,6 +2,16 @@
exports[`add-cluster - navigation using application menu renders 1`] = ` exports[`add-cluster - navigation using application menu renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -10,6 +20,16 @@ exports[`add-cluster - navigation using application menu renders 1`] = `
exports[`add-cluster - navigation using application menu when navigating to add cluster using application menu renders 1`] = ` exports[`add-cluster - navigation using application menu when navigating to add cluster using application menu renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout AddClusters" class="SettingLayout AddClusters"
data-testid="add-cluster-page" data-testid="add-cluster-page"

View File

@ -3,6 +3,16 @@
exports[`installing update using tray when started renders 1`] = ` exports[`installing update using tray when started renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -13,6 +23,16 @@ exports[`installing update using tray when started renders 1`] = `
exports[`installing update using tray when started when user checks for updates using tray renders 1`] = ` exports[`installing update using tray when started when user checks for updates using tray renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
> >
@ -64,6 +84,16 @@ exports[`installing update using tray when started when user checks for updates
exports[`installing update using tray when started when user checks for updates using tray when new update is discovered renders 1`] = ` exports[`installing update using tray when started when user checks for updates using tray when new update is discovered renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
> >
@ -155,6 +185,16 @@ exports[`installing update using tray when started when user checks for updates
exports[`installing update using tray when started when user checks for updates using tray when new update is discovered when download fails renders 1`] = ` exports[`installing update using tray when started when user checks for updates using tray when new update is discovered when download fails renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
> >
@ -286,6 +326,16 @@ exports[`installing update using tray when started when user checks for updates
exports[`installing update using tray when started when user checks for updates using tray when new update is discovered when download succeeds renders 1`] = ` exports[`installing update using tray when started when user checks for updates using tray when new update is discovered when download succeeds renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
> >
@ -447,6 +497,16 @@ Lens should restart automatically, if it doesn't please restart manually. Instal
exports[`installing update using tray when started when user checks for updates using tray when no new update is discovered renders 1`] = ` exports[`installing update using tray when started when user checks for updates using tray when no new update is discovered renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
> >

View File

@ -3,6 +3,16 @@
exports[`installing update when started renders 1`] = ` exports[`installing update when started renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -13,6 +23,16 @@ exports[`installing update when started renders 1`] = `
exports[`installing update when started when user checks for updates renders 1`] = ` exports[`installing update when started when user checks for updates renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -23,6 +43,16 @@ exports[`installing update when started when user checks for updates renders 1`]
exports[`installing update when started when user checks for updates when new update is discovered renders 1`] = ` exports[`installing update when started when user checks for updates when new update is discovered renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -33,6 +63,16 @@ exports[`installing update when started when user checks for updates when new up
exports[`installing update when started when user checks for updates when new update is discovered when download fails renders 1`] = ` exports[`installing update when started when user checks for updates when new update is discovered when download fails renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -43,6 +83,16 @@ exports[`installing update when started when user checks for updates when new up
exports[`installing update when started when user checks for updates when new update is discovered when download succeeds renders 1`] = ` exports[`installing update when started when user checks for updates when new update is discovered when download succeeds renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -53,6 +103,16 @@ exports[`installing update when started when user checks for updates when new up
exports[`installing update when started when user checks for updates when new update is discovered when download succeeds when user answers not to install the update renders 1`] = ` exports[`installing update when started when user checks for updates when new update is discovered when download succeeds when user answers not to install the update renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -63,6 +123,16 @@ exports[`installing update when started when user checks for updates when new up
exports[`installing update when started when user checks for updates when new update is discovered when download succeeds when user answers to install the update renders 1`] = ` exports[`installing update when started when user checks for updates when new update is discovered when download succeeds when user answers to install the update renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -73,6 +143,16 @@ exports[`installing update when started when user checks for updates when new up
exports[`installing update when started when user checks for updates when no new update is discovered renders 1`] = ` exports[`installing update when started when user checks for updates when no new update is discovered renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />

View File

@ -3,6 +3,16 @@
exports[`periodical checking of updates given updater is enabled and configuration exists, when started renders 1`] = ` exports[`periodical checking of updates given updater is enabled and configuration exists, when started renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />

View File

@ -3,6 +3,16 @@
exports[`selection of update stability when started renders 1`] = ` exports[`selection of update stability when started renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />

View File

@ -0,0 +1,225 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable";
import publishIsConfiguredInjectable from "../../main/application-update/publish-is-configured.injectable";
import type { AsyncFnMock } from "@async-fn/jest";
import asyncFn from "@async-fn/jest";
import type { CheckForPlatformUpdates } from "../../main/application-update/check-for-platform-updates/check-for-platform-updates.injectable";
import checkForPlatformUpdatesInjectable from "../../main/application-update/check-for-platform-updates/check-for-platform-updates.injectable";
import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable";
import type { DiContainer } from "@ogre-tools/injectable";
import processCheckingForUpdatesInjectable from "../../main/application-update/check-for-updates/process-checking-for-updates.injectable";
import type { DownloadPlatformUpdate } from "../../main/application-update/download-platform-update/download-platform-update.injectable";
import downloadPlatformUpdateInjectable from "../../main/application-update/download-platform-update/download-platform-update.injectable";
import quitAndInstallUpdateInjectable from "../../main/application-update/quit-and-install-update.injectable";
import appVersionInjectable from "../../common/get-configuration-file-model/app-version/app-version.injectable";
import periodicalCheckForUpdatesInjectable from "../../main/application-update/periodical-check-for-updates/periodical-check-for-updates.injectable";
describe("analytics for installing update", () => {
let applicationBuilder: ApplicationBuilder;
let checkForPlatformUpdatesMock: AsyncFnMock<CheckForPlatformUpdates>;
let downloadPlatformUpdateMock: AsyncFnMock<DownloadPlatformUpdate>;
let analyticsListenerMock: jest.Mock;
let mainDi: DiContainer;
beforeEach(async () => {
jest.useFakeTimers();
global.Date.now = () => new Date("2015-10-21T07:28:00Z").getTime();
applicationBuilder = getApplicationBuilder();
analyticsListenerMock = jest.fn();
applicationBuilder.beforeApplicationStart(({ mainDi }) => {
mainDi.override(appVersionInjectable, () => "42.0.0");
checkForPlatformUpdatesMock = asyncFn();
mainDi.override(
checkForPlatformUpdatesInjectable,
() => checkForPlatformUpdatesMock,
);
downloadPlatformUpdateMock = asyncFn();
mainDi.override(downloadPlatformUpdateInjectable, () => downloadPlatformUpdateMock);
mainDi.override(electronUpdaterIsActiveInjectable, () => true);
mainDi.override(publishIsConfiguredInjectable, () => true);
const eventBus = mainDi.inject(appEventBusInjectable);
eventBus.addListener(analyticsListenerMock);
});
mainDi = applicationBuilder.dis.mainDi;
});
describe("given application is started and checking updates periodically", () => {
beforeEach(async () => {
mainDi.unoverride(periodicalCheckForUpdatesInjectable);
mainDi.permitSideEffects(periodicalCheckForUpdatesInjectable);
await applicationBuilder.render();
});
it("sends event to analytics for being checked periodically", () => {
expect(analyticsListenerMock).toHaveBeenCalledWith({
name: "app",
action: "checking-for-updates",
params: {
currentDateTime: "2015-10-21T07:28:00Z",
source: "periodic",
},
});
});
it("when enough time passes to check for updates again, sends event to analytics for being checked periodically", () => {
analyticsListenerMock.mockClear();
jest.advanceTimersByTime(1000 * 60 * 60 * 2);
expect(analyticsListenerMock).toHaveBeenCalledWith({
name: "app",
action: "checking-for-updates",
params: {
currentDateTime: "2015-10-21T07:28:00Z",
source: "periodic",
},
});
});
});
describe("when application is started", () => {
beforeEach(async () => {
analyticsListenerMock.mockClear();
await applicationBuilder.render();
});
it("sends event to analytics about the current version", () => {
expect(analyticsListenerMock).toHaveBeenCalledWith({
name: "app",
action: "current-version",
params: {
version: "42.0.0",
currentDateTime: "2015-10-21T07:28:00Z",
},
});
});
it("when checking for updates using tray, sends event to analytics for being checked from tray", async () => {
analyticsListenerMock.mockClear();
applicationBuilder.tray.click("check-for-updates");
expect(analyticsListenerMock.mock.calls).toEqual([
[
{
name: "app",
action: "checking-for-updates",
params: {
currentDateTime: "2015-10-21T07:28:00Z",
source: "tray",
},
},
],
]);
});
it("when checking for updates using application menu, sends event to analytics for being checked from application menu", async () => {
analyticsListenerMock.mockClear();
applicationBuilder.applicationMenu.click("root.check-for-updates");
expect(analyticsListenerMock.mock.calls).toEqual([
[
{
name: "app",
action: "checking-for-updates",
params: {
currentDateTime: "2015-10-21T07:28:00Z",
source: "application-menu",
},
},
],
]);
});
describe("given checking for updates, when check for updates resolves with new update being available", () => {
beforeEach(async () => {
const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable);
processCheckingForUpdates("irrelevant");
analyticsListenerMock.mockClear();
await checkForPlatformUpdatesMock.resolve({
updateWasDiscovered: true,
version: "43.0.0",
});
});
it("sends event to analytics about new update being available", () => {
expect(analyticsListenerMock.mock.calls).toEqual([
[
{
name: "app",
action: "update-was-discovered",
params: {
version: "43.0.0",
currentDateTime: "2015-10-21T07:28:00Z",
},
},
],
]);
});
describe("given update is downloaded", () => {
beforeEach(async () => {
analyticsListenerMock.mockClear();
await downloadPlatformUpdateMock.resolve({ downloadWasSuccessful: true });
});
it("does not send event to analytics about update downloaded being successful", () => {
expect(analyticsListenerMock).not.toHaveBeenCalled();
});
it("when installing the update, sends event to analytics about installing the update", () => {
const quitAndInstallUpdate = mainDi.inject(quitAndInstallUpdateInjectable);
quitAndInstallUpdate();
expect(analyticsListenerMock.mock.calls).toEqual([
[
{
name: "app",
action: "start-installing-update",
params: {
version: "43.0.0",
currentDateTime: "2015-10-21T07:28:00Z",
updateChannel: "latest",
},
},
],
]);
});
});
});
});
});

View File

@ -22,8 +22,6 @@ describe("downgrading version update", () => {
let mainDi: DiContainer; let mainDi: DiContainer;
beforeEach(() => { beforeEach(() => {
jest.useFakeTimers();
applicationBuilder = getApplicationBuilder(); applicationBuilder = getApplicationBuilder();
applicationBuilder.beforeApplicationStart(({ mainDi }) => { applicationBuilder.beforeApplicationStart(({ mainDi }) => {
@ -79,7 +77,7 @@ describe("downgrading version update", () => {
const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable); const processCheckingForUpdates = mainDi.inject(processCheckingForUpdatesInjectable);
processCheckingForUpdates(); processCheckingForUpdates("irrelevant");
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(expect.any(Object), { allowDowngrade: downgradeIsAllowed }); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(expect.any(Object), { allowDowngrade: downgradeIsAllowed });
}); });

View File

@ -4,7 +4,7 @@
*/ */
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import quitAndInstallUpdateInjectable from "../../main/electron-app/features/quit-and-install-update.injectable"; import quitAndInstallUpdateInjectable from "../../main/application-update/quit-and-install-update.injectable";
import type { RenderResult } from "@testing-library/react"; import type { RenderResult } from "@testing-library/react";
import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable"; import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable";
import publishIsConfiguredInjectable from "../../main/application-update/publish-is-configured.injectable"; import publishIsConfiguredInjectable from "../../main/application-update/publish-is-configured.injectable";
@ -67,7 +67,7 @@ describe("installing update", () => {
describe("when started", () => { describe("when started", () => {
let rendered: RenderResult; let rendered: RenderResult;
let processCheckingForUpdates: () => Promise<void>; let processCheckingForUpdates: (source: string) => Promise<void>;
beforeEach(async () => { beforeEach(async () => {
rendered = await applicationBuilder.render(); rendered = await applicationBuilder.render();
@ -83,7 +83,7 @@ describe("installing update", () => {
let processCheckingForUpdatesPromise: Promise<void>; let processCheckingForUpdatesPromise: Promise<void>;
beforeEach(async () => { beforeEach(async () => {
processCheckingForUpdatesPromise = processCheckingForUpdates(); processCheckingForUpdatesPromise = processCheckingForUpdates("irrelevant");
}); });
it("checks for updates", () => { it("checks for updates", () => {

View File

@ -4,7 +4,7 @@
*/ */
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import quitAndInstallUpdateInjectable from "../../main/electron-app/features/quit-and-install-update.injectable"; import quitAndInstallUpdateInjectable from "../../main/application-update/quit-and-install-update.injectable";
import type { RenderResult } from "@testing-library/react"; import type { RenderResult } from "@testing-library/react";
import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable"; import electronUpdaterIsActiveInjectable from "../../main/electron-app/features/electron-updater-is-active.injectable";
import publishIsConfiguredInjectable from "../../main/application-update/publish-is-configured.injectable"; import publishIsConfiguredInjectable from "../../main/application-update/publish-is-configured.injectable";
@ -72,7 +72,7 @@ describe("selection of update stability", () => {
describe("when started", () => { describe("when started", () => {
let rendered: RenderResult; let rendered: RenderResult;
let processCheckingForUpdates: () => Promise<void>; let processCheckingForUpdates: (source: string) => Promise<void>;
beforeEach(async () => { beforeEach(async () => {
rendered = await applicationBuilder.render(); rendered = await applicationBuilder.render();
@ -97,7 +97,7 @@ describe("selection of update stability", () => {
selectedUpdateChannel.setValue(updateChannels.alpha.id); selectedUpdateChannel.setValue(updateChannels.alpha.id);
processCheckingForUpdates(); processCheckingForUpdates("irrelevant");
}); });
it('checks updates from update channel "alpha"', () => { it('checks updates from update channel "alpha"', () => {
@ -191,7 +191,7 @@ describe("selection of update stability", () => {
describe("when checking for updates", () => { describe("when checking for updates", () => {
beforeEach(() => { beforeEach(() => {
processCheckingForUpdates(); processCheckingForUpdates("irrelevant");
}); });
describe('when update from "beta" channel is discovered', () => { describe('when update from "beta" channel is discovered', () => {
@ -241,7 +241,7 @@ describe("selection of update stability", () => {
const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable);
processCheckingForUpdates(); processCheckingForUpdates("irrelevant");
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object)); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object));
}); });
@ -259,7 +259,7 @@ describe("selection of update stability", () => {
const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable);
processCheckingForUpdates(); processCheckingForUpdates("irrelevant");
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.latest, expect.any(Object)); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.latest, expect.any(Object));
}); });
@ -273,7 +273,7 @@ describe("selection of update stability", () => {
const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable);
processCheckingForUpdates(); processCheckingForUpdates("irrelevant");
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith( expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(
updateChannels.latest, updateChannels.latest,
@ -290,7 +290,7 @@ describe("selection of update stability", () => {
const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable);
processCheckingForUpdates(); processCheckingForUpdates("irrelevant");
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.alpha, expect.any(Object)); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.alpha, expect.any(Object));
}); });
@ -304,7 +304,7 @@ describe("selection of update stability", () => {
const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable);
processCheckingForUpdates(); processCheckingForUpdates("irrelevant");
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object)); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object));
}); });
@ -324,7 +324,7 @@ describe("selection of update stability", () => {
const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable); const processCheckingForUpdates = applicationBuilder.dis.mainDi.inject(processCheckingForUpdatesInjectable);
processCheckingForUpdates(); processCheckingForUpdates("irrelevant");
expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object)); expect(checkForPlatformUpdatesMock).toHaveBeenCalledWith(updateChannels.beta, expect.any(Object));
}); });

View File

@ -14,7 +14,7 @@ import { sidebarItemsInjectionToken } from "../../renderer/components/layout/sid
import { computed } from "mobx"; import { computed } from "mobx";
import { noop } from "lodash/fp"; import { noop } from "lodash/fp";
import routeIsActiveInjectable from "../../renderer/routes/route-is-active.injectable"; import routeIsActiveInjectable from "../../renderer/routes/route-is-active.injectable";
import { routeInjectionToken } from "../../common/front-end-routing/route-injection-token"; import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import writeJsonFileInjectable from "../../common/fs/write-json-file.injectable"; import writeJsonFileInjectable from "../../common/fs/write-json-file.injectable";
@ -337,7 +337,7 @@ const testRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
const testRouteComponentInjectable = getInjectable({ const testRouteComponentInjectable = getInjectable({

View File

@ -10,7 +10,7 @@ import { computed } from "mobx";
import { routeSpecificComponentInjectionToken } from "../../renderer/routes/route-specific-component-injection-token"; import { routeSpecificComponentInjectionToken } from "../../renderer/routes/route-specific-component-injection-token";
import React from "react"; import React from "react";
import isAllowedResourceInjectable from "../../common/utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../common/utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../common/front-end-routing/route-injection-token"; import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token"; import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token";
@ -83,7 +83,7 @@ const testRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
const testRouteComponentInjectable = getInjectable({ const testRouteComponentInjectable = getInjectable({

View File

@ -2,6 +2,16 @@
exports[`extensions - navigation using application menu renders 1`] = ` exports[`extensions - navigation using application menu renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -10,6 +20,16 @@ exports[`extensions - navigation using application menu renders 1`] = `
exports[`extensions - navigation using application menu when navigating to extensions using application menu renders 1`] = ` exports[`extensions - navigation using application menu when navigating to extensions using application menu renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout DropFileInput Extensions" class="SettingLayout DropFileInput Extensions"
data-testid="extensions-page" data-testid="extensions-page"

View File

@ -37,8 +37,8 @@ describe("extensions - navigation using application menu", () => {
}); });
describe("when navigating to extensions using application menu", () => { describe("when navigating to extensions using application menu", () => {
beforeEach(async () => { beforeEach(() => {
await applicationBuilder.applicationMenu.click("root.extensions"); applicationBuilder.applicationMenu.click("root.extensions");
}); });
it("focuses the window", () => { it("focuses the window", () => {

View File

@ -444,8 +444,14 @@ exports[`helm-charts - navigation to Helm charts when navigating to Helm charts
</div> </div>
</div> </div>
<div <div
class="Spinner singleColor center" class="NoItems flex box grow"
/> >
<div
class="box center"
>
Item list is empty
</div>
</div>
</div> </div>
<div <div
class="AddRemoveButtons flex gaps" class="AddRemoveButtons flex gaps"

View File

@ -0,0 +1,387 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { RenderResult } from "@testing-library/react";
import { fireEvent } from "@testing-library/react";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import type { AsyncFnMock } from "@async-fn/jest";
import asyncFn from "@async-fn/jest";
import execFileInjectable from "../../common/fs/exec-file.injectable";
import helmBinaryPathInjectable from "../../main/helm/helm-binary-path.injectable";
import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
import type { HelmRepo } from "../../common/helm/helm-repo";
import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/adding-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable";
import isPathInjectable from "../../renderer/components/input/validators/is-path.injectable";
import showSuccessNotificationInjectable from "../../renderer/components/notifications/show-success-notification.injectable";
import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable";
import type { AsyncResult } from "../../common/utils/async-result";
// TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
withTooltip: (target: any) => target,
}));
describe("add custom helm repository in preferences", () => {
let applicationBuilder: ApplicationBuilder;
let showSuccessNotificationMock: jest.Mock;
let showErrorNotificationMock: jest.Mock;
let rendered: RenderResult;
let execFileMock: AsyncFnMock<
ReturnType<typeof execFileInjectable["instantiate"]>
>;
let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult<HelmRepo[]>>;
beforeEach(async () => {
jest.useFakeTimers();
applicationBuilder = getApplicationBuilder();
execFileMock = asyncFn();
getActiveHelmRepositoriesMock = asyncFn();
applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => {
rendererDi.override(callForPublicHelmRepositoriesInjectable, () => async () => []);
showSuccessNotificationMock = jest.fn();
rendererDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock);
showErrorNotificationMock = jest.fn();
rendererDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock);
// TODO: Figure out how to make async validators unit testable
rendererDi.override(isPathInjectable, () => ({ debounce: 0, validate: async () => {} }));
mainDi.override(
getActiveHelmRepositoriesInjectable,
() => getActiveHelmRepositoriesMock,
);
mainDi.override(execFileInjectable, () => execFileMock);
mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path");
});
rendered = await applicationBuilder.render();
});
describe("when navigating to preferences containing helm repositories", () => {
beforeEach(async () => {
applicationBuilder.preferences.navigate();
applicationBuilder.preferences.navigation.click("kubernetes");
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
describe("when active repositories resolve", () => {
beforeEach(async () => {
await Promise.all([
getActiveHelmRepositoriesMock.resolve({
callWasSuccessful: true,
response: [
{ name: "Some active repository", url: "some-url" },
],
}),
]);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
describe("when selecting to add custom repository", () => {
beforeEach(() => {
const button = rendered.getByTestId("add-custom-helm-repo-button");
fireEvent.click(button);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("shows dialog", () => {
expect(
rendered.queryByTestId("add-custom-helm-repository-dialog"),
).toBeInTheDocument();
});
// TODO: Figure out how to close dialog by clicking outside of it
xdescribe("when closing the dialog by clicking outside", () => {
beforeEach(() => {});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("does not show dialog anymore", () => {
expect(
rendered.queryByTestId("add-custom-helm-repository-dialog"),
).not.toBeInTheDocument();
});
});
describe("when closing the dialog by clicking cancel", () => {
beforeEach(() => {
const button = rendered.getByTestId("custom-helm-repository-cancel-button");
fireEvent.click(button);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("does not show dialog anymore", () => {
expect(
rendered.queryByTestId("add-custom-helm-repository-dialog"),
).not.toBeInTheDocument();
});
});
describe("when inputted minimal options for the repository", () => {
beforeEach(() => {
getActiveHelmRepositoriesMock.mockClear();
const nameInput = rendered.getByTestId("custom-helm-repository-name-input");
fireEvent.change(nameInput, { target: { value: "some-custom-repository" }});
const urlInput = rendered.getByTestId("custom-helm-repository-url-input");
fireEvent.change(urlInput, { target: { value: "http://some.url" }});
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
describe("when submitted and some time passes", () => {
beforeEach(() => {
const submitButton = rendered.getByTestId("custom-helm-repository-submit-button");
fireEvent.click(submitButton);
// TODO: Remove when debounce is removed from WizardStep.submit
jest.runOnlyPendingTimers();
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("adds the repository", () => {
expect(execFileMock).toHaveBeenCalledWith(
"some-helm-binary-path",
["repo", "add", "some-custom-repository", "http://some.url"],
);
});
it("does not reload active repositories yet", () => {
expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled();
});
it("does not show notification yet", () => {
expect(showSuccessNotificationMock).not.toHaveBeenCalled();
});
describe("when activation rejects", () => {
beforeEach(async () => {
await execFileMock.reject(
"Some error",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("shows error notification", () => {
expect(showErrorNotificationMock).toHaveBeenCalledWith(
"Some error",
);
});
it("does not show success notification", () => {
expect(showSuccessNotificationMock).not.toHaveBeenCalled();
});
it("does not show dialog anymore", () => {
expect(rendered.queryByTestId("add-custom-helm-repository-dialog")).not.toBeInTheDocument();
});
it("does not reload active repositories", () => {
expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled();
});
});
describe("when activation resolves with success", () => {
beforeEach(async () => {
await execFileMock.resolveSpecific(
[
"some-helm-binary-path",
["repo", "add", "some-custom-repository", "http://some.url"],
],
"",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("does not show dialog anymore", () => {
expect(rendered.queryByTestId("add-custom-helm-repository-dialog")).not.toBeInTheDocument();
});
it("reloads active repositories", () => {
expect(getActiveHelmRepositoriesMock).toHaveBeenCalled();
});
it("shows success notification", () => {
expect(showSuccessNotificationMock).toHaveBeenCalledWith(
"Helm repository some-custom-repository has been added.",
);
});
describe("when adding custom repository again", () => {
beforeEach(() => {
const button = rendered.getByTestId("add-custom-helm-repo-button");
fireEvent.click(button);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("repository name is empty", () => {
const input = rendered.getByTestId("custom-helm-repository-name-input") as HTMLInputElement;
expect(input.value).toBe("");
});
it("repository url is empty", () => {
const input = rendered.getByTestId("custom-helm-repository-url-input") as HTMLInputElement;
expect(input.value).toBe("");
});
});
});
});
describe("when showing the maximal options", () => {
beforeEach(() => {
const button = rendered.getByTestId("toggle-maximal-options-for-custom-helm-repository-button");
fireEvent.click(button);
});
it("shows maximal options", () => {
const maximalOptions = rendered.getByTestId("maximal-options-for-custom-helm-repository-dialog");
expect(maximalOptions).toBeInTheDocument();
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("given closing the dialog, when reopening the dialog, still shows maximal options", () => {
const cancelButton = rendered.getByTestId("custom-helm-repository-cancel-button");
fireEvent.click(cancelButton);
const openButton = rendered.getByTestId("add-custom-helm-repo-button");
fireEvent.click(openButton);
const maximalOptions = rendered.getByTestId("maximal-options-for-custom-helm-repository-dialog");
expect(maximalOptions).toBeInTheDocument();
});
describe("when hiding maximal options", () => {
beforeEach(() => {
const button = rendered.getByTestId("toggle-maximal-options-for-custom-helm-repository-button");
fireEvent.click(button);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("does not show maximal options anymore", () => {
const maximalOptions = rendered.queryByTestId("maximal-options-for-custom-helm-repository-dialog");
expect(maximalOptions).not.toBeInTheDocument();
});
});
describe("when inputted maximal options", () => {
beforeEach(async () => {
[
{ selector: "username-input", value: "some-username" },
{ selector: "password-input", value: "some-password" },
{ selector: "ca-cert-file-input", value: "some-ca-cert-file" },
{ selector: "cert-file-input", value: "some-cert-file" },
{ selector: "key-file-input", value: "some-key-file" },
].forEach(({ selector, value }) => {
const input = rendered.getByTestId(`custom-helm-repository-${selector}`);
fireEvent.change(input, { target: { value }});
});
const checkbox = rendered.getByTestId(`custom-helm-repository-verify-tls-input`);
fireEvent.click(checkbox);
jest.runOnlyPendingTimers();
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("when submitted and some time passes, adds the repository with maximal options", () => {
const submitButton = rendered.getByTestId("custom-helm-repository-submit-button");
fireEvent.click(submitButton);
// TODO: Remove when debounce is removed from WizardStep.submit
jest.runOnlyPendingTimers();
expect(execFileMock).toHaveBeenCalledWith(
"some-helm-binary-path",
[
"repo",
"add",
"some-custom-repository",
"http://some.url",
"--insecure-skip-tls-verify",
"--username",
"some-username",
"--password",
"some-password",
"--ca-file",
"some-ca-cert-file",
"--key-file",
"some-key-file",
"--cert-file",
"some-cert-file",
],
);
});
});
});
});
});
});
});
});

View File

@ -0,0 +1,278 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { RenderResult } from "@testing-library/react";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import type { AsyncFnMock } from "@async-fn/jest";
import asyncFn from "@async-fn/jest";
import execFileInjectable from "../../common/fs/exec-file.injectable";
import helmBinaryPathInjectable from "../../main/helm/helm-binary-path.injectable";
import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
import type { HelmRepo } from "../../common/helm/helm-repo";
import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/adding-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable";
import showSuccessNotificationInjectable from "../../renderer/components/notifications/show-success-notification.injectable";
import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable";
import type { AsyncResult } from "../../common/utils/async-result";
// TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
withTooltip: (target: any) => target,
}));
describe("add helm repository from list in preferences", () => {
let applicationBuilder: ApplicationBuilder;
let showSuccessNotificationMock: jest.Mock;
let showErrorNotificationMock: jest.Mock;
let rendered: RenderResult;
let execFileMock: AsyncFnMock<
ReturnType<typeof execFileInjectable["instantiate"]>
>;
let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult<HelmRepo[]>>;
let callForPublicHelmRepositoriesMock: AsyncFnMock<() => Promise<HelmRepo[]>>;
beforeEach(async () => {
applicationBuilder = getApplicationBuilder();
execFileMock = asyncFn();
getActiveHelmRepositoriesMock = asyncFn();
callForPublicHelmRepositoriesMock = asyncFn();
applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => {
showSuccessNotificationMock = jest.fn();
rendererDi.override(showSuccessNotificationInjectable, () => showSuccessNotificationMock);
showErrorNotificationMock = jest.fn();
rendererDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock);
rendererDi.override(
callForPublicHelmRepositoriesInjectable,
() => callForPublicHelmRepositoriesMock,
);
mainDi.override(
getActiveHelmRepositoriesInjectable,
() => getActiveHelmRepositoriesMock,
);
mainDi.override(execFileInjectable, () => execFileMock);
mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path");
});
rendered = await applicationBuilder.render();
});
describe("when navigating to preferences containing helm repositories", () => {
beforeEach(async () => {
applicationBuilder.preferences.navigate();
applicationBuilder.preferences.navigation.click("kubernetes");
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("calls for public repositories", () => {
expect(callForPublicHelmRepositoriesMock).toHaveBeenCalled();
});
it("calls for active repositories", () => {
expect(getActiveHelmRepositoriesMock).toHaveBeenCalled();
});
describe("when both active and public repositories resolve", () => {
beforeEach(async () => {
await Promise.all([
callForPublicHelmRepositoriesMock.resolve([
{ name: "Some already active repository", url: "some-url" },
{ name: "Some to be added repository", url: "some-other-url" },
]),
getActiveHelmRepositoriesMock.resolve({
callWasSuccessful: true,
response: [
{ name: "Some already active repository", url: "some-url" },
],
}),
]);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
describe("when select for adding public repositories is clicked", () => {
beforeEach(() => {
applicationBuilder.select.openMenu(
"selection-of-active-public-helm-repository",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
describe("when deactive public repository is selected", () => {
beforeEach(async () => {
getActiveHelmRepositoriesMock.mockClear();
applicationBuilder.select.selectOption(
"selection-of-active-public-helm-repository",
"Some to be added repository",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("adds the repository", () => {
expect(execFileMock).toHaveBeenCalledWith(
"some-helm-binary-path",
["repo", "add", "Some to be added repository", "some-other-url"],
);
});
it("does not reload active repositories yet", () => {
expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled();
});
describe("when adding rejects", () => {
beforeEach(async () => {
await execFileMock.reject(
"Some error",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("shows error notification", () => {
expect(showErrorNotificationMock).toHaveBeenCalledWith(
"Some error",
);
});
it("does not show success notification", () => {
expect(showSuccessNotificationMock).not.toHaveBeenCalled();
});
it("does not show dialog anymore", () => {
expect(rendered.queryByTestId("add-custom-helm-repository-dialog")).not.toBeInTheDocument();
});
it("does not reload active repositories", () => {
expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled();
});
});
describe("when adding resolves", () => {
beforeEach(async () => {
await execFileMock.resolveSpecific(
[
"some-helm-binary-path",
["repo", "add", "Some to be added repository", "some-other-url"],
],
"",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("reloads active repositories", () => {
expect(getActiveHelmRepositoriesMock).toHaveBeenCalled();
});
it("shows success notification", () => {
expect(showSuccessNotificationMock).toHaveBeenCalledWith(
"Helm repository Some to be added repository has been added.",
);
});
describe("when active repositories resolve again", () => {
beforeEach(async () => {
await getActiveHelmRepositoriesMock.resolve({
callWasSuccessful: true,
response: [
{ name: "Some already active repository", url: "some-url" },
{ name: "Some to be added repository", url: "some-other-url" },
],
});
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
describe("when select for selecting active repositories is clicked", () => {
beforeEach(() => {
applicationBuilder.select.openMenu(
"selection-of-active-public-helm-repository",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
describe("when active repository is selected", () => {
beforeEach(() => {
execFileMock.mockClear();
getActiveHelmRepositoriesMock.mockClear();
applicationBuilder.select.selectOption(
"selection-of-active-public-helm-repository",
"Some already active repository",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("removes the repository", () => {
expect(execFileMock).toHaveBeenCalledWith(
"some-helm-binary-path",
["repo", "remove", "Some already active repository"],
);
});
it("does not reload active repositories yet", () => {
expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled();
});
describe("when removing resolves", () => {
beforeEach(async () => {
await execFileMock.resolveSpecific(
[
"some-helm-binary-path",
["repo", "remove", "Some already active repository"],
],
"",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("reloads active repositories", () => {
expect(getActiveHelmRepositoriesMock).toHaveBeenCalled();
});
});
});
});
});
});
});
});
});
});
});

View File

@ -0,0 +1,458 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { RenderResult } from "@testing-library/react";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import type { ReadYamlFile } from "../../common/fs/read-yaml-file.injectable";
import readYamlFileInjectable from "../../common/fs/read-yaml-file.injectable";
import type { AsyncFnMock } from "@async-fn/jest";
import asyncFn from "@async-fn/jest";
import type { HelmRepositoriesFromYaml } from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
import execFileInjectable from "../../common/fs/exec-file.injectable";
import helmBinaryPathInjectable from "../../main/helm/helm-binary-path.injectable";
import loggerInjectable from "../../common/logger.injectable";
import type { Logger } from "../../common/logger";
import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/adding-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable";
import showErrorNotificationInjectable from "../../renderer/components/notifications/show-error-notification.injectable";
// TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
withTooltip: (target: any) => target,
}));
describe("listing active helm repositories in preferences", () => {
let applicationBuilder: ApplicationBuilder;
let rendered: RenderResult;
let readYamlFileMock: AsyncFnMock<ReadYamlFile>;
let execFileMock: AsyncFnMock<ReturnType<typeof execFileInjectable["instantiate"]>>;
let loggerStub: Logger;
let showErrorNotificationMock: jest.Mock;
beforeEach(async () => {
applicationBuilder = getApplicationBuilder();
readYamlFileMock = asyncFn();
execFileMock = asyncFn();
loggerStub = { error: jest.fn() } as unknown as Logger;
applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => {
showErrorNotificationMock = jest.fn();
rendererDi.override(showErrorNotificationInjectable, () => showErrorNotificationMock);
rendererDi.override(callForPublicHelmRepositoriesInjectable, () => async () => []);
mainDi.override(readYamlFileInjectable, () => readYamlFileMock);
mainDi.override(execFileInjectable, () => execFileMock);
mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path");
mainDi.override(loggerInjectable, () => loggerStub);
});
rendered = await applicationBuilder.render();
});
describe("when navigating to preferences containing helm repositories", () => {
beforeEach(async () => {
applicationBuilder.preferences.navigate();
applicationBuilder.preferences.navigation.click("kubernetes");
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("shows loader for repositories", () => {
expect(
rendered.getByTestId("helm-repositories-are-loading"),
).toBeInTheDocument();
});
it("calls for helm configuration", () => {
expect(execFileMock).toHaveBeenCalledWith(
"some-helm-binary-path",
["env"],
);
});
it("does not call for updating of repositories yet", () => {
expect(execFileMock).not.toHaveBeenCalledWith(
"some-helm-binary-path",
["repo", "update"],
);
});
describe("when getting configuration rejects", () => {
beforeEach(async () => {
await execFileMock.reject("some-error");
});
it("shows error notification", () => {
expect(showErrorNotificationMock).toHaveBeenCalledWith(
"Error getting Helm configuration: some-error",
);
});
it("removes all helm controls", () => {
expect(
rendered.queryByTestId("helm-controls"),
).not.toBeInTheDocument();
});
it("does not show loader for repositories anymore", () => {
expect(
rendered.queryByTestId("helm-repositories-are-loading"),
).not.toBeInTheDocument();
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
});
describe("when configuration resolves without path to repository config file", () => {
beforeEach(async () => {
execFileMock.mockClear();
await execFileMock.resolveSpecific(
["some-helm-binary-path", ["env"]],
"HELM_REPOSITORY_CACHE=some-helm-repository-cache-path",
);
});
it("logs error", () => {
expect(loggerStub.error).toHaveBeenCalledWith(
"Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in `$ helm env`.",
);
});
it("shows error notification", () => {
expect(showErrorNotificationMock).toHaveBeenCalledWith(
"Error getting Helm configuration: Tried to get Helm repositories, but HELM_REPOSITORY_CONFIG was not present in `$ helm env`.",
);
});
it("removes all helm controls", () => {
expect(
rendered.queryByTestId("helm-controls"),
).not.toBeInTheDocument();
});
it("does not show loader for repositories anymore", () => {
expect(
rendered.queryByTestId("helm-repositories-are-loading"),
).not.toBeInTheDocument();
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
});
describe("when configuration resolves without path to repository cache directory", () => {
beforeEach(async () => {
execFileMock.mockClear();
await execFileMock.resolveSpecific(
["some-helm-binary-path", ["env"]],
"HELM_REPOSITORY_CONFIG=some-helm-repository-config-file.yaml",
);
});
it("logs error", () => {
expect(loggerStub.error).toHaveBeenCalledWith(
"Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in `$ helm env`.",
);
});
it("shows error notification", () => {
expect(showErrorNotificationMock).toHaveBeenCalledWith(
"Error getting Helm configuration: Tried to get Helm repositories, but HELM_REPOSITORY_CACHE was not present in `$ helm env`.",
);
});
it("removes all helm controls", () => {
expect(
rendered.queryByTestId("helm-controls"),
).not.toBeInTheDocument();
});
it("does not show loader for repositories anymore", () => {
expect(
rendered.queryByTestId("helm-repositories-are-loading"),
).not.toBeInTheDocument();
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
});
describe("when configuration resolves", () => {
beforeEach(async () => {
execFileMock.mockClear();
await execFileMock.resolveSpecific(
["some-helm-binary-path", ["env"]],
[
"HELM_REPOSITORY_CONFIG=some-helm-repository-config-file.yaml",
"HELM_REPOSITORY_CACHE=some-helm-repository-cache-path",
].join("\n"),
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("calls for update of repositories", () => {
expect(execFileMock).toHaveBeenCalledWith(
"some-helm-binary-path",
["repo", "update"],
);
});
it("does not call for repositories yet", () => {
expect(readYamlFileMock).not.toHaveBeenCalled();
});
describe("when updating repositories reject with any other error", () => {
beforeEach(async () => {
await execFileMock.reject("Some error");
});
it("shows error notification", () => {
expect(showErrorNotificationMock).toHaveBeenCalledWith(
"Error updating Helm repositories: Some error",
);
});
it("removes all helm controls", () => {
expect(
rendered.queryByTestId("helm-controls"),
).not.toBeInTheDocument();
});
it("does not show loader for repositories anymore", () => {
expect(
rendered.queryByTestId("helm-repositories-are-loading"),
).not.toBeInTheDocument();
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
});
describe("when updating repositories reject with error about no existing repositories", () => {
beforeEach(async () => {
execFileMock.mockClear();
await execFileMock.reject(
"Error: no repositories found. You must add one before updating",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("still shows the loader for repositories", () => {
expect(
rendered.queryByTestId("helm-repositories-are-loading"),
).toBeInTheDocument();
});
it('adds "bitnami" as default repository', () => {
expect(execFileMock).toHaveBeenCalledWith(
"some-helm-binary-path",
["repo", "add", "bitnami", "https://charts.bitnami.com/bitnami"],
);
});
describe("when adding default repository reject", () => {
beforeEach(async () => {
await execFileMock.reject("Some error");
});
it("shows error notification", () => {
expect(showErrorNotificationMock).toHaveBeenCalledWith(
"Error when adding default Helm repository: Some error",
);
});
it("removes all helm controls", () => {
expect(
rendered.queryByTestId("helm-controls"),
).not.toBeInTheDocument();
});
it("does not show loader for repositories anymore", () => {
expect(
rendered.queryByTestId("helm-repositories-are-loading"),
).not.toBeInTheDocument();
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
});
describe("when adding of default repository resolves", () => {
beforeEach(async () => {
readYamlFileMock.mockClear();
await execFileMock.resolveSpecific(
[
"some-helm-binary-path",
[
"repo",
"add",
"bitnami",
"https://charts.bitnami.com/bitnami",
],
],
"",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("still shows the loader for repositories", () => {
expect(
rendered.queryByTestId("helm-repositories-are-loading"),
).toBeInTheDocument();
});
it("calls for repositories again", () => {
expect(readYamlFileMock).toHaveBeenCalledWith(
"some-helm-repository-config-file.yaml",
);
});
describe("when another call for repositories resolve", () => {
beforeEach(async () => {
await readYamlFileMock.resolveSpecific(
["some-helm-repository-config-file.yaml"],
{
repositories: [
{
name: "bitnami",
url: "https://charts.bitnami.com/bitnami",
caFile: "irrelevant",
certFile: "irrelevant",
insecure_skip_tls_verify: false,
keyFile: "irrelevant",
pass_credentials_all: false,
password: "irrelevant",
username: "irrelevant",
},
],
},
);
});
it("does not show loader for repositories anymore", () => {
expect(
rendered.queryByTestId("helm-repositories-are-loading"),
).not.toBeInTheDocument();
});
it("shows the added repository", () => {
const actual = rendered.getByTestId("helm-repository-bitnami");
expect(actual).toBeInTheDocument();
});
});
});
});
describe("when updating repositories resolve", () => {
beforeEach(async () => {
execFileMock.mockClear();
await execFileMock.resolveSpecific(
["some-helm-binary-path", ["repo", "update"]],
"",
);
});
it("loads repositories from file system", () => {
expect(readYamlFileMock).toHaveBeenCalledWith(
"some-helm-repository-config-file.yaml",
);
});
describe("when repositories resolves", () => {
beforeEach(async () => {
execFileMock.mockClear();
await readYamlFileMock.resolveSpecific(
["some-helm-repository-config-file.yaml"],
repositoryConfigStub,
);
});
it("does not add default repository", () => {
expect(execFileMock).not.toHaveBeenCalledWith(
"some-helm-binary-path",
["repo", "add", "bitnami", "https://charts.bitnami.com/bitnami"],
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("does not show loader for repositories anymore", () => {
expect(
rendered.queryByTestId("helm-repositories-are-loading"),
).not.toBeInTheDocument();
});
it("shows repositories in use", () => {
const actual = rendered.getAllByTestId(
/^helm-repository-(some-repository|some-other-repository)$/,
);
expect(actual).toHaveLength(2);
});
});
});
});
});
});
const repositoryConfigStub: HelmRepositoriesFromYaml = {
repositories: [
{
name: "some-repository",
url: "some-repository-url",
caFile: "irrelevant",
certFile: "irrelevant",
insecure_skip_tls_verify: false,
keyFile: "irrelevant",
pass_credentials_all: false,
password: "irrelevant",
username: "irrelevant",
},
{
name: "some-other-repository",
url: "some-other-repository-url",
caFile: "irrelevant",
certFile: "irrelevant",
insecure_skip_tls_verify: false,
keyFile: "irrelevant",
pass_credentials_all: false,
password: "irrelevant",
username: "irrelevant",
},
],
};

View File

@ -0,0 +1,126 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { RenderResult } from "@testing-library/react";
import { fireEvent } from "@testing-library/react";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import type { AsyncFnMock } from "@async-fn/jest";
import asyncFn from "@async-fn/jest";
import execFileInjectable from "../../common/fs/exec-file.injectable";
import helmBinaryPathInjectable from "../../main/helm/helm-binary-path.injectable";
import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
import type { HelmRepo } from "../../common/helm/helm-repo";
import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/adding-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable";
import type { AsyncResult } from "../../common/utils/async-result";
// TODO: Make tooltips free of side effects by making it deterministic
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
withTooltip: (target: any) => target,
}));
describe("remove helm repository from list of active repositories in preferences", () => {
let applicationBuilder: ApplicationBuilder;
let rendered: RenderResult;
let getActiveHelmRepositoriesMock: AsyncFnMock<() => AsyncResult<HelmRepo[]>>;
let execFileMock: AsyncFnMock<
ReturnType<typeof execFileInjectable["instantiate"]>
>;
beforeEach(async () => {
applicationBuilder = getApplicationBuilder();
execFileMock = asyncFn();
getActiveHelmRepositoriesMock = asyncFn();
applicationBuilder.beforeApplicationStart(({ mainDi, rendererDi }) => {
rendererDi.override(callForPublicHelmRepositoriesInjectable, () => async () => []);
mainDi.override(
getActiveHelmRepositoriesInjectable,
() => getActiveHelmRepositoriesMock,
);
mainDi.override(execFileInjectable, () => execFileMock);
mainDi.override(helmBinaryPathInjectable, () => "some-helm-binary-path");
});
rendered = await applicationBuilder.render();
});
describe("when navigating to preferences containing helm repositories", () => {
beforeEach(async () => {
applicationBuilder.preferences.navigate();
applicationBuilder.preferences.navigation.click("kubernetes");
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
describe("when active repositories resolve", () => {
beforeEach(async () => {
getActiveHelmRepositoriesMock.resolve({
callWasSuccessful: true,
response: [
{ name: "some-active-repository", url: "some-url" },
],
});
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
describe("when removing repository", () => {
beforeEach(() => {
execFileMock.mockClear();
getActiveHelmRepositoriesMock.mockClear();
const removeButton = rendered.getByTestId(
"remove-helm-repository-some-active-repository",
);
fireEvent.click(removeButton);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("removes the repository", () => {
expect(execFileMock).toHaveBeenCalledWith(
"some-helm-binary-path",
["repo", "remove", "some-active-repository"],
);
});
it("does not reload active repositories yet", () => {
expect(getActiveHelmRepositoriesMock).not.toHaveBeenCalled();
});
describe("when removing resolves", () => {
beforeEach(async () => {
await execFileMock.resolveSpecific(
[
"some-helm-binary-path",
["repo", "remove", "some-active-repository"],
],
"",
);
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
it("reloads active repositories", () => {
expect(getActiveHelmRepositoriesMock).toHaveBeenCalled();
});
});
});
});
});
});

View File

@ -9,8 +9,8 @@ import { computed } from "mobx";
import type { RenderResult } from "@testing-library/react"; import type { RenderResult } from "@testing-library/react";
import { routeSpecificComponentInjectionToken } from "../renderer/routes/route-specific-component-injection-token"; import { routeSpecificComponentInjectionToken } from "../renderer/routes/route-specific-component-injection-token";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import type { Route } from "../common/front-end-routing/route-injection-token"; import type { Route } from "../common/front-end-routing/front-end-route-injection-token";
import { routeInjectionToken } from "../common/front-end-routing/route-injection-token"; import { frontEndRouteInjectionToken } from "../common/front-end-routing/front-end-route-injection-token";
import type { ApplicationBuilder } from "../renderer/components/test-utils/get-application-builder"; import type { ApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
import currentRouteInjectable from "../renderer/routes/current-route.injectable"; import currentRouteInjectable from "../renderer/routes/current-route.injectable";
@ -192,7 +192,7 @@ describe("navigating between routes", () => {
const testRouteWithoutPathParametersInjectable = getInjectable({ const testRouteWithoutPathParametersInjectable = getInjectable({
id: "some-route", id: "some-route",
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
instantiate: () => ({ instantiate: () => ({
path: "/some-path", path: "/some-path",
@ -214,7 +214,7 @@ const testRouteWithoutPathParametersComponentInjectable = getInjectable({
const routeWithOptionalPathParametersInjectable = getInjectable({ const routeWithOptionalPathParametersInjectable = getInjectable({
id: "some-route", id: "some-route",
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
instantiate: (): Route<{ someParameter?: string; someOtherParameter?: string }> => ({ instantiate: (): Route<{ someParameter?: string; someOtherParameter?: string }> => ({
path: "/some-path/:someParameter?/:someOtherParameter?", path: "/some-path/:someParameter?/:someOtherParameter?",

View File

@ -2,6 +2,16 @@
exports[`preferences - closing-preferences given accessing preferences directly renders 1`] = ` exports[`preferences - closing-preferences given accessing preferences directly renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -543,6 +553,16 @@ exports[`preferences - closing-preferences given accessing preferences directly
exports[`preferences - closing-preferences given accessing preferences directly when navigating to a tab in preferences renders 1`] = ` exports[`preferences - closing-preferences given accessing preferences directly when navigating to a tab in preferences renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
> >
@ -688,6 +708,16 @@ exports[`preferences - closing-preferences given accessing preferences directly
exports[`preferences - closing-preferences given accessing preferences directly when navigating to a tab in preferences when preferences are closed renders 1`] = ` exports[`preferences - closing-preferences given accessing preferences directly when navigating to a tab in preferences when preferences are closed renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div> <div>
Some front page Some front page
</div> </div>
@ -699,6 +729,16 @@ exports[`preferences - closing-preferences given accessing preferences directly
exports[`preferences - closing-preferences given accessing preferences directly when preferences are closed renders 1`] = ` exports[`preferences - closing-preferences given accessing preferences directly when preferences are closed renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div> <div>
Some front page Some front page
</div> </div>
@ -710,6 +750,16 @@ exports[`preferences - closing-preferences given accessing preferences directly
exports[`preferences - closing-preferences given already in a page and then navigated to preferences renders 1`] = ` exports[`preferences - closing-preferences given already in a page and then navigated to preferences renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -1251,6 +1301,16 @@ exports[`preferences - closing-preferences given already in a page and then navi
exports[`preferences - closing-preferences given already in a page and then navigated to preferences when navigating to a tab in preferences renders 1`] = ` exports[`preferences - closing-preferences given already in a page and then navigated to preferences when navigating to a tab in preferences renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
> >
@ -1396,6 +1456,16 @@ exports[`preferences - closing-preferences given already in a page and then navi
exports[`preferences - closing-preferences given already in a page and then navigated to preferences when navigating to a tab in preferences when preferences are closed renders 1`] = ` exports[`preferences - closing-preferences given already in a page and then navigated to preferences when navigating to a tab in preferences when preferences are closed renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
> >
@ -1541,6 +1611,16 @@ exports[`preferences - closing-preferences given already in a page and then navi
exports[`preferences - closing-preferences given already in a page and then navigated to preferences when preferences are closed renders 1`] = ` exports[`preferences - closing-preferences given already in a page and then navigated to preferences when preferences are closed renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
> >

View File

@ -2,6 +2,16 @@
exports[`preferences - navigation to application preferences given in some child page of preferences, when rendered renders 1`] = ` exports[`preferences - navigation to application preferences given in some child page of preferences, when rendered renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="proxy-preferences-page" data-testid="proxy-preferences-page"
@ -207,6 +217,16 @@ exports[`preferences - navigation to application preferences given in some child
exports[`preferences - navigation to application preferences given in some child page of preferences, when rendered when navigating to application preferences using navigation renders 1`] = ` exports[`preferences - navigation to application preferences given in some child page of preferences, when rendered when navigating to application preferences using navigation renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"

View File

@ -2,6 +2,16 @@
exports[`preferences - navigation to editor preferences given in preferences, when rendered renders 1`] = ` exports[`preferences - navigation to editor preferences given in preferences, when rendered renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -531,6 +541,16 @@ exports[`preferences - navigation to editor preferences given in preferences, wh
exports[`preferences - navigation to editor preferences given in preferences, when rendered when navigating to editor preferences using navigation renders 1`] = ` exports[`preferences - navigation to editor preferences given in preferences, when rendered when navigating to editor preferences using navigation renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="editor-preferences-page" data-testid="editor-preferences-page"

View File

@ -792,6 +792,16 @@ exports[`preferences - navigation to extension specific preferences given in pre
exports[`preferences - navigation to extension specific preferences given in preferences, when rendered renders 1`] = ` exports[`preferences - navigation to extension specific preferences given in preferences, when rendered renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -1321,6 +1331,16 @@ exports[`preferences - navigation to extension specific preferences given in pre
exports[`preferences - navigation to extension specific preferences given in preferences, when rendered when extension with specific preferences is enabled renders 1`] = ` exports[`preferences - navigation to extension specific preferences given in preferences, when rendered when extension with specific preferences is enabled renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -1885,6 +1905,16 @@ exports[`preferences - navigation to extension specific preferences given in pre
exports[`preferences - navigation to extension specific preferences given in preferences, when rendered when extension with specific preferences is enabled when navigating to extension preferences using navigation renders 1`] = ` exports[`preferences - navigation to extension specific preferences given in preferences, when rendered when extension with specific preferences is enabled when navigating to extension preferences using navigation renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="extension-preferences-page" data-testid="extension-preferences-page"

View File

@ -2,6 +2,16 @@
exports[`preferences - navigation to kubernetes preferences given in preferences, when rendered renders 1`] = ` exports[`preferences - navigation to kubernetes preferences given in preferences, when rendered renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -531,6 +541,16 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
exports[`preferences - navigation to kubernetes preferences given in preferences, when rendered when navigating to kubernetes preferences using navigation renders 1`] = ` exports[`preferences - navigation to kubernetes preferences given in preferences, when rendered when navigating to kubernetes preferences using navigation renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="kubernetes-preferences-page" data-testid="kubernetes-preferences-page"
@ -834,114 +854,97 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
</h2> </h2>
<div> <div>
<div <div
class="flex gaps" data-testid="helm-controls"
> >
<div <div
class="Select theme-lens box grow Select--is-disabled css-3iigni-container" class="flex gaps"
> >
<span
class="css-1f43avz-a11yText-A11yText"
id="react-select-HelmRepoSelect-live-region"
/>
<span
aria-atomic="false"
aria-live="polite"
aria-relevant="additions text"
class="css-1f43avz-a11yText-A11yText"
/>
<div <div
class="Select__control Select__control--is-disabled css-1insrsq-control" class="Select theme-lens box grow css-b62m3t-container"
> >
<span
class="css-1f43avz-a11yText-A11yText"
id="react-select-selection-of-active-public-helm-repository-live-region"
/>
<span
aria-atomic="false"
aria-live="polite"
aria-relevant="additions text"
class="css-1f43avz-a11yText-A11yText"
/>
<div <div
class="Select__value-container css-319lph-ValueContainer" class="Select__control css-1s2u09g-control"
> >
<div <div
class="Select__placeholder css-14el2xx-placeholder" class="Select__value-container css-319lph-ValueContainer"
id="react-select-HelmRepoSelect-placeholder"
> >
Repositories <div
</div> class="Select__placeholder css-14el2xx-placeholder"
<div id="react-select-selection-of-active-public-helm-repository-placeholder"
class="Select__input-container css-jzldcf-Input"
data-value=""
>
<input
aria-autocomplete="list"
aria-describedby="react-select-HelmRepoSelect-placeholder"
aria-expanded="false"
aria-haspopup="true"
autocapitalize="none"
autocomplete="off"
autocorrect="off"
class="Select__input"
disabled=""
id="HelmRepoSelect"
role="combobox"
spellcheck="false"
style="opacity: 1; width: 100%; grid-area: 1 / 2; min-width: 2px; border: 0px; margin: 0px; outline: 0; padding: 0px;"
tabindex="0"
type="text"
value=""
/>
</div>
</div>
<div
class="Select__indicators css-1hb7zxy-IndicatorsContainer"
>
<div
aria-hidden="true"
class="Select__indicator Select__loading-indicator css-at12u2-loadingIndicator"
>
<span
class="css-1xtdfmb-LoadingDot"
/>
<span
class="css-zoievk-LoadingDot"
/>
<span
class="css-x748d8-LoadingDot"
/>
</div>
<span
class="Select__indicator-separator css-109onse-indicatorSeparator"
/>
<div
aria-hidden="true"
class="Select__indicator Select__dropdown-indicator css-tlfecz-indicatorContainer"
>
<svg
aria-hidden="true"
class="css-tj5bde-Svg"
focusable="false"
height="20"
viewBox="0 0 20 20"
width="20"
> >
<path Repositories
d="M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z" </div>
<div
class="Select__input-container css-6j8wv5-Input"
data-value=""
>
<input
aria-autocomplete="list"
aria-describedby="react-select-selection-of-active-public-helm-repository-placeholder"
aria-expanded="false"
aria-haspopup="true"
autocapitalize="none"
autocomplete="off"
autocorrect="off"
class="Select__input"
id="selection-of-active-public-helm-repository"
role="combobox"
spellcheck="false"
style="opacity: 1; width: 100%; grid-area: 1 / 2; min-width: 2px; border: 0px; margin: 0px; outline: 0; padding: 0px;"
tabindex="0"
type="text"
value=""
/> />
</svg> </div>
</div>
<div
class="Select__indicators css-1hb7zxy-IndicatorsContainer"
>
<span
class="Select__indicator-separator css-1okebmr-indicatorSeparator"
/>
<div
aria-hidden="true"
class="Select__indicator Select__dropdown-indicator css-tlfecz-indicatorContainer"
>
<svg
aria-hidden="true"
class="css-tj5bde-Svg"
focusable="false"
height="20"
viewBox="0 0 20 20"
width="20"
>
<path
d="M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z"
/>
</svg>
</div>
</div> </div>
</div> </div>
</div> </div>
<button
class="Button primary"
data-testid="add-custom-helm-repo-button"
type="button"
>
Add Custom Helm Repo
</button>
</div> </div>
<button
class="Button primary"
type="button"
>
Add Custom Helm Repo
</button>
</div>
<div
class="repos"
>
<div <div
class="pt-5 relative" class="repos"
> />
<div <div />
class="Spinner singleColor center"
/>
</div>
</div> </div>
</div> </div>
</section> </section>

View File

@ -2,6 +2,16 @@
exports[`preferences - navigation to proxy preferences given in preferences, when rendered renders 1`] = ` exports[`preferences - navigation to proxy preferences given in preferences, when rendered renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -531,6 +541,16 @@ exports[`preferences - navigation to proxy preferences given in preferences, whe
exports[`preferences - navigation to proxy preferences given in preferences, when rendered when navigating to proxy preferences using navigation renders 1`] = ` exports[`preferences - navigation to proxy preferences given in preferences, when rendered when navigating to proxy preferences using navigation renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="proxy-preferences-page" data-testid="proxy-preferences-page"

View File

@ -2,6 +2,16 @@
exports[`preferences - navigation to telemetry preferences given URL for Sentry DNS, when navigating to preferences when navigating to telemetry preferences renders 1`] = ` exports[`preferences - navigation to telemetry preferences given URL for Sentry DNS, when navigating to preferences when navigating to telemetry preferences renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="telemetry-preferences-page" data-testid="telemetry-preferences-page"
@ -193,6 +203,16 @@ exports[`preferences - navigation to telemetry preferences given URL for Sentry
exports[`preferences - navigation to telemetry preferences given in preferences, when rendered renders 1`] = ` exports[`preferences - navigation to telemetry preferences given in preferences, when rendered renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -722,6 +742,16 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
exports[`preferences - navigation to telemetry preferences given in preferences, when rendered when extension with telemetry preference items gets enabled renders 1`] = ` exports[`preferences - navigation to telemetry preferences given in preferences, when rendered when extension with telemetry preference items gets enabled renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -1263,6 +1293,16 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
exports[`preferences - navigation to telemetry preferences given in preferences, when rendered when extension with telemetry preference items gets enabled when clicking link to telemetry preferences from navigation renders 1`] = ` exports[`preferences - navigation to telemetry preferences given in preferences, when rendered when extension with telemetry preference items gets enabled when clicking link to telemetry preferences from navigation renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="telemetry-preferences-page" data-testid="telemetry-preferences-page"
@ -1442,6 +1482,16 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
exports[`preferences - navigation to telemetry preferences given no URL for Sentry DNS, when navigating to telemetry preferences renders 1`] = ` exports[`preferences - navigation to telemetry preferences given no URL for Sentry DNS, when navigating to telemetry preferences renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="telemetry-preferences-page" data-testid="telemetry-preferences-page"

View File

@ -2,6 +2,16 @@
exports[`preferences - navigation to terminal preferences given in preferences, when rendered renders 1`] = ` exports[`preferences - navigation to terminal preferences given in preferences, when rendered renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"
@ -531,6 +541,16 @@ exports[`preferences - navigation to terminal preferences given in preferences,
exports[`preferences - navigation to terminal preferences given in preferences, when rendered when navigating to terminal preferences using navigation renders 1`] = ` exports[`preferences - navigation to terminal preferences given in preferences, when rendered when navigating to terminal preferences using navigation renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="terminal-preferences-page" data-testid="terminal-preferences-page"

View File

@ -2,6 +2,16 @@
exports[`preferences - navigation using application menu renders 1`] = ` exports[`preferences - navigation using application menu renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -10,6 +20,16 @@ exports[`preferences - navigation using application menu renders 1`] = `
exports[`preferences - navigation using application menu when navigating to preferences using application menu renders 1`] = ` exports[`preferences - navigation using application menu when navigating to preferences using application menu renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"

View File

@ -3,6 +3,16 @@
exports[`show-about-using-tray renders 1`] = ` exports[`show-about-using-tray renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -13,6 +23,16 @@ exports[`show-about-using-tray renders 1`] = `
exports[`show-about-using-tray when navigating using tray renders 1`] = ` exports[`show-about-using-tray when navigating using tray renders 1`] = `
<body> <body>
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="SettingLayout showNavigation Preferences" class="SettingLayout showNavigation Preferences"
data-testid="application-preferences-page" data-testid="application-preferences-page"

View File

@ -8,7 +8,7 @@ import type { RenderResult } from "@testing-library/react";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import currentPathInjectable from "../../renderer/routes/current-path.injectable"; import currentPathInjectable from "../../renderer/routes/current-path.injectable";
import { routeInjectionToken } from "../../common/front-end-routing/route-injection-token"; import { frontEndRouteInjectionToken } from "../../common/front-end-routing/front-end-route-injection-token";
import { computed } from "mobx"; import { computed } from "mobx";
import { preferenceNavigationItemInjectionToken } from "../../renderer/components/+preferences/preferences-navigation/preference-navigation-items.injectable"; import { preferenceNavigationItemInjectionToken } from "../../renderer/components/+preferences/preferences-navigation/preference-navigation-items.injectable";
import routeIsActiveInjectable from "../../renderer/routes/route-is-active.injectable"; import routeIsActiveInjectable from "../../renderer/routes/route-is-active.injectable";
@ -202,7 +202,7 @@ const testPreferencesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
const testPreferencesRouteComponentInjectable = getInjectable({ const testPreferencesRouteComponentInjectable = getInjectable({
@ -225,7 +225,7 @@ const testFrontPageRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
const testFrontPageRouteComponentInjectable = getInjectable({ const testFrontPageRouteComponentInjectable = getInjectable({

View File

@ -5,6 +5,8 @@
import type { RenderResult } from "@testing-library/react"; import type { RenderResult } from "@testing-library/react";
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import callForPublicHelmRepositoriesInjectable from "../../renderer/components/+preferences/kubernetes/helm-charts/adding-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable";
import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
describe("preferences - navigation to kubernetes preferences", () => { describe("preferences - navigation to kubernetes preferences", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
@ -17,6 +19,15 @@ describe("preferences - navigation to kubernetes preferences", () => {
let rendered: RenderResult; let rendered: RenderResult;
beforeEach(async () => { beforeEach(async () => {
applicationBuilder.beforeApplicationStart(({ rendererDi, mainDi }) => {
rendererDi.override(callForPublicHelmRepositoriesInjectable, () => async () => []);
mainDi.override(
getActiveHelmRepositoriesInjectable,
() => async () => ({ callWasSuccessful: true, response: [] }),
);
});
applicationBuilder.beforeRender(() => { applicationBuilder.beforeRender(() => {
applicationBuilder.preferences.navigate(); applicationBuilder.preferences.navigate();
}); });

View File

@ -28,8 +28,8 @@ describe("preferences - navigation using application menu", () => {
}); });
describe("when navigating to preferences using application menu", () => { describe("when navigating to preferences using application menu", () => {
beforeEach(async () => { beforeEach(() => {
await applicationBuilder.applicationMenu.click("root.preferences"); applicationBuilder.applicationMenu.click("root.preferences");
}); });
it("renders", () => { it("renders", () => {

View File

@ -0,0 +1,238 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { lensWindowInjectionToken } from "../../main/start-main-application/lens-window/application-window/lens-window-injection-token";
import applicationWindowInjectable from "../../main/start-main-application/lens-window/application-window/application-window.injectable";
import createElectronWindowForInjectable from "../../main/start-main-application/lens-window/application-window/create-electron-window.injectable";
import type { AsyncFnMock } from "@async-fn/jest";
import asyncFn from "@async-fn/jest";
import type { ElectronWindow, LensWindowConfiguration } from "../../main/start-main-application/lens-window/application-window/create-lens-window.injectable";
import type { DiContainer } from "@ogre-tools/injectable";
import { flushPromises } from "../../common/test-utils/flush-promises";
import lensResourcesDirInjectable from "../../common/vars/lens-resources-dir.injectable";
describe("opening application window using tray", () => {
describe("given application has started", () => {
let applicationBuilder: ApplicationBuilder;
let createElectronWindowMock: jest.Mock;
let expectWindowsToBeOpen: (windowIds: string[]) => void;
let callForSplashWindowHtmlMock: AsyncFnMock<() => void>;
let callForApplicationWindowHtmlMock: AsyncFnMock<() => void>;
beforeEach(async () => {
applicationBuilder = getApplicationBuilder().beforeApplicationStart(
({ mainDi }) => {
mainDi.override(lensResourcesDirInjectable, () => "some-lens-resources-directory");
createElectronWindowMock = jest.fn((configuration: LensWindowConfiguration) =>
({
splash: {
send: () => {},
close: () => {},
show: () => {},
loadFile: callForSplashWindowHtmlMock,
loadUrl: () => { throw new Error("Should never come here"); },
},
"only-application-window": {
send: () => {},
close: () => {},
show: () => {},
loadFile: () => { throw new Error("Should never come here"); },
loadUrl: callForApplicationWindowHtmlMock,
},
}[configuration.id] as ElectronWindow));
mainDi.override(
createElectronWindowForInjectable,
() => createElectronWindowMock,
);
expectWindowsToBeOpen = expectWindowsToBeOpenFor(mainDi);
callForSplashWindowHtmlMock = asyncFn();
callForApplicationWindowHtmlMock = asyncFn();
},
);
const renderPromise = applicationBuilder.render();
await flushPromises();
await callForSplashWindowHtmlMock.resolve();
await callForApplicationWindowHtmlMock.resolve();
await renderPromise;
});
it("only an application window is open", () => {
expectWindowsToBeOpen(["only-application-window"]);
});
describe("when an attempt to reopen the already started application is made using tray", () => {
beforeEach(() => {
applicationBuilder.tray.click("open-app");
});
it("still shows only the application window", () => {
expectWindowsToBeOpen(["only-application-window"]);
});
});
describe("when the application window is closed", () => {
beforeEach(() => {
const applicationWindow = applicationBuilder.dis.mainDi.inject(
applicationWindowInjectable,
);
applicationWindow.close();
});
it("no windows are open", () => {
expectWindowsToBeOpen([]);
});
describe("when an application window is reopened using tray", () => {
beforeEach(() => {
callForSplashWindowHtmlMock.mockClear();
callForApplicationWindowHtmlMock.mockClear();
applicationBuilder.tray.click("open-app");
});
it("still no windows are open", () => {
expectWindowsToBeOpen([]);
});
it("starts loading static HTML of splash window", () => {
expect(callForSplashWindowHtmlMock).toHaveBeenCalledWith("/some-absolute-root-directory/some-lens-resources-directory/static/splash.html");
});
describe("when loading of splash window HTML resolves", () => {
beforeEach(async () => {
await callForSplashWindowHtmlMock.resolve();
});
it("shows just the splash window", () => {
expectWindowsToBeOpen(["splash"]);
});
it("starts loading of content for the application window", () => {
expect(callForApplicationWindowHtmlMock).toHaveBeenCalledWith("http://localhost:42");
});
describe("given static HTML of application window has not resolved yet, when opening from tray again", () => {
beforeEach(() => {
callForApplicationWindowHtmlMock.mockClear();
callForSplashWindowHtmlMock.mockClear();
applicationBuilder.tray.click("open-app");
});
it("does not load contents of splash window again", () => {
expect(callForSplashWindowHtmlMock).not.toHaveBeenCalled();
});
it("does not load contents of application window again", () => {
expect(callForApplicationWindowHtmlMock).not.toHaveBeenCalled();
});
it("shows just the blank application window to permit developer tool access", () => {
expectWindowsToBeOpen(["only-application-window"]);
});
});
describe("when static HTML of application window resolves", () => {
beforeEach(async () => {
await callForApplicationWindowHtmlMock.resolve();
});
it("shows just the application window", () => {
expectWindowsToBeOpen(["only-application-window"]);
});
describe("when reopening the application using tray", () => {
beforeEach(() => {
callForSplashWindowHtmlMock.mockClear();
callForApplicationWindowHtmlMock.mockClear();
applicationBuilder.tray.click("open-app");
});
it("still shows just the application window", () => {
expectWindowsToBeOpen(["only-application-window"]);
});
it("does not load HTML for splash window again", () => {
expect(callForSplashWindowHtmlMock).not.toHaveBeenCalled();
});
it("does not load HTML for application window again", () => {
expect(callForApplicationWindowHtmlMock).not.toHaveBeenCalled();
});
});
});
});
describe("given opening of splash window has not finished yet, but another attempt to open the application is made", () => {
beforeEach(() => {
createElectronWindowMock.mockClear();
applicationBuilder.tray.click("open-app");
});
it("does not open any new windows", () => {
expect(createElectronWindowMock).not.toHaveBeenCalled();
});
});
describe("when opening of splash window resolves", () => {
beforeEach(async () => {
await callForSplashWindowHtmlMock.resolve();
});
it("still only splash window is open", () => {
expectWindowsToBeOpen(["splash"]);
});
it("when opening of application window finishes, only an application window is open", async () => {
await callForApplicationWindowHtmlMock.resolve();
expectWindowsToBeOpen(["only-application-window"]);
});
describe("given opening of application window has not finished yet, but another attempt to open the application is made", () => {
beforeEach(() => {
createElectronWindowMock.mockClear();
applicationBuilder.tray.click("open-app");
});
it("does not open any new windows", () => {
expect(createElectronWindowMock).not.toHaveBeenCalled();
});
it("when opening finishes, only an application window is open", async () => {
await callForApplicationWindowHtmlMock.resolve();
expectWindowsToBeOpen(["only-application-window"]);
});
});
});
});
});
});
});
const expectWindowsToBeOpenFor = (di: DiContainer) => (windowIds: string[]) => {
const windows = di.injectMany(lensWindowInjectionToken);
expect(
windows.filter((window) => window.isVisible).map((window) => window.id),
).toEqual(windowIds);
};

View File

@ -0,0 +1,90 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
import type { ClusterManager } from "../../main/cluster-manager";
import { lensWindowInjectionToken } from "../../main/start-main-application/lens-window/application-window/lens-window-injection-token";
import exitAppInjectable from "../../main/electron-app/features/exit-app.injectable";
import clusterManagerInjectable from "../../main/cluster-manager.injectable";
import stopServicesAndExitAppInjectable from "../../main/stop-services-and-exit-app.injectable";
describe("quitting the app using application menu", () => {
describe("given application has started", () => {
let applicationBuilder: ApplicationBuilder;
let clusterManagerStub: ClusterManager;
let exitAppMock: jest.Mock;
beforeEach(async () => {
jest.useFakeTimers();
applicationBuilder = getApplicationBuilder().beforeApplicationStart(
({ mainDi }) => {
mainDi.unoverride(stopServicesAndExitAppInjectable);
clusterManagerStub = { stop: jest.fn() } as unknown as ClusterManager;
mainDi.override(clusterManagerInjectable, () => clusterManagerStub);
exitAppMock = jest.fn();
mainDi.override(exitAppInjectable, () => exitAppMock);
},
);
await applicationBuilder.render();
});
it("only an application window is open", () => {
const windows = applicationBuilder.dis.mainDi.injectMany(
lensWindowInjectionToken,
);
expect(
windows.map((window) => ({ id: window.id, visible: window.isVisible })),
).toEqual([
{ id: "only-application-window", visible: true },
{ id: "splash", visible: false },
]);
});
describe("when application is quit", () => {
beforeEach(() => {
applicationBuilder.applicationMenu.click("root.quit");
});
it("closes all windows", () => {
const windows = applicationBuilder.dis.mainDi.injectMany(
lensWindowInjectionToken,
);
expect(
windows.map((window) => ({ id: window.id, visible: window.isVisible })),
).toEqual([
{ id: "only-application-window", visible: false },
{ id: "splash", visible: false },
]);
});
it("disconnects all clusters", () => {
expect(clusterManagerStub.stop).toHaveBeenCalled();
});
it("after insufficient time passes, does not terminate application yet", () => {
jest.advanceTimersByTime(999);
expect(exitAppMock).not.toHaveBeenCalled();
});
describe("after sufficient time passes", () => {
beforeEach(() => {
jest.advanceTimersByTime(1000);
});
it("terminates application", () => {
expect(exitAppMock).toHaveBeenCalled();
});
});
});
});
});

View File

@ -2,6 +2,16 @@
exports[`welcome - navigation using application menu renders 1`] = ` exports[`welcome - navigation using application menu renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="Notifications flex column align-flex-end" class="Notifications flex column align-flex-end"
/> />
@ -10,6 +20,16 @@ exports[`welcome - navigation using application menu renders 1`] = `
exports[`welcome - navigation using application menu when navigating to welcome using application menu renders 1`] = ` exports[`welcome - navigation using application menu when navigating to welcome using application menu renders 1`] = `
<div> <div>
<div
class="StatusBar"
>
<div
class="leftSide"
/>
<div
class="rightSide"
/>
</div>
<div <div
class="flex justify-center Welcome align-center" class="flex justify-center Welcome align-center"
data-testid="welcome-page" data-testid="welcome-page"

View File

@ -28,8 +28,8 @@ describe("welcome - navigation using application menu", () => {
}); });
describe("when navigating to welcome using application menu", () => { describe("when navigating to welcome using application menu", () => {
beforeEach(async () => { beforeEach(() => {
await applicationBuilder.applicationMenu.click("help.welcome"); applicationBuilder.applicationMenu.click("help.welcome");
}); });
it("renders", () => { it("renders", () => {

View File

@ -0,0 +1,13 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import appEventBusInjectable from "./app-event-bus.injectable";
const emitEventInjectable = getInjectable({
id: "emit-event",
instantiate: (di) => di.inject(appEventBusInjectable).emit,
});
export default emitEventInjectable;

View File

@ -0,0 +1,13 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectionToken } from "@ogre-tools/injectable";
import type { IComputedValue } from "mobx";
export const allowedResourcesInjectionToken = getInjectionToken<
IComputedValue<Set<string>>
>({
id: "allowed-resources",
});

View File

@ -6,8 +6,8 @@ import { getInjectionToken } from "@ogre-tools/injectable";
import type { IComputedValue } from "mobx"; import type { IComputedValue } from "mobx";
import type { LensRendererExtension } from "../../extensions/lens-renderer-extension"; import type { LensRendererExtension } from "../../extensions/lens-renderer-extension";
export const routeInjectionToken = getInjectionToken<Route<unknown>>({ export const frontEndRouteInjectionToken = getInjectionToken<Route<unknown>>({
id: "route-injection-token", id: "front-end-route-injection-token",
}); });
export interface Route<TParameter = void> { export interface Route<TParameter = void> {

View File

@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { getInjectionToken } from "@ogre-tools/injectable"; import { getInjectionToken } from "@ogre-tools/injectable";
import type { Route } from "./route-injection-token"; import type { Route } from "./front-end-route-injection-token";
type InferParametersFrom<TRoute> = TRoute extends Route<infer TParameters> type InferParametersFrom<TRoute> = TRoute extends Route<infer TParameters>
? TParameters ? TParameters

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token";
const addClusterRouteInjectable = getInjectable({ const addClusterRouteInjectable = getInjectable({
id: "add-cluster-route", id: "add-cluster-route",
@ -15,7 +15,7 @@ const addClusterRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default addClusterRouteInjectable; export default addClusterRouteInjectable;

View File

@ -4,8 +4,8 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import type { Route } from "../../route-injection-token"; import type { Route } from "../../front-end-route-injection-token";
import { routeInjectionToken } from "../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token";
export interface CatalogPathParameters { export interface CatalogPathParameters {
group?: string; group?: string;
@ -21,7 +21,7 @@ const catalogRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default catalogRouteInjectable; export default catalogRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token";
const clusterViewRouteInjectable = getInjectable({ const clusterViewRouteInjectable = getInjectable({
id: "cluster-view-route", id: "cluster-view-route",
@ -15,7 +15,7 @@ const clusterViewRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default clusterViewRouteInjectable; export default clusterViewRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const configMapsRouteInjectable = getInjectable({ const configMapsRouteInjectable = getInjectable({
id: "config-maps-route", id: "config-maps-route",
@ -19,7 +19,7 @@ const configMapsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default configMapsRouteInjectable; export default configMapsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const horizontalPodAutoscalersRouteInjectable = getInjectable({ const horizontalPodAutoscalersRouteInjectable = getInjectable({
id: "horizontal-pod-autoscalers-route", id: "horizontal-pod-autoscalers-route",
@ -19,7 +19,7 @@ const horizontalPodAutoscalersRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default horizontalPodAutoscalersRouteInjectable; export default horizontalPodAutoscalersRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const limitRangesRouteInjectable = getInjectable({ const limitRangesRouteInjectable = getInjectable({
id: "limit-ranges-route", id: "limit-ranges-route",
@ -22,7 +22,7 @@ const limitRangesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default limitRangesRouteInjectable; export default limitRangesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const podDisruptionBudgetsRouteInjectable = getInjectable({ const podDisruptionBudgetsRouteInjectable = getInjectable({
id: "pod-disruption-budgets-route", id: "pod-disruption-budgets-route",
@ -19,7 +19,7 @@ const podDisruptionBudgetsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default podDisruptionBudgetsRouteInjectable; export default podDisruptionBudgetsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const resourceQuotasRouteInjectable = getInjectable({ const resourceQuotasRouteInjectable = getInjectable({
id: "resource-quotas-route", id: "resource-quotas-route",
@ -19,7 +19,7 @@ const resourceQuotasRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default resourceQuotasRouteInjectable; export default resourceQuotasRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const secretsRouteInjectable = getInjectable({ const secretsRouteInjectable = getInjectable({
id: "secrets-route", id: "secrets-route",
@ -19,7 +19,7 @@ const secretsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default secretsRouteInjectable; export default secretsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const crdListRouteInjectable = getInjectable({ const crdListRouteInjectable = getInjectable({
id: "crd-list-route", id: "crd-list-route",
@ -15,7 +15,7 @@ const crdListRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default crdListRouteInjectable; export default crdListRouteInjectable;

View File

@ -4,8 +4,8 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import type { Route } from "../../../../route-injection-token"; import type { Route } from "../../../../front-end-route-injection-token";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
export interface CustomResourcesPathParameters { export interface CustomResourcesPathParameters {
group?: string; group?: string;
@ -21,7 +21,7 @@ const customResourcesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default customResourcesRouteInjectable; export default customResourcesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const eventsRouteInjectable = getInjectable({ const eventsRouteInjectable = getInjectable({
id: "events-route", id: "events-route",
@ -19,7 +19,7 @@ const eventsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default eventsRouteInjectable; export default eventsRouteInjectable;

View File

@ -4,8 +4,8 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import type { Route } from "../../../../route-injection-token"; import type { Route } from "../../../../front-end-route-injection-token";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
export interface HelmChartsPathParameters { export interface HelmChartsPathParameters {
repo?: string; repo?: string;
@ -21,7 +21,7 @@ const helmChartsRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default helmChartsRouteInjectable; export default helmChartsRouteInjectable;

View File

@ -4,8 +4,8 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import type { Route } from "../../../../route-injection-token"; import type { Route } from "../../../../front-end-route-injection-token";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
export interface HelmReleasesPathParameters { export interface HelmReleasesPathParameters {
namespace?: string; namespace?: string;
@ -21,7 +21,7 @@ const helmReleasesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default helmReleasesRouteInjectable; export default helmReleasesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const namespacesRouteInjectable = getInjectable({ const namespacesRouteInjectable = getInjectable({
id: "namespaces-route", id: "namespaces-route",
@ -19,7 +19,7 @@ const namespacesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default namespacesRouteInjectable; export default namespacesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const endpointsRouteInjectable = getInjectable({ const endpointsRouteInjectable = getInjectable({
id: "endpoints-route", id: "endpoints-route",
@ -19,7 +19,7 @@ const endpointsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default endpointsRouteInjectable; export default endpointsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const ingressesRouteInjectable = getInjectable({ const ingressesRouteInjectable = getInjectable({
id: "ingresses-route", id: "ingresses-route",
@ -19,7 +19,7 @@ const ingressesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default ingressesRouteInjectable; export default ingressesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const networkPoliciesRouteInjectable = getInjectable({ const networkPoliciesRouteInjectable = getInjectable({
id: "network-policies-route", id: "network-policies-route",
@ -19,7 +19,7 @@ const networkPoliciesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default networkPoliciesRouteInjectable; export default networkPoliciesRouteInjectable;

View File

@ -4,8 +4,8 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import type { Route } from "../../../../route-injection-token"; import type { Route } from "../../../../front-end-route-injection-token";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
export interface PortForwardsPathParameters { export interface PortForwardsPathParameters {
forwardport?: string; forwardport?: string;
@ -20,7 +20,7 @@ const portForwardsRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default portForwardsRouteInjectable; export default portForwardsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const servicesRouteInjectable = getInjectable({ const servicesRouteInjectable = getInjectable({
id: "services-route", id: "services-route",
@ -19,7 +19,7 @@ const servicesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default servicesRouteInjectable; export default servicesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const nodesRouteInjectable = getInjectable({ const nodesRouteInjectable = getInjectable({
id: "nodes-route", id: "nodes-route",
@ -19,7 +19,7 @@ const nodesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default nodesRouteInjectable; export default nodesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const clusterOverviewRouteInjectable = getInjectable({ const clusterOverviewRouteInjectable = getInjectable({
id: "cluster-overview-route", id: "cluster-overview-route",
@ -19,7 +19,7 @@ const clusterOverviewRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default clusterOverviewRouteInjectable; export default clusterOverviewRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const persistentVolumeClaimsRouteInjectable = getInjectable({ const persistentVolumeClaimsRouteInjectable = getInjectable({
id: "persistent-volume-claims-route", id: "persistent-volume-claims-route",
@ -19,7 +19,7 @@ const persistentVolumeClaimsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default persistentVolumeClaimsRouteInjectable; export default persistentVolumeClaimsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const persistentVolumesRouteInjectable = getInjectable({ const persistentVolumesRouteInjectable = getInjectable({
id: "persistent-volumes-route", id: "persistent-volumes-route",
@ -19,7 +19,7 @@ const persistentVolumesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default persistentVolumesRouteInjectable; export default persistentVolumesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const storageClassesRouteInjectable = getInjectable({ const storageClassesRouteInjectable = getInjectable({
id: "storage-classes-route", id: "storage-classes-route",
@ -19,7 +19,7 @@ const storageClassesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default storageClassesRouteInjectable; export default storageClassesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const clusterRoleBindingsRouteInjectable = getInjectable({ const clusterRoleBindingsRouteInjectable = getInjectable({
id: "cluster-role-bindings-route", id: "cluster-role-bindings-route",
@ -19,7 +19,7 @@ const clusterRoleBindingsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default clusterRoleBindingsRouteInjectable; export default clusterRoleBindingsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const clusterRolesRouteInjectable = getInjectable({ const clusterRolesRouteInjectable = getInjectable({
id: "cluster-roles-route", id: "cluster-roles-route",
@ -19,7 +19,7 @@ const clusterRolesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default clusterRolesRouteInjectable; export default clusterRolesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const podSecurityPoliciesRouteInjectable = getInjectable({ const podSecurityPoliciesRouteInjectable = getInjectable({
id: "pod-security-policies-route", id: "pod-security-policies-route",
@ -19,7 +19,7 @@ const podSecurityPoliciesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default podSecurityPoliciesRouteInjectable; export default podSecurityPoliciesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const roleBindingsRouteInjectable = getInjectable({ const roleBindingsRouteInjectable = getInjectable({
id: "role-bindings-route", id: "role-bindings-route",
@ -19,7 +19,7 @@ const roleBindingsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default roleBindingsRouteInjectable; export default roleBindingsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const rolesRouteInjectable = getInjectable({ const rolesRouteInjectable = getInjectable({
id: "roles-route", id: "roles-route",
@ -19,7 +19,7 @@ const rolesRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default rolesRouteInjectable; export default rolesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const serviceAccountsRouteInjectable = getInjectable({ const serviceAccountsRouteInjectable = getInjectable({
id: "service-accounts-route", id: "service-accounts-route",
@ -19,7 +19,7 @@ const serviceAccountsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default serviceAccountsRouteInjectable; export default serviceAccountsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const cronJobsRouteInjectable = getInjectable({ const cronJobsRouteInjectable = getInjectable({
id: "cron-jobs-route", id: "cron-jobs-route",
@ -19,7 +19,7 @@ const cronJobsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default cronJobsRouteInjectable; export default cronJobsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const daemonsetsRouteInjectable = getInjectable({ const daemonsetsRouteInjectable = getInjectable({
id: "daemonsets-route", id: "daemonsets-route",
@ -19,7 +19,7 @@ const daemonsetsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default daemonsetsRouteInjectable; export default daemonsetsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const deploymentsRouteInjectable = getInjectable({ const deploymentsRouteInjectable = getInjectable({
id: "deployments-route", id: "deployments-route",
@ -19,7 +19,7 @@ const deploymentsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default deploymentsRouteInjectable; export default deploymentsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const jobsRouteInjectable = getInjectable({ const jobsRouteInjectable = getInjectable({
id: "jobs-route", id: "jobs-route",
@ -19,7 +19,7 @@ const jobsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default jobsRouteInjectable; export default jobsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const workloadsOverviewRouteInjectable = getInjectable({ const workloadsOverviewRouteInjectable = getInjectable({
id: "workloads-overview-route", id: "workloads-overview-route",
@ -15,7 +15,7 @@ const workloadsOverviewRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default workloadsOverviewRouteInjectable; export default workloadsOverviewRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const podsRouteInjectable = getInjectable({ const podsRouteInjectable = getInjectable({
id: "pods-route", id: "pods-route",
@ -19,7 +19,7 @@ const podsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default podsRouteInjectable; export default podsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const replicasetsRouteInjectable = getInjectable({ const replicasetsRouteInjectable = getInjectable({
id: "replicasets-route", id: "replicasets-route",
@ -19,7 +19,7 @@ const replicasetsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default replicasetsRouteInjectable; export default replicasetsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable"; import isAllowedResourceInjectable from "../../../../../utils/is-allowed-resource.injectable";
import { routeInjectionToken } from "../../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token";
const statefulsetsRouteInjectable = getInjectable({ const statefulsetsRouteInjectable = getInjectable({
id: "statefulsets-route", id: "statefulsets-route",
@ -19,7 +19,7 @@ const statefulsetsRouteInjectable = getInjectable({
}; };
}, },
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default statefulsetsRouteInjectable; export default statefulsetsRouteInjectable;

View File

@ -4,8 +4,8 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import type { Route } from "../../route-injection-token"; import type { Route } from "../../front-end-route-injection-token";
import { routeInjectionToken } from "../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token";
export interface EntitySettingsPathParameters { export interface EntitySettingsPathParameters {
entityId: string; entityId: string;
@ -20,7 +20,7 @@ const entitySettingsRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default entitySettingsRouteInjectable; export default entitySettingsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token";
const extensionsRouteInjectable = getInjectable({ const extensionsRouteInjectable = getInjectable({
id: "extensions-route", id: "extensions-route",
@ -15,7 +15,7 @@ const extensionsRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default extensionsRouteInjectable; export default extensionsRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const appPreferencesRouteInjectable = getInjectable({ const appPreferencesRouteInjectable = getInjectable({
id: "app-preferences-route", id: "app-preferences-route",
@ -15,7 +15,7 @@ const appPreferencesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default appPreferencesRouteInjectable; export default appPreferencesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const editorPreferencesRouteInjectable = getInjectable({ const editorPreferencesRouteInjectable = getInjectable({
id: "editor-preferences-route", id: "editor-preferences-route",
@ -15,7 +15,7 @@ const editorPreferencesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default editorPreferencesRouteInjectable; export default editorPreferencesRouteInjectable;

View File

@ -4,8 +4,8 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import type { Route } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
import { routeInjectionToken } from "../../../route-injection-token"; import type { Route } from "../../../front-end-route-injection-token";
interface ExtensionPreferenceRouteParams { interface ExtensionPreferenceRouteParams {
extensionId: string; extensionId: string;
@ -21,7 +21,7 @@ const extensionPreferencesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default extensionPreferencesRouteInjectable; export default extensionPreferencesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const kubernetesPreferencesRouteInjectable = getInjectable({ const kubernetesPreferencesRouteInjectable = getInjectable({
id: "kubernetes-preferences-route", id: "kubernetes-preferences-route",
@ -15,7 +15,7 @@ const kubernetesPreferencesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default kubernetesPreferencesRouteInjectable; export default kubernetesPreferencesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const proxyPreferencesRouteInjectable = getInjectable({ const proxyPreferencesRouteInjectable = getInjectable({
id: "proxy-preferences-route", id: "proxy-preferences-route",
@ -15,7 +15,7 @@ const proxyPreferencesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default proxyPreferencesRouteInjectable; export default proxyPreferencesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const telemetryPreferencesRouteInjectable = getInjectable({ const telemetryPreferencesRouteInjectable = getInjectable({
id: "telemetry-preferences-route", id: "telemetry-preferences-route",
@ -15,7 +15,7 @@ const telemetryPreferencesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default telemetryPreferencesRouteInjectable; export default telemetryPreferencesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token";
const terminalPreferencesRouteInjectable = getInjectable({ const terminalPreferencesRouteInjectable = getInjectable({
id: "terminal-preferences-route", id: "terminal-preferences-route",
@ -15,7 +15,7 @@ const terminalPreferencesRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default terminalPreferencesRouteInjectable; export default terminalPreferencesRouteInjectable;

View File

@ -4,7 +4,7 @@
*/ */
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; import { computed } from "mobx";
import { routeInjectionToken } from "../../route-injection-token"; import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token";
const welcomeRouteInjectable = getInjectable({ const welcomeRouteInjectable = getInjectable({
id: "welcome-route", id: "welcome-route",
@ -15,7 +15,7 @@ const welcomeRouteInjectable = getInjectable({
isEnabled: computed(() => true), isEnabled: computed(() => true),
}), }),
injectionToken: routeInjectionToken, injectionToken: frontEndRouteInjectionToken,
}); });
export default welcomeRouteInjectable; export default welcomeRouteInjectable;

Some files were not shown because too many files have changed in this diff Show More