/addons/web/static/tests/core/orm_service_tests.js

https://gitlab.com/odoo-manage/odoo-manage · JavaScript · 347 lines · 320 code · 26 blank · 1 comment · 0 complexity · 08c940e4d6f31ca8e0a32b96e33b6eba MD5 · raw file

  1. /** @odoo-module **/
  2. import { ormService } from "@web/core/orm_service";
  3. import { registry } from "@web/core/registry";
  4. import { useService } from "@web/core/utils/hooks";
  5. import { makeTestEnv } from "../helpers/mock_env";
  6. import { getFixture } from "../helpers/utils";
  7. const { Component, mount, tags } = owl;
  8. const { xml } = tags;
  9. const serviceRegistry = registry.category("services");
  10. QUnit.module("ORM Service", {
  11. async beforeEach() {
  12. serviceRegistry.add("orm", ormService);
  13. },
  14. });
  15. function makeFakeRPC() {
  16. const query = { route: null, params: null };
  17. const rpc = {
  18. start() {
  19. return async (route, params) => {
  20. query.route = route;
  21. query.params = params;
  22. };
  23. },
  24. };
  25. return [query, rpc];
  26. }
  27. QUnit.test("add user context to a simple read request", async (assert) => {
  28. const [query, rpc] = makeFakeRPC();
  29. serviceRegistry.add("rpc", rpc);
  30. const env = await makeTestEnv();
  31. await env.services.orm.read("my.model", [3], ["id", "descr"]);
  32. assert.strictEqual(query.route, "/web/dataset/call_kw/my.model/read");
  33. assert.deepEqual(query.params, {
  34. args: [[3], ["id", "descr"]],
  35. kwargs: {
  36. context: {
  37. lang: "en",
  38. tz: "taht",
  39. uid: 7,
  40. },
  41. },
  42. method: "read",
  43. model: "my.model",
  44. });
  45. });
  46. QUnit.test("context is combined with user context in read request", async (assert) => {
  47. const [query, rpc] = makeFakeRPC();
  48. serviceRegistry.add("rpc", rpc);
  49. const env = await makeTestEnv();
  50. await env.services.orm.read("my.model", [3], ["id", "descr"], { earth: "isfucked" });
  51. assert.strictEqual(query.route, "/web/dataset/call_kw/my.model/read");
  52. assert.deepEqual(query.params, {
  53. args: [[3], ["id", "descr"]],
  54. kwargs: {
  55. context: {
  56. lang: "en",
  57. tz: "taht",
  58. uid: 7,
  59. earth: "isfucked",
  60. },
  61. },
  62. method: "read",
  63. model: "my.model",
  64. });
  65. });
  66. QUnit.test("basic method call of model", async (assert) => {
  67. const [query, rpc] = makeFakeRPC();
  68. serviceRegistry.add("rpc", rpc);
  69. const env = await makeTestEnv();
  70. await env.services.orm.call("partner", "test", [], { context: { a: 1 } });
  71. assert.strictEqual(query.route, "/web/dataset/call_kw/partner/test");
  72. assert.deepEqual(query.params, {
  73. args: [],
  74. kwargs: {
  75. context: {
  76. lang: "en",
  77. tz: "taht",
  78. uid: 7,
  79. a: 1,
  80. },
  81. },
  82. method: "test",
  83. model: "partner",
  84. });
  85. });
  86. QUnit.test("create method", async (assert) => {
  87. const [query, rpc] = makeFakeRPC();
  88. serviceRegistry.add("rpc", rpc);
  89. const env = await makeTestEnv();
  90. await env.services.orm.create("partner", { color: "red" });
  91. assert.strictEqual(query.route, "/web/dataset/call_kw/partner/create");
  92. assert.deepEqual(query.params, {
  93. args: [
  94. {
  95. color: "red",
  96. },
  97. ],
  98. kwargs: {
  99. context: {
  100. lang: "en",
  101. tz: "taht",
  102. uid: 7,
  103. },
  104. },
  105. method: "create",
  106. model: "partner",
  107. });
  108. });
  109. QUnit.test("unlink method", async (assert) => {
  110. const [query, rpc] = makeFakeRPC();
  111. serviceRegistry.add("rpc", rpc);
  112. const env = await makeTestEnv();
  113. await env.services.orm.unlink("partner", [43]);
  114. assert.strictEqual(query.route, "/web/dataset/call_kw/partner/unlink");
  115. assert.deepEqual(query.params, {
  116. args: [[43]],
  117. kwargs: {
  118. context: {
  119. lang: "en",
  120. tz: "taht",
  121. uid: 7,
  122. },
  123. },
  124. method: "unlink",
  125. model: "partner",
  126. });
  127. });
  128. QUnit.test("write method", async (assert) => {
  129. const [query, rpc] = makeFakeRPC();
  130. serviceRegistry.add("rpc", rpc);
  131. const env = await makeTestEnv();
  132. await env.services.orm.write("partner", [43, 14], { active: false });
  133. assert.strictEqual(query.route, "/web/dataset/call_kw/partner/write");
  134. assert.deepEqual(query.params, {
  135. args: [[43, 14], { active: false }],
  136. kwargs: {
  137. context: {
  138. lang: "en",
  139. tz: "taht",
  140. uid: 7,
  141. },
  142. },
  143. method: "write",
  144. model: "partner",
  145. });
  146. });
  147. QUnit.test("webReadGroup method", async (assert) => {
  148. const [query, rpc] = makeFakeRPC();
  149. serviceRegistry.add("rpc", rpc);
  150. const env = await makeTestEnv();
  151. await env.services.orm.webReadGroup(
  152. "sale.order",
  153. [["user_id", "=", 2]],
  154. ["amount_total:sum"],
  155. ["date_order"],
  156. { offset: 1 }
  157. );
  158. assert.strictEqual(query.route, "/web/dataset/call_kw/sale.order/web_read_group");
  159. assert.deepEqual(query.params, {
  160. args: [],
  161. kwargs: {
  162. domain: [["user_id", "=", 2]],
  163. fields: ["amount_total:sum"],
  164. groupby: ["date_order"],
  165. context: {
  166. lang: "en",
  167. uid: 7,
  168. tz: "taht",
  169. },
  170. offset: 1,
  171. },
  172. method: "web_read_group",
  173. model: "sale.order",
  174. });
  175. });
  176. QUnit.test("readGroup method", async (assert) => {
  177. const [query, rpc] = makeFakeRPC();
  178. serviceRegistry.add("rpc", rpc);
  179. const env = await makeTestEnv();
  180. await env.services.orm.readGroup(
  181. "sale.order",
  182. [["user_id", "=", 2]],
  183. ["amount_total:sum"],
  184. ["date_order"],
  185. { offset: 1 }
  186. );
  187. assert.strictEqual(query.route, "/web/dataset/call_kw/sale.order/read_group");
  188. assert.deepEqual(query.params, {
  189. args: [],
  190. kwargs: {
  191. domain: [["user_id", "=", 2]],
  192. fields: ["amount_total:sum"],
  193. groupby: ["date_order"],
  194. context: {
  195. lang: "en",
  196. uid: 7,
  197. tz: "taht",
  198. },
  199. offset: 1,
  200. },
  201. method: "read_group",
  202. model: "sale.order",
  203. });
  204. });
  205. QUnit.test("searchRead method", async (assert) => {
  206. const [query, rpc] = makeFakeRPC();
  207. serviceRegistry.add("rpc", rpc);
  208. const env = await makeTestEnv();
  209. await env.services.orm.searchRead("sale.order", [["user_id", "=", 2]], ["amount_total"]);
  210. assert.strictEqual(query.route, "/web/dataset/call_kw/sale.order/search_read");
  211. assert.deepEqual(query.params, {
  212. args: [],
  213. kwargs: {
  214. context: {
  215. lang: "en",
  216. tz: "taht",
  217. uid: 7,
  218. },
  219. domain: [["user_id", "=", 2]],
  220. fields: ["amount_total"],
  221. },
  222. method: "search_read",
  223. model: "sale.order",
  224. });
  225. });
  226. QUnit.test("webSearchRead method", async (assert) => {
  227. const [query, rpc] = makeFakeRPC();
  228. serviceRegistry.add("rpc", rpc);
  229. const env = await makeTestEnv();
  230. await env.services.orm.webSearchRead("sale.order", [["user_id", "=", 2]], ["amount_total"]);
  231. assert.strictEqual(query.route, "/web/dataset/call_kw/sale.order/web_search_read");
  232. assert.deepEqual(query.params, {
  233. args: [],
  234. kwargs: {
  235. context: {
  236. lang: "en",
  237. tz: "taht",
  238. uid: 7,
  239. },
  240. domain: [["user_id", "=", 2]],
  241. fields: ["amount_total"],
  242. },
  243. method: "web_search_read",
  244. model: "sale.order",
  245. });
  246. });
  247. QUnit.test("useModel is specialized for component", async (assert) => {
  248. const [query, rpc] = makeFakeRPC();
  249. serviceRegistry.add("rpc", rpc);
  250. const env = await makeTestEnv();
  251. class MyComponent extends Component {
  252. setup() {
  253. this.rpc = useService("rpc");
  254. this.orm = useService("orm");
  255. }
  256. }
  257. MyComponent.template = xml`<div/>`;
  258. const target = getFixture();
  259. const component = await mount(MyComponent, { env, target });
  260. assert.notStrictEqual(component.orm, env.services.orm);
  261. });
  262. QUnit.test("silent mode", async (assert) => {
  263. serviceRegistry.add("rpc", {
  264. start() {
  265. return async (route, params, settings) => {
  266. assert.step(`${route}${settings.silent ? " (silent)" : ""}`);
  267. };
  268. },
  269. });
  270. const env = await makeTestEnv();
  271. const orm = env.services.orm;
  272. orm.call("my_model", "my_method");
  273. orm.silent.call("my_model", "my_method");
  274. orm.call("my_model", "my_method");
  275. orm.read("my_model", [1], []);
  276. orm.silent.read("my_model", [1], []);
  277. orm.read("my_model", [1], []);
  278. assert.verifySteps([
  279. "/web/dataset/call_kw/my_model/my_method",
  280. "/web/dataset/call_kw/my_model/my_method (silent)",
  281. "/web/dataset/call_kw/my_model/my_method",
  282. "/web/dataset/call_kw/my_model/read",
  283. "/web/dataset/call_kw/my_model/read (silent)",
  284. "/web/dataset/call_kw/my_model/read",
  285. ]);
  286. });
  287. QUnit.test("validate some obviously wrong calls", async (assert) => {
  288. assert.expect(2);
  289. const [query, rpc] = makeFakeRPC();
  290. serviceRegistry.add("rpc", rpc);
  291. const env = await makeTestEnv();
  292. try {
  293. await env.services.orm.read(false, [3], ["id", "descr"]);
  294. } catch (error) {
  295. assert.strictEqual(error.message, "Invalid model name: false");
  296. }
  297. try {
  298. await env.services.orm.read("res.partner", false, ["id", "descr"]);
  299. } catch (error) {
  300. assert.strictEqual(error.message, "Invalid ids list: false");
  301. }
  302. });
  303. QUnit.test("optimize read and unlink if no ids", async (assert) => {
  304. serviceRegistry.add("rpc", {
  305. start() {
  306. return async (route) => {
  307. assert.step(route);
  308. };
  309. },
  310. });
  311. const env = await makeTestEnv();
  312. const orm = env.services.orm;
  313. await orm.read("my_model", [1], []);
  314. assert.verifySteps(["/web/dataset/call_kw/my_model/read"]);
  315. await orm.read("my_model", [], []);
  316. assert.verifySteps([]);
  317. await orm.unlink("my_model", [1], {});
  318. assert.verifySteps(["/web/dataset/call_kw/my_model/unlink"]);
  319. await orm.unlink("my_model", [], {});
  320. assert.verifySteps([]);
  321. });