Skip to content

Commit e491922

Browse files
committed
[tests] base_import_async: cover async import helpers
1 parent 901ba08 commit e491922

File tree

1 file changed

+140
-1
lines changed

1 file changed

+140
-1
lines changed

base_import_async/tests/test_base_import_import.py

Lines changed: 140 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
# Copyright 2024 Camptocamp
22
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
33

4+
from odoo.addons.queue_job.exception import FailedJobError
45
from odoo.tests.common import RecordCapturer, TransactionCase
56

6-
from ..wizard.base_import_import import OPT_USE_QUEUE
7+
from ..wizard.base_import_import import (
8+
INIT_PRIORITY,
9+
OPT_CHUNK_SIZE,
10+
OPT_HAS_HEADER,
11+
OPT_QUOTING,
12+
OPT_SEPARATOR,
13+
OPT_USE_QUEUE,
14+
)
715

816

917
class TestBaseImportImport(TransactionCase):
@@ -59,6 +67,53 @@ def test_normal_import_res_partners(self):
5967
self.assertEqual(len(records_created), 2)
6068
self.assertIn("partner1", records_created[0].email)
6169

70+
def test_execute_import_res_partners_async(self):
71+
values = [
72+
[
73+
"name",
74+
"email",
75+
"is_company",
76+
],
77+
[
78+
"partner 1",
79+
"partner1@example.com",
80+
"1",
81+
],
82+
[
83+
"partner 2",
84+
"partner2@example.com",
85+
"0",
86+
],
87+
]
88+
import_vals = {
89+
"res_model": self.res_partners._name,
90+
"file": "\n".join([";".join(values) for values in values]),
91+
"file_type": "text/csv",
92+
}
93+
import_wizard = self.import_wizard.create(import_vals)
94+
opts = {
95+
OPT_QUOTING: '"',
96+
OPT_SEPARATOR: ";",
97+
OPT_HAS_HEADER: True,
98+
OPT_USE_QUEUE: True,
99+
}
100+
preview = import_wizard.parse_preview(opts)
101+
with RecordCapturer(self.env["queue.job"], []) as capture:
102+
result = import_wizard.execute_import(
103+
[field[0] for field in preview["matches"].values()],
104+
[],
105+
opts,
106+
)
107+
self.assertEqual(result, [])
108+
self.assertEqual(len(capture.records), 1)
109+
job = capture.records[0]
110+
self.assertEqual(job.method_name, "_split_file")
111+
self.assertEqual(job.model_name, "base_import.import")
112+
attachment = self.env["ir.attachment"].search(
113+
[("res_model", "=", "queue.job"), ("res_id", "=", job.id)], limit=1
114+
)
115+
self.assertTrue(attachment)
116+
62117
def test_wrong_import_res_partners(self):
63118
values = [
64119
[
@@ -97,3 +152,87 @@ def test_wrong_import_res_partners(self):
97152
opts,
98153
)
99154
self.assertTrue(any(msg["type"] == "error" for msg in results["messages"]))
155+
156+
def test_split_file_creates_chunk_jobs_and_links_attachments(self):
157+
import_wizard = self.import_wizard.create(
158+
{
159+
"res_model": self.res_partners._name,
160+
"file": "dummy",
161+
"file_type": "text/csv",
162+
}
163+
)
164+
fields = ["name", "email", "is_company"]
165+
data = [
166+
["partner 1", "partner1@example.com", "1"],
167+
["partner 2", "partner2@example.com", "0"],
168+
["partner 3", "partner3@example.com", "0"],
169+
]
170+
opts = {
171+
OPT_QUOTING: '"',
172+
OPT_SEPARATOR: ";",
173+
OPT_HAS_HEADER: True,
174+
OPT_CHUNK_SIZE: 2,
175+
}
176+
attachment = import_wizard._create_csv_attachment(
177+
fields, data, opts, "partners.csv"
178+
)
179+
with RecordCapturer(self.env["queue.job"], []) as capture:
180+
import_wizard._split_file(
181+
model_name=self.res_partners._name,
182+
translated_model_name="Contacts",
183+
attachment=attachment,
184+
options=opts,
185+
file_name="partners.csv",
186+
)
187+
jobs = capture.records.sorted("priority")
188+
self.assertEqual(len(jobs), 2)
189+
self.assertEqual(jobs.mapped("method_name"), ["_import_one_chunk"] * 2)
190+
self.assertEqual(jobs.mapped("priority"), [INIT_PRIORITY, INIT_PRIORITY + 1])
191+
self.assertEqual(
192+
jobs.mapped("name"),
193+
[
194+
"Import Contacts from file partners.csv - #0 - lines 2 to 3",
195+
"Import Contacts from file partners.csv - #1 - lines 4 to 4",
196+
],
197+
)
198+
chunk_attachments = self.env["ir.attachment"].search(
199+
[("name", "in", ["partners-0.csv", "partners-1.csv"])]
200+
)
201+
self.assertEqual(len(chunk_attachments), 2)
202+
self.assertTrue(all(att.res_model == "queue.job" for att in chunk_attachments))
203+
self.assertTrue(all(att.res_id in jobs.ids for att in chunk_attachments))
204+
205+
def test_import_one_chunk_success_and_error(self):
206+
import_wizard = self.import_wizard.create(
207+
{
208+
"res_model": self.res_partners._name,
209+
"file": "dummy",
210+
"file_type": "text/csv",
211+
}
212+
)
213+
opts = {OPT_QUOTING: '"', OPT_SEPARATOR: ";"}
214+
215+
fields = ["name", "email", "is_company"]
216+
data = [
217+
["partner 1", "partner1@example.com", "1"],
218+
["partner 2", "partner2@example.com", "0"],
219+
]
220+
attachment = import_wizard._create_csv_attachment(
221+
fields, data, opts, "partners.csv"
222+
)
223+
with RecordCapturer(self.res_partners, []) as capture:
224+
result = import_wizard._import_one_chunk(
225+
self.res_partners._name, attachment, opts
226+
)
227+
self.assertEqual(result["messages"], [])
228+
self.assertEqual(len(capture.records), 2)
229+
230+
invalid_fields = ["name", "unknown_field"]
231+
invalid_data = [["partner 3", "x"]]
232+
invalid_attachment = import_wizard._create_csv_attachment(
233+
invalid_fields, invalid_data, opts, "invalid.csv"
234+
)
235+
with self.assertRaises(FailedJobError):
236+
import_wizard._import_one_chunk(
237+
self.res_partners._name, invalid_attachment, opts
238+
)

0 commit comments

Comments
 (0)