oddb2xml 2.7.1 → 2.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +1 -1
- data/.standard.yml +2 -0
- data/Gemfile +3 -3
- data/History.txt +8 -0
- data/README.md +1 -1
- data/Rakefile +24 -23
- data/bin/check_artikelstamm +11 -11
- data/bin/compare_v5 +23 -23
- data/bin/oddb2xml +14 -13
- data/lib/oddb2xml.rb +1 -1
- data/lib/oddb2xml/builder.rb +1070 -1038
- data/lib/oddb2xml/calc.rb +232 -233
- data/lib/oddb2xml/chapter_70_hack.rb +38 -32
- data/lib/oddb2xml/cli.rb +252 -236
- data/lib/oddb2xml/compare.rb +70 -59
- data/lib/oddb2xml/compositions_syntax.rb +448 -430
- data/lib/oddb2xml/compressor.rb +20 -20
- data/lib/oddb2xml/downloader.rb +153 -127
- data/lib/oddb2xml/extractor.rb +302 -289
- data/lib/oddb2xml/options.rb +34 -35
- data/lib/oddb2xml/parslet_compositions.rb +263 -269
- data/lib/oddb2xml/semantic_check.rb +39 -33
- data/lib/oddb2xml/util.rb +163 -163
- data/lib/oddb2xml/version.rb +1 -1
- data/lib/oddb2xml/xml_definitions.rb +32 -33
- data/oddb2xml.gemspec +31 -32
- data/spec/artikelstamm_spec.rb +111 -110
- data/spec/builder_spec.rb +489 -505
- data/spec/calc_spec.rb +552 -593
- data/spec/check_artikelstamm_spec.rb +26 -26
- data/spec/cli_spec.rb +173 -174
- data/spec/compare_spec.rb +9 -11
- data/spec/composition_syntax_spec.rb +390 -409
- data/spec/compressor_spec.rb +48 -48
- data/spec/data/transfer.dat +1 -0
- data/spec/data_helper.rb +47 -49
- data/spec/downloader_spec.rb +247 -260
- data/spec/extractor_spec.rb +171 -159
- data/spec/galenic_spec.rb +233 -256
- data/spec/options_spec.rb +116 -119
- data/spec/parslet_spec.rb +833 -861
- data/spec/spec_helper.rb +154 -153
- data/test_options.rb +39 -42
- data/tools/win_fetch_cacerts.rb +2 -3
- metadata +19 -3
data/spec/builder_spec.rb
CHANGED
@@ -1,41 +1,38 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'spec_helper'
|
1
|
+
require "spec_helper"
|
4
2
|
require "rexml/document"
|
5
|
-
require
|
6
|
-
include REXML
|
3
|
+
require "webmock/rspec"
|
7
4
|
RUN_ALL = true
|
8
5
|
|
9
6
|
# TODO: Add articles which contain these values
|
10
7
|
# not done, because it was easy to verify this by running on the command line grep 'LIMPTS' oddb_article.xml | sort | uniq
|
11
|
-
ARTICLE_ATTRIBUTE_TESTS =
|
12
|
-
[
|
13
|
-
[
|
14
|
-
[
|
15
|
-
[
|
16
|
-
[
|
8
|
+
ARTICLE_ATTRIBUTE_TESTS = [
|
9
|
+
["ARTICLE", "CREATION_DATETIME", Oddb2xml::DATE_REGEXP],
|
10
|
+
["ARTICLE", "PROD_DATE", Oddb2xml::DATE_REGEXP],
|
11
|
+
["ARTICLE", "VALID_DATE", Oddb2xml::DATE_REGEXP],
|
12
|
+
["ARTICLE/ART", "SHA256", /[a-f0-9]{32}/],
|
13
|
+
["ARTICLE/ART", "DT", /\d{4}-\d{2}-\d{2}/]
|
17
14
|
]
|
18
15
|
|
19
|
-
ARTICLE_MISSING_ELEMENTS =
|
20
|
-
[
|
21
|
-
[
|
22
|
-
[
|
23
|
-
[
|
24
|
-
[
|
25
|
-
[
|
26
|
-
[
|
27
|
-
[
|
16
|
+
ARTICLE_MISSING_ELEMENTS = [
|
17
|
+
["ARTICLE/ART/LIMPTS", "10"],
|
18
|
+
["ARTICLE/ART/LIMPTS", "30"],
|
19
|
+
["ARTICLE/ART/LIMPTS", "40"],
|
20
|
+
["ARTICLE/ART/LIMPTS", "50"],
|
21
|
+
["ARTICLE/ART/LIMPTS", "60"],
|
22
|
+
["ARTICLE/ART/LIMPTS", "80"],
|
23
|
+
["ARTICLE/ART/LIMPTS", "100"],
|
24
|
+
["ARTICLE/ART/SLOPLUS", "1"]
|
28
25
|
]
|
29
26
|
|
30
|
-
ARTICLE_ZURROSE_ELEMENTS =
|
31
|
-
[
|
32
|
-
[
|
33
|
-
[
|
34
|
-
[
|
35
|
-
[
|
36
|
-
[
|
37
|
-
[
|
38
|
-
[
|
27
|
+
ARTICLE_ZURROSE_ELEMENTS = [
|
28
|
+
["ARTICLE/ART/REF_DATA", "0"],
|
29
|
+
["ARTICLE/ART/ARTCOMP/COMPNO", "7601001000896"],
|
30
|
+
["ARTICLE/ART/ARTPRI/PTYP", "PEXF"],
|
31
|
+
["ARTICLE/ART/ARTPRI/PTYP", "PPUB"],
|
32
|
+
["ARTICLE/ART/ARTPRI/PTYP", "ZURROSE"],
|
33
|
+
["ARTICLE/ART/ARTPRI/PTYP", "ZURROSEPUB"],
|
34
|
+
["ARTICLE/ART/ARTINS/NINCD", "13"],
|
35
|
+
["ARTICLE/ART/ARTINS/NINCD", "20"]
|
39
36
|
]
|
40
37
|
|
41
38
|
ARTICLE_NAROPIN = %(<REF_DATA>1</REF_DATA>
|
@@ -59,275 +56,268 @@ ARTICLE_NAROPIN = %(<REF_DATA>1</REF_DATA>
|
|
59
56
|
</ARTBAR>
|
60
57
|
</ART>)
|
61
58
|
|
62
|
-
ARTICLE_COMMON_ELEMENTS =
|
63
|
-
[
|
64
|
-
[
|
65
|
-
[
|
66
|
-
[
|
67
|
-
[
|
68
|
-
[
|
69
|
-
[
|
70
|
-
[
|
71
|
-
[
|
72
|
-
[
|
73
|
-
[
|
74
|
-
[
|
75
|
-
[
|
76
|
-
[
|
77
|
-
[
|
78
|
-
[
|
79
|
-
[
|
80
|
-
[
|
81
|
-
[
|
82
|
-
[
|
83
|
-
[
|
84
|
-
[
|
85
|
-
[
|
86
|
-
[
|
87
|
-
[
|
59
|
+
ARTICLE_COMMON_ELEMENTS = [
|
60
|
+
["ARTICLE/ART/REF_DATA", "1"],
|
61
|
+
["ARTICLE/ART/SMCAT", "A"],
|
62
|
+
["ARTICLE/ART/SMCAT", "B"],
|
63
|
+
["ARTICLE/ART/SMCAT", "C"],
|
64
|
+
["ARTICLE/ART/SMCAT", "D"],
|
65
|
+
["ARTICLE/ART/GEN_PRODUCTION", "X"],
|
66
|
+
["ARTICLE/ART/DRUG_INDEX", "d"],
|
67
|
+
["ARTICLE/ART/INSULIN_CATEGORY", "Insulinanalog: schnell wirkend"],
|
68
|
+
["ARTICLE/ART/SMNO", "16105058"],
|
69
|
+
["ARTICLE/ART/PRODNO", "1610501"],
|
70
|
+
["ARTICLE/ART/VAT", "2"],
|
71
|
+
["ARTICLE/ART/SALECD", "A"],
|
72
|
+
["ARTICLE/ART/SALECD", "I"],
|
73
|
+
["ARTICLE/ART/COOL", "1"],
|
74
|
+
["ARTICLE/ART/LIMPTS", "20"],
|
75
|
+
["ARTICLE/ART/CDBG", "Y"],
|
76
|
+
["ARTICLE/ART/CDBG", "N"],
|
77
|
+
["ARTICLE/ART/BG", "Y"],
|
78
|
+
["ARTICLE/ART/BG", "N"],
|
79
|
+
["ARTICLE/ART/ARTBAR/BC", Oddb2xml::ORPHAN_GTIN.to_s],
|
80
|
+
["ARTICLE/ART/ARTBAR/BC", Oddb2xml::FRIDGE_GTIN.to_s],
|
81
|
+
["ARTICLE/ART/SYN1D", "Hirudoid"],
|
82
|
+
["ARTICLE/ART/SYN1F", "Hirudoid"],
|
83
|
+
["ARTICLE/ART/SLOPLUS", "2"],
|
84
|
+
["ARTICLE/ART/ARTINS/NINCD", "10"]
|
88
85
|
]
|
89
86
|
|
90
|
-
CODE_ATTRIBUTE_TESTS =
|
91
|
-
[
|
92
|
-
[
|
93
|
-
[
|
94
|
-
[
|
87
|
+
CODE_ATTRIBUTE_TESTS = [
|
88
|
+
["CODE", "CREATION_DATETIME", Oddb2xml::DATE_REGEXP],
|
89
|
+
["CODE", "PROD_DATE", Oddb2xml::DATE_REGEXP],
|
90
|
+
["CODE", "VALID_DATE", Oddb2xml::DATE_REGEXP],
|
91
|
+
["CODE/CD", "DT", ""]
|
95
92
|
]
|
96
93
|
|
97
|
-
CODE_MISSING_ELEMENT_TESTS = [
|
98
|
-
]
|
94
|
+
CODE_MISSING_ELEMENT_TESTS = []
|
99
95
|
|
100
96
|
CODE_ELEMENT_TESTS = [
|
101
|
-
[
|
102
|
-
[
|
103
|
-
[
|
104
|
-
[
|
105
|
-
[
|
106
|
-
[
|
107
|
-
[
|
108
|
-
[
|
109
|
-
[
|
110
|
-
[
|
111
|
-
[
|
112
|
-
[
|
113
|
-
[
|
114
|
-
[
|
115
|
-
[
|
116
|
-
[
|
97
|
+
["CODE/CD/CDTYP", "11"],
|
98
|
+
["CODE/CD/CDTYP", "13"],
|
99
|
+
["CODE/CD/CDTYP", "14"],
|
100
|
+
["CODE/CD/CDTYP", "15"],
|
101
|
+
["CODE/CD/CDTYP", "16"],
|
102
|
+
["CODE/CD/CDVAL", "A"],
|
103
|
+
["CODE/CD/CDVAL", "B"],
|
104
|
+
["CODE/CD/CDVAL", "C"],
|
105
|
+
["CODE/CD/CDVAL", "D"],
|
106
|
+
["CODE/CD/CDVAL", "X"],
|
107
|
+
["CODE/CD/DSCRSD", "Kontraindiziert"],
|
108
|
+
["CODE/CD/DSCRSD", "Kombination meiden"],
|
109
|
+
["CODE/CD/DSCRSD", "Monitorisieren"],
|
110
|
+
["CODE/CD/DSCRSD", "Vorsichtsmassnahmen"],
|
111
|
+
["CODE/CD/DSCRSD", "keine Massnahmen"],
|
112
|
+
["CODE/CD/DEL", "false"]
|
117
113
|
]
|
118
114
|
|
119
|
-
INTERACTION_ATTRIBUTE_TESTS =
|
120
|
-
[
|
121
|
-
[
|
122
|
-
[
|
123
|
-
[
|
124
|
-
[
|
115
|
+
INTERACTION_ATTRIBUTE_TESTS = [
|
116
|
+
["INTERACTION", "CREATION_DATETIME", Oddb2xml::DATE_REGEXP],
|
117
|
+
["INTERACTION", "PROD_DATE", Oddb2xml::DATE_REGEXP],
|
118
|
+
["INTERACTION", "VALID_DATE", Oddb2xml::DATE_REGEXP],
|
119
|
+
["INTERACTION/IX", "SHA256", /[a-f0-9]{32}/],
|
120
|
+
["INTERACTION/IX", "DT", ""]
|
125
121
|
]
|
126
122
|
|
127
123
|
INTERACTION_MISSING_ELEMENT_TESTS = [
|
128
|
-
[
|
129
|
-
[
|
130
|
-
[
|
131
|
-
[
|
132
|
-
[
|
124
|
+
["INTERACTION/IX/EFFD", "Kombination meiden"],
|
125
|
+
["INTERACTION/IX/EFFD", "Kontraindiziert"],
|
126
|
+
["INTERACTION/IX/EFFD", "Monitorisieren"],
|
127
|
+
["INTERACTION/IX/EFFD", "Vorsichtsmassnahmen"],
|
128
|
+
["INTERACTION/IX/DEL", "true"] # Never found???
|
133
129
|
]
|
134
130
|
|
135
131
|
INTERACTION_ELEMENT_TESTS = [
|
136
|
-
[
|
137
|
-
[
|
138
|
-
[
|
139
|
-
[
|
140
|
-
[
|
141
|
-
[
|
142
|
-
[
|
143
|
-
[
|
144
|
-
|
145
|
-
|
146
|
-
LIMITATION_ATTRIBUTE_TESTS =
|
147
|
-
[
|
148
|
-
[
|
149
|
-
[
|
150
|
-
[
|
151
|
-
[
|
132
|
+
["INTERACTION/IX/IXNO", "2"],
|
133
|
+
["INTERACTION/IX/TITD", "Keine Interaktion"],
|
134
|
+
["INTERACTION/IX/GRP1D", "N06AB06"],
|
135
|
+
["INTERACTION/IX/GRP2D", "M03BX02"],
|
136
|
+
["INTERACTION/IX/EFFD", "Keine Interaktion."],
|
137
|
+
["INTERACTION/IX/MECHD", /Tizanidin wird über CYP1A2 metabolisiert/],
|
138
|
+
["INTERACTION/IX/MEASD", /Die Kombination aus Sertralin und Tizanidin/],
|
139
|
+
["INTERACTION/IX/DEL", "false"]
|
140
|
+
]
|
141
|
+
|
142
|
+
LIMITATION_ATTRIBUTE_TESTS = [
|
143
|
+
["LIMITATION", "CREATION_DATETIME", Oddb2xml::DATE_REGEXP],
|
144
|
+
["LIMITATION", "PROD_DATE", Oddb2xml::DATE_REGEXP],
|
145
|
+
["LIMITATION", "VALID_DATE", Oddb2xml::DATE_REGEXP],
|
146
|
+
["LIMITATION/LIM", "SHA256", /[a-f0-9]{32}/],
|
147
|
+
["LIMITATION/LIM", "DT", ""]
|
152
148
|
]
|
153
149
|
|
154
150
|
# Found by grep LIMTYP oddb_limitation.xml | sort | uniq
|
155
151
|
LIMITATION_MISSING_ELEMENT_TESTS = [
|
156
|
-
[
|
157
|
-
[
|
158
|
-
[
|
159
|
-
[
|
160
|
-
[
|
152
|
+
["LIMITATION/LIM/SwissmedicNo8", "62089002"],
|
153
|
+
["LIMITATION/LIM/Pharmacode", "0"],
|
154
|
+
["LIMITATION/LIM/LIMTYP", "AUD"],
|
155
|
+
["LIMITATION/LIM/LIMTYP", "KOM"],
|
156
|
+
["LIMITATION/LIM/LIMTYP", "ZEI"]
|
161
157
|
]
|
162
158
|
|
163
159
|
LIMITATION_ELEMENT_TESTS = [
|
164
|
-
[
|
165
|
-
[
|
166
|
-
[
|
167
|
-
[
|
168
|
-
[
|
169
|
-
[
|
170
|
-
[
|
171
|
-
[
|
172
|
-
[
|
173
|
-
[
|
174
|
-
[
|
175
|
-
[
|
176
|
-
[
|
177
|
-
[
|
178
|
-
[
|
179
|
-
[
|
180
|
-
[
|
181
|
-
]
|
182
|
-
|
183
|
-
SUBSTANCE_ATTRIBUTE_TESTS = [
|
184
|
-
['SUBSTANCE', 'CREATION_DATETIME', Oddb2xml::DATE_REGEXP],
|
185
|
-
['SUBSTANCE', 'PROD_DATE', Oddb2xml::DATE_REGEXP],
|
186
|
-
['SUBSTANCE', 'VALID_DATE', Oddb2xml::DATE_REGEXP],
|
187
|
-
['SUBSTANCE/SB', 'SHA256', /[a-f0-9]{32}/],
|
188
|
-
['SUBSTANCE/SB', 'DT', ''],
|
160
|
+
["LIMITATION/LIM/LIMVAL", "10"],
|
161
|
+
["LIMITATION/LIM/LIMVAL", "20"],
|
162
|
+
["LIMITATION/LIM/LIMVAL", "30"],
|
163
|
+
["LIMITATION/LIM/LIMVAL", "40"],
|
164
|
+
["LIMITATION/LIM/LIMVAL", "50"],
|
165
|
+
["LIMITATION/LIM/LIMVAL", "60"],
|
166
|
+
["LIMITATION/LIM/LIMVAL", "80"],
|
167
|
+
["LIMITATION/LIM/LIMVAL", "100"],
|
168
|
+
["LIMITATION/LIM/IT", "07.02.40."],
|
169
|
+
["LIMITATION/LIM/LIMTYP", "DIA"],
|
170
|
+
["LIMITATION/LIM/LIMTYP", "PKT"],
|
171
|
+
["LIMITATION/LIM/LIMNAMEBAG", "070240"],
|
172
|
+
["LIMITATION/LIM/LIMNIV", "IP"],
|
173
|
+
["LIMITATION/LIM/VDAT", /\d{2}\.\d{2}\.\d{4}/],
|
174
|
+
["LIMITATION/LIM/DSCRD", /Therapiedauer/],
|
175
|
+
["LIMITATION/LIM/DSCRF", /Traitement de la pneumonie/],
|
176
|
+
["LIMITATION/LIM/SwissmedicNo5", "28486"]
|
189
177
|
]
|
190
178
|
|
191
|
-
|
179
|
+
SUBSTANCE_ATTRIBUTE_TESTS = [
|
180
|
+
["SUBSTANCE", "CREATION_DATETIME", Oddb2xml::DATE_REGEXP],
|
181
|
+
["SUBSTANCE", "PROD_DATE", Oddb2xml::DATE_REGEXP],
|
182
|
+
["SUBSTANCE", "VALID_DATE", Oddb2xml::DATE_REGEXP],
|
183
|
+
["SUBSTANCE/SB", "SHA256", /[a-f0-9]{32}/],
|
184
|
+
["SUBSTANCE/SB", "DT", ""]
|
192
185
|
]
|
193
186
|
|
187
|
+
SUBSTANCE_MISSING_ELEMENT_TESTS = []
|
188
|
+
|
194
189
|
SUBSTANCE_ELEMENT_TESTS = [
|
195
|
-
[
|
196
|
-
[
|
190
|
+
["SUBSTANCE/SB/SUBNO", "1"],
|
191
|
+
["SUBSTANCE/SB/NAML", "Linezolidum"]
|
197
192
|
]
|
198
193
|
|
199
194
|
# Betriebe and Medizinalpersonen don't work at the moment
|
200
|
-
BETRIEB_ATTRIBUTE_TESTS =
|
201
|
-
[
|
202
|
-
[
|
203
|
-
[
|
204
|
-
[
|
195
|
+
BETRIEB_ATTRIBUTE_TESTS = [
|
196
|
+
["Betriebe", "CREATION_DATETIME", Oddb2xml::DATE_REGEXP],
|
197
|
+
["Betriebe", "PROD_DATE", Oddb2xml::DATE_REGEXP],
|
198
|
+
["Betriebe", "VALID_DATE", Oddb2xml::DATE_REGEXP],
|
199
|
+
["Betriebe/Betrieb", "DT", ""]
|
205
200
|
]
|
206
201
|
|
207
|
-
BETRIEB_MISSING_ELEMENT_TESTS = [
|
208
|
-
]
|
202
|
+
BETRIEB_MISSING_ELEMENT_TESTS = []
|
209
203
|
|
210
204
|
BETRIEB_ELEMENT_TESTS = [
|
211
|
-
[
|
212
|
-
[
|
213
|
-
[
|
214
|
-
[
|
215
|
-
[
|
216
|
-
[
|
217
|
-
[
|
218
|
-
[
|
219
|
-
[
|
220
|
-
[
|
221
|
-
[
|
205
|
+
["Betriebe/Betrieb/GLN_Betrieb", "974633"],
|
206
|
+
["Betriebe/Betrieb/Betriebsname_1", "Betriebsname_1"],
|
207
|
+
["Betriebe/Betrieb/Betriebsname_2", "Betriebsname_2"],
|
208
|
+
["Betriebe/Betrieb/Strasse", "Strasse"],
|
209
|
+
["Betriebe/Betrieb/Nummer", "Nummer"],
|
210
|
+
["Betriebe/Betrieb/PLZ", "PLZ"],
|
211
|
+
["Betriebe/Betrieb/Ort", "Ort"],
|
212
|
+
["Betriebe/Betrieb/Bewilligungskanton", "Bewilligungskanton"],
|
213
|
+
["Betriebe/Betrieb/Land", "Land"],
|
214
|
+
["Betriebe/Betrieb/Betriebstyp", "Betriebstyp"],
|
215
|
+
["Betriebe/Betrieb/BTM_Berechtigung", "BTM_Berechtigung"]
|
222
216
|
]
|
223
217
|
|
224
|
-
MEDIZINALPERSON_ATTRIBUTE_TESTS =
|
225
|
-
[
|
226
|
-
[
|
227
|
-
[
|
228
|
-
[
|
218
|
+
MEDIZINALPERSON_ATTRIBUTE_TESTS = [
|
219
|
+
["Personen", "CREATION_DATETIME", Oddb2xml::DATE_REGEXP],
|
220
|
+
["Personen", "PROD_DATE", Oddb2xml::DATE_REGEXP],
|
221
|
+
["Personen", "VALID_DATE", Oddb2xml::DATE_REGEXP],
|
222
|
+
["Personen/Person", "DT", ""]
|
229
223
|
]
|
230
224
|
|
231
|
-
MEDIZINALPERSON_MISSING_ELEMENT_TESTS = [
|
232
|
-
]
|
225
|
+
MEDIZINALPERSON_MISSING_ELEMENT_TESTS = []
|
233
226
|
|
234
227
|
MEDIZINALPERSON_ELEMENT_TESTS = [
|
235
|
-
[
|
236
|
-
[
|
237
|
-
[
|
238
|
-
[
|
239
|
-
[
|
240
|
-
[
|
241
|
-
[
|
242
|
-
[
|
243
|
-
[
|
244
|
-
[
|
228
|
+
["Personen/Person/GLN_Person", "56459"],
|
229
|
+
["Personen/Person/Name", "Name"],
|
230
|
+
["Personen/Person/Vorname", "Vorname"],
|
231
|
+
["Personen/Person/PLZ", "PLZ"],
|
232
|
+
["Personen/Person/Ort", "Ort"],
|
233
|
+
["Personen/Person/Bewilligungskanton", "Bewilligungskanton"],
|
234
|
+
["Personen/Person/Land", "Land"],
|
235
|
+
["Personen/Person/Bewilligung_Selbstdispensation", "Bewilligung_Selbstdispensation"],
|
236
|
+
["Personen/Person/Diplom", "Diplom"],
|
237
|
+
["Personen/Person/BTM_Berechtigung", "BTM_Berechtigung"]
|
245
238
|
]
|
246
239
|
|
247
240
|
def check_result(inhalt, nbr_record)
|
248
|
-
[
|
241
|
+
["<NBR_RECORD>",
|
249
242
|
"<OK_ERROR>",
|
250
|
-
|
251
|
-
].each do |what|
|
243
|
+
"<OK_ERROR>OK</OK_ERROR>"].each do |what|
|
252
244
|
expect(inhalt.scan(what).size).to eq 1
|
253
245
|
end
|
254
|
-
expect(inhalt.index(
|
255
|
-
expect(inhalt.index(
|
246
|
+
expect(inhalt.index("<OK_ERROR>OK</OK_ERROR>")).to be > 0
|
247
|
+
expect(inhalt.index("<ERROR_CODE/>")).to be > 0
|
256
248
|
m = /<NBR_RECORD>(\d+)<\/NBR_RECORD>/.match(inhalt)
|
257
249
|
expect(m).not_to be nil
|
258
|
-
expect(m[1].to_i).to eq
|
250
|
+
expect(m[1].to_i).to eq nbr_record
|
259
251
|
end
|
260
252
|
|
261
|
-
[
|
253
|
+
["article", "betrieb", "code", "interaction", "limitation", "medizinalperson", "product", "substance"].each do |cat|
|
262
254
|
eval "
|
263
255
|
def oddb_#{cat}_xml
|
264
|
-
File.expand_path(File.join(Oddb2xml::
|
256
|
+
File.expand_path(File.join(Oddb2xml::WORK_DIR, 'oddb_#{cat}.xml'))
|
265
257
|
end
|
266
258
|
"
|
267
259
|
end
|
268
260
|
|
269
|
-
def check_article_IGM_format(line, price_kendural=825, add_80_percents=false)
|
270
|
-
typ
|
271
|
-
name
|
272
|
-
ckzl
|
273
|
-
ciks
|
274
|
-
price_exf
|
261
|
+
def check_article_IGM_format(line, price_kendural = 825, add_80_percents = false)
|
262
|
+
typ = line[0..1]
|
263
|
+
name = line[10..59]
|
264
|
+
ckzl = line[72]
|
265
|
+
ciks = line[75]
|
266
|
+
price_exf = line[60..65].to_i
|
275
267
|
price_reseller = line[66..71].to_i
|
276
|
-
price_public
|
277
|
-
expect(typ).to
|
268
|
+
price_public = line[66..71].to_i
|
269
|
+
expect(typ).to eq "11"
|
278
270
|
puts "check_article_IGM_format: #{price_exf} #{price_public} CKZL is #{ckzl} CIKS is #{ciks} name #{name} " if $VERBOSE
|
279
|
-
|
280
|
-
|
271
|
+
found_sl = false
|
272
|
+
found_non_sl = false
|
281
273
|
|
282
|
-
if /7680353660163\d$/.match(line) # KENDURAL Depottabl 30 Stk
|
283
|
-
puts "
|
284
|
-
|
285
|
-
expect(line[60..65]).to eq
|
274
|
+
if /7680353660163\d$/.match?(line) # KENDURAL Depottabl 30 Stk
|
275
|
+
puts "found_sl for #{line}" if $VERBOSE
|
276
|
+
found_sl = true
|
277
|
+
expect(line[60..65]).to eq "000496"
|
286
278
|
expect(price_exf).to eq 496
|
287
|
-
expect(ckzl).to eq
|
288
|
-
expect(price_public).to eq price_kendural
|
289
|
-
expect(line[66..71]).to eq
|
279
|
+
expect(ckzl).to eq "1"
|
280
|
+
expect(price_public).to eq price_kendural # this is a SL-product. Therefore we may not have a price increase
|
281
|
+
expect(line[66..71]).to eq "000" + sprintf("%03d", price_kendural) # the dat format requires leading zeroes and not point
|
290
282
|
end
|
291
283
|
|
292
|
-
if /7680403330459\d$/.match(line) # CARBADERM
|
293
|
-
|
294
|
-
puts "
|
295
|
-
expect(ckzl).to eq
|
284
|
+
if /7680403330459\d$/.match?(line) # CARBADERM
|
285
|
+
found_non_sl = true
|
286
|
+
puts "found_non_sl for #{line}" if $VERBOSE
|
287
|
+
expect(ckzl).to eq "3"
|
296
288
|
if add_80_percents
|
297
|
-
expect(price_reseller).to eq
|
298
|
-
expect(line[66..71]).to eq
|
289
|
+
expect(price_reseller).to eq 2919 # = 1545*1.8 this is a non SL-product. Therefore we must increase its price as requsted
|
290
|
+
expect(line[66..71]).to eq "002919" # dat format requires leading zeroes and not poin
|
299
291
|
else
|
300
|
-
expect(price_reseller).to eq
|
301
|
-
expect(line[66..71]).to eq
|
292
|
+
expect(price_reseller).to eq 2770 # this is a non SL-product, but no price increase was requested
|
293
|
+
expect(line[66..71]).to eq "002770" # the dat format requires leading zeroes and not point
|
302
294
|
end
|
303
|
-
expect(line[60..65]).to eq
|
304
|
-
expect(price_exf).to eq
|
295
|
+
expect(line[60..65]).to eq "001622" # the dat format requires leading zeroes and not point
|
296
|
+
expect(price_exf).to eq 1622 # this is a non SL-product, but no price increase was requested
|
305
297
|
end
|
306
|
-
|
298
|
+
[found_sl, found_non_sl]
|
307
299
|
end
|
308
300
|
|
309
301
|
def validate_via_xsd(xsd_file, xml_file)
|
310
|
-
xsd =open(xsd_file).read
|
302
|
+
xsd = File.open(xsd_file).read
|
311
303
|
xsd_rtikelstamm_xml = Nokogiri::XML::Schema(xsd)
|
312
304
|
doc = Nokogiri::XML(File.read(xml_file))
|
313
|
-
xsd_rtikelstamm_xml.validate(doc).each do
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
expect(error.message).to be_nil, msg
|
305
|
+
xsd_rtikelstamm_xml.validate(doc).each do |error|
|
306
|
+
if error.message
|
307
|
+
puts "Failed validating #{xml_file} with #{File.size(xml_file)} bytes using XSD from #{xsd_file}"
|
308
|
+
puts "CMD: xmllint --noout --schema #{xsd_file} #{xml_file}"
|
309
|
+
end
|
310
|
+
msg = "expected #{error.message} to be nil\nfor #{xml_file}"
|
311
|
+
puts msg
|
312
|
+
expect(error.message).to be_nil, msg
|
322
313
|
end
|
323
314
|
end
|
324
315
|
|
325
316
|
def check_validation_via_xsd
|
326
|
-
files = Dir.glob(
|
327
|
-
files.each{
|
328
|
-
|
329
|
-
|
330
|
-
xsd2use = /oddb_calc/.match(file) ? @oddb_calc_xsd : @oddb2xml_xsd
|
317
|
+
files = Dir.glob("*.xml")
|
318
|
+
files.each { |file|
|
319
|
+
next if /#{Time.now.year}/.match?(file)
|
320
|
+
xsd2use = /oddb_calc/.match?(file) ? @oddb_calc_xsd : @oddb2xml_xsd
|
331
321
|
validate_via_xsd(xsd2use, File.expand_path(file))
|
332
322
|
}
|
333
323
|
end
|
@@ -358,33 +348,33 @@ def checkPrices(increased = false)
|
|
358
348
|
end
|
359
349
|
end
|
360
350
|
|
361
|
-
def checkAndGetArticleXmlName(tst=nil)
|
362
|
-
article_xml = File.expand_path(File.join(Oddb2xml::
|
363
|
-
expect(File.
|
364
|
-
FileUtils.cp(article_xml, File.join(Oddb2xml::
|
351
|
+
def checkAndGetArticleXmlName(tst = nil)
|
352
|
+
article_xml = File.expand_path(File.join(Oddb2xml::WORK_DIR, "oddb_article.xml"))
|
353
|
+
expect(File.exist?(article_xml)).to eq true
|
354
|
+
FileUtils.cp(article_xml, File.join(Oddb2xml::WORK_DIR, "tst-#{tst}.xml")) if tst
|
365
355
|
article_xml
|
366
356
|
end
|
367
357
|
|
368
358
|
def checkAndGetProductWithGTIN(doc, gtin)
|
369
|
-
products = XPath.match(
|
370
|
-
gtins
|
359
|
+
products = REXML::XPath.match(doc, "//PRD[GTIN=#{gtin}]")
|
360
|
+
gtins = REXML::XPath.match(doc, "//PRD[GTIN=#{gtin}]/GTIN")
|
371
361
|
expect(gtins.size).to eq 1
|
372
362
|
expect(gtins.first.text).to eq gtin.to_s
|
373
363
|
# return product
|
374
|
-
|
364
|
+
products.size == 1 ? products.first : nil
|
375
365
|
end
|
376
366
|
|
377
367
|
def checkAndGetArticleWithGTIN(doc, gtin)
|
378
|
-
articles = XPath.match(
|
379
|
-
gtins
|
368
|
+
articles = REXML::XPath.match(doc, "//ART[ARTBAR/BC=#{gtin}]")
|
369
|
+
gtins = REXML::XPath.match(doc, "//ART[ARTBAR/BC=#{gtin}]/ARTBAR/BC")
|
380
370
|
expect(gtins.size).to eq 1
|
381
371
|
expect(gtins.first.text).to eq gtin.to_s
|
382
372
|
gtins.first
|
383
373
|
# return article
|
384
|
-
|
374
|
+
articles.size == 1 ? articles.first : nil
|
385
375
|
end
|
386
376
|
|
387
|
-
def checkArticleXml(
|
377
|
+
def checkArticleXml(check_erythrocin = true)
|
388
378
|
article_filename = checkAndGetArticleXmlName
|
389
379
|
|
390
380
|
# check articles
|
@@ -394,101 +384,101 @@ def checkArticleXml(checkERYTHROCIN = true)
|
|
394
384
|
desitin = checkAndGetArticleWithGTIN(doc, Oddb2xml::LEVETIRACETAM_GTIN)
|
395
385
|
expect(desitin).not_to eq nil
|
396
386
|
# TODO: why is this now nil? desitin.elements['ATC'].text.should == 'N03AX14'
|
397
|
-
expect(desitin.elements[
|
398
|
-
expect(desitin.elements[
|
399
|
-
expect(desitin.elements[
|
400
|
-
expect(desitin.elements[
|
401
|
-
expect(desitin.elements[
|
402
|
-
expect(desitin.elements[
|
403
|
-
expect(desitin.elements[
|
404
|
-
expect(desitin.elements[
|
405
|
-
expect(desitin.elements[
|
406
|
-
expect(desitin.elements[
|
407
|
-
expect(desitin.elements[
|
408
|
-
|
409
|
-
erythrocin_gtin =
|
387
|
+
expect(desitin.elements["DSCRD"].text).to eq("LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk")
|
388
|
+
expect(desitin.elements["DSCRF"].text).to eq("LEVETIRACETAM DESITIN mini cpr pel 250 mg 30 pce")
|
389
|
+
expect(desitin.elements["REF_DATA"].text).to eq("1")
|
390
|
+
expect(desitin.elements["PHAR"].text).to eq("5819012")
|
391
|
+
expect(desitin.elements["SMCAT"].text).to eq("B")
|
392
|
+
expect(desitin.elements["SMNO"].text).to eq("62069008")
|
393
|
+
expect(desitin.elements["VAT"].text).to eq("2")
|
394
|
+
expect(desitin.elements["PRODNO"].text).to eq("6206901")
|
395
|
+
expect(desitin.elements["SALECD"].text).to eq("A")
|
396
|
+
expect(desitin.elements["CDBG"].text).to eq("N")
|
397
|
+
expect(desitin.elements["BG"].text).to eq("N")
|
398
|
+
|
399
|
+
erythrocin_gtin = "7680202580475" # picked up from zur rose
|
410
400
|
erythrocin = checkAndGetArticleWithGTIN(doc, erythrocin_gtin)
|
411
|
-
expect(erythrocin.elements[
|
401
|
+
expect(erythrocin.elements["DSCRD"].text).to eq("ERYTHROCIN i.v. Trockensub 1000 mg Amp") if check_erythrocin
|
412
402
|
|
413
403
|
lansoyl = checkAndGetArticleWithGTIN(doc, Oddb2xml::LANSOYL_GTIN)
|
414
|
-
expect(lansoyl.elements[
|
415
|
-
expect(lansoyl.elements[
|
416
|
-
expect(lansoyl.elements[
|
417
|
-
expect(lansoyl.elements[
|
418
|
-
expect(lansoyl.elements[
|
404
|
+
expect(lansoyl.elements["DSCRD"].text).to eq "LANSOYL Gel 225 g"
|
405
|
+
expect(lansoyl.elements["REF_DATA"].text).to eq "1"
|
406
|
+
expect(lansoyl.elements["SMNO"].text).to eq "32475019"
|
407
|
+
expect(lansoyl.elements["PHAR"].text).to eq "0023722"
|
408
|
+
expect(lansoyl.elements["ARTCOMP/COMPNO"].text).to eq("7601001002012")
|
419
409
|
|
420
410
|
zyvoxid = checkAndGetArticleWithGTIN(doc, Oddb2xml::ZYVOXID_GTIN)
|
421
|
-
expect(zyvoxid.elements[
|
411
|
+
expect(zyvoxid.elements["DSCRD"].text).to eq "ZYVOXID Filmtabl 600 mg 10 Stk"
|
422
412
|
|
423
|
-
expect(XPath.match(
|
413
|
+
expect(REXML::XPath.match(doc, "//LIMPTS").size).to be >= 1
|
424
414
|
# TODO: desitin.elements['QTY'].text.should eq '250 mg'
|
425
415
|
end
|
426
416
|
|
427
417
|
def checkProductXml(nbr_record = -1)
|
428
|
-
product_filename = File.expand_path(File.join(Oddb2xml::
|
429
|
-
expect(File.
|
418
|
+
product_filename = File.expand_path(File.join(Oddb2xml::WORK_DIR, "oddb_product.xml"))
|
419
|
+
expect(File.exist?(product_filename)).to eq true
|
430
420
|
|
431
421
|
# check products
|
432
422
|
content = IO.read(product_filename)
|
433
423
|
doc = REXML::Document.new content
|
434
424
|
check_result(content, nbr_record)
|
435
|
-
expect(nbr_record).to eq
|
425
|
+
expect(nbr_record).to eq content.scan(/<PRD/).size if nbr_record != -1
|
436
426
|
|
437
427
|
desitin = checkAndGetProductWithGTIN(doc, Oddb2xml::LEVETIRACETAM_GTIN)
|
438
|
-
expect(desitin.elements[
|
439
|
-
expect(desitin.elements[
|
440
|
-
expect(desitin.elements[
|
441
|
-
expect(desitin.elements[
|
442
|
-
expect(desitin.elements[
|
443
|
-
expect(desitin.elements[
|
444
|
-
expect(desitin.elements[
|
445
|
-
expect(desitin.elements[
|
446
|
-
expect(desitin.elements[
|
447
|
-
expect(desitin.elements[
|
448
|
-
expect(desitin.elements[
|
449
|
-
expect(desitin.elements[
|
450
|
-
expect(desitin.elements[
|
428
|
+
expect(desitin.elements["ATC"].text).to eq("N03AX14")
|
429
|
+
expect(desitin.elements["DSCRD"].text).to eq("LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk")
|
430
|
+
expect(desitin.elements["DSCRF"].text).to eq("LEVETIRACETAM DESITIN mini cpr pel 250 mg 30 pce")
|
431
|
+
expect(desitin.elements["PRODNO"].text).to eq "6206901"
|
432
|
+
expect(desitin.elements["IT"].text).to eq "01.07.1."
|
433
|
+
expect(desitin.elements["PackGrSwissmedic"].text).to eq "30"
|
434
|
+
expect(desitin.elements["EinheitSwissmedic"].text).to eq "Tablette(n)"
|
435
|
+
expect(desitin.elements["SubstanceSwissmedic"].text).to eq "levetiracetamum"
|
436
|
+
expect(desitin.elements["CompositionSwissmedic"].text).to eq "levetiracetamum 250 mg, excipiens pro compressi obducti pro charta."
|
437
|
+
expect(desitin.elements["CPT/CPTCMP/LINE"].text).to eq "0"
|
438
|
+
expect(desitin.elements["CPT/CPTCMP/SUBNO"].text).to eq "13"
|
439
|
+
expect(desitin.elements["CPT/CPTCMP/QTY"].text).to eq "250"
|
440
|
+
expect(desitin.elements["CPT/CPTCMP/QTYU"].text).to eq "mg"
|
451
441
|
|
452
442
|
checkAndGetProductWithGTIN(doc, Oddb2xml::THREE_TC_GTIN)
|
453
443
|
checkAndGetProductWithGTIN(doc, Oddb2xml::ZYVOXID_GTIN)
|
454
444
|
if $VERBOSE
|
455
445
|
puts "checkProductXml #{product_filename} #{File.size(product_filename)} #{File.mtime(product_filename)}"
|
456
|
-
puts "checkProductXml has #{XPath.match(
|
457
|
-
puts "checkProductXml has #{XPath.match(
|
458
|
-
puts "checkProductXml has #{XPath.match(
|
446
|
+
puts "checkProductXml has #{REXML::XPath.match(doc, "//PRD").count { |x| true }} packages"
|
447
|
+
puts "checkProductXml has #{REXML::XPath.match(doc, "//GTIN").count { |x| true }} GTIN"
|
448
|
+
puts "checkProductXml has #{REXML::XPath.match(doc, "//PRODNO").count { |x| true }} PRODNO"
|
459
449
|
end
|
460
450
|
hirudoid = checkAndGetProductWithGTIN(doc, Oddb2xml::HIRUDOID_GTIN)
|
461
|
-
expect(hirudoid.elements[
|
451
|
+
expect(hirudoid.elements["ATC"].text).to eq("C05BA01") # modified by atc.csv!
|
462
452
|
end
|
463
453
|
|
454
|
+
NR_EXTENDED_ARTICLES = 80
|
455
|
+
NR_SUBSTANCES = 28
|
456
|
+
NR_LIMITATIONS = 15
|
457
|
+
|
458
|
+
NR_INTERACTIONS = 2
|
459
|
+
NR_CODES = 5
|
460
|
+
NR_PRODNO = 31
|
461
|
+
NR_PACKAGES = 46
|
462
|
+
NR_PRODUCTS = 40
|
463
|
+
REG_EXP_DESITIN = /1120000000LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk/
|
464
464
|
describe Oddb2xml::Builder do
|
465
|
-
NrExtendedArticles = 80
|
466
|
-
NrSubstances = 28
|
467
|
-
NrLimitations = 15
|
468
|
-
|
469
|
-
NrInteractions = 2
|
470
|
-
NrCodes = 5
|
471
|
-
NrProdno = 31
|
472
|
-
NrPackages = 46
|
473
|
-
NrProducts = 40
|
474
|
-
RegExpDesitin = /1120000000LEVETIRACETAM DESITIN Mini Filmtab 250 mg 30 Stk/
|
475
465
|
include ServerMockHelper
|
476
466
|
def common_run_init(options = {})
|
477
|
-
@
|
478
|
-
@oddb2xml_xsd = File.expand_path(File.join(File.dirname(__FILE__),
|
479
|
-
@oddb_calc_xsd = File.expand_path(File.join(File.dirname(__FILE__),
|
467
|
+
@saved_dir = Dir.pwd
|
468
|
+
@oddb2xml_xsd = File.expand_path(File.join(File.dirname(__FILE__), "..", "oddb2xml.xsd"))
|
469
|
+
@oddb_calc_xsd = File.expand_path(File.join(File.dirname(__FILE__), "..", "oddb_calc.xsd"))
|
480
470
|
expect(File.exist?(@oddb2xml_xsd)).to eq true
|
481
471
|
expect(File.exist?(@oddb_calc_xsd)).to eq true
|
482
472
|
cleanup_directories_before_run
|
483
|
-
FileUtils.makedirs(Oddb2xml::
|
484
|
-
Dir.chdir(Oddb2xml::
|
473
|
+
FileUtils.makedirs(Oddb2xml::WORK_DIR)
|
474
|
+
Dir.chdir(Oddb2xml::WORK_DIR)
|
485
475
|
mock_downloads
|
486
476
|
end
|
487
477
|
|
488
478
|
after(:all) do
|
489
|
-
Dir.chdir @
|
479
|
+
Dir.chdir @saved_dir if @saved_dir && File.directory?(@saved_dir)
|
490
480
|
end
|
491
|
-
context
|
481
|
+
context "when default options are given" do
|
492
482
|
before(:all) do
|
493
483
|
common_run_init
|
494
484
|
Oddb2xml::Cli.new({}).run # to debug
|
@@ -497,87 +487,86 @@ describe Oddb2xml::Builder do
|
|
497
487
|
@rexml = REXML::Document.new File.read(oddb_article_xml)
|
498
488
|
end
|
499
489
|
|
500
|
-
it
|
501
|
-
expect(File.
|
490
|
+
it "should produce a oddb_article.xml" do
|
491
|
+
expect(File.exist?(oddb_article_xml)).to eq true
|
502
492
|
end
|
503
493
|
|
504
|
-
it
|
505
|
-
check_result(@inhalt,
|
494
|
+
it "should have a correct NBR_RECORD in oddb_article.xml" do
|
495
|
+
check_result(@inhalt, NR_PRODUCTS)
|
506
496
|
end
|
507
497
|
|
508
|
-
it
|
509
|
-
oddb_product_xml = oddb_article_xml.sub(
|
498
|
+
it "should have a correct NBR_RECORD in oddb_products.xml" do
|
499
|
+
oddb_product_xml = oddb_article_xml.sub("oddb_article.xml", "oddb_product.xml")
|
510
500
|
check_result(File.read(oddb_product_xml), 46)
|
511
501
|
end
|
512
502
|
|
513
|
-
it
|
514
|
-
expect(XPath.match(@rexml, "//ART"
|
515
|
-
expect(XPath.match(@rexml, "//ART"
|
503
|
+
it "oddb_article.xml should contain a SHA256" do
|
504
|
+
expect(REXML::XPath.match(@rexml, "//ART").first.attributes["SHA256"].size).to eq 64
|
505
|
+
expect(REXML::XPath.match(@rexml, "//ART").size).to eq REXML::XPath.match(@rexml, "//ART").size
|
516
506
|
end
|
517
507
|
|
518
|
-
it
|
508
|
+
it "should be possible to verify the oddb_article.xml" do
|
519
509
|
result = Oddb2xml.verify_sha256(oddb_article_xml)
|
520
510
|
expect(result)
|
521
511
|
end
|
522
512
|
|
523
|
-
it
|
513
|
+
it "should be possible to verify all xml files against our XSD" do
|
524
514
|
check_validation_via_xsd
|
525
515
|
end
|
526
516
|
|
527
517
|
check_attributes(oddb_article_xml, ARTICLE_ATTRIBUTE_TESTS)
|
528
518
|
check_elements(oddb_article_xml, ARTICLE_COMMON_ELEMENTS)
|
529
519
|
|
530
|
-
it
|
520
|
+
it "should validate XSD article" do
|
531
521
|
@inhalt = File.read(oddb_article_xml)
|
532
522
|
# This fails on Ruby < 2.4 as NAROPIN INJ LÖS 0.2 % 10 is wrongly encoded
|
533
523
|
expect(File.read(oddb_article_xml).scan(ARTICLE_NAROPIN).size).to eq 1
|
534
524
|
end
|
535
525
|
|
536
|
-
context
|
537
|
-
skip
|
526
|
+
context "XSD betrieb" do
|
527
|
+
skip "At the moment downloading and extractiong the medreg is broken!"
|
538
528
|
# check_attributes(oddb_betrieb_xml, BETRIEB_ATTRIBUTE_TESTS)
|
539
529
|
# check_elements(oddb_betrieb_xml, BETRIEB_COMMON_ELEMENTS)
|
540
530
|
end
|
541
531
|
|
542
|
-
context
|
543
|
-
skip
|
532
|
+
context "XSD medizinalperson" do
|
533
|
+
skip "At the moment downloading and extractiong the medreg is broken!"
|
544
534
|
# check_attributes(oddb_medizinalperson_xml, MEDIZINAPERSON_ATTRIBUTE_TESTS)
|
545
535
|
# check_elements(oddb_medizinalperson_xml, MEDIZINAPERSON_COMMON_ELEMENTS)
|
546
536
|
end
|
547
537
|
|
548
|
-
it
|
538
|
+
it "should have a correct insulin (gentechnik) for 7680532900196" do
|
549
539
|
expect(@inhalt.match(/.*<BC>7680532900196<\/BC>.*/).class).to be MatchData
|
550
|
-
expect(XPath.match(
|
551
|
-
expect(XPath.match(
|
552
|
-
expect(XPath.match(
|
553
|
-
expect(XPath.match(
|
540
|
+
expect(REXML::XPath.match(@rexml, "//ART//GEN_PRODUCTION").size).to be >= 1
|
541
|
+
expect(REXML::XPath.match(@rexml, "//ART//GEN_PRODUCTION").first.text).to eq "X"
|
542
|
+
expect(REXML::XPath.match(@rexml, "//ART//INSULIN_CATEGORY").size).to eq 1
|
543
|
+
expect(REXML::XPath.match(@rexml, "//ART//INSULIN_CATEGORY").first.text).to eq "Insulinanalog: schnell wirkend"
|
554
544
|
end
|
555
545
|
|
556
|
-
it
|
546
|
+
it "should flag fridge drugs correctly" do
|
557
547
|
doc = REXML::Document.new IO.read(checkAndGetArticleXmlName)
|
558
548
|
checkAndGetArticleWithGTIN(doc, Oddb2xml::FRIDGE_GTIN)
|
559
|
-
expect(XPath.match(
|
549
|
+
expect(REXML::XPath.match(doc, "//COOL='1']").size).to eq 1
|
560
550
|
end
|
561
551
|
|
562
552
|
ean_with_drug_index = 7680555610041
|
563
553
|
it "should have a correct drug information for #{ean_with_drug_index}" do
|
564
|
-
|
554
|
+
REXML::Document.new IO.read(checkAndGetArticleXmlName)
|
565
555
|
expect(@inhalt.match(/.*<BC>#{ean_with_drug_index}<\/BC>.*/).class).to be MatchData
|
566
|
-
expect(XPath.match(
|
567
|
-
expect(XPath.match(
|
556
|
+
expect(REXML::XPath.match(@rexml, "//ART//DRUG_INDEX").size).to eq 1
|
557
|
+
expect(REXML::XPath.match(@rexml, "//ART//DRUG_INDEX").first.text).to eq "d"
|
568
558
|
found = false
|
569
|
-
XPath.match(
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
end
|
559
|
+
REXML::XPath.match(@rexml, "//ART//CDBG").each { |flag|
|
560
|
+
if flag.text.eql?("Y")
|
561
|
+
found = true
|
562
|
+
break
|
563
|
+
end
|
575
564
|
}
|
576
565
|
expect(found)
|
577
566
|
end
|
578
567
|
|
579
|
-
it
|
580
|
-
oddb_product_xml = IO.read(File.join(Oddb2xml::
|
568
|
+
it "should generate ATC for 7680002770014" do
|
569
|
+
oddb_product_xml = IO.read(File.join(Oddb2xml::WORK_DIR, "oddb_product.xml"))
|
581
570
|
text = %(<GTIN>7680002770014</GTIN>
|
582
571
|
<PRODNO>0027701</PRODNO>
|
583
572
|
<DSCRD>SEROCYTOL Herz-Gefässe Supp 3 Stk</DSCRD>
|
@@ -588,8 +577,8 @@ describe Oddb2xml::Builder do
|
|
588
577
|
expect(oddb_product_xml.index(text)).to be >= 1
|
589
578
|
end
|
590
579
|
|
591
|
-
it
|
592
|
-
oddb_product_xml = IO.read(File.join(Oddb2xml::
|
580
|
+
it "should generate ATC for 7680002770021" do
|
581
|
+
oddb_product_xml = IO.read(File.join(Oddb2xml::WORK_DIR, "oddb_product.xml"))
|
593
582
|
text2 = %( <GTIN>7680002770021</GTIN>
|
594
583
|
<PRODNO>0027701</PRODNO>
|
595
584
|
<DSCRD>Coeur-Vaisseaux Sérocytol, suppositoire</DSCRD>
|
@@ -600,401 +589,396 @@ describe Oddb2xml::Builder do
|
|
600
589
|
expect(oddb_product_xml.index(text2)).to be >= 1
|
601
590
|
end
|
602
591
|
|
603
|
-
it
|
604
|
-
expect(IO.read(oddb_article_xml).index(
|
592
|
+
it "should generate SALECD A for swissmedic packages" do
|
593
|
+
expect(IO.read(oddb_article_xml).index("<SALECD>A<!--Overriding status I nincd 10 for 7680658560014 as in refdata_pharma--></SALECD>")).to be >= 1
|
605
594
|
end
|
606
|
-
|
607
595
|
end
|
608
596
|
|
609
|
-
context
|
597
|
+
context "when -o for fachinfo is given" do
|
610
598
|
before(:all) do
|
611
599
|
common_run_init
|
612
|
-
@oddb_fi_xml
|
613
|
-
@oddb_fi_product_xml
|
614
|
-
options = Oddb2xml::Options.parse([
|
600
|
+
@oddb_fi_xml = File.expand_path(File.join(Oddb2xml::WORK_DIR, "oddb_fi.xml"))
|
601
|
+
@oddb_fi_product_xml = File.expand_path(File.join(Oddb2xml::WORK_DIR, "oddb_fi_product.xml"))
|
602
|
+
options = Oddb2xml::Options.parse(["-o", "--log"])
|
615
603
|
# @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
616
604
|
Oddb2xml::Cli.new(options).run
|
617
605
|
end
|
618
606
|
|
619
|
-
it
|
620
|
-
check_result(
|
607
|
+
it "should have a correct NBR_RECORD in oddb_fi_product.xml" do
|
608
|
+
check_result(File.read("oddb_fi_product.xml"), 0)
|
621
609
|
end
|
622
610
|
|
623
|
-
it
|
624
|
-
check_result(
|
611
|
+
it "should have a correct NBR_RECORD in oddb_fi.xml" do
|
612
|
+
check_result(File.read("oddb_fi.xml"), 2)
|
625
613
|
end
|
626
614
|
|
627
|
-
it
|
628
|
-
expect(File.
|
615
|
+
it "should return produce a correct oddb_fi.xml" do
|
616
|
+
expect(File.exist?(@oddb_fi_xml)).to eq true
|
629
617
|
inhalt = IO.read(@oddb_fi_xml)
|
630
|
-
expect(/<KMP/.match(inhalt.to_s).to_s).to eq
|
631
|
-
expect(/<style><!\[CDATA\[p{margin-top/.match(inhalt.to_s).to_s).to eq
|
618
|
+
expect(/<KMP/.match(inhalt.to_s).to_s).to eq "<KMP"
|
619
|
+
expect(/<style><!\[CDATA\[p{margin-top/.match(inhalt.to_s).to_s).to eq "<style><![CDATA[p{margin-top"
|
632
620
|
m = /<paragraph><!\[CDATA\[(.+)\n(.*)/.match(inhalt.to_s)
|
633
621
|
expect(m[1]).to eq '<?xml version="1.0" encoding="utf-8"?><div xmlns="http://www.w3.org/1999/xhtml">'
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
inhalt = IO.read(@oddb_fi_product_xml)
|
622
|
+
skip { m[2].should eq '<p class="s4" id="section1"><span class="s2"><span>Zyvoxid</span></span><sup class="s3"><span>®</span></sup></p>' }
|
623
|
+
expect(File.exist?(@oddb_fi_product_xml)).to eq true
|
624
|
+
IO.read(@oddb_fi_product_xml)
|
638
625
|
end
|
639
626
|
|
640
|
-
it
|
627
|
+
it "should produce valid xml files" do
|
641
628
|
skip "Niklaus does not know how to create a valid oddb_fi_product.xml"
|
642
629
|
# check_validation_via_xsd
|
643
630
|
end
|
644
631
|
|
645
|
-
it
|
632
|
+
it "should generate a valid oddb_product.xml" do
|
646
633
|
expect(@res).to match(/products/) if @res
|
647
|
-
checkProductXml(
|
634
|
+
checkProductXml(NR_PACKAGES)
|
648
635
|
end
|
649
|
-
|
650
636
|
end
|
651
637
|
|
652
|
-
context
|
638
|
+
context "when -f dat is given" do
|
653
639
|
before(:all) do
|
654
640
|
common_run_init
|
655
|
-
options = Oddb2xml::Options.parse(
|
656
|
-
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
641
|
+
options = Oddb2xml::Options.parse("-f dat --log")
|
642
|
+
@res = buildr_capture(:stdout) { Oddb2xml::Cli.new(options).run }
|
657
643
|
# Oddb2xml::Cli.new(options).run # to debug
|
658
644
|
end
|
659
645
|
|
660
|
-
it
|
646
|
+
it "should contain the correct values fo CMUT from transfer.dat" do
|
661
647
|
expect(@res).to match(/products/)
|
662
|
-
dat_filename = File.join(Oddb2xml::
|
663
|
-
expect(File.
|
648
|
+
dat_filename = File.join(Oddb2xml::WORK_DIR, "oddb.dat")
|
649
|
+
expect(File.exist?(dat_filename)).to eq true
|
664
650
|
oddb_dat = IO.read(dat_filename)
|
665
651
|
expect(oddb_dat).to match(/^..2/), "should have a record with '2' in CMUT field"
|
666
652
|
expect(oddb_dat).to match(/^..3/), "should have a record with '3' in CMUT field"
|
667
|
-
expect(oddb_dat).to match(
|
668
|
-
IO.readlines(dat_filename).each{ |line| check_article_IGM_format(line, 0) }
|
653
|
+
expect(oddb_dat).to match(REG_EXP_DESITIN), "should have Desitin"
|
654
|
+
IO.readlines(dat_filename).each { |line| check_article_IGM_format(line, 0) }
|
669
655
|
m = /.+KENDURAL Depottabl 30 Stk.*7680353660163.+/.match(oddb_dat)
|
670
656
|
expect(m[0].size).to eq 97 # size of IGM 1 record
|
671
|
-
expect(m[0][74]).to eq
|
657
|
+
expect(m[0][74]).to eq "3"
|
672
658
|
end
|
673
659
|
end
|
674
660
|
|
675
|
-
context
|
661
|
+
context "when --append -f dat is given" do
|
676
662
|
before(:all) do
|
677
663
|
common_run_init
|
678
|
-
options = Oddb2xml::Options.parse(
|
679
|
-
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
664
|
+
options = Oddb2xml::Options.parse("--append -f dat")
|
665
|
+
@res = buildr_capture(:stdout) { Oddb2xml::Cli.new(options).run }
|
680
666
|
end
|
681
667
|
|
682
|
-
it
|
683
|
-
dat_filename = File.join(Oddb2xml::
|
684
|
-
expect(File.
|
668
|
+
it "should generate a valid oddb_with_migel.dat" do
|
669
|
+
dat_filename = File.join(Oddb2xml::WORK_DIR, "oddb_with_migel.dat")
|
670
|
+
expect(File.exist?(dat_filename)).to eq true
|
685
671
|
oddb_dat = IO.read(dat_filename)
|
686
|
-
expect(oddb_dat).to match(
|
672
|
+
expect(oddb_dat).to match(REG_EXP_DESITIN), "should have Desitin"
|
687
673
|
expect(@res).to match(/products/)
|
688
674
|
end
|
689
675
|
|
690
676
|
it "should match EAN 76806206900842 of Desitin" do
|
691
|
-
dat_filename = File.join(Oddb2xml::
|
692
|
-
expect(File.
|
677
|
+
dat_filename = File.join(Oddb2xml::WORK_DIR, "oddb_with_migel.dat")
|
678
|
+
expect(File.exist?(dat_filename)).to eq true
|
693
679
|
oddb_dat = IO.read(dat_filename)
|
694
680
|
expect(oddb_dat).to match(/76806206900842/), "should match EAN of Desitin"
|
695
681
|
end
|
696
682
|
end
|
697
683
|
|
698
|
-
context
|
684
|
+
context "when --append -I 80 -e is given" do
|
699
685
|
before(:all) do
|
700
686
|
common_run_init
|
701
|
-
options = Oddb2xml::Options.parse(
|
687
|
+
options = Oddb2xml::Options.parse("--append -I 80 -e")
|
702
688
|
Oddb2xml::Cli.new(options).run
|
703
689
|
# @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
704
690
|
end
|
705
691
|
|
706
|
-
it "oddb_article with stuf from ZurRose", :
|
692
|
+
it "oddb_article with stuf from ZurRose", skip: "ZurRose contains ERYTHROCIN i.v. Troc*esteekensub 1000 mg Amp [!]" do
|
707
693
|
checkArticleXml
|
708
694
|
end
|
709
695
|
|
710
|
-
|
711
|
-
it
|
696
|
+
# Zeno used oddb2xml -e -I 45 -c zip for oddb_arcticle for artikelstamm 7680172330414 3605520301605
|
697
|
+
it "should add GTIN 7680172330414 which is marked as inactive in transfer.dat" do
|
712
698
|
@inhalt = IO.read(oddb_article_xml)
|
713
|
-
expect(@inhalt.index(
|
699
|
+
expect(@inhalt.index("7680172330414")).not_to be nil
|
714
700
|
end
|
715
701
|
|
716
|
-
it
|
702
|
+
it "should add GTIN 3605520301605 Armani Attitude which is marked as inactive in transfer.dat" do
|
717
703
|
@inhalt = IO.read(oddb_article_xml)
|
718
704
|
# <SALECD>I</SALECD>
|
719
705
|
|
720
|
-
expect(@inhalt.index(
|
706
|
+
expect(@inhalt.index("3605520301605")).not_to be nil
|
721
707
|
end
|
722
708
|
|
723
|
-
context
|
709
|
+
context "XSD" do
|
724
710
|
check_attributes(oddb_article_xml, ARTICLE_ATTRIBUTE_TESTS)
|
725
711
|
check_elements(oddb_article_xml, ARTICLE_COMMON_ELEMENTS)
|
726
712
|
check_elements(oddb_article_xml, ARTICLE_ZURROSE_ELEMENTS)
|
727
|
-
it
|
713
|
+
it "should contain NAROPIN" do
|
728
714
|
# This fails on Ruby < 2.4 as NAROPIN INJ LÖS 0.2 % 10 is wrongly encoded
|
729
715
|
expect(File.read(oddb_article_xml).scan(ARTICLE_NAROPIN).size).to eq 1
|
730
716
|
end
|
731
717
|
end
|
732
718
|
|
733
|
-
it
|
719
|
+
it "should emit a correct oddb_article.xml" do
|
734
720
|
checkArticleXml(false)
|
735
721
|
end
|
736
722
|
|
737
|
-
it
|
738
|
-
expect(@res).to match(/products/)
|
739
|
-
checkProductXml(
|
723
|
+
it "should generate a valid oddb_product.xml" do
|
724
|
+
expect(@res).to match(/products/) unless @res.nil?
|
725
|
+
checkProductXml(NR_PACKAGES)
|
740
726
|
end
|
741
727
|
|
742
|
-
it
|
728
|
+
it "should contain the correct (increased) prices" do
|
743
729
|
checkPrices(true)
|
744
730
|
end
|
745
731
|
end
|
746
732
|
|
747
|
-
context
|
733
|
+
context "when option -e is given" do
|
748
734
|
before(:all) do
|
749
735
|
common_run_init
|
750
|
-
options = Oddb2xml::Options.parse(
|
736
|
+
options = Oddb2xml::Options.parse("-e")
|
751
737
|
puts options
|
752
738
|
@cli = Oddb2xml::Cli.new(options)
|
753
739
|
if RUN_ALL
|
754
|
-
@res = buildr_capture(:stdout){ @cli.run }
|
740
|
+
@res = buildr_capture(:stdout) { @cli.run }
|
755
741
|
else
|
756
742
|
@cli.run
|
757
743
|
end
|
758
744
|
end
|
759
745
|
|
760
|
-
context
|
746
|
+
context "XSD limitation" do
|
761
747
|
check_attributes(oddb_limitation_xml, LIMITATION_ATTRIBUTE_TESTS)
|
762
748
|
check_elements(oddb_limitation_xml, LIMITATION_ELEMENT_TESTS)
|
763
749
|
end
|
764
750
|
|
765
|
-
context
|
751
|
+
context "XSD code" do
|
766
752
|
check_attributes(oddb_code_xml, CODE_ATTRIBUTE_TESTS)
|
767
753
|
check_elements(oddb_code_xml, CODE_ELEMENT_TESTS)
|
768
754
|
end
|
769
755
|
|
770
|
-
it
|
771
|
-
check_result(File.read(oddb_code_xml),
|
756
|
+
it "should have a correct NBR_RECORD in oddb_code.xml" do
|
757
|
+
check_result(File.read(oddb_code_xml), NR_CODES)
|
772
758
|
end
|
773
759
|
|
774
|
-
context
|
760
|
+
context "XSD interaction" do
|
775
761
|
check_attributes(oddb_interaction_xml, INTERACTION_ATTRIBUTE_TESTS)
|
776
762
|
check_elements(oddb_interaction_xml, INTERACTION_ELEMENT_TESTS)
|
777
763
|
end
|
778
764
|
|
779
|
-
it
|
780
|
-
check_result(File.read(oddb_interaction_xml),
|
765
|
+
it "should have a correct NBR_RECORD in oddb_interaction.xml" do
|
766
|
+
check_result(File.read(oddb_interaction_xml), NR_INTERACTIONS)
|
781
767
|
end
|
782
768
|
|
783
|
-
context
|
769
|
+
context "XSD substance" do
|
784
770
|
check_attributes(oddb_substance_xml, SUBSTANCE_ATTRIBUTE_TESTS)
|
785
771
|
check_elements(oddb_substance_xml, SUBSTANCE_ELEMENT_TESTS)
|
786
772
|
end
|
787
773
|
|
788
|
-
it
|
789
|
-
check_result(File.read(
|
774
|
+
it "should have a correct NBR_RECORD in oddb_substance.xml" do
|
775
|
+
check_result(File.read("oddb_substance.xml"), NR_SUBSTANCES)
|
790
776
|
end
|
791
777
|
|
792
|
-
it
|
778
|
+
it "should emit a correct oddb_article.xml" do
|
793
779
|
checkArticleXml
|
794
780
|
end
|
795
781
|
|
796
|
-
it
|
797
|
-
checkProductXml(
|
782
|
+
it "should produce a correct oddb_product.xml" do
|
783
|
+
checkProductXml(NR_PACKAGES)
|
798
784
|
end
|
799
785
|
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
786
|
+
if RUN_ALL
|
787
|
+
it "should report correct output on stdout" do
|
788
|
+
expect(@res).to match(/\sPharma products: \d+/)
|
789
|
+
expect(@res).to match(/\sNonPharma products: \d+/)
|
790
|
+
end
|
791
|
+
end
|
804
792
|
|
805
|
-
it
|
793
|
+
it "should contain the correct (normal) prices" do
|
806
794
|
checkPrices(false)
|
807
795
|
end
|
808
796
|
|
809
|
-
it
|
797
|
+
it "should generate the flag ORPH for orphan" do
|
810
798
|
doc = REXML::Document.new File.new(oddb_product_xml)
|
811
799
|
orphan = checkAndGetProductWithGTIN(doc, Oddb2xml::ORPHAN_GTIN)
|
812
800
|
expect(orphan).not_to eq nil
|
813
|
-
expect(orphan.elements[
|
801
|
+
expect(orphan.elements["ORPH"].text).to eq("true")
|
814
802
|
end
|
815
803
|
|
816
|
-
it
|
817
|
-
doc = REXML::Document.new File.new(checkAndGetArticleXmlName(
|
818
|
-
expect(XPath.match(
|
804
|
+
it "should generate the flag non-refdata" do
|
805
|
+
doc = REXML::Document.new File.new(checkAndGetArticleXmlName("non-refdata"))
|
806
|
+
expect(REXML::XPath.match(doc, "//REF_DATA").size).to eq NR_EXTENDED_ARTICLES
|
819
807
|
end
|
820
808
|
|
821
|
-
it
|
809
|
+
it "should generate SALECD A for migel (NINCD 13)" do
|
822
810
|
doc = REXML::Document.new File.new(checkAndGetArticleXmlName)
|
823
|
-
article = XPath.match(
|
824
|
-
expect(article.elements[
|
825
|
-
expect(article.elements[
|
811
|
+
article = REXML::XPath.match(doc, "//ART[DSCRD='ACTICOAT Flex 7 Wundverband 10x12.5cm 5 Stk']").first
|
812
|
+
expect(article.elements["SALECD"].text).to eq("A")
|
813
|
+
expect(article.elements["ARTINS/NINCD"].text).to eq("13")
|
826
814
|
end
|
827
815
|
|
828
|
-
it
|
816
|
+
it "should pass validating via oddb2xml.xsd" do
|
829
817
|
check_validation_via_xsd
|
830
818
|
end
|
831
819
|
|
832
|
-
it
|
820
|
+
it "should not contain veterinary iksnr 47066 CANIPHEDRIN" do
|
833
821
|
doc = REXML::Document.new File.new(checkAndGetArticleXmlName)
|
834
|
-
|
835
|
-
expect(XPath.match(
|
836
|
-
expect(XPath.match(
|
822
|
+
REXML::XPath.match(doc, "//ART")
|
823
|
+
expect(REXML::XPath.match(doc, "//BC").count { |x| x.text.match("47066") }).to eq(0)
|
824
|
+
expect(REXML::XPath.match(doc, "//DSCRD").count { |x| x.text.match(/CANIPHEDRIN/) }).to eq(0)
|
837
825
|
end
|
838
826
|
|
839
|
-
it
|
827
|
+
it "should handle not duplicate pharmacode 5366964" do
|
840
828
|
doc = REXML::Document.new File.new(checkAndGetArticleXmlName)
|
841
|
-
dscrds = XPath.match(
|
842
|
-
expect(XPath.match(
|
843
|
-
expect(dscrds.size).to eq(
|
844
|
-
expect(XPath.match(
|
845
|
-
expect(XPath.match(
|
846
|
-
expect(XPath.match(
|
829
|
+
dscrds = REXML::XPath.match(doc, "//ART")
|
830
|
+
expect(REXML::XPath.match(doc, "//PHAR").count { |x| x.text.match("5366964") }).to eq(1)
|
831
|
+
expect(dscrds.size).to eq(NR_EXTENDED_ARTICLES)
|
832
|
+
expect(REXML::XPath.match(doc, "//PRODNO").count { |x| true }.size).to be >= 1
|
833
|
+
expect(REXML::XPath.match(doc, "//PRODNO").count { |x| x.text.match("0027701") }).to eq(1)
|
834
|
+
expect(REXML::XPath.match(doc, "//PRODNO").count { |x| x.text.match("6206901") }).to eq(1)
|
847
835
|
end
|
848
836
|
|
849
|
-
it
|
837
|
+
it "should load correct number of nonpharma" do
|
850
838
|
puts checkAndGetArticleXmlName
|
851
839
|
doc = REXML::Document.new File.new(checkAndGetArticleXmlName)
|
852
|
-
dscrds = XPath.match(
|
853
|
-
expect(dscrds.size).to eq(
|
854
|
-
expect(XPath.match(
|
855
|
-
expect(XPath.match(
|
840
|
+
dscrds = REXML::XPath.match(doc, "//ART")
|
841
|
+
expect(dscrds.size).to eq(NR_EXTENDED_ARTICLES)
|
842
|
+
expect(REXML::XPath.match(doc, "//PHAR").count { |x| x.text.match("0000000") }).to eq(0) # 0 is not a valid pharmacode
|
843
|
+
expect(REXML::XPath.match(doc, "//PHAR").count { |x| x.text.match(/\d+/) }).to eq 66
|
856
844
|
end
|
857
845
|
|
858
|
-
it
|
859
|
-
check_result(File.read(
|
846
|
+
it "should have a correct NBR_RECORD in oddb_limitation.xml" do
|
847
|
+
check_result(File.read("oddb_limitation.xml"), NR_LIMITATIONS)
|
860
848
|
end
|
861
849
|
|
862
|
-
it
|
850
|
+
it "should emit a correct oddb_limitation.xml" do
|
863
851
|
# check limitations
|
864
|
-
limitation_filename = File.expand_path(File.join(Oddb2xml::
|
865
|
-
expect(File.
|
852
|
+
limitation_filename = File.expand_path(File.join(Oddb2xml::WORK_DIR, "oddb_limitation.xml"))
|
853
|
+
expect(File.exist?(limitation_filename)).to eq true
|
866
854
|
doc = REXML::Document.new File.new(limitation_filename)
|
867
|
-
limitations = XPath.match(
|
868
|
-
expect(limitations.size).to eql
|
869
|
-
expect(XPath.match(
|
870
|
-
expect(XPath.match(
|
871
|
-
expect(XPath.match(
|
872
|
-
expect(XPath.match(
|
873
|
-
expect(XPath.match(
|
855
|
+
limitations = REXML::XPath.match(doc, "//LIM")
|
856
|
+
expect(limitations.size).to eql NR_LIMITATIONS
|
857
|
+
expect(REXML::XPath.match(doc, "//SwissmedicNo5").count { |x| x.text.match("28486") }).to eq(1)
|
858
|
+
expect(REXML::XPath.match(doc, "//LIMNAMEBAG").count { |x| x.text.match("ZYVOXID") }).to eq(2)
|
859
|
+
expect(REXML::XPath.match(doc, "//LIMNAMEBAG").count { |x| x.text.match("070240") }).to be >= 1
|
860
|
+
expect(REXML::XPath.match(doc, "//DSCRD").count { |x| x.text.match(/^Gesamthaft zugelassen/) }).to be >= 1
|
861
|
+
expect(REXML::XPath.match(doc, "//DSCRD").count { |x| x.text.match(/^Behandlung nosokomialer Pneumonien/) }).to be >= 1
|
874
862
|
end
|
875
863
|
|
876
|
-
it
|
877
|
-
doc = REXML::Document.new File.new(File.join(Oddb2xml::
|
878
|
-
names = XPath.match(
|
879
|
-
expect(names.size).to eq(
|
880
|
-
expect(names.
|
864
|
+
it "should emit a correct oddb_substance.xml" do
|
865
|
+
doc = REXML::Document.new File.new(File.join(Oddb2xml::WORK_DIR, "oddb_substance.xml"))
|
866
|
+
names = REXML::XPath.match(doc, "//NAML")
|
867
|
+
expect(names.size).to eq(NR_SUBSTANCES)
|
868
|
+
expect(names.count { |x| x.text.match("Lamivudinum") }).to eq(1)
|
881
869
|
end
|
882
870
|
|
883
|
-
it
|
884
|
-
doc = REXML::Document.new File.new(File.join(Oddb2xml::
|
885
|
-
titles = XPath.match(
|
871
|
+
it "should emit a correct oddb_interaction.xml" do
|
872
|
+
doc = REXML::Document.new File.new(File.join(Oddb2xml::WORK_DIR, "oddb_interaction.xml"))
|
873
|
+
titles = REXML::XPath.match(doc, "//TITD")
|
886
874
|
expect(titles.size).to eq 2
|
887
|
-
expect(titles.
|
888
|
-
expect(titles.
|
875
|
+
expect(titles.count { |x| x.text.match("Keine Interaktion") }).to be >= 1
|
876
|
+
expect(titles.count { |x| x.text.match("Erhöhtes Risiko für Myopathie und Rhabdomyolyse") }).to eq(1)
|
889
877
|
end
|
890
878
|
|
891
879
|
def checkItemForSALECD(doc, ean13, expected)
|
892
|
-
article = XPath.match(
|
893
|
-
name
|
894
|
-
salecd
|
895
|
-
if $VERBOSE
|
880
|
+
article = REXML::XPath.match(doc, "//ART[ARTBAR/BC=#{ean13}]").first
|
881
|
+
name = article.elements["DSCRD"].text
|
882
|
+
salecd = article.elements["SALECD"].text
|
883
|
+
if $VERBOSE || (article.elements["SALECD"].text != expected.to_s)
|
896
884
|
puts "checking doc for ean13 #{ean13} expected #{expected} == #{salecd}. #{name}"
|
897
885
|
puts article.text
|
898
886
|
end
|
899
|
-
expect(article.elements[
|
887
|
+
expect(article.elements["SALECD"].text).to eq(expected.to_s)
|
900
888
|
end
|
901
889
|
|
902
|
-
it
|
903
|
-
expect(File.
|
904
|
-
FileUtils.cp(oddb_article_xml, File.join(Oddb2xml::
|
905
|
-
article_xml = IO.read(oddb_article_xml)
|
890
|
+
it "should generate the flag SALECD" do
|
891
|
+
expect(File.exist?(oddb_article_xml)).to eq true
|
892
|
+
FileUtils.cp(oddb_article_xml, File.join(Oddb2xml::WORK_DIR, "tst-SALECD.xml"))
|
906
893
|
doc = REXML::Document.new File.new(oddb_article_xml)
|
907
|
-
expect(XPath.match(
|
908
|
-
checkItemForSALECD(doc, Oddb2xml::FERRO_GRADUMET_GTIN,
|
909
|
-
checkItemForSALECD(doc, Oddb2xml::SOFRADEX_GTIN,
|
894
|
+
expect(REXML::XPath.match(doc, "//REF_DATA").size).to be > 0
|
895
|
+
checkItemForSALECD(doc, Oddb2xml::FERRO_GRADUMET_GTIN, "A") # FERRO-GRADUMET Depottabl 30 Stk
|
896
|
+
checkItemForSALECD(doc, Oddb2xml::SOFRADEX_GTIN, "I") # SOFRADEX
|
910
897
|
end
|
911
898
|
end
|
912
|
-
context
|
899
|
+
context "testing -e -I 80 option" do
|
913
900
|
before(:all) do
|
914
901
|
common_run_init
|
915
|
-
options = Oddb2xml::Options.parse(
|
902
|
+
options = Oddb2xml::Options.parse("-e -I 80 --log")
|
916
903
|
# @res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
917
904
|
@res = Oddb2xml::Cli.new(options).run
|
918
905
|
end
|
919
906
|
|
920
|
-
it
|
921
|
-
expect(File.
|
922
|
-
FileUtils.cp(oddb_article_xml, File.join(Oddb2xml::
|
907
|
+
it "should add 80 percent to zur_rose pubbprice" do
|
908
|
+
expect(File.exist?(oddb_article_xml)).to eq true
|
909
|
+
FileUtils.cp(oddb_article_xml, File.join(Oddb2xml::WORK_DIR, "tst-e80.xml"))
|
923
910
|
checkArticleXml
|
924
911
|
checkPrices(true)
|
925
912
|
end
|
926
913
|
|
927
|
-
it
|
928
|
-
expect(File.
|
914
|
+
it "should generate an article for EPIMINERAL" do
|
915
|
+
expect(File.exist?(oddb_article_xml)).to eq true
|
929
916
|
doc = REXML::Document.new IO.read(oddb_article_xml)
|
930
|
-
article = XPath.match(
|
931
|
-
expect(article.elements[
|
917
|
+
article = REXML::XPath.match(doc, "//ART[PHAR=5822801]").first
|
918
|
+
expect(article.elements["DSCRD"].text).to match(/EPIMINERAL/i)
|
932
919
|
end
|
933
920
|
|
934
|
-
it
|
935
|
-
checkProductXml(
|
921
|
+
it "should generate a correct number of packages in oddb_product.xml" do
|
922
|
+
checkProductXml(NR_PACKAGES)
|
936
923
|
end
|
937
924
|
|
938
|
-
it
|
925
|
+
it "should generate an article with the COOL (fridge) attribute" do
|
939
926
|
doc = REXML::Document.new File.new(oddb_article_xml)
|
940
927
|
fridge_product = checkAndGetArticleWithGTIN(doc, Oddb2xml::FRIDGE_GTIN)
|
941
|
-
expect(fridge_product.elements[
|
928
|
+
expect(fridge_product.elements["COOL"].text).to eq("1")
|
942
929
|
end
|
943
930
|
|
944
|
-
it
|
931
|
+
it "should generate a correct oddb_article.xml" do
|
945
932
|
checkArticleXml
|
946
933
|
end
|
947
934
|
end
|
948
935
|
|
949
|
-
context
|
936
|
+
context "when -f dat -p is given" do
|
950
937
|
before(:all) do
|
951
938
|
common_run_init
|
952
|
-
options = Oddb2xml::Options.parse(
|
953
|
-
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
939
|
+
options = Oddb2xml::Options.parse("-f dat -p")
|
940
|
+
@res = buildr_capture(:stdout) { Oddb2xml::Cli.new(options).run }
|
954
941
|
end
|
955
942
|
|
956
|
-
it
|
943
|
+
it "should report correct number of items" do
|
957
944
|
expect(@res).to match(/products/)
|
958
945
|
end
|
959
946
|
|
960
|
-
it
|
961
|
-
dat_filename = File.join(Oddb2xml::
|
962
|
-
expect(File.
|
947
|
+
it "should contain the correct values fo CMUT from transfer.dat" do
|
948
|
+
dat_filename = File.join(Oddb2xml::WORK_DIR, "oddb.dat")
|
949
|
+
expect(File.exist?(dat_filename)).to eq true
|
963
950
|
oddb_dat = IO.read(dat_filename)
|
964
951
|
expect(oddb_dat).to match(/^..2/), "should have a record with '2' in CMUT field"
|
965
952
|
expect(oddb_dat).to match(/^..3/), "should have a record with '3' in CMUT field"
|
966
|
-
expect(oddb_dat).to match(
|
967
|
-
IO.readlines(dat_filename).each{ |line| check_article_IGM_format(line, 0) }
|
953
|
+
expect(oddb_dat).to match(REG_EXP_DESITIN), "should have Desitin"
|
954
|
+
IO.readlines(dat_filename).each { |line| check_article_IGM_format(line, 0) }
|
968
955
|
# oddb_dat.should match(/^..1/), "should have a record with '1' in CMUT field" # we have no
|
969
956
|
end
|
970
957
|
end
|
971
958
|
|
972
|
-
context
|
959
|
+
context "when -f dat -I 80 is given" do
|
973
960
|
before(:all) do
|
974
961
|
common_run_init
|
975
|
-
options = Oddb2xml::Options.parse(
|
976
|
-
@res = buildr_capture(:stdout){ Oddb2xml::Cli.new(options).run }
|
962
|
+
options = Oddb2xml::Options.parse("-f dat -I 80")
|
963
|
+
@res = buildr_capture(:stdout) { Oddb2xml::Cli.new(options).run }
|
977
964
|
end
|
978
965
|
|
979
|
-
it
|
966
|
+
it "should report correct number of items" do
|
980
967
|
expect(@res).to match(/products/)
|
981
968
|
end
|
982
969
|
|
983
|
-
it
|
984
|
-
dat_filename = File.join(Oddb2xml::
|
985
|
-
expect(File.
|
986
|
-
|
987
|
-
oddb_dat_lines = IO.readlines(dat_filename)
|
988
|
-
IO.readlines(dat_filename).each{ |line| check_article_IGM_format(line, 892, true) }
|
970
|
+
it "should contain the corect prices" do
|
971
|
+
dat_filename = File.join(Oddb2xml::WORK_DIR, "oddb.dat")
|
972
|
+
expect(File.exist?(dat_filename)).to eq true
|
973
|
+
IO.readlines(dat_filename).each { |line| check_article_IGM_format(line, 892, true) }
|
989
974
|
end
|
990
975
|
end
|
991
|
-
context
|
992
|
-
it
|
993
|
-
lines = IO.readlines(File.join(Oddb2xml::SpecData,
|
976
|
+
context "when utf-8 to iso-8859 fails" do
|
977
|
+
it "should return a correct 8859 line" do
|
978
|
+
lines = IO.readlines(File.join(Oddb2xml::SpecData, "problems.txt"))
|
994
979
|
out = Oddb2xml.convert_to_8859_1(lines.first)
|
995
|
-
expect(out.encoding.to_s).to eq
|
996
|
-
expect(out.chomp).to eq
|
980
|
+
expect(out.encoding.to_s).to eq "ISO-8859-1"
|
981
|
+
expect(out.chomp).to eq "<NAME_DE>SENSURA Mio 1t Uro 10-33 midi con lig so op 10 Stk</NAME_DE>"
|
997
982
|
end
|
998
983
|
end
|
999
|
-
|
1000
984
|
end
|