jest-setup.js 4.9 KB
Newer Older
1 2
const path = require("path");
const fs = require("fs");
3 4 5 6
const {
    configureToMatchImageSnapshot
} = require('jest-image-snapshot');
let saveImageSnapshotDir = process.env.saveImageSnapshotDir || path.join(__dirname, '__snapshot__');
7 8

expect.extend({
9 10 11 12 13 14 15 16 17
    toMatchImageSnapshot: configureToMatchImageSnapshot({
        customSnapshotIdentifier(args) {
            return args.currentTestName.replace(/\//g, "-").replace(" ", "-");
        },
        customSnapshotsDir: process.env.saveImageSnapshotDir,
        customDiffDir: path.join(saveImageSnapshotDir, "diff"),
    }),
    toSaveSnapshot,
    toSaveImageSnapshot,
18
});
19

20
const testCaseToSnapshotFilePath =
21
    process.env.testCaseToSnapshotFilePath || "./testCaseToSnapshotFilePath.json";
22 23

if (!fs.existsSync(testCaseToSnapshotFilePath)) {
24
    fs.writeFileSync(testCaseToSnapshotFilePath, "{}");
25 26 27
}

function writeTestCaseToSnapshotFile(testCaseName, snapshotFilePath) {
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
    const data = JSON.parse(fs.readFileSync(testCaseToSnapshotFilePath));

    if (testCaseName.includes(__dirname)) {
        testCaseName = testCaseName.substring(`${__dirname}`.length);
        if (testCaseName[0] == '/'  || testCaseName[0] == '\\') {
            testCaseName = testCaseName.substring(1);
        };
    };

    if (!data[testCaseName]) {
        data[testCaseName] = [snapshotFilePath];
    } else {
        data[testCaseName].push(snapshotFilePath);
    }
    fs.writeFileSync(testCaseToSnapshotFilePath, JSON.stringify(data, null, 2));
43 44
}

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
function toSaveSnapshot(received, {
    customSnapshotsDir,
    fileName
} = {}) {
    const {
        snapshotState: {
            _rootDir
        },
        testPath,
        currentTestName,
    } = this;
    const SNAPSHOTS_DIR = "__file_snapshots__";
    const snapshotDir =
        process.env.saveSnapshotDir ||
        createSnapshotDir({
            customSnapshotsDir,
            testPath,
            SNAPSHOTS_DIR,
        });
    const _fileName = createFileName({
        fileName,
        testPath,
        currentTestName,
68
    });
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
    const filePath = path.join(snapshotDir, _fileName);
    let message = () => `${currentTestName} toSaveSnapshot success`;
    let pass = true;

    try {
        checkSnapshotDir(snapshotDir);
        fs.writeFileSync(filePath, received);
        writeTestCaseToSnapshotFile(testPath.replace(`${_rootDir}/`, ""), filePath);
    } catch (e) {
        console.log("toSaveSnapshot fail", e);
        message = () => e.message;
        pass = false;
    }

    return {
        message,
        pass,
    };
87 88 89
}

function toSaveImageSnapshot(
90 91 92 93
    received, {
        customSnapshotsDir,
        customSnapshotIdentifier
    } = {}
94
) {
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
    const {
        snapshotState: {
            _rootDir
        },
        testPath,
        currentTestName,
    } = this;
    const SNAPSHOTS_DIR = "__image_snapshots__";
    const snapshotDir =
        process.env.saveImageSnapshotDir ||
        createSnapshotDir({
            customSnapshotsDir,
            testPath,
            SNAPSHOTS_DIR,
        });
    const _fileName = createFileName({
        fileName: customSnapshotIdentifier ? customSnapshotIdentifier() : "",
        testPath,
        currentTestName,
        fileType: "png",
115
    });
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    const filePath = path.join(snapshotDir, _fileName);
    let message = () => `${currentTestName} toSaveImageSnapshot success`;
    let pass = true;

    try {
        checkSnapshotDir(snapshotDir);
        fs.writeFileSync(filePath, Buffer.from(received, "base64"));
        writeTestCaseToSnapshotFile(testPath.replace(`${_rootDir}/`, ""), filePath);
    } catch (e) {
        console.log("toSaveImageSnapshot fail", e);
        message = () => e.message;
        pass = false;
    }

    return {
        message,
        pass,
    };
134 135
}

136 137 138 139 140 141
function createSnapshotDir({
    customSnapshotsDir,
    testPath,
    SNAPSHOTS_DIR
}) {
    return customSnapshotsDir || path.join(path.dirname(testPath), SNAPSHOTS_DIR);
142 143
}

144 145 146 147 148 149 150 151 152 153 154 155 156 157
function createFileName({
    fileName,
    testPath,
    currentTestName,
    fileType
}) {
    return (
        fileName ||
        createSnapshotIdentifier({
            testPath,
            currentTestName,
            fileType,
        })
    );
158 159 160
}

function createSnapshotIdentifier({
161 162 163
    testPath,
    currentTestName,
    fileType = "txt",
164
}) {
165 166 167 168 169 170
    const snapshotIdentifier = kebabCase(
        `${path.basename(testPath)}-${currentTestName}`
    );
    const counter = timesCalled.get(`${snapshotIdentifier}-${fileType}`) || 1;
    timesCalled.set(`${snapshotIdentifier}-${fileType}`, counter + 1);
    return `${snapshotIdentifier}-${counter}.${fileType}`;
171 172 173
}

function kebabCase(str) {
174 175 176 177 178 179 180
    return str
        .replaceAll(/([a-z])([A-Z])/g, "$1-$2")
        .replaceAll(/\s+/g, "-")
        .replaceAll(/_+/g, "-")
        .replaceAll(/\/+/g, "-")
        .replaceAll(/\.+/g, "-")
        .toLowerCase();
181 182 183
}

function checkSnapshotDir(snapshotDir) {
184 185 186 187 188
    if (!fs.existsSync(snapshotDir)) {
        fs.mkdirSync(snapshotDir, {
            recursive: true,
        });
    }
189 190 191
}

const timesCalled = new Map();