kui-shell
Version:
This is the monorepo for Kui, the hybrid command-line/GUI electron-based Kubernetes tool
217 lines • 8.48 kB
JavaScript
;
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