UNPKG

good-vibes

Version:

Good Vibes is a Node.js testing library inspired by Alicia Keys Tiny Desk Concert

173 lines 10.7 kB
"use strict"; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _TestContext_instances, _TestContext_groupName, _TestContext_testStatus, _TestContext_snapshotsDirectoryInitCompleted, _TestContext_snapshotsDirectoryInitFailed, _TestContext_passedAssertions, _TestContext_failedAssertions, _TestContext_setTestStatus, _TestContext_initSnapshotsDirectory, _TestContext_getSnapshotPath; Object.defineProperty(exports, "__esModule", { value: true }); const isEqual = require("lodash.isequal"); const fs = require("fs/promises"); const Diff = require("diff"); const Context_1 = require("./Context"); const log_1 = require("./log"); var TestStatus; (function (TestStatus) { TestStatus[TestStatus["PASSTHROUGH"] = 0] = "PASSTHROUGH"; TestStatus[TestStatus["FAILED"] = 1] = "FAILED"; TestStatus[TestStatus["PASSED"] = 2] = "PASSED"; })(TestStatus || (TestStatus = {})); // assert 4 failed // 4/5 assertions passed class TestContext extends Context_1.default { constructor(testName, groupName, resolve, snapshotsDirectory) { super(testName, resolve); _TestContext_instances.add(this); _TestContext_groupName.set(this, void 0); _TestContext_testStatus.set(this, void 0); _TestContext_snapshotsDirectoryInitCompleted.set(this, void 0); _TestContext_snapshotsDirectoryInitFailed.set(this, void 0); _TestContext_passedAssertions.set(this, void 0); _TestContext_failedAssertions.set(this, void 0); __classPrivateFieldSet(this, _TestContext_groupName, groupName, "f"); this.snapshotsDirectory = snapshotsDirectory ? `${snapshotsDirectory}/${__classPrivateFieldGet(this, _TestContext_groupName, "f")}` : `./test/__snapshots__/${__classPrivateFieldGet(this, _TestContext_groupName, "f")}`; __classPrivateFieldSet(this, _TestContext_snapshotsDirectoryInitCompleted, false, "f"); __classPrivateFieldSet(this, _TestContext_snapshotsDirectoryInitFailed, false, "f"); __classPrivateFieldSet(this, _TestContext_testStatus, TestStatus.PASSTHROUGH, "f"); __classPrivateFieldSet(this, _TestContext_passedAssertions, 0, "f"); __classPrivateFieldSet(this, _TestContext_failedAssertions, 0, "f"); } check(expectedValue, actualValue) { var _a, _b; const result = isEqual(expectedValue, actualValue); if (!result) { __classPrivateFieldSet(this, _TestContext_failedAssertions, (_a = __classPrivateFieldGet(this, _TestContext_failedAssertions, "f"), _a++, _a), "f"); this.logger(`Assertion ${__classPrivateFieldGet(this, _TestContext_failedAssertions, "f")}: Expected ${JSON.stringify(expectedValue)} to match ${JSON.stringify(actualValue)}`, log_1.LogLevel.ERROR); __classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_setTestStatus).call(this, TestStatus.FAILED); } else { __classPrivateFieldSet(this, _TestContext_passedAssertions, (_b = __classPrivateFieldGet(this, _TestContext_passedAssertions, "f"), _b++, _b), "f"); __classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_setTestStatus).call(this, TestStatus.PASSED); } return this; } async snapshot(assertionName, actualValue, rebase) { if (rebase) { await __classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_initSnapshotsDirectory).call(this); this.logger(`Writing snapshot baseline for ${assertionName} to ${__classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_getSnapshotPath).call(this, assertionName)}`); try { await fs.writeFile(__classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_getSnapshotPath).call(this, assertionName), JSON.stringify(actualValue)); } catch (e) { this.logger(`Failed to write snapshot baseline file due to error, ${e}`); } this.logger(`Failing test in case rebase flag was set by mistake`); __classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_setTestStatus).call(this, TestStatus.FAILED); } else { const snapshotPath = __classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_getSnapshotPath).call(this, assertionName); let data; try { data = await fs.readFile(snapshotPath, { encoding: "utf8", }); } catch (e) { this.logger(`Could not find snapshot file at path ${snapshotPath}`); __classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_setTestStatus).call(this, TestStatus.FAILED); return Promise.resolve(this); } const existingValue = JSON.parse(data); const diff = Diff.diffJson(actualValue, existingValue); if (diff?.length) { const failed = diff.reduce((failed, part) => { failed = failed || part.added || part.removed; return failed; }, false); if (failed) { this.logger(`Snapshot ${assertionName}: FAILED, please see diff below for details\n`, log_1.LogLevel.ERROR); diff.forEach((part) => { (0, log_1.default)(part.value, part.added ? log_1.LogLevel.ERROR : part.removed ? log_1.LogLevel.SUCCESS : log_1.LogLevel.INFO); }); __classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_setTestStatus).call(this, TestStatus.FAILED); } else { this.logger(`Snapshot ${assertionName}: PASSED`, log_1.LogLevel.SUCCESS); __classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_setTestStatus).call(this, TestStatus.PASSED); } } else { this.logger("Test failed as baseline was empty, run with rebase flag set to true to generate file"); __classPrivateFieldGet(this, _TestContext_instances, "m", _TestContext_setTestStatus).call(this, TestStatus.FAILED); } } return Promise.resolve(this); } done() { if (__classPrivateFieldGet(this, _TestContext_passedAssertions, "f")) { this.logger(`${__classPrivateFieldGet(this, _TestContext_passedAssertions, "f")}/${__classPrivateFieldGet(this, _TestContext_failedAssertions, "f") + __classPrivateFieldGet(this, _TestContext_passedAssertions, "f")} Assertions PASSED`, log_1.LogLevel.SUCCESS); } this.resolve(__classPrivateFieldGet(this, _TestContext_testStatus, "f") === TestStatus.PASSTHROUGH || __classPrivateFieldGet(this, _TestContext_testStatus, "f") === TestStatus.PASSED); } } exports.default = TestContext; _TestContext_groupName = new WeakMap(), _TestContext_testStatus = new WeakMap(), _TestContext_snapshotsDirectoryInitCompleted = new WeakMap(), _TestContext_snapshotsDirectoryInitFailed = new WeakMap(), _TestContext_passedAssertions = new WeakMap(), _TestContext_failedAssertions = new WeakMap(), _TestContext_instances = new WeakSet(), _TestContext_setTestStatus = function _TestContext_setTestStatus(status) { if (__classPrivateFieldGet(this, _TestContext_testStatus, "f") === TestStatus.FAILED && status === TestStatus.PASSED) { __classPrivateFieldSet(this, _TestContext_testStatus, TestStatus.FAILED, "f"); } else { __classPrivateFieldSet(this, _TestContext_testStatus, status, "f"); } }, _TestContext_initSnapshotsDirectory = async function _TestContext_initSnapshotsDirectory() { if (__classPrivateFieldGet(this, _TestContext_snapshotsDirectoryInitCompleted, "f")) { return; // no need to re-init } if (__classPrivateFieldGet(this, _TestContext_snapshotsDirectoryInitFailed, "f")) { this.logger(`Failed to create snapshots directory in a previous attempt, will not retry`); return; // no need to re-init } this.logger(`Checking if specified directory for snapshots ${this.snapshotsDirectory} exists`); let stat; try { stat = await fs.stat(this.snapshotsDirectory); } catch (e) { this.logger(`Snapshots directory does not exist, trying to create now`); try { await fs.mkdir(this.snapshotsDirectory, { recursive: true }); this.logger(`Snapshots directory created, lets go!`); __classPrivateFieldSet(this, _TestContext_snapshotsDirectoryInitCompleted, true, "f"); } catch (e) { this.logger(`Failed to create snapshots directory due to error: ${e}`); __classPrivateFieldSet(this, _TestContext_snapshotsDirectoryInitFailed, true, "f"); } } if (stat) { if (!stat.isDirectory()) { this.logger(`Specified path for snapshots (${this.snapshotsDirectory}) exists but is not a directory`); __classPrivateFieldSet(this, _TestContext_snapshotsDirectoryInitFailed, true, "f"); } else { (0, log_1.default)(`Directory already exists, lets go!`); __classPrivateFieldSet(this, _TestContext_snapshotsDirectoryInitCompleted, true, "f"); } } }, _TestContext_getSnapshotPath = function _TestContext_getSnapshotPath(assertionName) { return `${this.snapshotsDirectory}/${this.name}_${assertionName}.json`; }; //# sourceMappingURL=TestContext.js.map