Odoo18-Base/addons/spreadsheet/static/tests/data_fetching/data_source.test.js
2025-01-06 10:57:38 +07:00

85 lines
2.8 KiB
JavaScript

import { animationFrame } from "@odoo/hoot-mock";
import { LoadableDataSource } from "@spreadsheet/data_sources/data_source";
import { Deferred } from "@web/core/utils/concurrency";
import { makeServerError } from "@web/../tests/web_test_helpers";
import { describe, expect, test } from "@odoo/hoot";
import { defineSpreadsheetActions, defineSpreadsheetModels } from "../helpers/data";
describe.current.tags("headless");
defineSpreadsheetModels();
defineSpreadsheetActions();
test("data source is ready after all concurrent requests are resolved", async () => {
const def1 = new Deferred();
const def2 = new Deferred();
let req = 0;
class TestDataSource extends LoadableDataSource {
constructor() {
super(...arguments);
this.data = null;
}
async _load() {
this.data = null;
switch (++req) {
case 1:
await def1;
break;
case 2:
await def2;
break;
}
this.data = "something";
}
}
const dataSource = new TestDataSource({
odooDataProvider: {
notify: () => expect.step("notify"),
notifyWhenPromiseResolves: () => expect.step("notify-from-promise"),
cancelPromise: () => expect.step("cancel-promise"),
},
});
dataSource.load();
expect.verifySteps(["notify-from-promise"]);
dataSource.load({ reload: true });
expect(dataSource.isReady()).toBe(false);
def1.resolve();
await animationFrame();
expect.verifySteps(["cancel-promise", "notify-from-promise"]);
expect(dataSource.isReady()).toBe(false);
def2.resolve();
await animationFrame();
expect(dataSource.isReady()).toBe(true);
expect.verifySteps([]);
});
test("Datasources handle errors thrown at _load", async () => {
class TestDataSource extends LoadableDataSource {
constructor() {
super(...arguments);
this.data = null;
}
async _load() {
this.data = await this._orm.call();
}
}
const dataSource = new TestDataSource({
odooDataProvider: {
notify: () => expect.step("notify"),
notifyWhenPromiseResolves: () => expect.step("notify-from-promise"),
cancelPromise: () => expect.step("cancel-promise"),
orm: {
call: () => {
throw makeServerError({ description: "Ya done!" });
},
},
},
});
await dataSource.load();
expect.verifySteps(["notify-from-promise"]);
expect(dataSource._isFullyLoaded).toBe(true);
expect(dataSource._isValid).toBe(false);
expect(dataSource._loadError.message).toBe("Ya done!");
});