Skip to content

Commit f7422e3

Browse files
committed
[FIX] support subTest context manager for Odoo version 16.0 and greater
1 parent 15efa46 commit f7422e3

File tree

5 files changed

+226
-19
lines changed

5 files changed

+226
-19
lines changed

coverage.xml

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
<?xml version="1.0" ?>
2+
<coverage version="7.9.2" timestamp="1752148777225" lines-valid="133" lines-covered="51" line-rate="0.3835" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
3+
<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.9.2 -->
4+
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
5+
<sources>
6+
<source>/home/pverkest/clients/foodles/odoo/.gitaggregate/pytest-odoo</source>
7+
</sources>
8+
<packages>
9+
<package name=".tox.py.lib.python3.10.site-packages" line-rate="0.3835" branch-rate="0" complexity="0">
10+
<classes>
11+
<class name="pytest_odoo.py" filename=".tox/py/lib/python3.10/site-packages/pytest_odoo.py" complexity="0" line-rate="0.3835" branch-rate="0">
12+
<methods/>
13+
<lines>
14+
<line number="7" hits="0"/>
15+
<line number="8" hits="0"/>
16+
<line number="9" hits="0"/>
17+
<line number="10" hits="0"/>
18+
<line number="11" hits="0"/>
19+
<line number="12" hits="0"/>
20+
<line number="13" hits="0"/>
21+
<line number="14" hits="0"/>
22+
<line number="15" hits="0"/>
23+
<line number="17" hits="0"/>
24+
<line number="18" hits="0"/>
25+
<line number="19" hits="0"/>
26+
<line number="21" hits="0"/>
27+
<line number="24" hits="0"/>
28+
<line number="25" hits="0"/>
29+
<line number="28" hits="0"/>
30+
<line number="31" hits="0"/>
31+
<line number="35" hits="0"/>
32+
<line number="38" hits="0"/>
33+
<line number="40" hits="0"/>
34+
<line number="42" hits="0"/>
35+
<line number="49" hits="0"/>
36+
<line number="50" hits="0"/>
37+
<line number="52" hits="1"/>
38+
<line number="57" hits="0"/>
39+
<line number="60" hits="0"/>
40+
<line number="67" hits="0"/>
41+
<line number="68" hits="0"/>
42+
<line number="69" hits="0"/>
43+
<line number="70" hits="0"/>
44+
<line number="71" hits="0"/>
45+
<line number="73" hits="0"/>
46+
<line number="74" hits="0"/>
47+
<line number="75" hits="0"/>
48+
<line number="79" hits="0"/>
49+
<line number="80" hits="0"/>
50+
<line number="81" hits="0"/>
51+
<line number="83" hits="0"/>
52+
<line number="85" hits="0"/>
53+
<line number="88" hits="0"/>
54+
<line number="91" hits="0"/>
55+
<line number="92" hits="0"/>
56+
<line number="93" hits="0"/>
57+
<line number="94" hits="0"/>
58+
<line number="98" hits="0"/>
59+
<line number="100" hits="0"/>
60+
<line number="102" hits="0"/>
61+
<line number="103" hits="0"/>
62+
<line number="105" hits="0"/>
63+
<line number="107" hits="1"/>
64+
<line number="110" hits="0"/>
65+
<line number="111" hits="0"/>
66+
<line number="112" hits="1"/>
67+
<line number="113" hits="0"/>
68+
<line number="114" hits="0"/>
69+
<line number="116" hits="0"/>
70+
<line number="117" hits="0"/>
71+
<line number="124" hits="1"/>
72+
<line number="125" hits="1"/>
73+
<line number="126" hits="1"/>
74+
<line number="127" hits="0"/>
75+
<line number="128" hits="0"/>
76+
<line number="129" hits="0"/>
77+
<line number="130" hits="0"/>
78+
<line number="132" hits="0"/>
79+
<line number="133" hits="0"/>
80+
<line number="138" hits="1"/>
81+
<line number="139" hits="1"/>
82+
<line number="140" hits="1"/>
83+
<line number="141" hits="1"/>
84+
<line number="142" hits="0"/>
85+
<line number="143" hits="0"/>
86+
<line number="144" hits="0"/>
87+
<line number="145" hits="0"/>
88+
<line number="146" hits="0"/>
89+
<line number="147" hits="1"/>
90+
<line number="148" hits="1"/>
91+
<line number="150" hits="1"/>
92+
<line number="151" hits="0"/>
93+
<line number="152" hits="0"/>
94+
<line number="153" hits="0"/>
95+
<line number="154" hits="0"/>
96+
<line number="157" hits="0"/>
97+
<line number="158" hits="0"/>
98+
<line number="167" hits="1"/>
99+
<line number="168" hits="1"/>
100+
<line number="169" hits="1"/>
101+
<line number="170" hits="1"/>
102+
<line number="173" hits="0"/>
103+
<line number="174" hits="0"/>
104+
<line number="182" hits="1"/>
105+
<line number="183" hits="1"/>
106+
<line number="184" hits="1"/>
107+
<line number="186" hits="0"/>
108+
<line number="187" hits="1"/>
109+
<line number="189" hits="1"/>
110+
<line number="192" hits="1"/>
111+
<line number="196" hits="1"/>
112+
<line number="197" hits="1"/>
113+
<line number="198" hits="1"/>
114+
<line number="199" hits="1"/>
115+
<line number="200" hits="1"/>
116+
<line number="203" hits="1"/>
117+
<line number="206" hits="0"/>
118+
<line number="212" hits="1"/>
119+
<line number="213" hits="1"/>
120+
<line number="214" hits="1"/>
121+
<line number="215" hits="1"/>
122+
<line number="217" hits="1"/>
123+
<line number="219" hits="0"/>
124+
<line number="226" hits="1"/>
125+
<line number="227" hits="1"/>
126+
<line number="228" hits="1"/>
127+
<line number="230" hits="1"/>
128+
<line number="231" hits="1"/>
129+
<line number="232" hits="1"/>
130+
<line number="234" hits="1"/>
131+
<line number="236" hits="0"/>
132+
<line number="239" hits="1"/>
133+
<line number="240" hits="1"/>
134+
<line number="241" hits="1"/>
135+
<line number="242" hits="1"/>
136+
<line number="243" hits="1"/>
137+
<line number="245" hits="1"/>
138+
<line number="246" hits="1"/>
139+
<line number="249" hits="0"/>
140+
<line number="251" hits="1"/>
141+
<line number="252" hits="1"/>
142+
<line number="253" hits="1"/>
143+
<line number="254" hits="0"/>
144+
<line number="255" hits="0"/>
145+
<line number="257" hits="0"/>
146+
<line number="258" hits="0"/>
147+
</lines>
148+
</class>
149+
</classes>
150+
</package>
151+
</packages>
152+
</coverage>

pytest_odoo.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import subprocess
1111
import threading
1212
from contextlib import contextmanager
13-
from unittest import mock, TestCase
13+
from unittest import mock, TestCase as UnitTestTestCase
1414
from pathlib import Path
1515
from typing import Optional
1616

@@ -217,18 +217,19 @@ def disable_odoo_test_retry():
217217
pass
218218

219219
def support_subtest():
220-
"""Odoo from version 16.0 overwrite TestCase.SubTest context manager
220+
"""Odoo from version 16.0 re-define its own TestCase.subTest context manager
221221
222-
This overwrite assume the usage of OdooTestResult which we are not
223-
using with pytest-odoo. So this restaure unitest SubTest Context manager
222+
Odoo assume the usage of OdooTestResult which is not our case
223+
using with pytest-odoo. So this fallback to the unitest.TestCase.subTest
224+
Context manager
224225
"""
225226
try:
226-
from odoo.tests import BaseCase
227-
BaseCase.subTest = TestCase.subTest
227+
from odoo.tests.case import TestCase
228+
TestCase.subTest = UnitTestTestCase.subTest
228229

229230
from odoo.tests.case import _Outcome
230231
_Outcome.result_supports_subtests = False
231-
except (ImportError, AttributeError):
232+
except ImportError:
232233
# Odoo <= 15.0
233234
pass
234235

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from unittest.mock import MagicMock
22
common = MagicMock()
3+
from . import case
34

4-
5-
class BaseCase:
5+
class BaseCase(case.TestCase):
66

77
def run(*args, **kwargs):
88
super().run(*args, **kwargs)

tests/mock/odoo/odoo/tests/case.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import contextlib
2+
3+
4+
class TestCase:
5+
6+
@contextlib.contextmanager
7+
def subTest(self, **kwargs):
8+
"""Simulate odoo TestCase.subTest from version 15.0"""
9+
10+
11+
class _Outcome:
12+
pass

tests/test_pytest_odoo.py

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
from _pytest import pathlib as pytest_pathlib
77
from pytest_odoo import (
88
_find_manifest_path,
9-
monkey_patch_resolve_pkg_root_and_module_name,
109
disable_odoo_test_retry,
10+
monkey_patch_resolve_pkg_root_and_module_name,
11+
support_subtest,
1112
)
1213

1314

@@ -93,7 +94,7 @@ def test_disable_odoo_test_retry(self):
9394

9495
def restore_basecase_run():
9596
BaseCase.run = original_basecase_run
96-
97+
9798
self.addCleanup(restore_basecase_run)
9899

99100
disable_odoo_test_retry()
@@ -107,26 +108,67 @@ def test_disable_odoo_test_retry_ignore_run_doesnt_exists(self):
107108

108109
def restore_basecase_run():
109110
BaseCase.run = original_basecase_run
110-
111+
111112
self.addCleanup(restore_basecase_run)
112-
113+
113114
del BaseCase.run
114-
115+
115116
disable_odoo_test_retry()
116117
self.assertFalse(hasattr(BaseCase, "run"))
117118

118119

119120

120121
def test_import_error(self):
121-
from odoo import tests
122-
122+
from odoo import tests
123+
123124
original_BaseCase = tests.BaseCase
124125

125126
def restore_basecase():
126127
tests.BaseCase = original_BaseCase
127-
128+
128129
self.addCleanup(restore_basecase)
129-
130+
130131
del tests.BaseCase
131132
disable_odoo_test_retry()
132-
133+
134+
def test_support_subtest(self):
135+
from odoo.tests import case
136+
137+
original_test_case = case.TestCase
138+
original_outcome = case._Outcome
139+
140+
def restore():
141+
case.TestCase = original_test_case
142+
case._Outcome = original_outcome
143+
144+
self.addCleanup(restore)
145+
support_subtest()
146+
from odoo.tests import BaseCase
147+
148+
self.assertTrue(BaseCase.subTest is TestCase.subTest)
149+
150+
def test_support_subtest_no_base_case(self):
151+
from odoo import tests
152+
153+
original_BaseCase = tests.BaseCase
154+
155+
def restore_basecase():
156+
tests.BaseCase = original_BaseCase
157+
158+
self.addCleanup(restore_basecase)
159+
160+
del tests.BaseCase
161+
support_subtest()
162+
163+
def test_support_subtest_import_error(self):
164+
from odoo.tests import case
165+
166+
original_odoo_test_case = case.TestCase
167+
168+
def restore_testcase():
169+
case.TestCase = original_odoo_test_case
170+
171+
self.addCleanup(restore_testcase)
172+
173+
del case.TestCase
174+
support_subtest()

0 commit comments

Comments
 (0)