blob: 7435c8eabc49a995428689f63c058eb56eb1b9c3 [file] [log] [blame]
import Script, {
ScriptEnvironment,
ScriptPage,
ScriptRunPhase,
} from './Script';
import { beforeEach, expect, it, jest } from '@jest/globals';
import ScriptRunner from './ScriptRunner';
interface FakeScriptOptions {
id: string;
priority: number;
}
class FakeScript extends Script {
id: string;
priority: number;
page: ScriptPage.CommunityConsole;
environment: ScriptEnvironment.ContentScript;
runPhase: ScriptRunPhase.Main;
constructor(options: FakeScriptOptions) {
super();
this.id = options.id;
this.priority = options.priority;
}
execute() {}
}
const fakeScriptMock = jest
.spyOn(FakeScript.prototype, 'execute')
.mockImplementation(function() {
return (this as FakeScript).id;
});
beforeEach(() => {
jest.clearAllMocks();
});
it('scripts run in the correct order based on priority', () => {
const scriptsConfig = [
{
script: new FakeScript({
id: '1',
priority: 1,
}),
expectedRunPosition: 2,
},
{
script: new FakeScript({
id: '2',
priority: 1000,
}),
expectedRunPosition: 3,
},
{
script: new FakeScript({
id: '3',
priority: 0,
}),
expectedRunPosition: 1,
},
{
script: new FakeScript({
id: '4',
priority: 2 ** 31,
}),
expectedRunPosition: 4,
},
];
const scriptRunner = new ScriptRunner();
scriptRunner.add(...scriptsConfig.map((config) => config.script));
scriptRunner.run();
expect(fakeScriptMock).toHaveBeenCalledTimes(scriptsConfig.length);
for (const config of scriptsConfig) {
expect(fakeScriptMock).toHaveNthReturnedWith(
config.expectedRunPosition,
config.script.id,
);
}
});