mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
fix tests from rebase
Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
5d1609e0e4
commit
3def62cd8d
@ -364,7 +364,6 @@
|
|||||||
"flex.box": "^3.4.4",
|
"flex.box": "^3.4.4",
|
||||||
"fork-ts-checker-webpack-plugin": "^6.5.0",
|
"fork-ts-checker-webpack-plugin": "^6.5.0",
|
||||||
"gunzip-maybe": "^1.4.2",
|
"gunzip-maybe": "^1.4.2",
|
||||||
"hoist-non-react-statics": "^3.3.2",
|
|
||||||
"html-webpack-plugin": "^5.5.0",
|
"html-webpack-plugin": "^5.5.0",
|
||||||
"identity-obj-proxy": "^3.0.0",
|
"identity-obj-proxy": "^3.0.0",
|
||||||
"ignore-loader": "^0.1.2",
|
"ignore-loader": "^0.1.2",
|
||||||
|
|||||||
@ -9,7 +9,10 @@ import { getApplicationBuilder } from "../../renderer/components/test-utils/get-
|
|||||||
import isAutoUpdateEnabledInjectable from "../../main/is-auto-update-enabled.injectable";
|
import isAutoUpdateEnabledInjectable from "../../main/is-auto-update-enabled.injectable";
|
||||||
|
|
||||||
// TODO: Make components free of side effects by making them deterministic
|
// TODO: Make components free of side effects by making them deterministic
|
||||||
jest.mock("../../renderer/components/tooltip");
|
jest.mock("../../renderer/components/tooltip/tooltip");
|
||||||
|
jest.mock("../../renderer/components/tooltip/withTooltip", () => ({
|
||||||
|
withTooltip: (target: any) => target,
|
||||||
|
}));
|
||||||
jest.mock("../../renderer/components/monaco-editor/monaco-editor");
|
jest.mock("../../renderer/components/monaco-editor/monaco-editor");
|
||||||
|
|
||||||
describe("add-cluster - navigation using application menu", () => {
|
describe("add-cluster - navigation using application menu", () => {
|
||||||
|
|||||||
@ -5,8 +5,6 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { fireEvent } from "@testing-library/react";
|
import { fireEvent } from "@testing-library/react";
|
||||||
import { getRendererExtensionFake } from "../../renderer/components/test-utils/get-renderer-extension-fake";
|
|
||||||
import { LensRendererExtension } from "../../extensions/lens-renderer-extension";
|
|
||||||
import directoryForLensLocalStorageInjectable from "../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable";
|
import directoryForLensLocalStorageInjectable from "../../common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable";
|
||||||
import routesInjectable from "../../renderer/routes/routes.injectable";
|
import routesInjectable from "../../renderer/routes/routes.injectable";
|
||||||
import { matches } from "lodash/fp";
|
import { matches } from "lodash/fp";
|
||||||
@ -19,6 +17,8 @@ import type { DiContainer } from "@ogre-tools/injectable";
|
|||||||
import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token";
|
import { navigateToRouteInjectionToken } from "../../common/front-end-routing/navigate-to-route-injection-token";
|
||||||
import assert from "assert";
|
import assert from "assert";
|
||||||
import { getSidebarItem } from "../utils";
|
import { getSidebarItem } from "../utils";
|
||||||
|
import type { FakeExtensionData } from "../../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
|
import { getRendererExtensionFakeFor } from "../../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
|
|
||||||
describe("cluster - sidebar and tab navigation for extensions", () => {
|
describe("cluster - sidebar and tab navigation for extensions", () => {
|
||||||
let applicationBuilder: ApplicationBuilder;
|
let applicationBuilder: ApplicationBuilder;
|
||||||
@ -43,6 +43,7 @@ describe("cluster - sidebar and tab navigation for extensions", () => {
|
|||||||
|
|
||||||
describe("given extension with cluster pages and cluster page menus", () => {
|
describe("given extension with cluster pages and cluster page menus", () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
|
const getRendererExtensionFake = getRendererExtensionFakeFor(applicationBuilder);
|
||||||
const testExtension = getRendererExtensionFake(extensionStubWithSidebarItems);
|
const testExtension = getRendererExtensionFake(extensionStubWithSidebarItems);
|
||||||
|
|
||||||
await applicationBuilder.addExtensions(testExtension);
|
await applicationBuilder.addExtensions(testExtension);
|
||||||
@ -383,8 +384,10 @@ describe("cluster - sidebar and tab navigation for extensions", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const extensionStubWithSidebarItems = new (class extends LensRendererExtension {
|
const extensionStubWithSidebarItems: FakeExtensionData = {
|
||||||
clusterPages = [
|
id: "some-extension-id",
|
||||||
|
name: "some-extension-name",
|
||||||
|
clusterPages: [
|
||||||
{
|
{
|
||||||
components: {
|
components: {
|
||||||
Page: () => {
|
Page: () => {
|
||||||
@ -408,9 +411,8 @@ const extensionStubWithSidebarItems = new (class extends LensRendererExtension {
|
|||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
],
|
||||||
|
clusterPageMenus: [
|
||||||
clusterPageMenus = [
|
|
||||||
{
|
{
|
||||||
id: "some-parent-id",
|
id: "some-parent-id",
|
||||||
title: "Parent",
|
title: "Parent",
|
||||||
@ -441,16 +443,5 @@ const extensionStubWithSidebarItems = new (class extends LensRendererExtension {
|
|||||||
Icon: null as never,
|
Icon: null as never,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
],
|
||||||
})({
|
};
|
||||||
absolutePath: "/some/absolute/path",
|
|
||||||
id: "some-extension-id",
|
|
||||||
isBundled: true,
|
|
||||||
isCompatible: true,
|
|
||||||
isEnabled: true,
|
|
||||||
manifest: {
|
|
||||||
name: "some-extension-name",
|
|
||||||
version: "1.0.0",
|
|
||||||
},
|
|
||||||
manifestPath: "/some/manifest/path",
|
|
||||||
});
|
|
||||||
|
|||||||
@ -2,15 +2,13 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* 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 type { TestExtension } from "../renderer/components/test-utils/get-renderer-extension-fake";
|
import type { FakeExtensionData, TestExtension } from "../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
import { getRendererExtensionFake } from "../renderer/components/test-utils/get-renderer-extension-fake";
|
import { getRendererExtensionFakeFor } from "../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
||||||
import type { LensRendererExtension } from "../extensions/lens-renderer-extension";
|
|
||||||
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 type { SetRequired } from "type-fest";
|
|
||||||
|
|
||||||
describe("extension special characters in page registrations", () => {
|
describe("extension special characters in page registrations", () => {
|
||||||
let applicationBuilder: ApplicationBuilder;
|
let applicationBuilder: ApplicationBuilder;
|
||||||
@ -19,6 +17,7 @@ describe("extension special characters in page registrations", () => {
|
|||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
applicationBuilder = getApplicationBuilder();
|
applicationBuilder = getApplicationBuilder();
|
||||||
|
const getRendererExtensionFake = getRendererExtensionFakeFor(applicationBuilder);
|
||||||
|
|
||||||
testExtension = getRendererExtensionFake(
|
testExtension = getRendererExtensionFake(
|
||||||
extensionWithPagesHavingSpecialCharacters,
|
extensionWithPagesHavingSpecialCharacters,
|
||||||
@ -50,9 +49,9 @@ describe("extension special characters in page registrations", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const extensionWithPagesHavingSpecialCharacters: SetRequired<Partial<LensRendererExtension>, "id"> = {
|
const extensionWithPagesHavingSpecialCharacters: FakeExtensionData = {
|
||||||
id: "@some-extension-id/",
|
id: "some-extension-id",
|
||||||
|
name: "@some-extension-name/",
|
||||||
globalPages: [
|
globalPages: [
|
||||||
{
|
{
|
||||||
id: "/some-page-id/",
|
id: "/some-page-id/",
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* 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 type { TestExtension } from "../renderer/components/test-utils/get-renderer-extension-fake";
|
import type { FakeExtensionData, TestExtension } from "../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
import { getRendererExtensionFake } from "../renderer/components/test-utils/get-renderer-extension-fake";
|
import { getRendererExtensionFakeFor } from "../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import type { RenderResult } from "@testing-library/react";
|
import type { RenderResult } from "@testing-library/react";
|
||||||
import { fireEvent } from "@testing-library/react";
|
import { fireEvent } from "@testing-library/react";
|
||||||
@ -11,9 +11,7 @@ import isEmpty from "lodash/isEmpty";
|
|||||||
import queryParametersInjectable from "../renderer/routes/query-parameters.injectable";
|
import queryParametersInjectable from "../renderer/routes/query-parameters.injectable";
|
||||||
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
import currentPathInjectable from "../renderer/routes/current-path.injectable";
|
||||||
import type { IComputedValue } from "mobx";
|
import type { IComputedValue } from "mobx";
|
||||||
import type { LensRendererExtension } from "../extensions/lens-renderer-extension";
|
|
||||||
import { getApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
|
import { getApplicationBuilder } from "../renderer/components/test-utils/get-application-builder";
|
||||||
import type { SetRequired } from "type-fest";
|
|
||||||
|
|
||||||
describe("navigate to extension page", () => {
|
describe("navigate to extension page", () => {
|
||||||
let rendered: RenderResult;
|
let rendered: RenderResult;
|
||||||
@ -23,6 +21,7 @@ describe("navigate to extension page", () => {
|
|||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
const applicationBuilder = getApplicationBuilder();
|
const applicationBuilder = getApplicationBuilder();
|
||||||
|
const getRendererExtensionFake = getRendererExtensionFakeFor(applicationBuilder);
|
||||||
|
|
||||||
testExtension = getRendererExtensionFake(
|
testExtension = getRendererExtensionFake(
|
||||||
extensionWithPagesHavingParameters,
|
extensionWithPagesHavingParameters,
|
||||||
@ -126,9 +125,9 @@ describe("navigate to extension page", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const extensionWithPagesHavingParameters: SetRequired<Partial<LensRendererExtension>, "id"> = {
|
const extensionWithPagesHavingParameters: FakeExtensionData = {
|
||||||
id: "some-extension-id",
|
id: "some-extension-id",
|
||||||
|
name: "some-extension-name",
|
||||||
globalPages: [
|
globalPages: [
|
||||||
{
|
{
|
||||||
components: {
|
components: {
|
||||||
|
|||||||
@ -124,7 +124,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-26-live-region"
|
id="react-select-6-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -140,7 +140,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-26-placeholder"
|
id="react-select-6-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -150,7 +150,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-26-placeholder"
|
aria-describedby="react-select-6-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -209,7 +209,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-27-live-region"
|
id="react-select-7-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -225,7 +225,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-27-placeholder"
|
id="react-select-7-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -235,7 +235,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-27-placeholder"
|
aria-describedby="react-select-7-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -344,7 +344,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-28-live-region"
|
id="react-select-8-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -360,7 +360,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-28-placeholder"
|
id="react-select-8-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -370,7 +370,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-28-placeholder"
|
aria-describedby="react-select-8-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -429,7 +429,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-29-live-region"
|
id="react-select-9-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -445,7 +445,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-29-placeholder"
|
id="react-select-9-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -455,7 +455,7 @@ exports[`preferences - closing-preferences given accessing preferences directly
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-29-placeholder"
|
aria-describedby="react-select-9-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
|
|||||||
@ -663,7 +663,7 @@ exports[`preferences - navigation to editor preferences given in preferences, wh
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-14-live-region"
|
id="react-select-10-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -679,7 +679,7 @@ exports[`preferences - navigation to editor preferences given in preferences, wh
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-14-placeholder"
|
id="react-select-10-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -689,7 +689,7 @@ exports[`preferences - navigation to editor preferences given in preferences, wh
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-14-placeholder"
|
aria-describedby="react-select-10-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -747,7 +747,7 @@ exports[`preferences - navigation to editor preferences given in preferences, wh
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-15-live-region"
|
id="react-select-11-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -763,7 +763,7 @@ exports[`preferences - navigation to editor preferences given in preferences, wh
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-15-placeholder"
|
id="react-select-11-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -773,7 +773,7 @@ exports[`preferences - navigation to editor preferences given in preferences, wh
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-15-placeholder"
|
aria-describedby="react-select-11-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
|
|||||||
@ -652,7 +652,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-14-live-region"
|
id="react-select-6-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -668,7 +668,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-14-placeholder"
|
id="react-select-6-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -678,7 +678,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-14-placeholder"
|
aria-describedby="react-select-6-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -737,7 +737,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-15-live-region"
|
id="react-select-7-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -753,7 +753,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-15-placeholder"
|
id="react-select-7-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -763,7 +763,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-15-placeholder"
|
aria-describedby="react-select-7-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -872,7 +872,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-16-live-region"
|
id="react-select-8-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -888,7 +888,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-16-placeholder"
|
id="react-select-8-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -898,7 +898,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-16-placeholder"
|
aria-describedby="react-select-8-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -957,7 +957,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-17-live-region"
|
id="react-select-9-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -973,7 +973,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-17-placeholder"
|
id="react-select-9-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -983,7 +983,7 @@ exports[`preferences - navigation to extension specific preferences given in pre
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-17-placeholder"
|
aria-describedby="react-select-9-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
|
|||||||
@ -659,7 +659,7 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-14-live-region"
|
id="react-select-10-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -675,7 +675,7 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-14-placeholder"
|
id="react-select-10-placeholder"
|
||||||
>
|
>
|
||||||
Download mirror for kubectl
|
Download mirror for kubectl
|
||||||
</div>
|
</div>
|
||||||
@ -685,7 +685,7 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-14-placeholder"
|
aria-describedby="react-select-10-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -840,7 +840,7 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-15-live-region"
|
id="react-select-11-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -856,7 +856,7 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-15-placeholder"
|
id="react-select-11-placeholder"
|
||||||
>
|
>
|
||||||
Repositories
|
Repositories
|
||||||
</div>
|
</div>
|
||||||
@ -866,7 +866,7 @@ exports[`preferences - navigation to kubernetes preferences given in preferences
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-15-placeholder"
|
aria-describedby="react-select-11-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
|
|||||||
@ -840,7 +840,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-14-live-region"
|
id="react-select-6-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -856,7 +856,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-14-placeholder"
|
id="react-select-6-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -866,7 +866,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-14-placeholder"
|
aria-describedby="react-select-6-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -925,7 +925,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-15-live-region"
|
id="react-select-7-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -941,7 +941,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-15-placeholder"
|
id="react-select-7-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -951,7 +951,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-15-placeholder"
|
aria-describedby="react-select-7-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -1060,7 +1060,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-16-live-region"
|
id="react-select-8-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -1076,7 +1076,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-16-placeholder"
|
id="react-select-8-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -1086,7 +1086,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-16-placeholder"
|
aria-describedby="react-select-8-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
@ -1145,7 +1145,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-17-live-region"
|
id="react-select-9-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -1161,7 +1161,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-17-placeholder"
|
id="react-select-9-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -1171,7 +1171,7 @@ exports[`preferences - navigation to telemetry preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-17-placeholder"
|
aria-describedby="react-select-9-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
|
|||||||
@ -684,7 +684,7 @@ exports[`preferences - navigation to terminal preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="css-1f43avz-a11yText-A11yText"
|
class="css-1f43avz-a11yText-A11yText"
|
||||||
id="react-select-14-live-region"
|
id="react-select-10-live-region"
|
||||||
/>
|
/>
|
||||||
<span
|
<span
|
||||||
aria-atomic="false"
|
aria-atomic="false"
|
||||||
@ -700,7 +700,7 @@ exports[`preferences - navigation to terminal preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="Select__placeholder css-14el2xx-placeholder"
|
class="Select__placeholder css-14el2xx-placeholder"
|
||||||
id="react-select-14-placeholder"
|
id="react-select-10-placeholder"
|
||||||
>
|
>
|
||||||
Select...
|
Select...
|
||||||
</div>
|
</div>
|
||||||
@ -710,7 +710,7 @@ exports[`preferences - navigation to terminal preferences given in preferences,
|
|||||||
>
|
>
|
||||||
<input
|
<input
|
||||||
aria-autocomplete="list"
|
aria-autocomplete="list"
|
||||||
aria-describedby="react-select-14-placeholder"
|
aria-describedby="react-select-10-placeholder"
|
||||||
aria-expanded="false"
|
aria-expanded="false"
|
||||||
aria-haspopup="true"
|
aria-haspopup="true"
|
||||||
autocapitalize="none"
|
autocapitalize="none"
|
||||||
|
|||||||
@ -7,9 +7,9 @@ import type { ApplicationBuilder } from "../../renderer/components/test-utils/ge
|
|||||||
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder";
|
||||||
import userStoreInjectable from "../../common/user-store/user-store.injectable";
|
import userStoreInjectable from "../../common/user-store/user-store.injectable";
|
||||||
import type { UserStore } from "../../common/user-store";
|
import type { UserStore } from "../../common/user-store";
|
||||||
import { LensRendererExtension } from "../../extensions/lens-renderer-extension";
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { getRendererExtensionFake } from "../../renderer/components/test-utils/get-renderer-extension-fake";
|
import type { FakeExtensionData } from "../../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
|
import { getRendererExtensionFakeFor } from "../../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
import ipcRendererInjectable from "../../renderer/app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
|
import ipcRendererInjectable from "../../renderer/app-paths/get-value-from-registered-channel/ipc-renderer/ipc-renderer.injectable";
|
||||||
|
|
||||||
describe("preferences - navigation to extension specific preferences", () => {
|
describe("preferences - navigation to extension specific preferences", () => {
|
||||||
@ -60,6 +60,7 @@ describe("preferences - navigation to extension specific preferences", () => {
|
|||||||
|
|
||||||
describe("when extension with specific preferences is enabled", () => {
|
describe("when extension with specific preferences is enabled", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
const getRendererExtensionFake = getRendererExtensionFakeFor(applicationBuilder);
|
||||||
const testExtension = getRendererExtensionFake(extensionStubWithExtensionSpecificPreferenceItems);
|
const testExtension = getRendererExtensionFake(extensionStubWithExtensionSpecificPreferenceItems);
|
||||||
|
|
||||||
applicationBuilder.addExtensions(testExtension);
|
applicationBuilder.addExtensions(testExtension);
|
||||||
@ -106,8 +107,10 @@ describe("preferences - navigation to extension specific preferences", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const extensionStubWithExtensionSpecificPreferenceItems = new (class extends LensRendererExtension{
|
const extensionStubWithExtensionSpecificPreferenceItems: FakeExtensionData = {
|
||||||
appPreferences = [
|
id: "some-extension-id",
|
||||||
|
name: "some-extension-name",
|
||||||
|
appPreferences: [
|
||||||
{
|
{
|
||||||
title: "Some preference item",
|
title: "Some preference item",
|
||||||
id: "some-preference-item-id",
|
id: "some-preference-item-id",
|
||||||
@ -128,17 +131,6 @@ const extensionStubWithExtensionSpecificPreferenceItems = new (class extends Len
|
|||||||
Input: () => <div />,
|
Input: () => <div />,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
],
|
||||||
})({
|
};
|
||||||
absolutePath: "/some/absolute/path",
|
|
||||||
id: "some-extension-id",
|
|
||||||
isBundled: true,
|
|
||||||
isCompatible: true,
|
|
||||||
isEnabled: true,
|
|
||||||
manifest: {
|
|
||||||
name: "some-extension-name",
|
|
||||||
version: "1.0.0",
|
|
||||||
},
|
|
||||||
manifestPath: "/some/manifest/path",
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,8 @@ import type { RenderResult } from "@testing-library/react";
|
|||||||
import React from "react";
|
import React from "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 { getRendererExtensionFake } from "../../renderer/components/test-utils/get-renderer-extension-fake";
|
import type { FakeExtensionData } from "../../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
|
import { getRendererExtensionFakeFor } from "../../renderer/components/test-utils/get-renderer-extension-fake";
|
||||||
import type { UserStore } from "../../common/user-store";
|
import type { UserStore } from "../../common/user-store";
|
||||||
import userStoreInjectable from "../../common/user-store/user-store.injectable";
|
import userStoreInjectable from "../../common/user-store/user-store.injectable";
|
||||||
import navigateToTelemetryPreferencesInjectable from "../../common/front-end-routing/routes/preferences/telemetry/navigate-to-telemetry-preferences.injectable";
|
import navigateToTelemetryPreferencesInjectable from "../../common/front-end-routing/routes/preferences/telemetry/navigate-to-telemetry-preferences.injectable";
|
||||||
@ -61,8 +62,8 @@ describe("preferences - navigation to telemetry preferences", () => {
|
|||||||
|
|
||||||
describe("when extension with telemetry preference items gets enabled", () => {
|
describe("when extension with telemetry preference items gets enabled", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
const testExtensionWithTelemetryPreferenceItems =
|
const getRendererExtensionFake = getRendererExtensionFakeFor(applicationBuilder);
|
||||||
getRendererExtensionFake(extensionStubWithTelemetryPreferenceItems);
|
const testExtensionWithTelemetryPreferenceItems = getRendererExtensionFake(extensionStubWithTelemetryPreferenceItems);
|
||||||
|
|
||||||
applicationBuilder.addExtensions(
|
applicationBuilder.addExtensions(
|
||||||
testExtensionWithTelemetryPreferenceItems,
|
testExtensionWithTelemetryPreferenceItems,
|
||||||
@ -105,9 +106,10 @@ describe("preferences - navigation to telemetry preferences", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("given extensions but no telemetry preference items, does not show link for telemetry preferences", () => {
|
it("given extensions but no telemetry preference items, does not show link for telemetry preferences", () => {
|
||||||
const testExtensionWithTelemetryPreferenceItems =
|
const getRendererExtensionFake = getRendererExtensionFakeFor(applicationBuilder);
|
||||||
getRendererExtensionFake({
|
const testExtensionWithTelemetryPreferenceItems = getRendererExtensionFake({
|
||||||
id: "some-test-extension-id",
|
id: "some-test-extension-id",
|
||||||
|
name: "some-test-extension-name",
|
||||||
appPreferences: [
|
appPreferences: [
|
||||||
{
|
{
|
||||||
title: "irrelevant",
|
title: "irrelevant",
|
||||||
@ -185,8 +187,9 @@ describe("preferences - navigation to telemetry preferences", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
const extensionStubWithTelemetryPreferenceItems = {
|
const extensionStubWithTelemetryPreferenceItems: FakeExtensionData = {
|
||||||
id: "some-test-extension-id",
|
id: "some-test-extension-id",
|
||||||
|
name: "some-test-extension-name",
|
||||||
appPreferences: [
|
appPreferences: [
|
||||||
{
|
{
|
||||||
title: "Some telemetry-preference item",
|
title: "Some telemetry-preference item",
|
||||||
|
|||||||
@ -14,6 +14,7 @@ import type { FetchMock } from "jest-fetch-mock/types";
|
|||||||
import { DeploymentApi, Ingress, IngressApi, Pod, PodApi } from "../endpoints";
|
import { DeploymentApi, Ingress, IngressApi, Pod, PodApi } from "../endpoints";
|
||||||
import { getDiForUnitTesting } from "../../../main/getDiForUnitTesting";
|
import { getDiForUnitTesting } from "../../../main/getDiForUnitTesting";
|
||||||
import apiManagerInjectable from "../api-manager/manager.injectable";
|
import apiManagerInjectable from "../api-manager/manager.injectable";
|
||||||
|
import autoRegistrationInjectable from "../api-manager/auto-registration.injectable";
|
||||||
|
|
||||||
jest.mock("../api-manager");
|
jest.mock("../api-manager");
|
||||||
|
|
||||||
@ -98,6 +99,7 @@ describe("KubeApi", () => {
|
|||||||
apiManager = new ApiManager() as jest.Mocked<ApiManager>;
|
apiManager = new ApiManager() as jest.Mocked<ApiManager>;
|
||||||
|
|
||||||
di.override(apiManagerInjectable, () => apiManager);
|
di.override(apiManagerInjectable, () => apiManager);
|
||||||
|
di.inject(autoRegistrationInjectable);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("uses url from apiBase if apiBase contains the resource", async () => {
|
it("uses url from apiBase if apiBase contains the resource", async () => {
|
||||||
@ -227,7 +229,7 @@ describe("KubeApi", () => {
|
|||||||
await (api as any).checkPreferredVersion();
|
await (api as any).checkPreferredVersion();
|
||||||
|
|
||||||
expect(api.apiVersionPreferred).toBe("v1beta1");
|
expect(api.apiVersionPreferred).toBe("v1beta1");
|
||||||
expect(apiManager.registerApi).toBeCalledWith("/apis/extensions/v1beta1/ingresses", expect.anything());
|
expect(apiManager.registerApi).toBeCalledWith(api);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("registers with apiManager if checkPreferredVersion changes apiVersionPreferred with non-grouped apis", async () => {
|
it("registers with apiManager if checkPreferredVersion changes apiVersionPreferred with non-grouped apis", async () => {
|
||||||
@ -267,7 +269,7 @@ describe("KubeApi", () => {
|
|||||||
await (api as any).checkPreferredVersion();
|
await (api as any).checkPreferredVersion();
|
||||||
|
|
||||||
expect(api.apiVersionPreferred).toBe("v1beta1");
|
expect(api.apiVersionPreferred).toBe("v1beta1");
|
||||||
expect(apiManager.registerApi).toBeCalledWith("/api/v1beta1/pods", expect.anything());
|
expect(apiManager.registerApi).toBeCalledWith(api);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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 { reduce } from "../iter";
|
import { join, nth, reduce } from "../iter";
|
||||||
|
|
||||||
describe("iter", () => {
|
describe("iter", () => {
|
||||||
describe("reduce", () => {
|
describe("reduce", () => {
|
||||||
@ -15,4 +15,28 @@ describe("iter", () => {
|
|||||||
expect(reduce([], (acc: number[], current: number) => [acc[0] + current], [])).toEqual([]);
|
expect(reduce([], (acc: number[], current: number) => [acc[0] + current], [])).toEqual([]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("join", () => {
|
||||||
|
it("should not prefix the output by the seperator", () => {
|
||||||
|
expect(join(["a", "b", "c"].values(), " ")).toBe("a b c");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should return empty string if iterator is empty", () => {
|
||||||
|
expect(join([].values(), " ")).toBe("");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should return just first entry if iterator is of size 1", () => {
|
||||||
|
expect(join(["d"].values(), " ")).toBe("d");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("nth", () => {
|
||||||
|
it("should return undefined past the end of the iterator", () => {
|
||||||
|
expect(nth(["a"], 123)).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should by 0-indexing the index", () => {
|
||||||
|
expect(nth(["a", "b"], 0)).toBe("a");
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -5,64 +5,24 @@
|
|||||||
|
|
||||||
export type Falsey = false | 0 | "" | null | undefined;
|
export type Falsey = false | 0 | "" | null | undefined;
|
||||||
|
|
||||||
export function pipeline<T>(src: Iterable<T>) {
|
interface Iterator<T> {
|
||||||
return Iterator[createPipeline](src);
|
filter(fn: (val: T) => unknown): Iterator<T>;
|
||||||
|
filterMap<U>(fn: (val: T) => Falsey | U): Iterator<U>;
|
||||||
|
find(fn: (val: T) => unknown): T | undefined;
|
||||||
|
collect<U>(fn: (values: Iterable<T>) => U): U;
|
||||||
|
map<U>(fn: (val: T) => U): Iterator<U>;
|
||||||
|
join(sep?: string): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
const createPipeline = Symbol("create-pipeline");
|
export function pipeline<T>(src: IterableIterator<T>): Iterator<T> {
|
||||||
|
return {
|
||||||
export class Iterator<T> {
|
filter: (fn) => pipeline(filter(src, fn)),
|
||||||
#inner: Iterable<any>;
|
filterMap: (fn) => pipeline(filterMap(src, fn)),
|
||||||
|
map: (fn) => pipeline(map(src, fn)),
|
||||||
static [createPipeline]<T>(inner: Iterable<T>) {
|
find: (fn) => find(src, fn),
|
||||||
return new Iterator(inner);
|
join: (sep) => join(src, sep),
|
||||||
}
|
collect: (fn) => fn(src),
|
||||||
|
};
|
||||||
private constructor(inner: Iterable<T>) {
|
|
||||||
this.#inner = inner;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrap the interior iterator with an filter
|
|
||||||
*/
|
|
||||||
public filter(fn: (val: T) => any): Iterator<T> {
|
|
||||||
this.#inner = filter(this.#inner, fn);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrap the interior iterator with an filterMap
|
|
||||||
*/
|
|
||||||
public filterMap<U>(fn: (val: T) => Falsey | U): Iterator<U> {
|
|
||||||
this.#inner = filterMap(this.#inner, fn);
|
|
||||||
|
|
||||||
return this as never;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Consume the interior iterator until an element matches the callback and return that
|
|
||||||
*/
|
|
||||||
public find(fn: (val: T) => any): T | undefined {
|
|
||||||
return find(this.#inner, fn);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Consume the interior iterator and produce a new type
|
|
||||||
*/
|
|
||||||
public collect<U>(fn: (values: Iterable<T>) => U): U {
|
|
||||||
return fn(this.#inner);
|
|
||||||
}
|
|
||||||
|
|
||||||
public map<U>(fn: (val: T) => U): Iterator<U> {
|
|
||||||
this.#inner = map(this.#inner, fn);
|
|
||||||
|
|
||||||
return this as never;
|
|
||||||
}
|
|
||||||
|
|
||||||
public join(sep?: string): string {
|
|
||||||
return join(this.#inner, sep);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -224,8 +184,15 @@ export function reduce<T, R = T>(src: Iterable<T>, reducer: (acc: R, cur: T) =>
|
|||||||
* @param connector The string value to intersperse between the yielded values
|
* @param connector The string value to intersperse between the yielded values
|
||||||
* @returns The concatenated entries of `src` interspersed with copies of `connector`
|
* @returns The concatenated entries of `src` interspersed with copies of `connector`
|
||||||
*/
|
*/
|
||||||
export function join(src: Iterable<unknown>, connector = ","): string {
|
export function join(src: IterableIterator<unknown>, connector = ","): string {
|
||||||
return reduce(src, (acc, cur) => `${acc}${connector}${cur}`, "");
|
const iterSrc = src[Symbol.iterator]();
|
||||||
|
const first = iterSrc.next();
|
||||||
|
|
||||||
|
if (first.done === true) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return reduce(iterSrc, (acc, cur) => `${acc}${connector}${cur}`, `${first.value}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -22,7 +22,8 @@ export interface LensExtensionManifest extends PackageJson {
|
|||||||
renderer?: string; // path to %ext/dist/renderer.js
|
renderer?: string; // path to %ext/dist/renderer.js
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Disposers = Symbol();
|
export const lensExtensionDependencies = Symbol("lens-extension-dependencies");
|
||||||
|
export const Disposers = Symbol("disposers");
|
||||||
|
|
||||||
export class LensExtension<Dependencies extends LensExtensionDependencies = LensExtensionDependencies> {
|
export class LensExtension<Dependencies extends LensExtensionDependencies = LensExtensionDependencies> {
|
||||||
readonly id: LensExtensionId;
|
readonly id: LensExtensionId;
|
||||||
@ -64,7 +65,7 @@ export class LensExtension<Dependencies extends LensExtensionDependencies = Lens
|
|||||||
return this.manifest.description;
|
return this.manifest.description;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected readonly dependencies!: Dependencies;
|
readonly [lensExtensionDependencies]!: Dependencies;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* getExtensionFileFolder returns the path to an already created folder. This
|
* getExtensionFileFolder returns the path to an already created folder. This
|
||||||
@ -74,7 +75,7 @@ export class LensExtension<Dependencies extends LensExtensionDependencies = Lens
|
|||||||
* folder name.
|
* folder name.
|
||||||
*/
|
*/
|
||||||
async getExtensionFileFolder(): Promise<string> {
|
async getExtensionFileFolder(): Promise<string> {
|
||||||
return this.dependencies.fileSystemProvisionerStore.requestDirectory(this.id);
|
return this[lensExtensionDependencies].fileSystemProvisionerStore.requestDirectory(this.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
|||||||
@ -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 { LensExtension } from "./lens-extension";
|
import { LensExtension, lensExtensionDependencies } from "./lens-extension";
|
||||||
import { WindowManager } from "../main/window-manager";
|
import { WindowManager } from "../main/window-manager";
|
||||||
import type { CatalogEntity } from "../common/catalog";
|
import type { CatalogEntity } from "../common/catalog";
|
||||||
import type { IObservableArray } from "mobx";
|
import type { IObservableArray } from "mobx";
|
||||||
@ -36,10 +36,10 @@ export class LensMainExtension extends LensExtension<LensMainExtensionDependenci
|
|||||||
}
|
}
|
||||||
|
|
||||||
addCatalogSource(id: string, source: IObservableArray<CatalogEntity>) {
|
addCatalogSource(id: string, source: IObservableArray<CatalogEntity>) {
|
||||||
this.dependencies.entityRegistry.addObservableSource(`${this.name}:${id}`, source);
|
this[lensExtensionDependencies].entityRegistry.addObservableSource(`${this.name}:${id}`, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeCatalogSource(id: string) {
|
removeCatalogSource(id: string) {
|
||||||
this.dependencies.entityRegistry.removeSource(`${this.name}:${id}`);
|
this[lensExtensionDependencies].entityRegistry.removeSource(`${this.name}:${id}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import type * as registries from "./registries";
|
import type * as registries from "./registries";
|
||||||
import { Disposers, LensExtension } from "./lens-extension";
|
import { Disposers, LensExtension, lensExtensionDependencies } from "./lens-extension";
|
||||||
import type { CatalogEntity } from "../common/catalog";
|
import type { CatalogEntity } from "../common/catalog";
|
||||||
import type { Disposer } from "../common/utils";
|
import type { Disposer } from "../common/utils";
|
||||||
import type { EntityFilter } from "../renderer/api/catalog/entity/registry";
|
import type { EntityFilter } from "../renderer/api/catalog/entity/registry";
|
||||||
@ -46,7 +46,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
customCategoryViews: CustomCategoryViewRegistration[] = [];
|
customCategoryViews: CustomCategoryViewRegistration[] = [];
|
||||||
|
|
||||||
async navigate(pageId?: string, params: object = {}) {
|
async navigate(pageId?: string, params: object = {}) {
|
||||||
const routes = this.dependencies.routes.get();
|
const routes = this[lensExtensionDependencies].routes.get();
|
||||||
const targetRegistration = [...this.globalPages, ...this.clusterPages]
|
const targetRegistration = [...this.globalPages, ...this.clusterPages]
|
||||||
.find(registration => registration.id === (pageId || undefined));
|
.find(registration => registration.id === (pageId || undefined));
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const normalizedParams = this.dependencies.getExtensionPageParameters({
|
const normalizedParams = this[lensExtensionDependencies].getExtensionPageParameters({
|
||||||
extension: this,
|
extension: this,
|
||||||
registration: targetRegistration,
|
registration: targetRegistration,
|
||||||
});
|
});
|
||||||
@ -75,7 +75,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
fromPairs,
|
fromPairs,
|
||||||
);
|
);
|
||||||
|
|
||||||
this.dependencies.navigateToRoute(targetRoute, {
|
this[lensExtensionDependencies].navigateToRoute(targetRoute, {
|
||||||
query,
|
query,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -96,7 +96,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
* @returns A function to clean up the filter
|
* @returns A function to clean up the filter
|
||||||
*/
|
*/
|
||||||
addCatalogFilter(fn: EntityFilter): Disposer {
|
addCatalogFilter(fn: EntityFilter): Disposer {
|
||||||
const dispose = this.dependencies.entityRegistry.addCatalogFilter(fn);
|
const dispose = this[lensExtensionDependencies].entityRegistry.addCatalogFilter(fn);
|
||||||
|
|
||||||
this[Disposers].push(dispose);
|
this[Disposers].push(dispose);
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ export class LensRendererExtension extends LensExtension<LensRendererExtensionDe
|
|||||||
* @returns A function to clean up the filter
|
* @returns A function to clean up the filter
|
||||||
*/
|
*/
|
||||||
addCatalogCategoryFilter(fn: CategoryFilter): Disposer {
|
addCatalogCategoryFilter(fn: CategoryFilter): Disposer {
|
||||||
const dispose = this.dependencies.categoryRegistry.addCatalogCategoryFilter(fn);
|
const dispose = this[lensExtensionDependencies].categoryRegistry.addCatalogCategoryFilter(fn);
|
||||||
|
|
||||||
this[Disposers].push(dispose);
|
this[Disposers].push(dispose);
|
||||||
|
|
||||||
|
|||||||
@ -8,16 +8,18 @@ import * as uuid from "uuid";
|
|||||||
import { broadcastMessage } from "../../../common/ipc";
|
import { broadcastMessage } from "../../../common/ipc";
|
||||||
import { ProtocolHandlerExtension, ProtocolHandlerInternal } from "../../../common/protocol-handler";
|
import { ProtocolHandlerExtension, ProtocolHandlerInternal } from "../../../common/protocol-handler";
|
||||||
import { delay, noop } from "../../../common/utils";
|
import { delay, noop } from "../../../common/utils";
|
||||||
import { LensExtension } from "../../../extensions/main-api";
|
|
||||||
import { ExtensionsStore } from "../../../extensions/extensions-store/extensions-store";
|
import { ExtensionsStore } from "../../../extensions/extensions-store/extensions-store";
|
||||||
import type { LensProtocolRouterMain } from "../lens-protocol-router-main/lens-protocol-router-main";
|
import type { LensProtocolRouterMain } from "../lens-protocol-router-main/lens-protocol-router-main";
|
||||||
import mockFs from "mock-fs";
|
import mockFs from "mock-fs";
|
||||||
import { getDiForUnitTesting } from "../../getDiForUnitTesting";
|
import { getDiForUnitTesting } from "../../getDiForUnitTesting";
|
||||||
import extensionLoaderInjectable from "../../../extensions/extension-loader/extension-loader.injectable";
|
|
||||||
import lensProtocolRouterMainInjectable from "../lens-protocol-router-main/lens-protocol-router-main.injectable";
|
import lensProtocolRouterMainInjectable from "../lens-protocol-router-main/lens-protocol-router-main.injectable";
|
||||||
import extensionsStoreInjectable from "../../../extensions/extensions-store/extensions-store.injectable";
|
import extensionsStoreInjectable from "../../../extensions/extensions-store/extensions-store.injectable";
|
||||||
import getConfigurationFileModelInjectable from "../../../common/get-configuration-file-model/get-configuration-file-model.injectable";
|
import getConfigurationFileModelInjectable from "../../../common/get-configuration-file-model/get-configuration-file-model.injectable";
|
||||||
import appVersionInjectable from "../../../common/get-configuration-file-model/app-version/app-version.injectable";
|
import appVersionInjectable from "../../../common/get-configuration-file-model/app-version/app-version.injectable";
|
||||||
|
import { LensExtension } from "../../../extensions/lens-extension";
|
||||||
|
import type { LensExtensionId } from "../../../extensions/lens-extension";
|
||||||
|
import type { ObservableMap } from "mobx";
|
||||||
|
import extensionInstancesInjectable from "../../../extensions/extension-loader/extension-instances.injectable";
|
||||||
|
|
||||||
jest.mock("../../../common/ipc");
|
jest.mock("../../../common/ipc");
|
||||||
|
|
||||||
@ -28,9 +30,7 @@ function throwIfDefined(val: any): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe("protocol router tests", () => {
|
describe("protocol router tests", () => {
|
||||||
// TODO: This test suite is using any to access protected property.
|
let extensionInstances: ObservableMap<LensExtensionId, LensExtension>;
|
||||||
// Unit tests are allowed to only public interfaces.
|
|
||||||
let extensionLoader: any;
|
|
||||||
let lpr: LensProtocolRouterMain;
|
let lpr: LensProtocolRouterMain;
|
||||||
let extensionsStore: ExtensionsStore;
|
let extensionsStore: ExtensionsStore;
|
||||||
|
|
||||||
@ -48,10 +48,8 @@ describe("protocol router tests", () => {
|
|||||||
|
|
||||||
await di.runSetups();
|
await di.runSetups();
|
||||||
|
|
||||||
extensionLoader = di.inject(extensionLoaderInjectable);
|
extensionInstances = di.inject(extensionInstancesInjectable);
|
||||||
|
|
||||||
extensionsStore = di.inject(extensionsStoreInjectable);
|
extensionsStore = di.inject(extensionsStoreInjectable);
|
||||||
|
|
||||||
lpr = di.inject(lensProtocolRouterMainInjectable);
|
lpr = di.inject(lensProtocolRouterMainInjectable);
|
||||||
|
|
||||||
lpr.rendererLoaded = true;
|
lpr.rendererLoaded = true;
|
||||||
@ -99,7 +97,7 @@ describe("protocol router tests", () => {
|
|||||||
handler: noop,
|
handler: noop,
|
||||||
});
|
});
|
||||||
|
|
||||||
extensionLoader.instances.set(extId, ext);
|
extensionInstances.set(extId, ext);
|
||||||
extensionsStore.mergeState([[extId, { enabled: true, name: "@mirantis/minikube" }]]);
|
extensionsStore.mergeState([[extId, { enabled: true, name: "@mirantis/minikube" }]]);
|
||||||
|
|
||||||
lpr.addInternalHandler("/", noop);
|
lpr.addInternalHandler("/", noop);
|
||||||
@ -178,7 +176,7 @@ describe("protocol router tests", () => {
|
|||||||
handler: params => { called = params.pathname.id; },
|
handler: params => { called = params.pathname.id; },
|
||||||
});
|
});
|
||||||
|
|
||||||
extensionLoader.instances.set(extId, ext);
|
extensionInstances.set(extId, ext);
|
||||||
extensionsStore.mergeState([[extId, { enabled: true, name: "@foobar/icecream" }]]);
|
extensionsStore.mergeState([[extId, { enabled: true, name: "@foobar/icecream" }]]);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -216,7 +214,7 @@ describe("protocol router tests", () => {
|
|||||||
handler: params => { called = params.pathname.id; },
|
handler: params => { called = params.pathname.id; },
|
||||||
});
|
});
|
||||||
|
|
||||||
extensionLoader.instances.set(extId, ext);
|
extensionInstances.set(extId, ext);
|
||||||
extensionsStore.mergeState([[extId, { enabled: true, name: "@foobar/icecream" }]]);
|
extensionsStore.mergeState([[extId, { enabled: true, name: "@foobar/icecream" }]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,7 +239,7 @@ describe("protocol router tests", () => {
|
|||||||
handler: () => { called = 1; },
|
handler: () => { called = 1; },
|
||||||
});
|
});
|
||||||
|
|
||||||
extensionLoader.instances.set(extId, ext);
|
extensionInstances.set(extId, ext);
|
||||||
extensionsStore.mergeState([[extId, { enabled: true, name: "icecream" }]]);
|
extensionsStore.mergeState([[extId, { enabled: true, name: "icecream" }]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -86,7 +86,7 @@ export class AddSecretDialog extends React.Component<AddSecretDialogProps> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private getDataFromFields = (fields: SecretTemplateField[] = [], processValue: (val: string) => string = (val => val)) => {
|
private getDataFromFields = (fields: SecretTemplateField[] = [], processValue: (val: string) => string = (val => val)) => {
|
||||||
return iter.pipeline(fields)
|
return iter.pipeline(fields.values())
|
||||||
.filterMap(({ key, value }) => (
|
.filterMap(({ key, value }) => (
|
||||||
value
|
value
|
||||||
? [key, processValue(value)] as const
|
? [key, processValue(value)] as const
|
||||||
|
|||||||
@ -137,10 +137,8 @@ class NonInjectedDeploymentDetails extends React.Component<DeploymentDetailsProp
|
|||||||
labelsOnly
|
labelsOnly
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
deployment.getConditions().map(condition => {
|
deployment.getConditions()
|
||||||
const { type, message, lastTransitionTime, status } = condition;
|
.map(({ type, message, lastTransitionTime, status }) => (
|
||||||
|
|
||||||
return (
|
|
||||||
<Badge
|
<Badge
|
||||||
key={type}
|
key={type}
|
||||||
label={type}
|
label={type}
|
||||||
@ -153,10 +151,8 @@ class NonInjectedDeploymentDetails extends React.Component<DeploymentDetailsProp
|
|||||||
{`Last transition time: ${lastTransitionTime}`}
|
{`Last transition time: ${lastTransitionTime}`}
|
||||||
</p>
|
</p>
|
||||||
</>
|
</>
|
||||||
)}
|
)} />
|
||||||
/>
|
))
|
||||||
);
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
</DrawerItem>
|
</DrawerItem>
|
||||||
<PodDetailsTolerations workload={deployment}/>
|
<PodDetailsTolerations workload={deployment}/>
|
||||||
|
|||||||
@ -30,14 +30,20 @@ export interface IconProps extends React.HTMLAttributes<any> {
|
|||||||
disabled?: boolean;
|
disabled?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Icon = Object.assign(
|
export function isSvg(content: string): boolean {
|
||||||
withTooltip((props: IconProps) => {
|
// data-url for raw svg-icon
|
||||||
|
return String(content).includes("svg+xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
const RawIcon = withTooltip((props: IconProps) => {
|
||||||
const ref = createRef<HTMLAnchorElement>();
|
const ref = createRef<HTMLAnchorElement>();
|
||||||
|
|
||||||
const {
|
const {
|
||||||
// skip passing props to icon's html element
|
// skip passing props to icon's html element
|
||||||
className, href, link, material, svg, size, smallest, small, big,
|
className, href, link, material, svg, size, smallest, small, big,
|
||||||
disabled, sticker, active, focusable, children,
|
disabled, sticker, active,
|
||||||
|
focusable = true,
|
||||||
|
children,
|
||||||
interactive, onClick, onKeyDown,
|
interactive, onClick, onKeyDown,
|
||||||
...elemProps
|
...elemProps
|
||||||
} = props;
|
} = props;
|
||||||
@ -81,7 +87,8 @@ export const Icon = Object.assign(
|
|||||||
const dataUrlPrefix = "data:image/svg+xml;base64,";
|
const dataUrlPrefix = "data:image/svg+xml;base64,";
|
||||||
const svgIconDataUrl = svg.startsWith(dataUrlPrefix) ? svg : require(`./${svg}.svg`);
|
const svgIconDataUrl = svg.startsWith(dataUrlPrefix) ? svg : require(`./${svg}.svg`);
|
||||||
const svgIconText = typeof svgIconDataUrl == "string" // decode xml from data-url
|
const svgIconText = typeof svgIconDataUrl == "string" // decode xml from data-url
|
||||||
? decode(svgIconDataUrl.replace(dataUrlPrefix, "")) : "";
|
? decode(svgIconDataUrl.replace(dataUrlPrefix, ""))
|
||||||
|
: "";
|
||||||
|
|
||||||
iconContent = <span className="icon" dangerouslySetInnerHTML={{ __html: svgIconText }} />;
|
iconContent = <span className="icon" dangerouslySetInnerHTML={{ __html: svgIconText }} />;
|
||||||
}
|
}
|
||||||
@ -125,9 +132,6 @@ export const Icon = Object.assign(
|
|||||||
}
|
}
|
||||||
|
|
||||||
return <i {...iconProps} ref={ref} />;
|
return <i {...iconProps} ref={ref} />;
|
||||||
}),
|
});
|
||||||
{
|
|
||||||
// data-url for raw svg-icon
|
export const Icon = Object.assign(RawIcon, { isSvg });
|
||||||
isSvg: (content: string) => String(content).includes("svg+xml"),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|||||||
@ -28,7 +28,10 @@ import createEditResourceTabInjectable from "../dock/edit-resource/edit-resource
|
|||||||
import hideDetailsInjectable from "../kube-detail-params/hide-details.injectable";
|
import hideDetailsInjectable from "../kube-detail-params/hide-details.injectable";
|
||||||
|
|
||||||
// TODO: Make tooltips free of side effects by making it deterministic
|
// TODO: Make tooltips free of side effects by making it deterministic
|
||||||
jest.mock("../tooltip");
|
jest.mock("../tooltip/tooltip");
|
||||||
|
jest.mock("../tooltip/withTooltip", () => ({
|
||||||
|
withTooltip: (target: any) => target,
|
||||||
|
}));
|
||||||
|
|
||||||
class SomeTestExtension extends LensRendererExtension {
|
class SomeTestExtension extends LensRendererExtension {
|
||||||
constructor(
|
constructor(
|
||||||
|
|||||||
@ -104,18 +104,14 @@ const NonInjectedKubeObjectMeta = observer(({
|
|||||||
{ownerRefs?.length > 0 && (
|
{ownerRefs?.length > 0 && (
|
||||||
<DrawerItem name="Controlled By" hidden={isHidden("ownerReferences")}>
|
<DrawerItem name="Controlled By" hidden={isHidden("ownerReferences")}>
|
||||||
{
|
{
|
||||||
ownerRefs.map(ref => {
|
ownerRefs.map(ref => (
|
||||||
const { name, kind } = ref;
|
<p key={ref.name}>
|
||||||
const ownerDetailsUrl = getDetailsUrl(apiManager.lookupApiLink(ref, object));
|
{`${ref.kind} `}
|
||||||
|
<Link to={getDetailsUrl(apiManager.lookupApiLink(ref, object))}>
|
||||||
return (
|
{ref.name}
|
||||||
<p key={name}>
|
</Link>
|
||||||
{kind}
|
|
||||||
{" "}
|
|
||||||
<Link to={ownerDetailsUrl}>{name}</Link>
|
|
||||||
</p>
|
</p>
|
||||||
);
|
))
|
||||||
})
|
|
||||||
}
|
}
|
||||||
</DrawerItem>
|
</DrawerItem>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -164,6 +164,7 @@ class NonInjectedSelect<
|
|||||||
value = null,
|
value = null,
|
||||||
options,
|
options,
|
||||||
isMulti,
|
isMulti,
|
||||||
|
id: inputId,
|
||||||
onChange,
|
onChange,
|
||||||
...props
|
...props
|
||||||
} = this.props;
|
} = this.props;
|
||||||
@ -192,6 +193,7 @@ class NonInjectedSelect<
|
|||||||
}),
|
}),
|
||||||
...styles,
|
...styles,
|
||||||
}}
|
}}
|
||||||
|
inputId={inputId}
|
||||||
filterOption={defaultFilter} // This is done because the default filter crashes on symbols
|
filterOption={defaultFilter} // This is done because the default filter crashes on symbols
|
||||||
isMulti={isMulti}
|
isMulti={isMulti}
|
||||||
options={convertedOptions}
|
options={convertedOptions}
|
||||||
|
|||||||
@ -9,11 +9,12 @@ import React from "react";
|
|||||||
import { cssNames } from "../../utils";
|
import { cssNames } from "../../utils";
|
||||||
import { withTooltip } from "../tooltip";
|
import { withTooltip } from "../tooltip";
|
||||||
|
|
||||||
export interface StatusBrickProps extends React.HTMLAttributes<any> {
|
export interface StatusBrickProps extends React.HTMLAttributes<HTMLDivElement> {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const StatusBrick = withTooltip(({ className, ...elemProps }: StatusBrickProps) => (
|
export const StatusBrick = withTooltip(({ className, ...elemProps }: StatusBrickProps) => (
|
||||||
<div
|
<div
|
||||||
className={cssNames("StatusBrick", className)}
|
className={cssNames("StatusBrick", className)}
|
||||||
{...elemProps} />
|
{...elemProps}
|
||||||
|
/>
|
||||||
));
|
));
|
||||||
|
|||||||
@ -2,23 +2,48 @@
|
|||||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
* 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 type { SetRequired } from "type-fest";
|
import type { Mutable, SetRequired } from "type-fest";
|
||||||
|
import catalogCategoryRegistryInjectable from "../../../common/catalog/category-registry.injectable";
|
||||||
|
import fileSystemProvisionerStoreInjectable from "../../../extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable";
|
||||||
|
import { lensExtensionDependencies } from "../../../extensions/lens-extension";
|
||||||
import { LensRendererExtension } from "../../../extensions/lens-renderer-extension";
|
import { LensRendererExtension } from "../../../extensions/lens-renderer-extension";
|
||||||
|
import catalogEntityRegistryInjectable from "../../api/catalog/entity/registry.injectable";
|
||||||
|
import getExtensionPageParametersInjectable from "../../routes/get-extension-page-parameters.injectable";
|
||||||
|
import navigateToRouteInjectable from "../../routes/navigate-to-route.injectable";
|
||||||
|
import routesInjectable from "../../routes/routes.injectable";
|
||||||
|
import type { ApplicationBuilder } from "./get-application-builder";
|
||||||
|
|
||||||
export class TestExtension extends LensRendererExtension {}
|
export class TestExtension extends LensRendererExtension {}
|
||||||
|
|
||||||
export const getRendererExtensionFake = ({ id, ...rest }: SetRequired<Partial<LensRendererExtension>, "id">) => {
|
export type FakeExtensionData = SetRequired<Partial<LensRendererExtension>, "id" | "name">;
|
||||||
|
|
||||||
|
export const getRendererExtensionFakeFor = (builder: ApplicationBuilder) => (
|
||||||
|
function getRendererExtensionFake({ id, name, ...rest }: FakeExtensionData) {
|
||||||
const instance = new TestExtension({
|
const instance = new TestExtension({
|
||||||
id,
|
id,
|
||||||
absolutePath: "irrelevant",
|
absolutePath: "irrelevant",
|
||||||
isBundled: false,
|
isBundled: false,
|
||||||
isCompatible: false,
|
isCompatible: false,
|
||||||
isEnabled: false,
|
isEnabled: false,
|
||||||
manifest: { name: id, version: "some-version" },
|
manifest: {
|
||||||
|
name,
|
||||||
|
version: "1.0.0",
|
||||||
|
},
|
||||||
manifestPath: "irrelevant",
|
manifestPath: "irrelevant",
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.assign(instance, rest);
|
Object.assign(instance, rest);
|
||||||
|
|
||||||
return instance;
|
(instance as Mutable<LensRendererExtension>)[lensExtensionDependencies] = {
|
||||||
|
categoryRegistry: builder.dis.rendererDi.inject(catalogCategoryRegistryInjectable),
|
||||||
|
entityRegistry: builder.dis.rendererDi.inject(catalogEntityRegistryInjectable),
|
||||||
|
fileSystemProvisionerStore: builder.dis.rendererDi.inject(fileSystemProvisionerStoreInjectable),
|
||||||
|
getExtensionPageParameters: builder.dis.rendererDi.inject(getExtensionPageParametersInjectable),
|
||||||
|
navigateToRoute: builder.dis.rendererDi.inject(navigateToRouteInjectable),
|
||||||
|
routes: builder.dis.rendererDi.inject(routesInjectable),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
import type { ReactNode } from "react";
|
import type { ReactNode } from "react";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import hoistNonReactStatics from "hoist-non-react-statics";
|
|
||||||
import type { TooltipProps } from "./tooltip";
|
import type { TooltipProps } from "./tooltip";
|
||||||
import { Tooltip } from "./tooltip";
|
import { Tooltip } from "./tooltip";
|
||||||
import { isReactNode } from "../../utils/isReactNode";
|
import { isReactNode } from "../../utils/isReactNode";
|
||||||
@ -21,11 +20,15 @@ export interface TooltipDecoratorProps {
|
|||||||
* useful for displaying tooltips even when the target is "disabled"
|
* useful for displaying tooltips even when the target is "disabled"
|
||||||
*/
|
*/
|
||||||
tooltipOverrideDisabled?: boolean;
|
tooltipOverrideDisabled?: boolean;
|
||||||
id?: string | undefined;
|
id?: string;
|
||||||
children?: SingleOrMany<React.ReactNode>;
|
children?: SingleOrMany<React.ReactNode>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function withTooltip<TargetProps extends Pick<TooltipDecoratorProps, "id" | "children">>(Target: React.FunctionComponent<TargetProps>): React.FunctionComponent<TargetProps & TooltipDecoratorProps> {
|
export function withTooltip<TargetProps>(
|
||||||
|
Target: TargetProps extends Pick<TooltipDecoratorProps, "id" | "children">
|
||||||
|
? React.FunctionComponent<TargetProps>
|
||||||
|
: never,
|
||||||
|
): React.FunctionComponent<TargetProps & TooltipDecoratorProps> {
|
||||||
const DecoratedComponent = (props: TargetProps & TooltipDecoratorProps) => {
|
const DecoratedComponent = (props: TargetProps & TooltipDecoratorProps) => {
|
||||||
// TODO: Remove side-effect to allow deterministic unit testing
|
// TODO: Remove side-effect to allow deterministic unit testing
|
||||||
const [defaultTooltipId] = useState(uniqueId("tooltip_target_"));
|
const [defaultTooltipId] = useState(uniqueId("tooltip_target_"));
|
||||||
@ -62,7 +65,7 @@ export function withTooltip<TargetProps extends Pick<TooltipDecoratorProps, "id"
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Target id={targetId} {...targetProps as TargetProps}>
|
<Target id={targetId} {...targetProps as any}>
|
||||||
{targetChildren}
|
{targetChildren}
|
||||||
</Target>
|
</Target>
|
||||||
);
|
);
|
||||||
@ -70,5 +73,5 @@ export function withTooltip<TargetProps extends Pick<TooltipDecoratorProps, "id"
|
|||||||
|
|
||||||
DecoratedComponent.displayName = `withTooltip(${Target.displayName || Target.name})`;
|
DecoratedComponent.displayName = `withTooltip(${Target.displayName || Target.name})`;
|
||||||
|
|
||||||
return hoistNonReactStatics(DecoratedComponent, Target);
|
return DecoratedComponent;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,8 +27,8 @@ export function cssNames(...classNames: IClassName[]): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return iter.pipeline(classNamesEnabled)
|
return iter.pipeline(classNamesEnabled.entries())
|
||||||
.filter(([, isActive]) => !!isActive)
|
.filter(([, isActive]) => !!isActive)
|
||||||
.map(([className]) => className.trim())
|
.filterMap(([className]) => className.trim())
|
||||||
.join(" ");
|
.join(" ");
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user