Skip to content

Commit c9cc8d3

Browse files
cammarosanofda-odoo
authored andcommitted
[IMP] add all languages test
This is a sanity check test. It should allow us to detect false-positive OLS05068 (unknown language code) warnings due to some error in acquiring the list of valid language codes from res.lang.csv (e.g. error in parsing CSV files introduced by changes in the codebase). It basically loads an Odoo codebase (as per COMMNUNITY_PATH env variable) and checks for diagnostics in a list of currently known valid language codes.
1 parent b736762 commit c9cc8d3

3 files changed

Lines changed: 200 additions & 1 deletion

File tree

server/tests/data/addons/module_lang_test/__manifest__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
'data/res_lang.xml',
66
'data/lang_test_items.xml',
77
'data/extra_languages.xml',
8+
'data/all_langs_test.xml',
89
],
910
'license': 'LGPL-3',
1011
}
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<odoo>
3+
<!-- All language codes from res.lang.csv + their base languages.
4+
None of these should trigger OLS05068 (unknown language code). -->
5+
<record id="all_langs_item" model="lang_test.item">
6+
<field name="name">All Languages Test</field>
7+
<!-- Full language codes from res.lang.csv -->
8+
<field name="name@en_US">x</field>
9+
<field name="name@am_ET">x</field>
10+
<field name="name@ar_001">x</field>
11+
<field name="name@ar_SY">x</field>
12+
<field name="name@az_AZ">x</field>
13+
<field name="name@eu_ES">x</field>
14+
<field name="name@be_BY">x</field>
15+
<field name="name@bn_IN">x</field>
16+
<field name="name@bs_BA">x</field>
17+
<field name="name@bg_BG">x</field>
18+
<field name="name@ca_ES">x</field>
19+
<field name="name@zh_CN">x</field>
20+
<field name="name@zh_HK">x</field>
21+
<field name="name@zh_TW">x</field>
22+
<field name="name@hr_HR">x</field>
23+
<field name="name@cs_CZ">x</field>
24+
<field name="name@da_DK">x</field>
25+
<field name="name@nl_BE">x</field>
26+
<field name="name@nl_NL">x</field>
27+
<field name="name@en_AU">x</field>
28+
<field name="name@en_CA">x</field>
29+
<field name="name@en_GB">x</field>
30+
<field name="name@en_IN">x</field>
31+
<field name="name@en_NZ">x</field>
32+
<field name="name@et_EE">x</field>
33+
<field name="name@fi_FI">x</field>
34+
<field name="name@fr_BE">x</field>
35+
<field name="name@fr_CA">x</field>
36+
<field name="name@fr_CH">x</field>
37+
<field name="name@fr_FR">x</field>
38+
<field name="name@gl_ES">x</field>
39+
<field name="name@ka_GE">x</field>
40+
<field name="name@de_DE">x</field>
41+
<field name="name@de_CH">x</field>
42+
<field name="name@el_GR">x</field>
43+
<field name="name@gu_IN">x</field>
44+
<field name="name@he_IL">x</field>
45+
<field name="name@hi_IN">x</field>
46+
<field name="name@hu_HU">x</field>
47+
<field name="name@id_ID">x</field>
48+
<field name="name@it_IT">x</field>
49+
<field name="name@ja_JP">x</field>
50+
<field name="name@kab_DZ">x</field>
51+
<field name="name@km_KH">x</field>
52+
<field name="name@ko_KP">x</field>
53+
<field name="name@ko_KR">x</field>
54+
<field name="name@lo_LA">x</field>
55+
<field name="name@lv_LV">x</field>
56+
<field name="name@lt_LT">x</field>
57+
<field name="name@lb_LU">x</field>
58+
<field name="name@mk_MK">x</field>
59+
<field name="name@ml_IN">x</field>
60+
<field name="name@mn_MN">x</field>
61+
<field name="name@ms_MY">x</field>
62+
<field name="name@my_MM">x</field>
63+
<field name="name@nb_NO">x</field>
64+
<field name="name@fa_IR">x</field>
65+
<field name="name@pl_PL">x</field>
66+
<field name="name@pt_AO">x</field>
67+
<field name="name@pt_BR">x</field>
68+
<field name="name@pt_PT">x</field>
69+
<field name="name@ro_RO">x</field>
70+
<field name="name@ru_RU">x</field>
71+
<field name="name@sr@Cyrl">x</field>
72+
<field name="name@sr@latin">x</field>
73+
<field name="name@sk_SK">x</field>
74+
<field name="name@sl_SI">x</field>
75+
<field name="name@es_419">x</field>
76+
<field name="name@es_AR">x</field>
77+
<field name="name@es_BO">x</field>
78+
<field name="name@es_CL">x</field>
79+
<field name="name@es_CO">x</field>
80+
<field name="name@es_CR">x</field>
81+
<field name="name@es_DO">x</field>
82+
<field name="name@es_EC">x</field>
83+
<field name="name@es_GT">x</field>
84+
<field name="name@es_MX">x</field>
85+
<field name="name@es_PA">x</field>
86+
<field name="name@es_PE">x</field>
87+
<field name="name@es_PY">x</field>
88+
<field name="name@es_UY">x</field>
89+
<field name="name@es_VE">x</field>
90+
<field name="name@es_ES">x</field>
91+
<field name="name@sw">x</field>
92+
<field name="name@sv_SE">x</field>
93+
<field name="name@th_TH">x</field>
94+
<field name="name@tl_PH">x</field>
95+
<field name="name@tr_TR">x</field>
96+
<field name="name@uk_UA">x</field>
97+
<field name="name@vi_VN">x</field>
98+
<field name="name@sq_AL">x</field>
99+
<field name="name@te_IN">x</field>
100+
<!-- Base language codes -->
101+
<field name="name@am">x</field>
102+
<field name="name@ar">x</field>
103+
<field name="name@az">x</field>
104+
<field name="name@be">x</field>
105+
<field name="name@bg">x</field>
106+
<field name="name@bn">x</field>
107+
<field name="name@bs">x</field>
108+
<field name="name@ca">x</field>
109+
<field name="name@cs">x</field>
110+
<field name="name@da">x</field>
111+
<field name="name@de">x</field>
112+
<field name="name@el">x</field>
113+
<field name="name@en">x</field>
114+
<field name="name@es">x</field>
115+
<field name="name@et">x</field>
116+
<field name="name@eu">x</field>
117+
<field name="name@fa">x</field>
118+
<field name="name@fi">x</field>
119+
<field name="name@fr">x</field>
120+
<field name="name@gl">x</field>
121+
<field name="name@gu">x</field>
122+
<field name="name@he">x</field>
123+
<field name="name@hi">x</field>
124+
<field name="name@hr">x</field>
125+
<field name="name@hu">x</field>
126+
<field name="name@id">x</field>
127+
<field name="name@it">x</field>
128+
<field name="name@ja">x</field>
129+
<field name="name@ka">x</field>
130+
<field name="name@kab">x</field>
131+
<field name="name@km">x</field>
132+
<field name="name@ko">x</field>
133+
<field name="name@lb">x</field>
134+
<field name="name@lo">x</field>
135+
<field name="name@lt">x</field>
136+
<field name="name@lv">x</field>
137+
<field name="name@mk">x</field>
138+
<field name="name@ml">x</field>
139+
<field name="name@mn">x</field>
140+
<field name="name@ms">x</field>
141+
<field name="name@my">x</field>
142+
<field name="name@nb">x</field>
143+
<field name="name@nl">x</field>
144+
<field name="name@pl">x</field>
145+
<field name="name@pt">x</field>
146+
<field name="name@ro">x</field>
147+
<field name="name@ru">x</field>
148+
<field name="name@sk">x</field>
149+
<field name="name@sl">x</field>
150+
<field name="name@sq">x</field>
151+
<field name="name@sv">x</field>
152+
<field name="name@te">x</field>
153+
<field name="name@th">x</field>
154+
<field name="name@tl">x</field>
155+
<field name="name@tr">x</field>
156+
<field name="name@uk">x</field>
157+
<field name="name@vi">x</field>
158+
<field name="name@zh">x</field>
159+
</record>
160+
<!-- Invalid language code - should trigger OLS05068 -->
161+
<record id="invalid_lang_item" model="lang_test.item">
162+
<field name="name@non_existing_lang">x</field>
163+
</record>
164+
</odoo>

server/tests/test_language_updates.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::collections::{HashMap, HashSet};
22
use std::path::PathBuf;
33

4-
use lsp_types::{TextDocumentContentChangeEvent, VersionedTextDocumentIdentifier};
4+
use lsp_types::{NumberOrString, TextDocumentContentChangeEvent, VersionedTextDocumentIdentifier};
55
use odoo_ls_server::core::config::ConfigFile;
66
use odoo_ls_server::core::file_mgr::FileMgr;
77
use odoo_ls_server::core::odoo::Odoo;
@@ -233,6 +233,40 @@ fn test_additional_languages_config() {
233233
);
234234
}
235235

236+
/// Test that all language codes from res.lang.csv are recognized as valid.
237+
/// This ensures no false positives due to error in parsing the main source of language codes.
238+
#[test]
239+
fn test_no_false_positives_from_res_lang_csv() {
240+
let (mut odoo, config) = setup_server(true);
241+
let mut session = create_init_session(&mut odoo, config);
242+
243+
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
244+
.join("tests/data/addons/module_lang_test/data/all_langs_test.xml")
245+
.sanitize();
246+
247+
let diagnostics = get_diagnostics_for_path(&mut session, &path);
248+
249+
let ols05068: Vec<_> = diagnostics
250+
.iter()
251+
.filter(|d| {
252+
matches!(&d.code, Some(NumberOrString::String(s)) if s == "OLS05068")
253+
})
254+
.collect();
255+
256+
assert_eq!(
257+
ols05068.len(),
258+
1,
259+
"Expected exactly 1 OLS05068 (for non_existing_lang), got {}: {:?}",
260+
ols05068.len(),
261+
ols05068
262+
);
263+
assert!(
264+
ols05068[0].message.contains("non_existing_lang"),
265+
"OLS05068 should be for non_existing_lang, got: {}",
266+
ols05068[0].message
267+
);
268+
}
269+
236270
/// Test that changing additional_languages via config update clears/restores OLS05068 diagnostics.
237271
#[test]
238272
fn test_config_additional_languages_updates_diagnostics() {

0 commit comments

Comments
 (0)