Skip to content

Commit 4fc0813

Browse files
[IMP] test_generic: prevent hard coded dates
- Added test to check if date methods are being called and prevent hard coded dates. - set some lists to const.
1 parent 3bb0b6c commit 4fc0813

File tree

4 files changed

+44
-15
lines changed

4 files changed

+44
-15
lines changed

electronic_store/demo/pos_order.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<field name="name">Electronic Store/0003</field>
2828
<field name="session_id" ref="pos_session_1"/>
2929
<field name="config_id" ref="pos_config_electronic_store"/>
30-
<field name="shipping_date">2024-06-06</field>
30+
<field name="shipping_date" eval="DateTime.today() + relativedelta(days=2)"/>
3131
<field name="partner_id" ref="res_partner_7"/>
3232
<field name="user_id" ref="base.user_admin"/>
3333
<field name="amount_total">12.42</field>

eyewear_shop/demo/pos_order.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<field name="name">Eyewear Shop/0003</field>
2828
<field name="session_id" ref="pos_session_1"/>
2929
<field name="config_id" ref="pos_config_eyewear_shop"/>
30-
<field name="shipping_date">2024-06-06</field>
30+
<field name="shipping_date" eval="DateTime.today() + relativedelta(days=2)"/>
3131
<field name="partner_id" ref="res_partner_52"/>
3232
<field name="user_id" ref="base.user_admin"/>
3333
<field name="amount_total">12.42</field>

pharmacy_retail/data/res_partner.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<record id="res_partner_11" model="res.partner">
44
<field name="name">Ranbaxy M Lab Labaxy</field>
55
<field name="image_1920" type="base64" file="pharmacy_retail/static/src/binary/res_partner/11-image_1920"/>
6-
<field name="x_drug_license_date">2026-12-31</field>
6+
<field name="x_drug_license_date" eval="DateTime.today() + relativedelta(years=1)"/>
77
<field name="x_drug_license_number">DL21309329098</field>
88
<field name="x_is_a_manufacturer" eval="True"/>
99
<field name="website">http://ranbaxylabs.com</field>
@@ -13,7 +13,7 @@
1313
<field name="name">Glaxo Smith Kline</field>
1414
<field name="image_1920" type="base64" file="pharmacy_retail/static/src/binary/res_partner/12-image_1920"/>
1515
<field name="phone">+1 919-483-2565</field>
16-
<field name="x_drug_license_date">2029-07-31</field>
16+
<field name="x_drug_license_date" eval="DateTime.today() + relativedelta(years=4)"/>
1717
<field name="x_drug_license_number">DL23908902398</field>
1818
<field name="x_is_a_manufacturer" eval="True"/>
1919
<field name="street">Moore Drive 5</field>
@@ -29,7 +29,7 @@
2929
<field name="name">Biocon</field>
3030
<field name="image_1920" type="base64" file="pharmacy_retail/static/src/binary/res_partner/13-image_1920"/>
3131
<field name="phone">+60 7-560 0000</field>
32-
<field name="x_drug_license_date">2039-09-14</field>
32+
<field name="x_drug_license_date" eval="DateTime.today() + relativedelta(years=14)"/>
3333
<field name="x_drug_license_number">DL-1232321098</field>
3434
<field name="x_is_a_manufacturer" eval="True"/>
3535
<field name="city">Bengaluru</field>
@@ -43,7 +43,7 @@
4343
<record id="res_partner_14" model="res.partner">
4444
<field name="name">Intas Pharmaceuticals</field>
4545
<field name="image_1920" type="base64" file="pharmacy_retail/static/src/binary/res_partner/14-image_1920"/>
46-
<field name="x_drug_license_date">2029-08-31</field>
46+
<field name="x_drug_license_date" eval="DateTime.today() + relativedelta(years=4)"/>
4747
<field name="x_drug_license_number">DL093209230990</field>
4848
<field name="x_is_a_manufacturer" eval="True"/>
4949
<field name="city">Ahmedabad</field>
@@ -56,7 +56,7 @@
5656
<record id="res_partner_15" model="res.partner">
5757
<field name="name">MedDay Pharma</field>
5858
<field name="image_1920" type="base64" file="pharmacy_retail/static/src/binary/res_partner/15-image_1920"/>
59-
<field name="x_drug_license_date">2033-12-30</field>
59+
<field name="x_drug_license_date" eval="DateTime.today() + relativedelta(years=8)"/>
6060
<field name="x_drug_license_number">DL232112321</field>
6161
<field name="x_is_a_manufacturer" eval="True"/>
6262
<field name="city">Paris</field>
@@ -69,7 +69,7 @@
6969
<field name="name">Himalaya Herbal Healthcare</field>
7070
<field name="image_1920" type="base64" file="pharmacy_retail/static/src/binary/res_partner/16-image_1920"/>
7171
<field name="phone">+1 713-863-1622</field>
72-
<field name="x_drug_license_date">2035-10-31</field>
72+
<field name="x_drug_license_date" eval="DateTime.today() + relativedelta(years=10)"/>
7373
<field name="x_drug_license_number">DL239080923098</field>
7474
<field name="x_is_a_manufacturer" eval="True"/>
7575
<field name="street">Gillingham Lane 1101</field>

tests/test_generic/tests/test_xml.py

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
"website.controller.page",
7676
]
7777

78-
models_with_user_id = [
78+
MODELS_WITH_USER_ID = [
7979
'crm.lead',
8080
'event.event',
8181
'knowledge.article.favorite',
@@ -141,6 +141,7 @@ def _check_files_in_path(self, module):
141141
self._check_static_files_usage_in_xml(tree, in_use_files)
142142
self._check_fields(tree, file_name)
143143
self._check_change_theme_method(tree, file_name)
144+
self._check_dates_are_relative(tree, file_name)
144145
if root.split('/')[-1] == 'data':
145146
self._check_view_active(tree, file_name)
146147
self._check_is_published_false(tree, file_name)
@@ -201,14 +202,14 @@ def _check_manifest(self, s, need_studio):
201202
_logger.warning("'web_studio' should not be in the dependencies.")
202203

203204
def _check_studio(self, root, file_name):
204-
models_for_studio = [
205+
MODELS_FOR_STUDIO = [
205206
"ir.actions.act_window",
206207
"ir.actions.server",
207208
"ir.model",
208209
"ir.model.fields",
209210
"ir.ui.menu",
210211
]
211-
for model in models_for_studio:
212+
for model in MODELS_FOR_STUDIO:
212213
if root.xpath(f"//record[@model='{model}']"):
213214
_logger.info("%s found in %s, needs studio", model, file_name)
214215
return True
@@ -221,18 +222,18 @@ def _check_studio(self, root, file_name):
221222
return False
222223

223224
def _check_xml_style(self, s, root, module, file_name):
224-
starts_with = [
225+
STARTS_WITH = [
225226
"<?xml version='1.0' encoding='UTF-8'?>",
226227
"<?xml version='1.0' encoding=\"UTF-8\"?>",
227228
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
228229
"<?xml version=\"1.0\" encoding='UTF-8'?>",
229230
"<?xml version=\"1.0\" encoding=\"utf-8\"?>",
230231
]
231232
first_line = s.split('\n')[0]
232-
if not any(first_line == start_line for start_line in starts_with):
233+
if not any(first_line == start_line for start_line in STARTS_WITH):
233234
_logger.warning(
234235
"XML files should begin with the following line: %s, but %s starts with %s",
235-
starts_with[0],
236+
STARTS_WITH[0],
236237
file_name,
237238
first_line,
238239
)
@@ -422,7 +423,7 @@ def _check_view_active(self, root, file_name):
422423

423424
def _check_user_is_set(self, root, previous_records):
424425
records = previous_records
425-
for model in models_with_user_id:
426+
for model in MODELS_WITH_USER_ID:
426427
for record in root.xpath(f"//record[@model='{model}']"):
427428
record_id = record.get('id')
428429
user_field = record.xpath(".//field[@name='user_id']")
@@ -441,3 +442,31 @@ def _check_change_theme_method(self, root, file_name):
441442
"You should use button_choose_theme instead of button_immediate_install in %s.",
442443
file_name,
443444
)
445+
446+
def _check_dates_are_relative(self, root, file_name):
447+
RELATIVE_DATES = [
448+
'today()',
449+
'now()',
450+
]
451+
for record in root.xpath("//record"):
452+
model_name = record.get('model')
453+
if not model_name:
454+
continue
455+
model = self.env.get(model_name)
456+
fields_set_in_record = {
457+
field for field in record.xpath('.//field')
458+
if field.getparent().get('id', False) == record.get('id') # nested record definitions
459+
}
460+
for field in fields_set_in_record:
461+
field_name = field.get('name')
462+
field_type = model._fields.get(field_name).type
463+
if field_type not in ('date', 'datetime'):
464+
continue
465+
field_eval = field.get('eval')
466+
if not field_eval or not any(date in field_eval for date in RELATIVE_DATES):
467+
_logger.warning(
468+
"Date field '%s' in model '%s' is hard coded (file: %s). ",
469+
field_name,
470+
model_name,
471+
file_name,
472+
)

0 commit comments

Comments
 (0)