Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Helm repositories and pod logs integration tests #2015

Merged
merged 2 commits into from Jan 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
42 changes: 32 additions & 10 deletions integration/__tests__/app.tests.ts
Expand Up @@ -6,10 +6,10 @@
*/
import { Application } from "spectron";
import * as utils from "../helpers/utils";
import { spawnSync, exec } from "child_process";
import * as util from "util";
import { spawnSync } from "child_process";
import { listHelmRepositories } from "../helpers/utils";
import { fail } from "assert";

export const promiseExec = util.promisify(exec);

jest.setTimeout(60000);

Expand Down Expand Up @@ -96,8 +96,11 @@ describe("Lens integration tests", () => {
});

it("ensures helm repos", async () => {
const { stdout: reposJson } = await promiseExec("helm repo list -o json");
const repos = JSON.parse(reposJson);
const repos = await listHelmRepositories();

if (!repos[0]) {
fail("Lens failed to add Bitnami repository");
}
Nokel81 marked this conversation as resolved.
Show resolved Hide resolved

await app.client.waitUntilTextExists("div.repos #message-bitnami", repos[0].name); // wait for the helm-cli to fetch the repo(s)
await app.client.click("#HelmRepoSelect"); // click the repo select to activate the drop-down
Expand Down Expand Up @@ -505,19 +508,35 @@ describe("Lens integration tests", () => {
await app.client.click(".sidebar-nav [data-test-id='workloads'] span.link-text");
await app.client.waitUntilTextExists('a[href^="/pods"]', "Pods");
await app.client.click('a[href^="/pods"]');
await app.client.click(".NamespaceSelect");
await app.client.keys("kube-system");
await app.client.keys("Enter");// "\uE007"
await app.client.waitUntilTextExists("div.TableCell", "kube-apiserver");
let podMenuItemEnabled = false;

// Wait until extensions are enabled on renderer
while (!podMenuItemEnabled) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fine for this PR but I think we need to have a better fix for this in future. Buttons should appear when an extension gets loaded.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree

const logs = await app.client.getRenderProcessLogs();

podMenuItemEnabled = !!logs.find(entry => entry.message.includes("[EXTENSION]: enabled lens-pod-menu@"));

if (!podMenuItemEnabled) {
await new Promise(r => setTimeout(r, 1000));
}
}
await new Promise(r => setTimeout(r, 500)); // Give some extra time to prepare extensions
// Open logs tab in dock
await app.client.click(".list .TableRow:first-child");
await app.client.waitForVisible(".Drawer");
await app.client.click(".drawer-title .Menu li:nth-child(2)");
// Check if controls are available
await app.client.waitForVisible(".Logs .VirtualList");
await app.client.waitForVisible(".LogList .VirtualList");
await app.client.waitForVisible(".LogResourceSelector");
await app.client.waitForVisible(".LogResourceSelector .SearchInput");
await app.client.waitForVisible(".LogResourceSelector .SearchInput input");
//await app.client.waitForVisible(".LogSearch .SearchInput");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A line to remove probably.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh yes...forgot to remove that line after testing that it's redundant.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe remove it next time (trying not to dismiss an approvements).

await app.client.waitForVisible(".LogSearch .SearchInput input");
// Search for semicolon
await app.client.keys(":");
await app.client.waitForVisible(".Logs .list span.active");
await app.client.waitForVisible(".LogList .list span.active");
// Click through controls
await app.client.click(".LogControls .show-timestamps");
await app.client.click(".LogControls .show-previous");
Expand Down Expand Up @@ -556,7 +575,10 @@ describe("Lens integration tests", () => {
await app.client.click(".sidebar-nav [data-test-id='workloads'] span.link-text");
await app.client.waitUntilTextExists('a[href^="/pods"]', "Pods");
await app.client.click('a[href^="/pods"]');
await app.client.waitUntilTextExists("div.TableCell", "kube-apiserver");

await app.client.click(".NamespaceSelect");
await app.client.keys(TEST_NAMESPACE);
await app.client.keys("Enter");// "\uE007"
await app.client.click(".Icon.new-dock-tab");
await app.client.waitUntilTextExists("li.MenuItem.create-resource-tab", "Create resource");
await app.client.click("li.MenuItem.create-resource-tab");
Expand Down
23 changes: 23 additions & 0 deletions integration/helpers/utils.ts
@@ -1,4 +1,6 @@
import { Application } from "spectron";
import * as util from "util";
import { exec } from "child_process";

const AppPaths: Partial<Record<NodeJS.Platform, string>> = {
"win32": "./dist/win-unpacked/Lens.exe",
Expand Down Expand Up @@ -26,7 +28,12 @@ export function setup(): Application {
});
}

type HelmRepository = {
name: string;
url: string;
};
type AsyncPidGetter = () => Promise<number>;
export const promiseExec = util.promisify(exec);

export async function tearDown(app: Application) {
const pid = await (app.mainProcess.pid as any as AsyncPidGetter)();
Expand All @@ -39,3 +46,19 @@ export async function tearDown(app: Application) {
console.error(e);
}
}

export async function listHelmRepositories(retries = 0): Promise<HelmRepository[]>{
if (retries < 5) {
try {
const { stdout: reposJson } = await promiseExec("helm repo list -o json");

return JSON.parse(reposJson);
} catch {
await new Promise(r => setTimeout(r, 2000)); // if no repositories, wait for Lens adding bitnami repository

return await listHelmRepositories((retries + 1));
}
}

return [];
}