MX-Banxico 1.0.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 +7 -0
- data/.gitignore +18 -0
- data/.rspec +3 -0
- data/.travis.yml +12 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +36 -0
- data/Guardfile +26 -0
- data/LICENSE.txt +22 -0
- data/MX-Banxico.gemspec +29 -0
- data/README.md +140 -0
- data/REFERENCIAS.md +6 -0
- data/Rakefile +26 -0
- data/lib/MX/Banxico.rb +12 -0
- data/lib/MX/Banxico/historico.rb +4 -0
- data/lib/MX/Banxico/historico/tipo_de_cambio.rb +296 -0
- data/lib/MX/Banxico/series.rb +346 -0
- data/lib/MX/Banxico/tipo_de_cambio.rb +159 -0
- data/lib/MX/Banxico/version.rb +14 -0
- data/lib/MX/Banxico/web_services.rb +4 -0
- data/lib/MX/Banxico/web_services/tipo_de_cambio.rb +83 -0
- data/lib/MX/Banxico/web_services/web_service.rb +99 -0
- data/spec/MX/Banxico/historico/tipo_de_cambio_spec.rb +525 -0
- data/spec/MX/Banxico/series_spec.rb +475 -0
- data/spec/MX/Banxico/tipo_de_cambio_spec.rb +688 -0
- data/spec/MX/Banxico/web_services/tipo_de_cambio_spec.rb +152 -0
- data/spec/MX/Banxico/web_services/web_service_spec.rb +108 -0
- data/spec/fixtures/MX/Banxico/historico/respuestas_correctas/tipo_de_cambio.xml +2228 -0
- data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/mal_formado.xml +1 -0
- data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/serie_sin_valores.xml +28 -0
- data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/sin_series.xml +26 -0
- data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/respuesta_correcta.xml +393 -0
- data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/serie_sin_valores.xml +28 -0
- data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/sin_serie.xml +26 -0
- data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/reservas_internacionales_banxico.xml +41 -0
- data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/tasas_de_interes_banxico.xml +50 -0
- data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/tipos_de_cambio_banxico.xml +56 -0
- data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/udis_banxico.xml +41 -0
- data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_fecha_tipo_de_cambio.xml +41 -0
- data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_nodo_obs.xml +40 -0
- data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_valor_tipo_de_cambio.xml +41 -0
- data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/respuesta_correcta.xml +41 -0
- data/spec/spec_helper.rb +31 -0
- metadata +152 -0
@@ -0,0 +1,475 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe MX::Banxico::Series, :series do
|
4
|
+
|
5
|
+
|
6
|
+
describe '.tipos' do
|
7
|
+
|
8
|
+
it 'es un arreglo de símbolos con los nombres de los tipos de series' do
|
9
|
+
expect(described_class.tipos).to be_a Array
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'tiene un elemento :reservas_internacionales' do
|
13
|
+
expect(described_class.tipos).to include :reservas_internacionales
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'tiene un elemento :tasas_de_interes' do
|
17
|
+
expect(described_class.tipos).to include :tasas_de_interes
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'tiene un elemento :tipos_de_cambio' do
|
21
|
+
expect(described_class.tipos).to include :tipos_de_cambio
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'tiene un elemento :udis' do
|
25
|
+
expect(described_class.tipos).to include :udis
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
describe '.todas' do
|
32
|
+
|
33
|
+
it 'es un Hash de Hashes con los tipos de series como llave' do
|
34
|
+
expect(described_class.todas).to be_a Hash
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'es la constante TIPOS' do
|
38
|
+
expect(described_class.todas).to eq described_class::TIPOS
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
describe '.reservas_internacionales' do
|
45
|
+
|
46
|
+
it 'es un Hash de Hashes con el nombre de la serie como llave' do
|
47
|
+
expect(described_class.reservas_internacionales).to be_a Hash
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'es la constante SERIES_RESERVAS_INTERNACIONALES' do
|
51
|
+
expect(described_class.reservas_internacionales).to eq described_class::SERIES_RESERVAS_INTERNACIONALES
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
describe 'tiene las series' do
|
56
|
+
|
57
|
+
context 'Reserva internacional' do
|
58
|
+
|
59
|
+
it 'tiene la llave :reservas_internacionales' do
|
60
|
+
expect(described_class.reservas_internacionales).to have_key :reserva_internacional
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'tiene el identificador SF43707' do
|
64
|
+
expect(described_class.reservas_internacionales[:reserva_internacional][:id]).to eq "SF43707"
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
describe '.tasas_de_interes' do
|
75
|
+
|
76
|
+
it 'es un Hash de Hashes con el nombre de la serie como llave' do
|
77
|
+
expect(described_class.tasas_de_interes).to be_a Hash
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'es la constante SERIES_TASAS_DE_INTERES' do
|
81
|
+
expect(described_class.tasas_de_interes).to eq described_class::SERIES_TASAS_DE_INTERES
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
describe 'tiene las series' do
|
86
|
+
|
87
|
+
context 'Tasa objetivo' do
|
88
|
+
|
89
|
+
it 'tiene la llave :tasa_objetivo' do
|
90
|
+
expect(described_class.tasas_de_interes).to have_key :tasa_objetivo
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'tiene el identificador SF61745' do
|
94
|
+
expect(described_class.tasas_de_interes[:tasa_objetivo][:id]).to eq "SF61745"
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
context 'Tasa interbancaria TIEE 28 días' do
|
101
|
+
|
102
|
+
it 'tiene la llave :tasa_interes_interbancaria_tiie_28_dias' do
|
103
|
+
expect(described_class.tasas_de_interes).to have_key :tasa_interes_interbancaria_tiie_28_dias
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'tiene el identificador SF60648' do
|
107
|
+
expect(described_class.tasas_de_interes[:tasa_interes_interbancaria_tiie_28_dias][:id]).to eq "SF60648"
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
context 'Tasa interbancaria TIEE 91 días' do
|
114
|
+
|
115
|
+
it 'tiene la llave :tasa_interes_interbancaria_tiie_91_dias' do
|
116
|
+
expect(described_class.tasas_de_interes).to have_key :tasa_interes_interbancaria_tiie_91_dias
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'tiene el identificador SF60649' do
|
120
|
+
expect(described_class.tasas_de_interes[:tasa_interes_interbancaria_tiie_91_dias][:id]).to eq "SF60649"
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
context 'Tasa rendimiento cetes a 28 días' do
|
127
|
+
|
128
|
+
it 'tiene la llave :tasa_rendimiento_cetes_28_dias' do
|
129
|
+
expect(described_class.tasas_de_interes).to have_key :tasa_rendimiento_cetes_28_dias
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'tiene el identificador SF60633' do
|
133
|
+
expect(described_class.tasas_de_interes[:tasa_rendimiento_cetes_28_dias][:id]).to eq "SF60633"
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
describe '.tipos_de_cambio' do
|
144
|
+
|
145
|
+
it 'es un Hash de Hashes con el nombre de la serie como llave' do
|
146
|
+
expect(described_class.tipos_de_cambio).to be_a Hash
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'es la constante SERIES_TIPOS_DE_CAMBIO' do
|
150
|
+
expect(described_class.tipos_de_cambio).to eq described_class::SERIES_TIPOS_DE_CAMBIO
|
151
|
+
end
|
152
|
+
|
153
|
+
|
154
|
+
describe 'tiene las series' do
|
155
|
+
|
156
|
+
context 'Dólar canadiense' do
|
157
|
+
|
158
|
+
it 'tiene la llave :dolar_canadiense' do
|
159
|
+
expect(described_class.tipos_de_cambio).to have_key :dolar_canadiense
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'tiene el identificador SF60632' do
|
163
|
+
expect(described_class.tipos_de_cambio[:dolar_canadiense][:id]).to eq "SF60632"
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
context 'Dólar fix' do
|
170
|
+
|
171
|
+
it 'tiene la llave :dolar_fix' do
|
172
|
+
expect(described_class.tipos_de_cambio).to have_key :dolar_fix
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'tiene el identificador SF43718' do
|
176
|
+
expect(described_class.tipos_de_cambio[:dolar_fix][:id]).to eq "SF43718"
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
context 'Dólar liquidación' do
|
183
|
+
|
184
|
+
it 'tiene la llave :dolar_liquidacion' do
|
185
|
+
expect(described_class.tipos_de_cambio).to have_key :dolar_liquidacion
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'tiene el identificador SF60653' do
|
189
|
+
expect(described_class.tipos_de_cambio[:dolar_liquidacion][:id]).to eq "SF60653"
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
context 'Euro' do
|
196
|
+
|
197
|
+
it 'tiene la llave :euro' do
|
198
|
+
expect(described_class.tipos_de_cambio).to have_key :euro
|
199
|
+
end
|
200
|
+
|
201
|
+
it 'tiene el identificador SF46410' do
|
202
|
+
expect(described_class.tipos_de_cambio[:euro][:id]).to eq "SF46410"
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
|
207
|
+
|
208
|
+
context 'Libra esterlina' do
|
209
|
+
|
210
|
+
it 'tiene la llave :libra_esterlina' do
|
211
|
+
expect(described_class.tipos_de_cambio).to have_key :libra_esterlina
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'tiene el identificador SF46407' do
|
215
|
+
expect(described_class.tipos_de_cambio[:libra_esterlina][:id]).to eq "SF46407"
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
context 'Yen' do
|
222
|
+
|
223
|
+
it 'tiene la llave :yen' do
|
224
|
+
expect(described_class.tipos_de_cambio).to have_key :yen
|
225
|
+
end
|
226
|
+
|
227
|
+
it 'tiene el identificador SF46406' do
|
228
|
+
expect(described_class.tipos_de_cambio[:yen][:id]).to eq "SF46406"
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
235
|
+
|
236
|
+
|
237
|
+
describe '.udis' do
|
238
|
+
|
239
|
+
it 'es un Hash de Hashes con el nombre de la serie como llave' do
|
240
|
+
expect(described_class.udis).to be_a Hash
|
241
|
+
end
|
242
|
+
|
243
|
+
it 'es la constante SERIES_UDIS' do
|
244
|
+
expect(described_class.udis).to eq described_class::SERIES_UDIS
|
245
|
+
end
|
246
|
+
|
247
|
+
describe 'tiene las series' do
|
248
|
+
|
249
|
+
context 'UDIS' do
|
250
|
+
|
251
|
+
it 'tiene la llave :udis' do
|
252
|
+
expect(described_class.udis).to have_key :udis
|
253
|
+
end
|
254
|
+
|
255
|
+
it 'tiene el identificador SP68257' do
|
256
|
+
expect(described_class.udis[:udis][:id]).to eq "SP68257"
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
262
|
+
|
263
|
+
end
|
264
|
+
|
265
|
+
|
266
|
+
describe '.identificador' do
|
267
|
+
|
268
|
+
context 'cuando el tipo dado no existe' do
|
269
|
+
it 'levanta una excepción' do
|
270
|
+
tipo = :tipo_inexistente
|
271
|
+
expect { described_class.identificador(tipo, :dolar_fix) }.to raise_error(ArgumentError, "El tipo no existe (tipo: #{tipo}).")
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
context 'cuando la serie dada no existe' do
|
276
|
+
it 'levanta una excepción' do
|
277
|
+
serie = :serie_inexistente
|
278
|
+
expect { described_class.identificador(:tipos_de_cambio, serie) }.to raise_error(ArgumentError, "La serie no existe (serie: #{serie}).")
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
context 'cuando el tipo y la serie dados existen' do
|
283
|
+
|
284
|
+
it 'es el identificador de la serie dada' do
|
285
|
+
expect(described_class.identificador(:tipos_de_cambio, :dolar_fix)).to eq "SF43718"
|
286
|
+
end
|
287
|
+
|
288
|
+
end
|
289
|
+
|
290
|
+
end
|
291
|
+
|
292
|
+
|
293
|
+
describe '.identificadores' do
|
294
|
+
|
295
|
+
context 'cuando el tipo dado es nulo' do
|
296
|
+
|
297
|
+
it 'es un arreglo con los identificadores de todas las series' do
|
298
|
+
ids = described_class.identificadores
|
299
|
+
ids_serie = described_class::TIPOS.inject([]){ |arr, tipo_serie| arr << tipo_serie.last.values.each.map{ |s| s[:id] } }.flatten
|
300
|
+
ids_serie.each do |id|
|
301
|
+
expect(ids).to include id
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
end
|
306
|
+
|
307
|
+
|
308
|
+
context 'cuando el tipo dado no es nulo' do
|
309
|
+
|
310
|
+
context 'cuando el tipo dado no existe' do
|
311
|
+
|
312
|
+
it 'levanta una excepción' do
|
313
|
+
tipo = :tipo_inexistente
|
314
|
+
expect { described_class.identificadores(tipo) }.to raise_error(ArgumentError, "El tipo no existe (tipo: #{tipo}).")
|
315
|
+
end
|
316
|
+
|
317
|
+
end
|
318
|
+
|
319
|
+
context 'cuando el tipo dado existe' do
|
320
|
+
|
321
|
+
it 'es un arreglo con los identificadores de todas las series del tipo dado' do
|
322
|
+
tipo = :tipos_de_cambio
|
323
|
+
ids = described_class.identificadores(tipo)
|
324
|
+
ids_serie = described_class::send(tipo).values.each.map{ |s| s[:id] }
|
325
|
+
ids_serie.each do |id|
|
326
|
+
expect(ids).to include id
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
end
|
331
|
+
|
332
|
+
end
|
333
|
+
|
334
|
+
end
|
335
|
+
|
336
|
+
|
337
|
+
describe '.nombre' do
|
338
|
+
|
339
|
+
context 'cuando el identificador dado no existe' do
|
340
|
+
let!(:id){ "IDINEXISTENTE" }
|
341
|
+
|
342
|
+
context 'cuando el tipo dado es nulo' do
|
343
|
+
|
344
|
+
it 'levanta una excepción' do
|
345
|
+
expect { described_class.nombre(id) }.to raise_error(ArgumentError, "El identificador no existe (identificador: #{id}).")
|
346
|
+
end
|
347
|
+
|
348
|
+
end
|
349
|
+
|
350
|
+
|
351
|
+
context 'cuando el tipo dado no es nulo' do
|
352
|
+
|
353
|
+
context 'cuando el tipo dado no existe' do
|
354
|
+
|
355
|
+
it 'levanta una excepción' do
|
356
|
+
tipo = :tipo_inexistente
|
357
|
+
expect { described_class.nombre(id, tipo) }.to raise_error(ArgumentError, "El tipo no existe (tipo: #{tipo}).")
|
358
|
+
end
|
359
|
+
|
360
|
+
end
|
361
|
+
|
362
|
+
|
363
|
+
context 'cuando el tipo dado existe' do
|
364
|
+
|
365
|
+
it 'levanta una excepción' do
|
366
|
+
tipo = :tipos_de_cambio
|
367
|
+
expect { described_class.nombre(id, :tipos_de_cambio) }.to raise_error(ArgumentError, "El identificador (identificador: #{id}) no se encuentra en el tipo de serie dado (tipo: #{tipo}).")
|
368
|
+
end
|
369
|
+
|
370
|
+
end
|
371
|
+
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
|
376
|
+
context 'cuando el identificador dado existe' do
|
377
|
+
let!(:id){ "SF43718" }
|
378
|
+
let!(:nombre){ :dolar_fix }
|
379
|
+
|
380
|
+
context 'cuando el tipo dado es nulo' do
|
381
|
+
|
382
|
+
it 'es el nombre de la serie correspondiente al identificador' do
|
383
|
+
expect(described_class.nombre(id)).to eq nombre
|
384
|
+
end
|
385
|
+
|
386
|
+
end
|
387
|
+
|
388
|
+
|
389
|
+
context 'cuando el tipo dado no es nulo' do
|
390
|
+
|
391
|
+
context 'cuando el tipo dado no existe' do
|
392
|
+
|
393
|
+
it 'levanta una excepción' do
|
394
|
+
tipo = :tipo_inexistente
|
395
|
+
expect { described_class.nombre(id, tipo) }.to raise_error(ArgumentError, "El tipo no existe (tipo: #{tipo}).")
|
396
|
+
end
|
397
|
+
|
398
|
+
end
|
399
|
+
|
400
|
+
|
401
|
+
context 'cuando el tipo dado existe' do
|
402
|
+
let!(:tipo) { :tipos_de_cambio }
|
403
|
+
|
404
|
+
context 'cuando el identificador corresponde al tipo de serie dado' do
|
405
|
+
|
406
|
+
it 'es el nombre de la serie correspondiente al identificador' do
|
407
|
+
expect(described_class.nombre(id)).to eq nombre
|
408
|
+
end
|
409
|
+
|
410
|
+
end
|
411
|
+
|
412
|
+
|
413
|
+
context 'cuando el identificador no corresponde al tipo de serie dado' do
|
414
|
+
let!(:id){ "SP68257" }
|
415
|
+
|
416
|
+
it 'levanta una excepción' do
|
417
|
+
expect { described_class.nombre(id, tipo) }.to raise_error(ArgumentError, "El identificador (identificador: #{id}) no se encuentra en el tipo de serie dado (tipo: #{tipo}).")
|
418
|
+
end
|
419
|
+
|
420
|
+
end
|
421
|
+
|
422
|
+
end
|
423
|
+
|
424
|
+
end
|
425
|
+
|
426
|
+
end
|
427
|
+
|
428
|
+
end
|
429
|
+
|
430
|
+
|
431
|
+
describe '.nombres' do
|
432
|
+
|
433
|
+
context 'cuando el tipo dado es nulo' do
|
434
|
+
|
435
|
+
it 'es un arreglo con los nombres de todas las series' do
|
436
|
+
nombres = described_class.nombres
|
437
|
+
nombres_serie = described_class::TIPOS.inject([]){ |arr, tipo_serie| arr << tipo_serie.last.keys }.flatten
|
438
|
+
nombres_serie.each do |nombre|
|
439
|
+
expect(nombres).to include nombre
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
end
|
444
|
+
|
445
|
+
|
446
|
+
context 'cuando el tipo dado no es nulo' do
|
447
|
+
|
448
|
+
context 'cuando el tipo dado no existe' do
|
449
|
+
|
450
|
+
it 'levanta una excepción' do
|
451
|
+
tipo = :tipo_inexistente
|
452
|
+
expect { described_class.nombres(tipo) }.to raise_error(ArgumentError, "El tipo no existe (tipo: #{tipo}).")
|
453
|
+
end
|
454
|
+
|
455
|
+
end
|
456
|
+
|
457
|
+
context 'cuando el tipo dado existe' do
|
458
|
+
|
459
|
+
it 'es un arreglo con los nombres de todas las series del tipo dado' do
|
460
|
+
tipo = :tipos_de_cambio
|
461
|
+
nombres = described_class.nombres(tipo)
|
462
|
+
nombres_serie = described_class::send(tipo.to_sym).keys
|
463
|
+
expect(nombres_serie).to be_a Array
|
464
|
+
nombres_serie.each do |nombre|
|
465
|
+
expect(nombres).to include nombre
|
466
|
+
end
|
467
|
+
end
|
468
|
+
|
469
|
+
end
|
470
|
+
|
471
|
+
end
|
472
|
+
|
473
|
+
end
|
474
|
+
|
475
|
+
end
|