good-vibes
Version:
Good Vibes is a Node.js testing library inspired by Alicia Keys Tiny Desk Concert
173 lines • 10.7 kB
JavaScript
"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