import { eachValue } from "../../../../commons/coolKids"; import { splitError, stopProccessIfAcumenError, throwExpection } from "../../../../commons/errorHandling"; import { iSnapshotSuite } from "../../../../contracts/snapshots/model/iSnapshotSuite"; import { iSnapshotTest } from "../../../../contracts/snapshots/model/iSnapshotTest"; import { iSnapshotTestInstance } from "../../../../contracts/snapshots/model/iSnapshotTestInstance"; import { iDispatchRequestSnapshot } from "../../../../contracts/snapshots/request/iDispatchRequestSnapshot"; import { translateResponse } from "../../../../translation/translate"; import { TerminalEnvironment } from "../../../configuration/terminalEnvironment"; import { callEntry } from "../../../processor/processor"; import { Kernel } from "../../kernel"; import { breadCrumbs, closeBracket, column, description, entityName, error, keyword, oneSpace, oneTab, openBracket } from "./terminalTheme"; export class TerminalSnapshot { public entries: string[] = []; public constructor( private kernel: Kernel, private terminalEnvironment: TerminalEnvironment ) { } public controller() { this.getEntries(); this.update(); } public getEntries() { this.entries = this.kernel.modules.repoManager .getEntries(this.terminalEnvironment.repo); } public createRequest(entry: string): iDispatchRequestSnapshot { const headers = this.kernel.modules.requests.getBaseHeadersForEntry(entry); return { url: "/snapshot", userAgent: "@terminal", body: {}, headers } } public update() { const entries = this.kernel.modules.repoManager.getEntries(this.terminalEnvironment.repo); entries.forEach(entry => { const messages = [] callEntry(entry, this.createRequest(entry), messages) .then(response => translateResponse(response)) .then(response => { response.whenSnapshot(snapshot => { const lines = [] this.suite(snapshot.body.data.suite, lines); this.kernel.modules.messages.info(this.terminalEnvironment, lines); this.kernel.modules.messages.verbose(this.terminalEnvironment, messages); if (this.terminalEnvironment.console.throwWhenErrorsPresent && snapshot.body.data.suite.containsFailures) { throwExpection(`Snapshot Failed`) } }) response.whenError(error => { this.kernel.modules.messages.verbose(this.terminalEnvironment, messages); this.kernel.modules.messages.error(this.terminalEnvironment, error.body); }) }).catch((err: Error) => { stopProccessIfAcumenError(err); this.kernel.modules.messages.verbose(this.terminalEnvironment, messages); this.kernel.modules.messages.error(this.terminalEnvironment, splitError(err)) }) }) } public suite(suite: iSnapshotSuite, lines: string[], space: string = "") { const inside = space + column(this.terminalEnvironment.console) + oneTab(); const headerSegments: string[] = [ keyword("@Suite"), entityName(suite.name), openBracket() ] const header = headerSegments.join(oneSpace()); lines.push(space + header); description(lines, suite, inside); if (suite.controller) { this.doController(suite.controller, lines, inside) } eachValue(suite.tests, (test: iSnapshotTest) => this.test(test, lines, inside)) eachValue(suite.suites, (suite: iSnapshotSuite) => this.suite(suite, lines, inside)) lines.push(space + closeBracket()) lines.push(space) } public doController(test: iSnapshotTest, lines: string[], space: string = "") { const inside = space + column(this.terminalEnvironment.console) + oneTab(); const headerSegments = [ `@Controller`, openBracket() ] const header = headerSegments.join(oneSpace()); lines.push(space + header); description(lines, test, inside); breadCrumbs(lines, test.breadCrumbs, inside) test.instances.forEach(instance => this.testInstance(instance, lines, inside)); lines.push(space + closeBracket()); lines.push(space); } public test(test: iSnapshotTest, lines: string[], space: string = "") { const inside = space + column(this.terminalEnvironment.console) + oneTab(); const headerSegments = [ `@Test`, `${test.command}`, openBracket() ] const header = headerSegments.join(oneSpace()); lines.push(space + header); description(lines, test, inside); breadCrumbs(lines, test.breadCrumbs, inside) test.instances.forEach(instance => this.testInstance(instance, lines, inside)); lines.push(space + closeBracket()); lines.push(space); } public testInstance(instance: iSnapshotTestInstance, lines: string[], space: string = "") { const inside = space + column(this.terminalEnvironment.console) + oneTab(); const caller = (instance.callerSuiteName || "Acumen") + "@" + (instance.callerTestCommand || "controller"); const benchmark = instance.time.toFixed(2) + "ms"; const openBracketString = Array.isArray(instance.error) ? openBracket() : "" const closeBracketString = Array.isArray(instance.error) ? closeBracket() : "" const line = [ `Caller: ${caller}`, `Benchmark: ${benchmark}`, `${openBracketString}` ] lines.push(space + line.join(" ")) error(lines, instance.error, inside) lines.push(space + closeBracketString) } }