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

Make HTML element discovery require less parameters

Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com>

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-10-19 15:28:39 +03:00
parent edb12fed06
commit 5503b938b7
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
13 changed files with 304 additions and 197 deletions

View File

@ -7,7 +7,8 @@ import type { IObservableValue } from "mobx";
import { runInAction, computed, observable } from "mobx"; import { runInAction, computed, observable } from "mobx";
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 { getSingleElement, queryAllElements, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
import React from "react"; import React from "react";
describe("preferences: extension adding preference tabs", () => { describe("preferences: extension adding preference tabs", () => {
@ -20,10 +21,13 @@ describe("preferences: extension adding preference tabs", () => {
describe("given in preferences, when extension with preference tabs is enabled", () => { describe("given in preferences, when extension with preference tabs is enabled", () => {
let rendered: RenderResult; let rendered: RenderResult;
let someObservable: IObservableValue<boolean>; let someObservable: IObservableValue<boolean>;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
rendered = await builder.render(); rendered = await builder.render();
discover = discoverFor(() => rendered);
builder.preferences.navigate(); builder.preferences.navigate();
someObservable = observable.box(false); someObservable = observable.box(false);
@ -95,11 +99,11 @@ describe("preferences: extension adding preference tabs", () => {
}); });
it("shows tabs in order", () => { it("shows tabs in order", () => {
const actual = queryAllElements("preference-tab-link")( const actual = discover
rendered, .queryAllElements("preference-tab-link")
).attributeValues.filter((value) => .attributeValues.filter((value) =>
value?.startsWith("extension-some-extension"), value?.startsWith("extension-some-extension"),
); );
expect(actual).toEqual([ expect(actual).toEqual([
"extension-some-extension-some-other-preference-tab-id", "extension-some-extension-some-other-preference-tab-id",
@ -108,12 +112,12 @@ describe("preferences: extension adding preference tabs", () => {
}); });
it("does not show hidden tab", () => { it("does not show hidden tab", () => {
const actual = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-tab-link", "preference-tab-link",
"extension-some-extension-some-preference-tab-id-with-controlled-visibility", "extension-some-extension-some-preference-tab-id-with-controlled-visibility",
)(rendered); );
expect(actual).toBeNull(); expect(discovered).toBeNull();
}); });
it("when item becomes visible, shows the tab", () => { it("when item becomes visible, shows the tab", () => {
@ -121,12 +125,12 @@ describe("preferences: extension adding preference tabs", () => {
someObservable.set(true); someObservable.set(true);
}); });
const actual = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-tab-link", "preference-tab-link",
"extension-some-extension-some-preference-tab-id-with-controlled-visibility", "extension-some-extension-some-preference-tab-id-with-controlled-visibility",
)(rendered); );
expect(actual).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
}); });

View File

@ -10,18 +10,22 @@ import { runInAction } from "mobx";
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 { preferenceItemInjectionToken } from "./renderer/preference-items/preference-item-injection-token"; import { preferenceItemInjectionToken } from "./renderer/preference-items/preference-item-injection-token";
import { getSingleElement, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
describe("preferences - hiding-of-empty-branches, given in preferences page", () => { describe("preferences - hiding-of-empty-branches, given in preferences page", () => {
let builder: ApplicationBuilder; let builder: ApplicationBuilder;
let rendered: RenderResult; let rendered: RenderResult;
let windowDi: DiContainer; let windowDi: DiContainer;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
builder = getApplicationBuilder(); builder = getApplicationBuilder();
rendered = await builder.render(); rendered = await builder.render();
discover = discoverFor(() => rendered);
builder.preferences.navigate(); builder.preferences.navigate();
windowDi = builder.applicationWindow.only.di; windowDi = builder.applicationWindow.only.di;
@ -87,25 +91,24 @@ describe("preferences - hiding-of-empty-branches, given in preferences page", ()
}); });
it("does not render the empty tab group", () => { it("does not render the empty tab group", () => {
const someTabGroup = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-tab-group", "preference-tab-group",
"some-tab-group", "some-tab-group",
)(rendered); );
expect(someTabGroup).toBeNull(); expect(discovered).toBeNull();
}); });
it("does not render the empty tabs", () => { it("does not render the empty tabs", () => {
const someTab = querySingleElement( const { discovered: someTab } = discover.querySingleElement(
"preference-tab-link", "preference-tab-link",
"some-path-id-for-some-tab-id", "some-path-id-for-some-tab-id",
)(rendered); );
const someOtherTab = querySingleElement( const { discovered: someOtherTab } = discover.querySingleElement(
"preference-tab-link", "preference-tab-link",
"some-path-id-for-some-other-tab-id", "some-path-id-for-some-other-tab-id",
)(rendered); );
expect([someTab, someOtherTab]).toEqual([null, null]); expect([someTab, someOtherTab]).toEqual([null, null]);
}); });
@ -137,30 +140,30 @@ describe("preferences - hiding-of-empty-branches, given in preferences page", ()
}); });
it("renders the tab group that is no longer empty", () => { it("renders the tab group that is no longer empty", () => {
const someTabGroup = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-tab-group", "preference-tab-group",
"some-tab-group", "some-tab-group",
)(rendered); );
expect(someTabGroup).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
it("renders the tab that is no longer empty", () => { it("renders the tab that is no longer empty", () => {
const someTab = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-tab-link", "preference-tab-link",
"some-path-id-for-some-tab-id", "some-path-id-for-some-tab-id",
)(rendered); );
expect(someTab).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
it("does not render the tab that is still empty", () => { it("does not render the tab that is still empty", () => {
const someTab = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-tab-link", "preference-tab-link",
"some-path-id-for-some-other-tab-id", "some-path-id-for-some-other-tab-id",
)(rendered); );
expect(someTab).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when an item appears for the remaining tab", () => { describe("when an item appears for the remaining tab", () => {
@ -190,30 +193,30 @@ describe("preferences - hiding-of-empty-branches, given in preferences page", ()
}); });
it("still renders the tab group that is not empty", () => { it("still renders the tab group that is not empty", () => {
const someTabGroup = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-tab-group", "preference-tab-group",
"some-tab-group", "some-tab-group",
)(rendered); );
expect(someTabGroup).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
it("still renders the tab that is not empty", () => { it("still renders the tab that is not empty", () => {
const someTab = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-tab-link", "preference-tab-link",
"some-path-id-for-some-tab-id", "some-path-id-for-some-tab-id",
)(rendered); );
expect(someTab).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
it("now renders the other tab that is no longer empty", () => { it("now renders the other tab that is no longer empty", () => {
const someTab = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-tab-link", "preference-tab-link",
"some-path-id-for-some-other-tab-id", "some-path-id-for-some-other-tab-id",
)(rendered); );
expect(someTab).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
}); });

View File

@ -6,7 +6,8 @@ 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 navigateToProxyPreferencesInjectable from "./common/navigate-to-proxy-preferences.injectable"; import navigateToProxyPreferencesInjectable from "./common/navigate-to-proxy-preferences.injectable";
import { getSingleElement, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
describe("preferences - navigation to application preferences", () => { describe("preferences - navigation to application preferences", () => {
let builder: ApplicationBuilder; let builder: ApplicationBuilder;
@ -17,6 +18,7 @@ describe("preferences - navigation to application preferences", () => {
describe("given in some child page of preferences, when rendered", () => { describe("given in some child page of preferences, when rendered", () => {
let rendered: RenderResult; let rendered: RenderResult;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
builder.beforeWindowStart((windowDi) => { builder.beforeWindowStart((windowDi) => {
@ -26,6 +28,8 @@ describe("preferences - navigation to application preferences", () => {
}); });
rendered = await builder.render(); rendered = await builder.render();
discover = discoverFor(() => rendered);
}); });
it("renders", () => { it("renders", () => {
@ -33,12 +37,12 @@ describe("preferences - navigation to application preferences", () => {
}); });
it("does not show application preferences yet", () => { it("does not show application preferences yet", () => {
const page = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-page", "preference-page",
"application-page", "application-page",
)(rendered); );
expect(page).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when navigating to application preferences using navigation", () => { describe("when navigating to application preferences using navigation", () => {
@ -51,12 +55,12 @@ describe("preferences - navigation to application preferences", () => {
}); });
it("shows application preferences", () => { it("shows application preferences", () => {
const page = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"application-page", "application-page",
)(rendered); );
expect(page).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
@ -70,12 +74,12 @@ describe("preferences - navigation to application preferences", () => {
}); });
it("shows tab for application preferences for it being the default", () => { it("shows tab for application preferences for it being the default", () => {
const page = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"application-page", "application-page",
)(rendered); );
expect(page).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
}); });

View File

@ -5,10 +5,12 @@
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 { getSingleElement, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
describe("preferences - navigation to editor preferences", () => { describe("preferences - navigation to editor preferences", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
let discover: Discover;
beforeEach(() => { beforeEach(() => {
applicationBuilder = getApplicationBuilder(); applicationBuilder = getApplicationBuilder();
@ -23,18 +25,20 @@ describe("preferences - navigation to editor preferences", () => {
}); });
rendered = await applicationBuilder.render(); rendered = await applicationBuilder.render();
discover = discoverFor(() => rendered);
}); });
it("renders", () => { it("renders", () => {
expect(rendered.container).toMatchSnapshot(); expect(rendered.container).toMatchSnapshot();
}); });
it("does not show editor preferences yet", () => { it("does not show editor preferences yet", () => {
const page = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-page", "preference-page",
"editor-page", "editor-page",
)(rendered); );
expect(page).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when navigating to editor preferences using navigation", () => { describe("when navigating to editor preferences using navigation", () => {
@ -47,10 +51,10 @@ describe("preferences - navigation to editor preferences", () => {
}); });
it("shows editor preferences", () => { it("shows editor preferences", () => {
const page = getSingleElement( const page = discover.getSingleElement(
"preference-page", "preference-page",
"editor-page", "editor-page",
)(rendered); );
expect(page).not.toBeNull(); expect(page).not.toBeNull();
}); });

View File

@ -8,7 +8,8 @@ import { getApplicationBuilder } from "../../renderer/components/test-utils/get-
import React from "react"; import React from "react";
import "@testing-library/jest-dom/extend-expect"; import "@testing-library/jest-dom/extend-expect";
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake"; import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
import { getSingleElement, queryAllElements, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
import logErrorInjectable from "../../common/log-error.injectable"; import logErrorInjectable from "../../common/log-error.injectable";
describe("preferences - navigation to extension specific preferences", () => { describe("preferences - navigation to extension specific preferences", () => {
@ -21,6 +22,7 @@ describe("preferences - navigation to extension specific preferences", () => {
describe("given in preferences, when rendered", () => { describe("given in preferences, when rendered", () => {
let rendered: RenderResult; let rendered: RenderResult;
let logErrorMock: jest.Mock; let logErrorMock: jest.Mock;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
logErrorMock = jest.fn(); logErrorMock = jest.fn();
@ -32,6 +34,8 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
rendered = await builder.render(); rendered = await builder.render();
discover = discoverFor(() => rendered);
}); });
it("renders", () => { it("renders", () => {
@ -40,9 +44,12 @@ describe("preferences - navigation to extension specific preferences", () => {
it("does not show extension preferences yet", () => { it("does not show extension preferences yet", () => {
// Todo: check if query is correct. // Todo: check if query is correct.
const page = querySingleElement("preference-page", "extension")(rendered); const { discovered } = discover.querySingleElement(
"preference-page",
"extension",
);
expect(page).toBeNull(); expect(discovered).toBeNull();
}); });
it("does not show link for extension preferences", () => { it("does not show link for extension preferences", () => {
@ -68,21 +75,21 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
it("doesn't show preferences from unrelated extension", () => { it("doesn't show preferences from unrelated extension", () => {
const actual = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-page", "preference-page",
"preference-item-for-extension-some-other-test-extension-id-page", "preference-item-for-extension-some-other-test-extension-id-page",
)(rendered); );
expect(actual).toBeNull(); expect(discovered).toBeNull();
}); });
it("shows preferences from related extension", () => { it("shows preferences from related extension", () => {
const actual = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"preference-item-for-extension-some-test-extension-id-page", "preference-item-for-extension-some-test-extension-id-page",
)(rendered); );
expect(actual).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
@ -118,12 +125,12 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
it("link should not be active", () => { it("link should not be active", () => {
const actual = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-tab-link", "preference-tab-link",
"some-test-extension-id", "some-test-extension-id",
)(rendered); );
expect(actual).not.toHaveClass("active"); expect(discovered).not.toHaveClass("active");
}); });
describe("when navigating to extension preferences using navigation", () => { describe("when navigating to extension preferences using navigation", () => {
@ -136,25 +143,27 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
it("shows proper page title", () => { it("shows proper page title", () => {
const title = getSingleElement("preference-page-title")(rendered); const { discovered } = discover.getSingleElement("preference-page-title");
expect(title).toHaveTextContent("some-test-extension-id preferences"); expect(discovered).toHaveTextContent("some-test-extension-id preferences");
}); });
it("shows only extension specific preference items", () => { it("shows only extension specific preference items", () => {
const actual = queryAllElements( const { attributeValues } =
"preference-item", discover.queryAllElements("preference-item");
)(rendered).attributeValues;
expect(actual).toEqual([ expect(attributeValues).toEqual([
"preference-item-for-extension-some-test-extension-id-item-some-preference-item-id", "preference-item-for-extension-some-test-extension-id-item-some-preference-item-id",
]); ]);
}); });
it("link is active", () => { it("link is active", () => {
const actual = getSingleElement("preference-tab-link", "some-test-extension-id")(rendered); const { discovered } = discover.getSingleElement(
"preference-tab-link",
"some-test-extension-id",
);
expect(actual).toHaveClass("active"); expect(discovered).toHaveClass("active");
}); });
describe("when extension is disabled", () => { describe("when extension is disabled", () => {
@ -167,20 +176,20 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
it("does not show any preference page", () => { it("does not show any preference page", () => {
const actual = querySingleElement("preference-page")(rendered); const { discovered } = discover.querySingleElement("preference-page");
expect(actual).toBeNull(); expect(discovered).toBeNull();
}); });
it("when extension is enabled again, shows the preference page", () => { it("when extension is enabled again, shows the preference page", () => {
builder.extensions.enable(extensionStubWithExtensionSpecificPreferenceItems); builder.extensions.enable(extensionStubWithExtensionSpecificPreferenceItems);
const actual = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"preference-item-for-extension-some-test-extension-id-page", "preference-item-for-extension-some-test-extension-id-page",
)(rendered); );
expect(actual).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
}); });
@ -204,26 +213,23 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
it("shows extension tab in general area", () => { it("shows extension tab in general area", () => {
const generalTabGroup = getSingleElement( const { discovered } = discover
"preference-tab-group", .getSingleElement("preference-tab-group", "general-tab-group")
"general-tab-group", .getSingleElement(
)(rendered); "preference-tab-link",
"extension-registered-tab-page-id-metrics-extension-tab",
);
const actual = getSingleElement( expect(discovered).not.toBeNull();
"preference-tab-link",
"extension-registered-tab-page-id-metrics-extension-tab",
)(generalTabGroup);
expect(actual).not.toBeNull();
}); });
it("does not show tab group for extensions for there being no content", () => { it("does not show tab group for extensions for there being no content", () => {
const actual = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-tab-group", "preference-tab-group",
"extensions-tab-group", "extensions-tab-group",
)(rendered); );
expect(actual).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when navigating to specific extension tab", () => { describe("when navigating to specific extension tab", () => {
@ -248,9 +254,11 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
it("shows correct page title", () => { it("shows correct page title", () => {
const pageTitle = getSingleElement("preference-page-title")(rendered); const { discovered } = discover.getSingleElement(
"preference-page-title",
);
expect(pageTitle).toHaveTextContent("Metrics tab"); expect(discovered).toHaveTextContent("Metrics tab");
}); });
}); });
}); });
@ -264,21 +272,21 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
it("shows tab from the first extension", () => { it("shows tab from the first extension", () => {
const actual = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-tab-link", "preference-tab-link",
"extension-registered-tab-page-id-metrics-extension-tab", "extension-registered-tab-page-id-metrics-extension-tab",
)(rendered); );
expect(actual).toBeInTheDocument(); expect(discovered).toBeInTheDocument();
}); });
it("shows tab from the second extension", () => { it("shows tab from the second extension", () => {
const actual = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-tab-link", "preference-tab-link",
"extension-duplicated-tab-page-id-metrics-extension-tab", "extension-duplicated-tab-page-id-metrics-extension-tab",
)(rendered); );
expect(actual).toBeInTheDocument(); expect(discovered).toBeInTheDocument();
}); });
describe("when navigating to first extension tab", () => { describe("when navigating to first extension tab", () => {
@ -293,10 +301,9 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
it("shows related preferences for this tab", () => { it("shows related preferences for this tab", () => {
const actual = const { attributeValues } = discover.queryAllElements("preference-item");
queryAllElements("preference-item")(rendered).attributeValues;
expect(actual).toEqual([ expect(attributeValues).toEqual([
"preference-item-for-extension-registered-tab-page-id-item-metrics-preference-item-id", "preference-item-for-extension-registered-tab-page-id-item-metrics-preference-item-id",
]); ]);
}); });
@ -314,10 +321,10 @@ describe("preferences - navigation to extension specific preferences", () => {
}); });
it("shows related preferences for this tab", () => { it("shows related preferences for this tab", () => {
const actual = const { attributeValues } =
queryAllElements("preference-item")(rendered).attributeValues; discover.queryAllElements("preference-item");
expect(actual).toEqual([ expect(attributeValues).toEqual([
"preference-item-for-extension-duplicated-tab-page-id-item-another-metrics-preference-item-id", "preference-item-for-extension-duplicated-tab-page-id-item-another-metrics-preference-item-id",
]); ]);
}); });

View File

@ -7,7 +7,8 @@ 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 callForPublicHelmRepositoriesInjectable from "../helm-charts/child-features/preferences/renderer/adding-of-public-helm-repository/public-helm-repositories/call-for-public-helm-repositories.injectable"; import callForPublicHelmRepositoriesInjectable from "../helm-charts/child-features/preferences/renderer/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"; import getActiveHelmRepositoriesInjectable from "../../main/helm/repositories/get-active-helm-repositories/get-active-helm-repositories.injectable";
import { getSingleElement, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
describe("preferences - navigation to kubernetes preferences", () => { describe("preferences - navigation to kubernetes preferences", () => {
let builder: ApplicationBuilder; let builder: ApplicationBuilder;
@ -18,6 +19,7 @@ describe("preferences - navigation to kubernetes preferences", () => {
describe("given in preferences, when rendered", () => { describe("given in preferences, when rendered", () => {
let rendered: RenderResult; let rendered: RenderResult;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
builder.beforeApplicationStart((mainDi) => { builder.beforeApplicationStart((mainDi) => {
@ -36,6 +38,8 @@ describe("preferences - navigation to kubernetes preferences", () => {
}); });
rendered = await builder.render(); rendered = await builder.render();
discover = discoverFor(() => rendered);
}); });
it("renders", () => { it("renders", () => {
@ -43,12 +47,12 @@ describe("preferences - navigation to kubernetes preferences", () => {
}); });
it("does not show kubernetes preferences yet", () => { it("does not show kubernetes preferences yet", () => {
const page = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-page", "preference-page",
"kubernetes-page", "kubernetes-page",
)(rendered); );
expect(page).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when navigating to kubernetes preferences using navigation", () => { describe("when navigating to kubernetes preferences using navigation", () => {
@ -61,12 +65,12 @@ describe("preferences - navigation to kubernetes preferences", () => {
}); });
it("shows kubernetes preferences", () => { it("shows kubernetes preferences", () => {
const page = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"kubernetes-page", "kubernetes-page",
)(rendered); );
expect(page).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
}); });

View File

@ -5,7 +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 { getSingleElement, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
describe("preferences - navigation to proxy preferences", () => { describe("preferences - navigation to proxy preferences", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
@ -16,6 +17,7 @@ describe("preferences - navigation to proxy preferences", () => {
describe("given in preferences, when rendered", () => { describe("given in preferences, when rendered", () => {
let rendered: RenderResult; let rendered: RenderResult;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
applicationBuilder.beforeWindowStart(() => { applicationBuilder.beforeWindowStart(() => {
@ -23,6 +25,7 @@ describe("preferences - navigation to proxy preferences", () => {
}); });
rendered = await applicationBuilder.render(); rendered = await applicationBuilder.render();
discover = discoverFor(() => rendered);
}); });
it("renders", () => { it("renders", () => {
@ -30,12 +33,12 @@ describe("preferences - navigation to proxy preferences", () => {
}); });
it("does not show proxy preferences yet", () => { it("does not show proxy preferences yet", () => {
const page = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-page", "preference-page",
"proxy-page", "proxy-page",
)(rendered); );
expect(page).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when navigating to proxy preferences using navigation", () => { describe("when navigating to proxy preferences using navigation", () => {
@ -48,12 +51,12 @@ describe("preferences - navigation to proxy preferences", () => {
}); });
it("shows proxy preferences", () => { it("shows proxy preferences", () => {
const page = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"proxy-page", "proxy-page",
)(rendered); );
expect(page).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
}); });

View File

@ -9,7 +9,8 @@ import { getApplicationBuilder } from "../../renderer/components/test-utils/get-
import navigateToTelemetryPreferencesInjectable from "./common/navigate-to-telemetry-preferences.injectable"; import navigateToTelemetryPreferencesInjectable from "./common/navigate-to-telemetry-preferences.injectable";
import sentryDataSourceNameInjectable from "../../common/vars/sentry-dsn-url.injectable"; import sentryDataSourceNameInjectable from "../../common/vars/sentry-dsn-url.injectable";
import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake"; import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake";
import { getSingleElement, queryAllElements, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
describe("preferences - navigation to telemetry preferences", () => { describe("preferences - navigation to telemetry preferences", () => {
let builder: ApplicationBuilder; let builder: ApplicationBuilder;
@ -20,6 +21,7 @@ describe("preferences - navigation to telemetry preferences", () => {
describe("given in preferences, when rendered", () => { describe("given in preferences, when rendered", () => {
let rendered: RenderResult; let rendered: RenderResult;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
builder.beforeWindowStart(() => { builder.beforeWindowStart(() => {
@ -27,6 +29,8 @@ describe("preferences - navigation to telemetry preferences", () => {
}); });
rendered = await builder.render(); rendered = await builder.render();
discover = discoverFor(() => rendered);
}); });
it("renders", () => { it("renders", () => {
@ -34,21 +38,21 @@ describe("preferences - navigation to telemetry preferences", () => {
}); });
it("does not show telemetry preferences yet", () => { it("does not show telemetry preferences yet", () => {
const page = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-page", "preference-page",
"telemetry-page", "telemetry-page",
)(rendered); );
expect(page).toBeNull(); expect(discovered).toBeNull();
}); });
it("does not show link for telemetry preferences", () => { it("does not show link for telemetry preferences", () => {
const actual = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-tab-link", "preference-tab-link",
"telemetry", "telemetry",
)(rendered); );
expect(actual).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when extension with telemetry preference items gets enabled", () => { describe("when extension with telemetry preference items gets enabled", () => {
@ -63,12 +67,12 @@ describe("preferences - navigation to telemetry preferences", () => {
}); });
it("shows link for telemetry preferences", () => { it("shows link for telemetry preferences", () => {
const actual = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-tab-link", "preference-tab-link",
"telemetry", "telemetry",
)(rendered); );
expect(actual).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
describe("when clicking link to telemetry preferences from navigation", () => { describe("when clicking link to telemetry preferences from navigation", () => {
@ -81,19 +85,19 @@ describe("preferences - navigation to telemetry preferences", () => {
}); });
it("shows telemetry preferences", () => { it("shows telemetry preferences", () => {
const page = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"telemetry-page", "telemetry-page",
)(rendered); );
expect(page).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
it("shows extension telemetry preference items", () => { it("shows extension telemetry preference items", () => {
const actual = const { attributeValues } =
queryAllElements("preference-item")(rendered).attributeValues; discover.queryAllElements("preference-item");
expect(actual).toEqual([ expect(attributeValues).toEqual([
"preference-item-for-extension-some-test-extension-name-item-some-telemetry-preference-item-id", "preference-item-for-extension-some-test-extension-name-item-some-telemetry-preference-item-id",
]); ]);
}); });
@ -117,17 +121,18 @@ describe("preferences - navigation to telemetry preferences", () => {
}, },
}); });
const actual = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-tab-link", "preference-tab-link",
"telemetry", "telemetry",
)(rendered); );
expect(actual).toBeNull(); expect(discovered).toBeNull();
}); });
}); });
describe("given URL for Sentry DNS, when navigating to preferences", () => { describe("given URL for Sentry DNS, when navigating to preferences", () => {
let rendered: RenderResult; let rendered: RenderResult;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
builder.beforeWindowStart((windowDi) => { builder.beforeWindowStart((windowDi) => {
@ -136,6 +141,8 @@ describe("preferences - navigation to telemetry preferences", () => {
rendered = await builder.render(); rendered = await builder.render();
discover = discoverFor(() => rendered);
builder.preferences.navigate(); builder.preferences.navigate();
}); });
@ -149,17 +156,18 @@ describe("preferences - navigation to telemetry preferences", () => {
}); });
it("allows configuration of automatic error reporting", () => { it("allows configuration of automatic error reporting", () => {
const actual = queryAllElements( const { attributeValues } = discover.queryAllElements(
"preference-item", "preference-item",
)(rendered).attributeValues; );
expect(actual).toEqual(["automatic-error-reporting"]); expect(attributeValues).toEqual(["automatic-error-reporting"]);
}); });
}); });
}); });
describe("given no URL for Sentry DNS, when navigating to telemetry preferences", () => { describe("given no URL for Sentry DNS, when navigating to telemetry preferences", () => {
let rendered: RenderResult; let rendered: RenderResult;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
builder.beforeWindowStart((windowDi) => { builder.beforeWindowStart((windowDi) => {
@ -168,6 +176,8 @@ describe("preferences - navigation to telemetry preferences", () => {
rendered = await builder.render(); rendered = await builder.render();
discover = discoverFor(() => rendered);
const windowDi = builder.applicationWindow.only.di; const windowDi = builder.applicationWindow.only.di;
const navigateToTelemetryPreferences = windowDi.inject(navigateToTelemetryPreferencesInjectable); const navigateToTelemetryPreferences = windowDi.inject(navigateToTelemetryPreferencesInjectable);
@ -180,11 +190,11 @@ describe("preferences - navigation to telemetry preferences", () => {
}); });
it("does not allow configuration of automatic error reporting", () => { it("does not allow configuration of automatic error reporting", () => {
const actual = queryAllElements( const { attributeValues } = discover.queryAllElements(
"preference-item", "preference-item",
)(rendered).attributeValues; );
expect(actual).toEqual([]); expect(attributeValues).toEqual([]);
}); });
}); });
}); });

View File

@ -5,7 +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 { getSingleElement, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
describe("preferences - navigation to terminal preferences", () => { describe("preferences - navigation to terminal preferences", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
@ -16,6 +17,7 @@ describe("preferences - navigation to terminal preferences", () => {
describe("given in preferences, when rendered", () => { describe("given in preferences, when rendered", () => {
let rendered: RenderResult; let rendered: RenderResult;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
applicationBuilder.beforeWindowStart(() => { applicationBuilder.beforeWindowStart(() => {
@ -23,6 +25,8 @@ describe("preferences - navigation to terminal preferences", () => {
}); });
rendered = await applicationBuilder.render(); rendered = await applicationBuilder.render();
discover = discoverFor(() => rendered);
}); });
it("renders", () => { it("renders", () => {
@ -30,12 +34,12 @@ describe("preferences - navigation to terminal preferences", () => {
}); });
it("does not show terminal preferences yet", () => { it("does not show terminal preferences yet", () => {
const page = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-page", "preference-page",
"terminal-page", "terminal-page",
)(rendered); );
expect(page).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when navigating to terminal preferences using navigation", () => { describe("when navigating to terminal preferences using navigation", () => {
@ -49,12 +53,12 @@ describe("preferences - navigation to terminal preferences", () => {
it("shows terminal preferences", () => { it("shows terminal preferences", () => {
const page = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"terminal-page", "terminal-page",
)(rendered); );
expect(page).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
}); });

View File

@ -6,16 +6,19 @@
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 { getSingleElement, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
describe("preferences - navigation using application menu", () => { describe("preferences - navigation using application menu", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
let rendered: RenderResult; let rendered: RenderResult;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
applicationBuilder = getApplicationBuilder(); applicationBuilder = getApplicationBuilder();
rendered = await applicationBuilder.render(); rendered = await applicationBuilder.render();
discover = discoverFor(() => rendered);
}); });
it("renders", () => { it("renders", () => {
@ -23,12 +26,12 @@ describe("preferences - navigation using application menu", () => {
}); });
it("does not show application preferences yet", () => { it("does not show application preferences yet", () => {
const page = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-page", "preference-page",
"application-page", "application-page",
)(rendered); );
expect(page).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when navigating to preferences using application menu", () => { describe("when navigating to preferences using application menu", () => {
@ -41,12 +44,12 @@ describe("preferences - navigation using application menu", () => {
}); });
it("shows application preferences", () => { it("shows application preferences", () => {
const page = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"application-page", "application-page",
)(rendered); );
expect(page).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
}); });

View File

@ -5,16 +5,19 @@
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 { getSingleElement, querySingleElement } from "../../renderer/components/test-utils/discovery-of-html-elements"; import type { Discover } from "../../renderer/components/test-utils/discovery-of-html-elements";
import { discoverFor } from "../../renderer/components/test-utils/discovery-of-html-elements";
describe("show-about-using-tray", () => { describe("show-about-using-tray", () => {
let applicationBuilder: ApplicationBuilder; let applicationBuilder: ApplicationBuilder;
let rendered: RenderResult; let rendered: RenderResult;
let discover: Discover;
beforeEach(async () => { beforeEach(async () => {
applicationBuilder = getApplicationBuilder(); applicationBuilder = getApplicationBuilder();
rendered = await applicationBuilder.render(); rendered = await applicationBuilder.render();
discover = discoverFor(() => rendered);
}); });
it("renders", () => { it("renders", () => {
@ -22,12 +25,12 @@ describe("show-about-using-tray", () => {
}); });
it("does not show application preferences yet", () => { it("does not show application preferences yet", () => {
const page = querySingleElement( const { discovered } = discover.querySingleElement(
"preference-page", "preference-page",
"application-page", "application-page",
)(rendered); );
expect(page).toBeNull(); expect(discovered).toBeNull();
}); });
describe("when navigating using tray", () => { describe("when navigating using tray", () => {
@ -40,12 +43,12 @@ describe("show-about-using-tray", () => {
}); });
it("shows application preferences", () => { it("shows application preferences", () => {
const page = getSingleElement( const { discovered } = discover.getSingleElement(
"preference-page", "preference-page",
"application-page", "application-page",
)(rendered); );
expect(page).not.toBeNull(); expect(discovered).not.toBeNull();
}); });
}); });
}); });

View File

@ -6,45 +6,96 @@ import type { RenderResult } from "@testing-library/react";
type DiscoverySourceTypes = RenderResult | Element; type DiscoverySourceTypes = RenderResult | Element;
export type QuerySingleElement = (
attributeName: string,
attributeValue?: string
) => { discovered: Element | null } & Discover;
export type GetSingleElement = (
attributeName: string,
attributeValue?: string
) => { discovered: Element } & Discover;
export type QueryAllElements = (attributeName: string) => {
discovered: Element[];
attributeValues: (string | null)[];
};
export interface Discover {
querySingleElement: QuerySingleElement;
queryAllElements: QueryAllElements;
getSingleElement: GetSingleElement;
}
export const discoverFor = (getSource: () => DiscoverySourceTypes): Discover => ({
querySingleElement: querySingleElement(getSource),
queryAllElements: queryAllElements(getSource),
getSingleElement: getSingleElement(getSource),
});
export const querySingleElement = export const querySingleElement =
(attributeName: string, attributeValue?: string) => (getSource: () => DiscoverySourceTypes): QuerySingleElement =>
(source: DiscoverySourceTypes) => { (attributeName, attributeValue) => {
const source = getSource();
const dataAttribute = `data-${attributeName}-test`; const dataAttribute = `data-${attributeName}-test`;
const selector = attributeValue ? `[${dataAttribute}="${attributeValue}"]` : `[${dataAttribute}]` ; const selector = attributeValue
? `[${dataAttribute}="${attributeValue}"]`
: `[${dataAttribute}]`;
return getBaseElement(source).querySelector(selector); const discovered = getBaseElement(source).querySelector(selector);
const nestedDiscover = discoverFor(() => {
if (!discovered) {
throw new Error("Tried to do nested discover using source that does not exist");
}
return discovered;
});
return {
discovered,
...nestedDiscover,
};
}; };
export const queryAllElements = export const queryAllElements =
(attributeName: string) => (source: DiscoverySourceTypes) => { (getSource: () => DiscoverySourceTypes): QueryAllElements =>
const dataAttribute = `data-${attributeName}-test`; (attributeName) => {
const source = getSource();
const results = [
...getBaseElement(source).querySelectorAll(`[${dataAttribute}]`),
];
return {
elements: results,
attributeValues: results.map((result) =>
result.getAttribute(dataAttribute),
),
};
};
export const getSingleElement =
(attributeName: string, attributeValue?: string) =>
(source: DiscoverySourceTypes) => {
const dataAttribute = `data-${attributeName}-test`; const dataAttribute = `data-${attributeName}-test`;
const element = querySingleElement(attributeName, attributeValue)(source); const results = [
...getBaseElement(source).querySelectorAll(`[${dataAttribute}]`),
];
if (!element) { return {
discovered: results,
attributeValues: results.map((result) =>
result.getAttribute(dataAttribute),
),
};
};
export const getSingleElement =
(getSource: () => DiscoverySourceTypes): GetSingleElement =>
(attributeName, attributeValue) => {
const dataAttribute = `data-${attributeName}-test`;
const { discovered, ...nestedDiscover } = querySingleElement(getSource)(
attributeName,
attributeValue,
);
if (!discovered) {
const validValues = const validValues =
queryAllElements(attributeName)(source).attributeValues; queryAllElements(getSource)(attributeName).attributeValues;
if(attributeValue) { if (attributeValue) {
throw new Error( throw new Error(
`Couldn't find HTML-element with attribute "${dataAttribute}" with value "${attributeValue}". Present values are:\n\n"${validValues.join( `Couldn't find HTML-element with attribute "${dataAttribute}" with value "${attributeValue}". Present values are:\n\n"${validValues.join(
'",\n"', '",\n"',
@ -52,10 +103,12 @@ export const getSingleElement =
); );
} }
throw new Error(`Couldn't find HTML-element with attribute "${dataAttribute}"`); throw new Error(
`Couldn't find HTML-element with attribute "${dataAttribute}"`,
);
} }
return element; return { discovered, ...nestedDiscover };
}; };
const getBaseElement = (source: DiscoverySourceTypes) => const getBaseElement = (source: DiscoverySourceTypes) =>

View File

@ -69,7 +69,7 @@ import { getCompositePaths } from "../../../common/utils/composite/get-composite
import { getCompositeNormalization } from "../../../common/utils/composite/get-composite-normalization/get-composite-normalization"; import { getCompositeNormalization } from "../../../common/utils/composite/get-composite-normalization/get-composite-normalization";
import type { ClickableMenuItem } from "../../../features/application-menu/main/menu-items/application-menu-item-injection-token"; import type { ClickableMenuItem } from "../../../features/application-menu/main/menu-items/application-menu-item-injection-token";
import type { Composite } from "../../../common/utils/composite/get-composite/get-composite"; import type { Composite } from "../../../common/utils/composite/get-composite/get-composite";
import { getSingleElement } from "./discovery-of-html-elements"; import { discoverFor } from "./discovery-of-html-elements";
type Callback = (di: DiContainer) => void | Promise<void>; type Callback = (di: DiContainer) => void | Promise<void>;
@ -447,7 +447,12 @@ export const getApplicationBuilder = () => {
click: (pathId: string) => { click: (pathId: string) => {
const { rendered } = builder.applicationWindow.only; const { rendered } = builder.applicationWindow.only;
const link = getSingleElement("preference-tab-link", pathId)(rendered); const discover = discoverFor(() => rendered);
const { discovered: link } = discover.getSingleElement(
"preference-tab-link",
pathId,
);
fireEvent.click(link); fireEvent.click(link);
}, },