mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 14:03:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			150 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const path = require("path");
 | 
						|
const fs = require("fs");
 | 
						|
const escapeRegExp = require("lodash/escapeRegExp");
 | 
						|
 | 
						|
require("@babel/register")({
 | 
						|
    extensions: [".es6", ".es", ".jsx", ".js", ".mjs", ".ts"],
 | 
						|
    only: [
 | 
						|
        new RegExp("^" + escapeRegExp(path.resolve(__dirname, "../../static/js")) + path.sep),
 | 
						|
        new RegExp(
 | 
						|
            "^" + escapeRegExp(path.resolve(__dirname, "../../static/shared/js")) + path.sep,
 | 
						|
        ),
 | 
						|
    ],
 | 
						|
    plugins: ["rewire-ts"],
 | 
						|
});
 | 
						|
 | 
						|
global.assert = require("assert").strict;
 | 
						|
global._ = require("underscore/underscore.js");
 | 
						|
const _ = global._;
 | 
						|
 | 
						|
// Create a helper function to avoid sneaky delays in tests.
 | 
						|
function immediate(f) {
 | 
						|
    return () => f();
 | 
						|
}
 | 
						|
 | 
						|
// Find the files we need to run.
 | 
						|
const finder = require("./finder.js");
 | 
						|
const files = finder.find_files_to_run(); // may write to console
 | 
						|
if (files.length === 0) {
 | 
						|
    throw "No tests found";
 | 
						|
}
 | 
						|
 | 
						|
// Set up our namespace helpers.
 | 
						|
const namespace = require("./namespace.js");
 | 
						|
global.set_global = namespace.set_global;
 | 
						|
global.patch_builtin = namespace.set_global;
 | 
						|
global.zrequire = namespace.zrequire;
 | 
						|
global.stub_out_jquery = namespace.stub_out_jquery;
 | 
						|
global.with_overrides = namespace.with_overrides;
 | 
						|
 | 
						|
global.window = new Proxy(global, {
 | 
						|
    set: (obj, prop, value) => namespace.set_global(prop, value),
 | 
						|
});
 | 
						|
global.to_$ = () => window;
 | 
						|
 | 
						|
// Set up stub helpers.
 | 
						|
const stub = require("./stub.js");
 | 
						|
global.make_stub = stub.make_stub;
 | 
						|
global.with_stub = stub.with_stub;
 | 
						|
 | 
						|
// Set up fake jQuery
 | 
						|
global.make_zjquery = require("./zjquery.js").make_zjquery;
 | 
						|
 | 
						|
// Set up fake blueslip
 | 
						|
const make_blueslip = require("./zblueslip.js").make_zblueslip;
 | 
						|
 | 
						|
// Set up fake translation
 | 
						|
const stub_i18n = require("./i18n.js");
 | 
						|
 | 
						|
// Set up Handlebars
 | 
						|
const handlebars = require("./handlebars.js");
 | 
						|
global.make_handlebars = handlebars.make_handlebars;
 | 
						|
global.stub_templates = handlebars.stub_templates;
 | 
						|
 | 
						|
const noop = function () {};
 | 
						|
 | 
						|
// Set up fake module.hot
 | 
						|
const Module = require("module");
 | 
						|
Module.prototype.hot = {
 | 
						|
    accept: noop,
 | 
						|
};
 | 
						|
 | 
						|
// Set up fixtures.
 | 
						|
global.read_fixture_data = (fn) => {
 | 
						|
    const full_fn = path.join(__dirname, "../../zerver/tests/fixtures/", fn);
 | 
						|
    const data = JSON.parse(fs.readFileSync(full_fn, "utf8", "r"));
 | 
						|
    return data;
 | 
						|
};
 | 
						|
 | 
						|
function short_tb(tb) {
 | 
						|
    const lines = tb.split("\n");
 | 
						|
 | 
						|
    const i = lines.findIndex(
 | 
						|
        (line) => line.includes("run_test") || line.includes("run_one_module"),
 | 
						|
    );
 | 
						|
 | 
						|
    if (i === -1) {
 | 
						|
        return tb;
 | 
						|
    }
 | 
						|
 | 
						|
    return lines.splice(0, i + 1).join("\n") + "\n(...)\n";
 | 
						|
}
 | 
						|
 | 
						|
// Set up markdown comparison helper
 | 
						|
global.markdown_assert = require("./markdown_assert.js");
 | 
						|
 | 
						|
let current_file_name;
 | 
						|
 | 
						|
function run_one_module(file) {
 | 
						|
    console.info("running tests for " + file.name);
 | 
						|
    current_file_name = file.name;
 | 
						|
    require(file.full_name);
 | 
						|
}
 | 
						|
 | 
						|
global.run_test = (label, f) => {
 | 
						|
    if (files.length === 1) {
 | 
						|
        console.info("        test: " + label);
 | 
						|
    }
 | 
						|
    try {
 | 
						|
        f();
 | 
						|
    } catch (error) {
 | 
						|
        console.info("-".repeat(50));
 | 
						|
        console.info(`test failed: ${current_file_name} > ${label}`);
 | 
						|
        console.info();
 | 
						|
        throw error;
 | 
						|
    }
 | 
						|
    // defensively reset blueslip after each test.
 | 
						|
    blueslip.reset();
 | 
						|
};
 | 
						|
 | 
						|
try {
 | 
						|
    files.forEach((file) => {
 | 
						|
        set_global("location", {
 | 
						|
            hash: "#",
 | 
						|
        });
 | 
						|
        global.patch_builtin("setTimeout", noop);
 | 
						|
        global.patch_builtin("setInterval", noop);
 | 
						|
        _.throttle = immediate;
 | 
						|
        _.debounce = immediate;
 | 
						|
 | 
						|
        set_global("blueslip", make_blueslip());
 | 
						|
        set_global("i18n", stub_i18n);
 | 
						|
        namespace.clear_zulip_refs();
 | 
						|
 | 
						|
        run_one_module(file);
 | 
						|
 | 
						|
        if (blueslip.reset) {
 | 
						|
            blueslip.reset();
 | 
						|
        }
 | 
						|
 | 
						|
        namespace.restore();
 | 
						|
    });
 | 
						|
} catch (e) {
 | 
						|
    if (e.stack) {
 | 
						|
        console.info(short_tb(e.stack));
 | 
						|
    } else {
 | 
						|
        console.info(e);
 | 
						|
    }
 | 
						|
    process.exit(1);
 | 
						|
}
 |