mirror of
https://github.com/zen-browser/desktop
synced 2026-04-25 17:15:00 +02:00
152 lines
3.7 KiB
JavaScript
152 lines
3.7 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
https://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
ChromeUtils.defineESModuleGetters(this, {
|
|
sinon: "resource://testing-common/Sinon.sys.mjs",
|
|
nsZenLiveFolderProvider: "resource:///modules/zen/ZenLiveFolder.sys.mjs",
|
|
});
|
|
|
|
function sleep(ms) {
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
}
|
|
|
|
describe("Zen Live Folder Scheduling", () => {
|
|
const INTERVAL = 250;
|
|
const INTERVAL_OFFSET = 50;
|
|
|
|
let instance;
|
|
let sandbox;
|
|
let mockManager;
|
|
|
|
function createInstance({ id, interval, lastFetched }) {
|
|
instance = new nsZenLiveFolderProvider({
|
|
id,
|
|
manager: mockManager,
|
|
state: {
|
|
interval,
|
|
lastFetched,
|
|
},
|
|
});
|
|
|
|
const fetchStub = sandbox.stub(instance, "fetchItems").resolves(["item1"]);
|
|
sandbox.stub(instance, "getMetadata").returns({});
|
|
|
|
return { fetchStub };
|
|
}
|
|
|
|
beforeEach(() => {
|
|
sandbox = sinon.createSandbox();
|
|
mockManager = {
|
|
saveState: sandbox.spy(),
|
|
onLiveFolderFetch: sandbox.spy(),
|
|
};
|
|
});
|
|
|
|
afterEach(() => {
|
|
if (instance) {
|
|
instance.stop();
|
|
}
|
|
sandbox.restore();
|
|
});
|
|
|
|
it("should fetch correctly at an interval", async () => {
|
|
const { fetchStub } = createInstance({
|
|
id: "test-folder",
|
|
interval: INTERVAL,
|
|
lastFetched: Date.now(),
|
|
});
|
|
|
|
instance.start();
|
|
sinon.assert.notCalled(fetchStub);
|
|
|
|
const startSpy = sandbox.spy(instance, "start");
|
|
|
|
await sleep(INTERVAL + INTERVAL_OFFSET);
|
|
Assert.equal(
|
|
fetchStub.callCount,
|
|
1,
|
|
"Should have fetched once after the first interval"
|
|
);
|
|
|
|
await sleep(INTERVAL + INTERVAL_OFFSET);
|
|
Assert.equal(fetchStub.callCount, 2, "Should have fetched 2 times");
|
|
Assert.deepEqual(
|
|
startSpy.firstCall.args,
|
|
[false],
|
|
"Start should have been called once with false"
|
|
);
|
|
|
|
await sleep(INTERVAL + INTERVAL_OFFSET);
|
|
Assert.equal(fetchStub.callCount, 3, "Should have fetched 3 times");
|
|
Assert.equal(startSpy.callCount, 1, "Start should not been called");
|
|
|
|
sinon.assert.called(mockManager.saveState);
|
|
sinon.assert.called(mockManager.onLiveFolderFetch);
|
|
});
|
|
|
|
it("should fetch immediately if overdue", async () => {
|
|
const { fetchStub } = createInstance({
|
|
id: "test-folder-overdue",
|
|
interval: INTERVAL,
|
|
lastFetched: Date.now() - 3600000,
|
|
});
|
|
|
|
instance.start();
|
|
|
|
await sleep(INTERVAL_OFFSET);
|
|
sinon.assert.calledOnce(fetchStub);
|
|
});
|
|
|
|
it("should fetch with correct offset", async () => {
|
|
const { fetchStub } = createInstance({
|
|
id: "test-folder-delay",
|
|
interval: INTERVAL,
|
|
lastFetched: Date.now() - INTERVAL / 2,
|
|
});
|
|
|
|
instance.start();
|
|
await sleep(INTERVAL / 2 + INTERVAL_OFFSET);
|
|
Assert.equal(fetchStub.callCount, 1, "Should have fetched once");
|
|
|
|
await sleep(INTERVAL + INTERVAL_OFFSET);
|
|
Assert.equal(
|
|
fetchStub.callCount,
|
|
2,
|
|
"Should have fetched once with normal interval"
|
|
);
|
|
});
|
|
|
|
it("should re-start the timer if interval was changed", async () => {
|
|
const { fetchStub } = createInstance({
|
|
id: "test-folder-interval-change",
|
|
interval: INTERVAL,
|
|
lastFetched: Date.now(),
|
|
});
|
|
|
|
instance.start();
|
|
|
|
sinon.assert.notCalled(fetchStub);
|
|
await sleep(INTERVAL + INTERVAL_OFFSET);
|
|
Assert.equal(
|
|
fetchStub.callCount,
|
|
1,
|
|
"Should have fetched once after the first interval"
|
|
);
|
|
|
|
const NEW_INTERVAL = 500;
|
|
instance.state.interval = NEW_INTERVAL;
|
|
|
|
instance.stop();
|
|
instance.start();
|
|
|
|
await sleep(NEW_INTERVAL + INTERVAL_OFFSET);
|
|
Assert.equal(
|
|
fetchStub.callCount,
|
|
2,
|
|
"Should have once after the new interval"
|
|
);
|
|
});
|
|
});
|