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.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +12 -0
  5. data/.yardopts +9 -0
  6. data/CHANGELOG.md +5 -0
  7. data/Gemfile +36 -0
  8. data/Guardfile +26 -0
  9. data/LICENSE.txt +22 -0
  10. data/MX-Banxico.gemspec +29 -0
  11. data/README.md +140 -0
  12. data/REFERENCIAS.md +6 -0
  13. data/Rakefile +26 -0
  14. data/lib/MX/Banxico.rb +12 -0
  15. data/lib/MX/Banxico/historico.rb +4 -0
  16. data/lib/MX/Banxico/historico/tipo_de_cambio.rb +296 -0
  17. data/lib/MX/Banxico/series.rb +346 -0
  18. data/lib/MX/Banxico/tipo_de_cambio.rb +159 -0
  19. data/lib/MX/Banxico/version.rb +14 -0
  20. data/lib/MX/Banxico/web_services.rb +4 -0
  21. data/lib/MX/Banxico/web_services/tipo_de_cambio.rb +83 -0
  22. data/lib/MX/Banxico/web_services/web_service.rb +99 -0
  23. data/spec/MX/Banxico/historico/tipo_de_cambio_spec.rb +525 -0
  24. data/spec/MX/Banxico/series_spec.rb +475 -0
  25. data/spec/MX/Banxico/tipo_de_cambio_spec.rb +688 -0
  26. data/spec/MX/Banxico/web_services/tipo_de_cambio_spec.rb +152 -0
  27. data/spec/MX/Banxico/web_services/web_service_spec.rb +108 -0
  28. data/spec/fixtures/MX/Banxico/historico/respuestas_correctas/tipo_de_cambio.xml +2228 -0
  29. data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/mal_formado.xml +1 -0
  30. data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/serie_sin_valores.xml +28 -0
  31. data/spec/fixtures/MX/Banxico/historico/respuestas_incorrectas/sin_series.xml +26 -0
  32. data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/respuesta_correcta.xml +393 -0
  33. data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/serie_sin_valores.xml +28 -0
  34. data/spec/fixtures/MX/Banxico/historico/tipo_de_cambio/dolar_fix/sin_serie.xml +26 -0
  35. data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/reservas_internacionales_banxico.xml +41 -0
  36. data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/tasas_de_interes_banxico.xml +50 -0
  37. data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/tipos_de_cambio_banxico.xml +56 -0
  38. data/spec/fixtures/MX/Banxico/web_services/respuestas_correctas/udis_banxico.xml +41 -0
  39. data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_fecha_tipo_de_cambio.xml +41 -0
  40. data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_nodo_obs.xml +40 -0
  41. data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/error_valor_tipo_de_cambio.xml +41 -0
  42. data/spec/fixtures/MX/Banxico/web_services/tipo_de_cambio/dolar_fix/respuesta_correcta.xml +41 -0
  43. data/spec/spec_helper.rb +31 -0
  44. 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