UNPKG

kui-shell

Version:

This is the monorepo for Kui, the hybrid command-line/GUI electron-based Kubernetes tool

217 lines 8.48 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const assert = require("assert"); const js_yaml_1 = require("js-yaml"); const Selectors = require("./selectors"); const CLI = require("./cli"); const Common = require("./common"); const ReplExpect = require("./repl-expect"); const SidecarExpect = require("./sidecar-expect"); const sameStruct = (struct1, struct2, subset = false) => { if (struct1 === struct2) { return true; } else if (typeof struct1 !== typeof struct2) { return false; } for (const key in struct1) { if (!(key in struct2)) { console.log(`!(${key} in struct2)`); return false; } else if (typeof struct1[key] === 'function') { if (!struct1[key](struct2[key])) { return false; } } else if (typeof struct1[key] !== typeof struct2[key]) { console.log(`typeof struct1[${key}] !== typeof struct2[${key}] ${typeof struct1[key]} ${typeof struct2[key]}`); return false; } else if (typeof struct1[key] === 'object') { if (!sameStruct(struct1[key], struct2[key], subset)) { return false; } } else if (struct1[key] !== struct2[key]) { console.log(`struct1[${key}] !== struct2[${key}] ${struct1[key]} ${struct2[key]}`); return false; } } if (subset) return true; for (const key in struct2) { if (!(key in struct1)) { console.log(`!(${key} in struct1)`); return false; } else if (typeof struct1[key] === 'function') { if (!struct1[key](struct2[key])) { return false; } } else if (typeof struct1[key] !== typeof struct2[key]) { console.log(`typeof struct1[${key}] !== typeof struct2[${key}] ${typeof struct1[key]} ${typeof struct2[key]}`); return false; } else if (typeof struct2[key] === 'object') { if (!sameStruct(struct1[key], struct2[key], subset)) { return false; } } else if (struct1[key] !== struct2[key]) { console.log(`struct1[${key}] !== struct2[${key}] ${struct1[key]} ${struct2[key]}`); return false; } } return true; }; exports.expectSubset = (struct1, failFast = true) => (str) => { try { const ok = sameStruct(struct1, JSON.parse(str), true); if (failFast) { assert.ok(ok); } return true; } catch (err) { console.error('Error comparing subset for actual value=' + str); throw err; } }; exports.expectStruct = (struct1, noParse = false, failFast = true) => (str) => { try { const ok = sameStruct(struct1, noParse ? str : JSON.parse(str)); if (failFast) { assert.ok(ok); } return ok; } catch (err) { console.error('Error comparing structs for actual value=' + str); throw err; } }; exports.expectYAML = (struct1, subset = false, failFast = true) => (str) => { try { const struct2 = js_yaml_1.safeLoad(str); const ok = sameStruct(struct1, struct2, subset); if (failFast) { assert.ok(ok); } return ok; } catch (err) { if (failFast) { return false; } else { console.error('Error comparing subset for actual value=' + str); throw err; } } }; exports.expectYAMLSubset = (struct1, failFast = true) => exports.expectYAML(struct1, true, failFast); exports.expectArray = (expected, failFast = true, subset = false) => (actual) => { if (!Array.isArray(actual)) { actual = [actual]; } const matchFn = function (u, i) { return u === expected[i]; }; const ok = !subset ? actual.length === expected.length && actual.every(matchFn) : actual.some(matchFn); if (!ok) { console.error(`array mismatch; expected=${expected} actual=${actual}`); } if (failFast) { assert.ok(ok); } else { return ok; } }; exports.getValueFromMonaco = (app, prefix = '') => __awaiter(void 0, void 0, void 0, function* () { const editor = '.monaco-editor-wrapper'; const selector = prefix ? `${prefix} ${editor}` : editor; try { yield app.client.waitForExist(selector, CLI.waitTimeout); } catch (err) { console.error('cannot find editor', err); yield app.client.getHTML(Selectors.SIDECAR).then(html => { console.log('here is the content of the sidecar:'); console.log(html); }); throw err; } return app.client .execute(selector => { try { return document.querySelector(selector)['editor'].getValue(); } catch (err) { console.error('error in getValueFromMonaco1', err); } }, selector) .then(_ => _.value); }); exports.waitForXtermInput = (app, N) => { const selector = `${Selectors.PROMPT_BLOCK_N(N)} .xterm-helper-textarea`; return app.client.waitForExist(selector); }; exports.expectText = (app, expectedText) => (selector) => __awaiter(void 0, void 0, void 0, function* () { yield app.client.waitUntil(() => __awaiter(void 0, void 0, void 0, function* () { const actualText = yield app.client.getText(selector); return actualText === expectedText; })); return app; }); function expectSuggestionsFor(cmd, expectedAvailable, { click = undefined, expectedBreadcrumb = undefined, sidecar: expectedIcon = undefined, expectedString = undefined } = {}) { return CLI.command(cmd, this.app) .then(ReplExpect.errorWithPassthrough(404, 'Command not found')) .then(N => { const base = `${Selectors.OUTPUT_N(N)} .user-error-available-commands .log-line`; const availableItems = `${base} .clickable`; return this.app.client .getText(availableItems) .then(exports.expectArray(expectedAvailable, false, true)) .then(() => { if (click !== undefined) { const clickOn = `${base}:nth-child(${click + 1}) .clickable`; return this.app.client.click(clickOn).then(() => { if (expectedBreadcrumb) { const breadcrumb = `${Selectors.OUTPUT_N(N + 1)} .bx--breadcrumb-item:last-child .bx--no-link`; return this.app.client .getText(breadcrumb) .then(actualBreadcrumb => assert.strictEqual(actualBreadcrumb, expectedBreadcrumb)); } else if (expectedIcon) { const icon = `${Selectors.SIDECAR} .sidecar-header-icon-wrapper .sidecar-header-icon`; return SidecarExpect.open(this.app) .then(() => this.app.client.getText(icon)) .then(actualIcon => actualIcon.toLowerCase()) .then(actualIcon => assert.strictEqual(actualIcon, expectedIcon)); } else if (expectedString) { return this.app.client.waitUntil(() => __awaiter(this, void 0, void 0, function* () { const text = yield this.app.client.getText(Selectors.OUTPUT_N(N + 1)); return text === expectedString; })); } }); } }); }) .catch(Common.oops(this)); } exports.expectSuggestionsFor = expectSuggestionsFor; //# sourceMappingURL=util.js.map