revised_holidays 9.0.0

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 (382) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +25 -0
  3. data/CHANGELOG.md +446 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +21 -0
  7. data/Makefile +45 -0
  8. data/README.md +337 -0
  9. data/Rakefile +109 -0
  10. data/bin/console +7 -0
  11. data/bin/setup +6 -0
  12. data/definitions/.github/workflows/ruby.yml +25 -0
  13. data/definitions/.gitignore +5 -0
  14. data/definitions/CHANGELOG.md +352 -0
  15. data/definitions/Gemfile +6 -0
  16. data/definitions/LICENSE +21 -0
  17. data/definitions/METHODS.yml +26 -0
  18. data/definitions/Makefile +9 -0
  19. data/definitions/README.md +22 -0
  20. data/definitions/ar.yaml +268 -0
  21. data/definitions/at.yaml +116 -0
  22. data/definitions/au.yaml +907 -0
  23. data/definitions/be_fr.yaml +153 -0
  24. data/definitions/be_nl.yaml +153 -0
  25. data/definitions/bg.yaml +186 -0
  26. data/definitions/br.yaml +178 -0
  27. data/definitions/ca.yaml +969 -0
  28. data/definitions/ch.yaml +277 -0
  29. data/definitions/cl.yaml +294 -0
  30. data/definitions/co.yaml +437 -0
  31. data/definitions/cr.yaml +100 -0
  32. data/definitions/cz.yaml +137 -0
  33. data/definitions/de.yaml +401 -0
  34. data/definitions/dk.yaml +220 -0
  35. data/definitions/doc/CONTRIBUTING.md +44 -0
  36. data/definitions/doc/MAINTAINERS.md +39 -0
  37. data/definitions/doc/SYNTAX.md +435 -0
  38. data/definitions/doc/architecture/README.md +15 -0
  39. data/definitions/doc/architecture/adr-001.md +86 -0
  40. data/definitions/doc/architecture/adr-002.md +64 -0
  41. data/definitions/ecbtarget.yaml +74 -0
  42. data/definitions/ee.yaml +123 -0
  43. data/definitions/es.yaml +495 -0
  44. data/definitions/federalreserve.yaml +389 -0
  45. data/definitions/federalreservebanks.yaml +821 -0
  46. data/definitions/fedex.yaml +102 -0
  47. data/definitions/fi.yaml +234 -0
  48. data/definitions/fr.yaml +157 -0
  49. data/definitions/gb.yaml +565 -0
  50. data/definitions/ge.yaml +158 -0
  51. data/definitions/gr.yaml +158 -0
  52. data/definitions/hk.yaml +287 -0
  53. data/definitions/hr.yaml +171 -0
  54. data/definitions/hu.yaml +156 -0
  55. data/definitions/ie.yaml +172 -0
  56. data/definitions/index.yaml +80 -0
  57. data/definitions/is.yaml +247 -0
  58. data/definitions/it.yaml +246 -0
  59. data/definitions/jp.yaml +761 -0
  60. data/definitions/ke.yaml +107 -0
  61. data/definitions/kr.yaml +166 -0
  62. data/definitions/kz.yaml +128 -0
  63. data/definitions/li.yaml +154 -0
  64. data/definitions/lib/validation/custom_method_validator.rb +38 -0
  65. data/definitions/lib/validation/definition_validator.rb +35 -0
  66. data/definitions/lib/validation/error.rb +11 -0
  67. data/definitions/lib/validation/month_validator.rb +58 -0
  68. data/definitions/lib/validation/run.rb +66 -0
  69. data/definitions/lib/validation/test_validator.rb +83 -0
  70. data/definitions/lt.yaml +198 -0
  71. data/definitions/lu.yaml +123 -0
  72. data/definitions/lv.yaml +229 -0
  73. data/definitions/ma.yaml +96 -0
  74. data/definitions/mt_en.yaml +131 -0
  75. data/definitions/mt_mt.yaml +131 -0
  76. data/definitions/mx.yaml +160 -0
  77. data/definitions/my.yaml +79 -0
  78. data/definitions/nerc.yaml +94 -0
  79. data/definitions/ng.yaml +97 -0
  80. data/definitions/nl.yaml +127 -0
  81. data/definitions/no.yaml +169 -0
  82. data/definitions/northamericainformal.yaml +105 -0
  83. data/definitions/nyse.yaml +137 -0
  84. data/definitions/nz.yaml +346 -0
  85. data/definitions/pe.yaml +208 -0
  86. data/definitions/ph.yaml +130 -0
  87. data/definitions/pl.yaml +796 -0
  88. data/definitions/pt.yaml +187 -0
  89. data/definitions/ro.yaml +240 -0
  90. data/definitions/rs_cyrl.yaml +129 -0
  91. data/definitions/rs_la.yaml +129 -0
  92. data/definitions/ru.yaml +108 -0
  93. data/definitions/se.yaml +238 -0
  94. data/definitions/sg.yaml +89 -0
  95. data/definitions/si.yaml +162 -0
  96. data/definitions/sk.yaml +154 -0
  97. data/definitions/spec/coverage_report.rb +7 -0
  98. data/definitions/spec/data/invalid/months/malformed/bad.yaml +15 -0
  99. data/definitions/spec/data/invalid/months/missing/no_months.yaml +9 -0
  100. data/definitions/spec/data/valid/simple.yaml +15 -0
  101. data/definitions/spec/spec_helper.rb +7 -0
  102. data/definitions/spec/validation/custom_method_validator_spec.rb +60 -0
  103. data/definitions/spec/validation/definition_validator_spec.rb +43 -0
  104. data/definitions/spec/validation/month_validator_spec.rb +175 -0
  105. data/definitions/spec/validation/test_validator_spec.rb +169 -0
  106. data/definitions/th.yaml +111 -0
  107. data/definitions/tn.yaml +83 -0
  108. data/definitions/tr.yaml +174 -0
  109. data/definitions/ua.yaml +161 -0
  110. data/definitions/unitednations.yaml +189 -0
  111. data/definitions/ups.yaml +102 -0
  112. data/definitions/us.yaml +965 -0
  113. data/definitions/ve.yaml +118 -0
  114. data/definitions/vi.yaml +54 -0
  115. data/definitions/za.yaml +139 -0
  116. data/doc/CONTRIBUTING.md +72 -0
  117. data/doc/MAINTAINERS.md +81 -0
  118. data/doc/REFERENCES +19 -0
  119. data/lib/generated_definitions/MANIFEST +83 -0
  120. data/lib/generated_definitions/REGIONS.rb +6 -0
  121. data/lib/generated_definitions/ar.rb +60 -0
  122. data/lib/generated_definitions/at.rb +37 -0
  123. data/lib/generated_definitions/au.rb +177 -0
  124. data/lib/generated_definitions/be.rb +42 -0
  125. data/lib/generated_definitions/be_fr.rb +36 -0
  126. data/lib/generated_definitions/be_nl.rb +36 -0
  127. data/lib/generated_definitions/bg.rb +53 -0
  128. data/lib/generated_definitions/br.rb +37 -0
  129. data/lib/generated_definitions/ca.rb +88 -0
  130. data/lib/generated_definitions/ch.rb +95 -0
  131. data/lib/generated_definitions/cl.rb +71 -0
  132. data/lib/generated_definitions/co.rb +121 -0
  133. data/lib/generated_definitions/cr.rb +35 -0
  134. data/lib/generated_definitions/cz.rb +37 -0
  135. data/lib/generated_definitions/de.rb +65 -0
  136. data/lib/generated_definitions/dk.rb +48 -0
  137. data/lib/generated_definitions/ecbtarget.rb +30 -0
  138. data/lib/generated_definitions/ee.rb +36 -0
  139. data/lib/generated_definitions/el.rb +38 -0
  140. data/lib/generated_definitions/es.rb +56 -0
  141. data/lib/generated_definitions/europe.rb +638 -0
  142. data/lib/generated_definitions/federalreserve.rb +35 -0
  143. data/lib/generated_definitions/federalreservebanks.rb +35 -0
  144. data/lib/generated_definitions/fedex.rb +36 -0
  145. data/lib/generated_definitions/fi.rb +61 -0
  146. data/lib/generated_definitions/fr.rb +39 -0
  147. data/lib/generated_definitions/gb.rb +51 -0
  148. data/lib/generated_definitions/ge.rb +41 -0
  149. data/lib/generated_definitions/gr.rb +38 -0
  150. data/lib/generated_definitions/hk.rb +106 -0
  151. data/lib/generated_definitions/hr.rb +40 -0
  152. data/lib/generated_definitions/hu.rb +35 -0
  153. data/lib/generated_definitions/ie.rb +33 -0
  154. data/lib/generated_definitions/is.rb +60 -0
  155. data/lib/generated_definitions/it.rb +45 -0
  156. data/lib/generated_definitions/jp.rb +166 -0
  157. data/lib/generated_definitions/ke.rb +34 -0
  158. data/lib/generated_definitions/kr.rb +40 -0
  159. data/lib/generated_definitions/kz.rb +38 -0
  160. data/lib/generated_definitions/li.rb +44 -0
  161. data/lib/generated_definitions/lt.rb +38 -0
  162. data/lib/generated_definitions/lu.rb +35 -0
  163. data/lib/generated_definitions/lv.rb +56 -0
  164. data/lib/generated_definitions/ma.rb +33 -0
  165. data/lib/generated_definitions/mt_en.rb +38 -0
  166. data/lib/generated_definitions/mt_mt.rb +38 -0
  167. data/lib/generated_definitions/mx.rb +54 -0
  168. data/lib/generated_definitions/my.rb +30 -0
  169. data/lib/generated_definitions/nerc.rb +30 -0
  170. data/lib/generated_definitions/ng.rb +33 -0
  171. data/lib/generated_definitions/nl.rb +37 -0
  172. data/lib/generated_definitions/no.rb +40 -0
  173. data/lib/generated_definitions/northamerica.rb +229 -0
  174. data/lib/generated_definitions/nyse.rb +34 -0
  175. data/lib/generated_definitions/nz.rb +105 -0
  176. data/lib/generated_definitions/pe.rb +43 -0
  177. data/lib/generated_definitions/ph.rb +50 -0
  178. data/lib/generated_definitions/pl.rb +73 -0
  179. data/lib/generated_definitions/pt.rb +40 -0
  180. data/lib/generated_definitions/ro.rb +39 -0
  181. data/lib/generated_definitions/rs_cyrl.rb +39 -0
  182. data/lib/generated_definitions/rs_la.rb +39 -0
  183. data/lib/generated_definitions/ru.rb +37 -0
  184. data/lib/generated_definitions/scandinavia.rb +166 -0
  185. data/lib/generated_definitions/se.rb +53 -0
  186. data/lib/generated_definitions/sg.rb +31 -0
  187. data/lib/generated_definitions/si.rb +39 -0
  188. data/lib/generated_definitions/sk.rb +39 -0
  189. data/lib/generated_definitions/southamerica.rb +248 -0
  190. data/lib/generated_definitions/th.rb +36 -0
  191. data/lib/generated_definitions/tn.rb +32 -0
  192. data/lib/generated_definitions/tr.rb +64 -0
  193. data/lib/generated_definitions/ua.rb +37 -0
  194. data/lib/generated_definitions/unitednations.rb +81 -0
  195. data/lib/generated_definitions/ups.rb +36 -0
  196. data/lib/generated_definitions/us.rb +153 -0
  197. data/lib/generated_definitions/ve.rb +36 -0
  198. data/lib/generated_definitions/vi.rb +29 -0
  199. data/lib/generated_definitions/za.rb +36 -0
  200. data/lib/holidays/core_extensions/date.rb +57 -0
  201. data/lib/holidays/core_extensions/time.rb +23 -0
  202. data/lib/holidays/date_calculator/day_of_month.rb +68 -0
  203. data/lib/holidays/date_calculator/easter.rb +91 -0
  204. data/lib/holidays/date_calculator/lunar_date.rb +371 -0
  205. data/lib/holidays/date_calculator/weekend_modifier.rb +80 -0
  206. data/lib/holidays/definition/context/function_processor.rb +91 -0
  207. data/lib/holidays/definition/context/generator.rb +209 -0
  208. data/lib/holidays/definition/context/load.rb +29 -0
  209. data/lib/holidays/definition/context/merger.rb +22 -0
  210. data/lib/holidays/definition/decorator/custom_method_proc.rb +28 -0
  211. data/lib/holidays/definition/decorator/custom_method_source.rb +30 -0
  212. data/lib/holidays/definition/decorator/test.rb +37 -0
  213. data/lib/holidays/definition/entity/custom_method.rb +11 -0
  214. data/lib/holidays/definition/entity/test.rb +11 -0
  215. data/lib/holidays/definition/generator/module.rb +54 -0
  216. data/lib/holidays/definition/generator/regions.rb +55 -0
  217. data/lib/holidays/definition/generator/test.rb +51 -0
  218. data/lib/holidays/definition/parser/custom_method.rb +67 -0
  219. data/lib/holidays/definition/parser/test.rb +86 -0
  220. data/lib/holidays/definition/repository/cache.rb +47 -0
  221. data/lib/holidays/definition/repository/custom_methods.rb +27 -0
  222. data/lib/holidays/definition/repository/holidays_by_month.rb +57 -0
  223. data/lib/holidays/definition/repository/proc_result_cache.rb +51 -0
  224. data/lib/holidays/definition/repository/regions.rb +46 -0
  225. data/lib/holidays/definition/validator/custom_method.rb +31 -0
  226. data/lib/holidays/definition/validator/region.rb +36 -0
  227. data/lib/holidays/definition/validator/test.rb +71 -0
  228. data/lib/holidays/errors.rb +11 -0
  229. data/lib/holidays/factory/date_calculator.rb +42 -0
  230. data/lib/holidays/factory/definition.rb +143 -0
  231. data/lib/holidays/factory/finder.rb +70 -0
  232. data/lib/holidays/finder/context/between.rb +45 -0
  233. data/lib/holidays/finder/context/dates_driver_builder.rb +64 -0
  234. data/lib/holidays/finder/context/next_holiday.rb +57 -0
  235. data/lib/holidays/finder/context/parse_options.rb +104 -0
  236. data/lib/holidays/finder/context/search.rb +111 -0
  237. data/lib/holidays/finder/context/year_holiday.rb +57 -0
  238. data/lib/holidays/finder/rules/in_region.rb +31 -0
  239. data/lib/holidays/finder/rules/year_range.rb +58 -0
  240. data/lib/holidays/load_all_definitions.rb +56 -0
  241. data/lib/holidays/version.rb +3 -0
  242. data/lib/holidays.rb +130 -0
  243. data/lib/revised_holidays.rb +1 -0
  244. data/revised_holidays.gemspec +31 -0
  245. data/test/coverage_report.rb +26 -0
  246. data/test/data/test_custom_govt_holiday_defs.yaml +5 -0
  247. data/test/data/test_custom_informal_holidays_defs.yaml +11 -0
  248. data/test/data/test_custom_year_range_holiday_defs.yaml +31 -0
  249. data/test/data/test_invalid_region.rb +15 -0
  250. data/test/data/test_multiple_custom_holiday_defs.yaml +12 -0
  251. data/test/data/test_multiple_regions_with_conflicts_region_1.yaml +38 -0
  252. data/test/data/test_multiple_regions_with_conflicts_region_2.yaml +38 -0
  253. data/test/data/test_region.rb +15 -0
  254. data/test/data/test_single_custom_holiday_defs.yaml +12 -0
  255. data/test/data/test_single_custom_holiday_with_custom_procs.yaml +28 -0
  256. data/test/defs/test_defs_ar.rb +69 -0
  257. data/test/defs/test_defs_at.rb +31 -0
  258. data/test/defs/test_defs_au.rb +233 -0
  259. data/test/defs/test_defs_be_fr.rb +45 -0
  260. data/test/defs/test_defs_be_nl.rb +45 -0
  261. data/test/defs/test_defs_bg.rb +41 -0
  262. data/test/defs/test_defs_br.rb +49 -0
  263. data/test/defs/test_defs_ca.rb +289 -0
  264. data/test/defs/test_defs_ch.rb +51 -0
  265. data/test/defs/test_defs_cl.rb +69 -0
  266. data/test/defs/test_defs_co.rb +113 -0
  267. data/test/defs/test_defs_cr.rb +29 -0
  268. data/test/defs/test_defs_cz.rb +37 -0
  269. data/test/defs/test_defs_de.rb +89 -0
  270. data/test/defs/test_defs_dk.rb +47 -0
  271. data/test/defs/test_defs_ecbtarget.rb +27 -0
  272. data/test/defs/test_defs_ee.rb +41 -0
  273. data/test/defs/test_defs_es.rb +137 -0
  274. data/test/defs/test_defs_europe.rb +1522 -0
  275. data/test/defs/test_defs_fed_ex.rb +24 -0
  276. data/test/defs/test_defs_federalreserve.rb +119 -0
  277. data/test/defs/test_defs_federalreservebanks.rb +251 -0
  278. data/test/defs/test_defs_fedex.rb +31 -0
  279. data/test/defs/test_defs_fi.rb +59 -0
  280. data/test/defs/test_defs_fr.rb +43 -0
  281. data/test/defs/test_defs_gb.rb +159 -0
  282. data/test/defs/test_defs_ge.rb +53 -0
  283. data/test/defs/test_defs_gr.rb +41 -0
  284. data/test/defs/test_defs_hk.rb +59 -0
  285. data/test/defs/test_defs_hr.rb +45 -0
  286. data/test/defs/test_defs_hu.rb +47 -0
  287. data/test/defs/test_defs_ie.rb +53 -0
  288. data/test/defs/test_defs_is.rb +51 -0
  289. data/test/defs/test_defs_it.rb +55 -0
  290. data/test/defs/test_defs_jp.rb +159 -0
  291. data/test/defs/test_defs_ke.rb +31 -0
  292. data/test/defs/test_defs_kr.rb +37 -0
  293. data/test/defs/test_defs_kz.rb +39 -0
  294. data/test/defs/test_defs_li.rb +35 -0
  295. data/test/defs/test_defs_lt.rb +65 -0
  296. data/test/defs/test_defs_lu.rb +35 -0
  297. data/test/defs/test_defs_lv.rb +98 -0
  298. data/test/defs/test_defs_ma.rb +29 -0
  299. data/test/defs/test_defs_mt_en.rb +41 -0
  300. data/test/defs/test_defs_mt_mt.rb +41 -0
  301. data/test/defs/test_defs_mx.rb +49 -0
  302. data/test/defs/test_defs_my.rb +23 -0
  303. data/test/defs/test_defs_nerc.rb +29 -0
  304. data/test/defs/test_defs_ng.rb +29 -0
  305. data/test/defs/test_defs_nl.rb +33 -0
  306. data/test/defs/test_defs_no.rb +43 -0
  307. data/test/defs/test_defs_northamerica.rb +667 -0
  308. data/test/defs/test_defs_nyse.rb +46 -0
  309. data/test/defs/test_defs_nz.rb +67 -0
  310. data/test/defs/test_defs_pe.rb +47 -0
  311. data/test/defs/test_defs_ph.rb +29 -0
  312. data/test/defs/test_defs_pl.rb +229 -0
  313. data/test/defs/test_defs_pt.rb +47 -0
  314. data/test/defs/test_defs_ro.rb +65 -0
  315. data/test/defs/test_defs_rs_cyrl.rb +46 -0
  316. data/test/defs/test_defs_rs_la.rb +46 -0
  317. data/test/defs/test_defs_ru.rb +34 -0
  318. data/test/defs/test_defs_scandinavia.rb +215 -0
  319. data/test/defs/test_defs_se.rb +59 -0
  320. data/test/defs/test_defs_sg.rb +25 -0
  321. data/test/defs/test_defs_si.rb +105 -0
  322. data/test/defs/test_defs_sk.rb +41 -0
  323. data/test/defs/test_defs_southamerica.rb +327 -0
  324. data/test/defs/test_defs_th.rb +33 -0
  325. data/test/defs/test_defs_tn.rb +27 -0
  326. data/test/defs/test_defs_tr.rb +60 -0
  327. data/test/defs/test_defs_ua.rb +41 -0
  328. data/test/defs/test_defs_unitednations.rb +11 -0
  329. data/test/defs/test_defs_ups.rb +31 -0
  330. data/test/defs/test_defs_us.rb +387 -0
  331. data/test/defs/test_defs_ve.rb +35 -0
  332. data/test/defs/test_defs_vi.rb +22 -0
  333. data/test/defs/test_defs_za.rb +35 -0
  334. data/test/holidays/core_extensions/test_date.rb +122 -0
  335. data/test/holidays/core_extensions/test_date_time.rb +60 -0
  336. data/test/holidays/date_calculator/test_day_of_month.rb +27 -0
  337. data/test/holidays/date_calculator/test_easter_gregorian.rb +30 -0
  338. data/test/holidays/date_calculator/test_easter_julian.rb +36 -0
  339. data/test/holidays/date_calculator/test_lunar_date.rb +89 -0
  340. data/test/holidays/date_calculator/test_weekend_modifier.rb +54 -0
  341. data/test/holidays/definition/context/test_function_processor.rb +199 -0
  342. data/test/holidays/definition/context/test_generator.rb +226 -0
  343. data/test/holidays/definition/context/test_load.rb +37 -0
  344. data/test/holidays/definition/context/test_merger.rb +25 -0
  345. data/test/holidays/definition/decorator/test_custom_method_proc.rb +113 -0
  346. data/test/holidays/definition/decorator/test_custom_method_source.rb +96 -0
  347. data/test/holidays/definition/decorator/test_test.rb +123 -0
  348. data/test/holidays/definition/generator/test_module.rb +268 -0
  349. data/test/holidays/definition/generator/test_regions.rb +97 -0
  350. data/test/holidays/definition/generator/test_test.rb +113 -0
  351. data/test/holidays/definition/parser/test_custom_method.rb +79 -0
  352. data/test/holidays/definition/parser/test_test.rb +142 -0
  353. data/test/holidays/definition/repository/test_cache.rb +123 -0
  354. data/test/holidays/definition/repository/test_custom_methods.rb +43 -0
  355. data/test/holidays/definition/repository/test_holidays_by_month.rb +275 -0
  356. data/test/holidays/definition/repository/test_proc_result_cache.rb +91 -0
  357. data/test/holidays/definition/repository/test_regions.rb +104 -0
  358. data/test/holidays/definition/validator/test_custom_method.rb +94 -0
  359. data/test/holidays/definition/validator/test_region.rb +54 -0
  360. data/test/holidays/definition/validator/test_test.rb +60 -0
  361. data/test/holidays/finder/context/test_between.rb +172 -0
  362. data/test/holidays/finder/context/test_dates_driver_builder.rb +91 -0
  363. data/test/holidays/finder/context/test_next_holiday.rb +156 -0
  364. data/test/holidays/finder/context/test_parse_options.rb +141 -0
  365. data/test/holidays/finder/context/test_search.rb +232 -0
  366. data/test/holidays/finder/context/test_year_holiday.rb +202 -0
  367. data/test/holidays/finder/rules/test_in_region.rb +42 -0
  368. data/test/holidays/finder/rules/test_year_range.rb +166 -0
  369. data/test/integration/README.md +9 -0
  370. data/test/integration/test_all_regions.rb +49 -0
  371. data/test/integration/test_any_holidays_during_work_week.rb +90 -0
  372. data/test/integration/test_available_regions.rb +23 -0
  373. data/test/integration/test_custom_holidays.rb +41 -0
  374. data/test/integration/test_custom_informal_holidays.rb +15 -0
  375. data/test/integration/test_custom_year_range_holidays.rb +35 -0
  376. data/test/integration/test_holidays.rb +243 -0
  377. data/test/integration/test_holidays_between.rb +87 -0
  378. data/test/integration/test_multiple_regions.rb +71 -0
  379. data/test/integration/test_multiple_regions_with_conflict.rb +29 -0
  380. data/test/integration/test_nonstandard_regions.rb +25 -0
  381. data/test/test_helper.rb +37 -0
  382. metadata +649 -0
@@ -0,0 +1,154 @@
1
+ # Slovak holiday definitions for the Ruby Holiday gem.
2
+ #
3
+ # Updated: 2013-12-26.
4
+ # Sources:
5
+ # - http://sk.wikipedia.org/wiki/Slovensk%C3%A9_%C5%A1t%C3%A1tne_sviatky
6
+ ---
7
+ months:
8
+ 0:
9
+ - name: Veľkonočný pondelok
10
+ regions: [sk]
11
+ function: easter(year)
12
+ function_modifier: 1
13
+ - name: Veľký piatok
14
+ regions: [sk]
15
+ function: easter(year)
16
+ function_modifier: -2
17
+ 1:
18
+ - name: Nový rok
19
+ regions: [sk]
20
+ mday: 1
21
+ - name: Zjavenie Pána (Traja králi)
22
+ regions: [sk]
23
+ mday: 6
24
+ 5:
25
+ - name: Sviatok práce
26
+ regions: [sk]
27
+ mday: 1
28
+ - name: Deň víťazstva nad fašizmom
29
+ regions: [sk]
30
+ mday: 8
31
+ 7:
32
+ - name: Sviatok svätého Cyrila a svätého Metoda
33
+ regions: [sk]
34
+ mday: 5
35
+ 8:
36
+ - name: Výročie Slovenského národného povstania
37
+ regions: [sk]
38
+ mday: 29
39
+ 9:
40
+ - name: Deň Ústavy Slovenskej republiky
41
+ regions: [sk]
42
+ mday: 1
43
+ - name: Sedembolestná Panna Mária
44
+ regions: [sk]
45
+ mday: 15
46
+ 11:
47
+ - name: Sviatok všetkých svätých
48
+ regions: [sk]
49
+ mday: 1
50
+ - name: Deň boja za slobodu a demokraciu
51
+ regions: [sk]
52
+ mday: 17
53
+ 12:
54
+ - name: Štedrý deň
55
+ regions: [sk]
56
+ mday: 24
57
+ - name: 1. sviatok vianočný
58
+ regions: [sk]
59
+ mday: 25
60
+ - name: 2. sviatok vianočný
61
+ regions: [sk]
62
+ mday: 26
63
+
64
+ tests:
65
+ - given:
66
+ date: '2013-01-01'
67
+ regions: ["sk"]
68
+ options: ["informal"]
69
+ expect:
70
+ name: "Nový rok"
71
+ - given:
72
+ date: '2013-01-06'
73
+ regions: ["sk"]
74
+ options: ["informal"]
75
+ expect:
76
+ name: "Zjavenie Pána (Traja králi)"
77
+ - given:
78
+ date: '2013-03-29'
79
+ regions: ["sk"]
80
+ options: ["informal"]
81
+ expect:
82
+ name: "Veľký piatok"
83
+ - given:
84
+ date: '2013-04-01'
85
+ regions: ["sk"]
86
+ options: ["informal"]
87
+ expect:
88
+ name: "Veľkonočný pondelok"
89
+ - given:
90
+ date: '2013-05-01'
91
+ regions: ["sk"]
92
+ options: ["informal"]
93
+ expect:
94
+ name: "Sviatok práce"
95
+ - given:
96
+ date: '2013-05-08'
97
+ regions: ["sk"]
98
+ options: ["informal"]
99
+ expect:
100
+ name: "Deň víťazstva nad fašizmom"
101
+ - given:
102
+ date: '2013-07-05'
103
+ regions: ["sk"]
104
+ options: ["informal"]
105
+ expect:
106
+ name: "Sviatok svätého Cyrila a svätého Metoda"
107
+ - given:
108
+ date: '2013-08-29'
109
+ regions: ["sk"]
110
+ options: ["informal"]
111
+ expect:
112
+ name: "Výročie Slovenského národného povstania"
113
+ - given:
114
+ date: '2013-09-01'
115
+ regions: ["sk"]
116
+ options: ["informal"]
117
+ expect:
118
+ name: "Deň Ústavy Slovenskej republiky"
119
+ - given:
120
+ date: '2013-09-15'
121
+ regions: ["sk"]
122
+ options: ["informal"]
123
+ expect:
124
+ name: "Sedembolestná Panna Mária"
125
+ - given:
126
+ date: '2013-11-01'
127
+ regions: ["sk"]
128
+ options: ["informal"]
129
+ expect:
130
+ name: "Sviatok všetkých svätých"
131
+ - given:
132
+ date: '2013-11-17'
133
+ regions: ["sk"]
134
+ options: ["informal"]
135
+ expect:
136
+ name: "Deň boja za slobodu a demokraciu"
137
+ - given:
138
+ date: '2013-12-24'
139
+ regions: ["sk"]
140
+ options: ["informal"]
141
+ expect:
142
+ name: "Štedrý deň"
143
+ - given:
144
+ date: '2013-12-25'
145
+ regions: ["sk"]
146
+ options: ["informal"]
147
+ expect:
148
+ name: "1. sviatok vianočný"
149
+ - given:
150
+ date: '2013-12-26'
151
+ regions: ["sk"]
152
+ options: ["informal"]
153
+ expect:
154
+ name: "2. sviatok vianočný"
@@ -0,0 +1,7 @@
1
+ require 'simplecov'
2
+ SimpleCov.minimum_coverage 100
3
+ SimpleCov.coverage_dir 'reports/coverage'
4
+ SimpleCov.start do
5
+ add_filter "/spec/"
6
+ add_filter "/.bundle/"
7
+ end
@@ -0,0 +1,15 @@
1
+ ---
2
+ months:
3
+ 1:
4
+ - name: Test Holiday
5
+ regions: [test]
6
+ mday: 1
7
+
8
+ methods:
9
+ test:
10
+ arguments: year
11
+ source: |
12
+ true
13
+
14
+ tests: |
15
+ test
@@ -0,0 +1,9 @@
1
+ ---
2
+ methods:
3
+ test:
4
+ arguments: year
5
+ source: |
6
+ true
7
+
8
+ tests: |
9
+ test
@@ -0,0 +1,15 @@
1
+ ---
2
+ months:
3
+ 1:
4
+ - name: Test Holiday
5
+ regions: [test]
6
+ mday: 1
7
+
8
+ methods:
9
+ test:
10
+ arguments: year
11
+ source: |
12
+ true
13
+
14
+ tests: |
15
+ test
@@ -0,0 +1,7 @@
1
+ $: << '../lib'
2
+
3
+ require 'coverage_report'
4
+
5
+ RSpec.configure do |c|
6
+ c.order = :random
7
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+ require 'validation/custom_method_validator'
3
+
4
+ describe Definitions::Validation::CustomMethod do
5
+ let(:methods) {
6
+ {
7
+ 'test' => {
8
+ 'arguments' => "date,year,month,day",
9
+ 'ruby' => "some source",
10
+ }
11
+ }
12
+ }
13
+
14
+ subject { described_class.new }
15
+
16
+ context 'success' do
17
+ it 'returns true' do
18
+ expect(subject.call(methods)).to be true
19
+ end
20
+ end
21
+
22
+ context 'failure' do
23
+ context 'name' do
24
+ it 'returns false if empty' do
25
+ methods = {}
26
+ methods[""] = {}
27
+ expect { subject.call(methods) }.to raise_error(Definitions::Errors::InvalidCustomMethod)
28
+ end
29
+ end
30
+
31
+ context 'arguments' do
32
+ it 'returns false if nil' do
33
+ methods['test']['arguments'] = nil
34
+ expect { subject.call(methods) }.to raise_error(Definitions::Errors::InvalidCustomMethod)
35
+ end
36
+
37
+ it 'returns false if empty' do
38
+ methods['test']['arguments'] = ""
39
+ expect { subject.call(methods) }.to raise_error(Definitions::Errors::InvalidCustomMethod)
40
+ end
41
+
42
+ it 'returns false if contains unknown variable' do
43
+ methods['test']['arguments'] = "unknown"
44
+ expect { subject.call(methods) }.to raise_error(Definitions::Errors::InvalidCustomMethod)
45
+ end
46
+ end
47
+
48
+ context 'source' do
49
+ it 'returns false if nil' do
50
+ methods['test']['ruby'] = nil
51
+ expect { subject.call(methods) }.to raise_error(Definitions::Errors::InvalidCustomMethod)
52
+ end
53
+
54
+ it 'returns false if empty' do
55
+ methods['test']['ruby'] = ""
56
+ expect { subject.call(methods) }.to raise_error(Definitions::Errors::InvalidCustomMethod)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+ require 'validation/definition_validator'
3
+
4
+ describe Definitions::Validation::Definition do
5
+ let(:custom_method_validator) { double(:custom_method_validator, :call => true) }
6
+ let(:months_validator) { double(:months_validator, :call => nil) }
7
+ let(:test_validator) { double(:test_validator, :call => true) }
8
+
9
+ let(:definition) { {
10
+ "months" => { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1}] },
11
+ "methods" =>{ "test" => {"arguments"=>"year", "source"=>"true"} },
12
+ "tests" => "test"
13
+ } }
14
+
15
+ subject { described_class.new(custom_method_validator, months_validator, test_validator) }
16
+
17
+ context 'definition is valid' do
18
+ it 'reports success' do
19
+ expect(subject.call(definition)).to be true
20
+ end
21
+ end
22
+
23
+ context 'invalid months' do
24
+ it 'raises error if months validator raises error' do
25
+ expect(months_validator).to receive(:call).with(definition['months']).and_raise(StandardError)
26
+ expect { subject.call(definition) }.to raise_error(StandardError)
27
+ end
28
+ end
29
+
30
+ context 'no methods' do
31
+ it 'returns success' do
32
+ definition["methods"] = nil
33
+ expect(subject.call(definition)).to be true
34
+ end
35
+ end
36
+
37
+ context 'no tests' do
38
+ it 'raises error' do
39
+ expect(test_validator).to receive(:call).with(definition['tests']).and_raise(StandardError)
40
+ expect { subject.call(definition) }.to raise_error(StandardError)
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+ require 'validation/month_validator'
3
+
4
+ describe Definitions::Validation::Month do
5
+ subject { described_class.new }
6
+
7
+ context 'months are valid' do
8
+ it 'reports success' do
9
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1}] }
10
+ expect(subject.call(months)).to be true
11
+ end
12
+ end
13
+
14
+ context 'invalid months' do
15
+ it 'returns error if missing' do
16
+ expect { subject.call(nil) }.to raise_error(Definitions::Errors::NoMonths)
17
+ end
18
+
19
+ it 'returns error if empty' do
20
+ expect { subject.call({}) }.to raise_error(Definitions::Errors::NoMonths)
21
+ expect { subject.call([]) }.to raise_error(Definitions::Errors::NoMonths)
22
+ end
23
+
24
+ it 'returns error if month not an integer' do
25
+ months = { 'january' => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1}] }
26
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
27
+ expect(e.message).to eq("All months must be an integer, received: #{months}")
28
+ }
29
+ end
30
+
31
+ it 'returns error if months not 0 through 12' do
32
+ months = { -1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1}] }
33
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
34
+ expect(e.message).to eq("All months must be between 0 and 12, received: #{months}")
35
+ }
36
+
37
+ months = { 13 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1}] }
38
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
39
+ expect(e.message).to eq("All months must be between 0 and 12, received: #{months}")
40
+ }
41
+ end
42
+
43
+ it 'returns error if month has no name' do
44
+ months = { 1 => [{""=>"Test Holiday", "regions"=>["test"], "mday"=>1}] }
45
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
46
+ expect(e.message).to eq("All months must have a name, received: #{months}")
47
+ }
48
+ end
49
+
50
+ it 'returns error if month has no regions' do
51
+ months = { 1 => [{"name"=>"Test Holiday", "mday"=>1}] }
52
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidRegions) { |e|
53
+ expect(e.message).to eq("A month must contain at least one region, received: #{months}")
54
+ }
55
+ end
56
+
57
+ it 'returns error if month has empty regions' do
58
+ months = { 1 => [{"name"=>"Test Holiday", "regions" => [], "mday"=>1}] }
59
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidRegions) { |e|
60
+ expect(e.message).to eq("A month must contain at least one region, received: #{months}")
61
+ }
62
+ end
63
+
64
+ it 'returns error if month has empty regions' do
65
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>[""], "mday"=>1}] }
66
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidRegions) { |e|
67
+ expect(e.message).to eq("A month must contain at least one region, received: #{months}")
68
+ }
69
+ end
70
+
71
+ context 'year_ranges' do
72
+ it 'returns error if year_ranges contains unknown subkey' do
73
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"blah" => [2018]} }] }
74
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
75
+ expect(e.message).to eq("The :year_ranges value only accepts the following: :until, :from, :limited, :between, received: #{months}")
76
+ }
77
+ end
78
+
79
+ it 'returns error if :until value is not a single integer' do
80
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"until" => [2018]} }] }
81
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
82
+ expect(e.message).to eq("The year_ranges.until value must contain a single 'year' integer, ex. 2018, received: #{months}")
83
+ }
84
+ end
85
+
86
+ it 'returns error if :from value is not a single integer' do
87
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"from" => [2018]} }] }
88
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
89
+ expect(e.message).to eq("The year_ranges.from value must contain a single 'year' integer, ex. 2018, received: #{months}")
90
+ }
91
+ end
92
+
93
+ it 'returns error if :limited value is not an array' do
94
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"limited" => 2018} }] }
95
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
96
+ expect(e.message).to eq("The year_ranges.limited value must contain an array of 'year' integers, ex. [2018], received: #{months}")
97
+ }
98
+ end
99
+
100
+ it 'returns error if :limited value is not an array of integers' do
101
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"limited" => ["blah"]} }] }
102
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
103
+ expect(e.message).to eq("The year_ranges.limited value must contain an array of 'year' integers, ex. [2018], received: #{months}")
104
+ }
105
+ end
106
+
107
+ context 'between' do
108
+ it 'returns error if not a hash' do
109
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"between" => "2008..2012" } }] }
110
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
111
+ expect(e.message).to eq("year_ranges.between must contain both a 'start' and 'end' key, received: #{months}")
112
+ }
113
+ end
114
+
115
+ it 'returns error if start is missing' do
116
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"between" => {"end" => 2018} } }] }
117
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
118
+ expect(e.message).to eq("year_ranges.between must contain both a 'start' and 'end' key, received: #{months}")
119
+ }
120
+ end
121
+
122
+ it 'returns error if end is missing' do
123
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"between" => {"start" => 2016} } }] }
124
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
125
+ expect(e.message).to eq("year_ranges.between must contain both a 'start' and 'end' key, received: #{months}")
126
+ }
127
+ end
128
+
129
+ it 'returns an error if start value is not an integer' do
130
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"between" => {"start" => "2016", "end" => 2018} } }] }
131
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
132
+ expect(e.message).to eq("The year_ranges.between.start value must contain a single 'year' integer, ex. 2018, received: #{months}")
133
+ }
134
+ end
135
+
136
+ it 'returns an error if end value is not an integer' do
137
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"between" => {"start" => 2016, "end" => "2018"} } }] }
138
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
139
+ expect(e.message).to eq("The year_ranges.between.end value must contain a single 'year' integer, ex. 2018, received: #{months}")
140
+ }
141
+ end
142
+
143
+ it 'returns an error if end value is before start' do
144
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"between" => {"start" => 2016, "end" => 2015} } }] }
145
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
146
+ expect(e.message).to eq("The year_ranges.between.end value cannot be before the start value, received: #{months}")
147
+ }
148
+ end
149
+
150
+ it 'returns an error if the start and end values are the same' do
151
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"between" => {"start" => 2016, "end" => 2016} } }] }
152
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
153
+ expect(e.message).to eq("The year_ranges.between start and end values cannot be the same, received: #{months}")
154
+ }
155
+ end
156
+ end
157
+
158
+ context 'with multiple selectors' do
159
+ it 'returns an error if provided an array' do
160
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => [{"from" => 2019}, {"between" => {"start" => 2014, "end" => 2016} }] }] }
161
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
162
+ expect(e.message).to eq("year_ranges only supports a single selector at this time, received: #{months}")
163
+ }
164
+ end
165
+
166
+ it 'returns an error if there is more than 1 sub key' do
167
+ months = { 1 => [{"name"=>"Test Holiday", "regions"=>["test"], "mday"=>1, "year_ranges" => {"from" => 2019, "between" => {"start" => 2014, "end" => 2016} } }] }
168
+ expect { subject.call(months) }.to raise_error(Definitions::Errors::InvalidMonth) { |e|
169
+ expect(e.message).to eq("year_ranges only supports a single selector at this time, received: #{months}")
170
+ }
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,169 @@
1
+ require 'spec_helper'
2
+ require 'validation/test_validator'
3
+
4
+ describe Definitions::Validation::Test do
5
+ subject { described_class.new }
6
+
7
+ context 'success' do
8
+ it 'returns true if single valid test' do
9
+ tests = [{ "given" => { "date" => "2016-01-01", "regions" => ['us'] }, "expect" => { "name" => "Test Holiday" } } ]
10
+ expect(subject.call(tests)).to be true
11
+ end
12
+
13
+ it 'returns true if multiple valid tests' do
14
+ tests = [
15
+ { "given" => { "date" => "2016-01-01", "regions" => ['us'] }, "expect" => { "name" => "Test Holiday" } },
16
+ { "given" => { "date" => "2016-02-02", "regions" => ['us'] }, "expect" => { "name" => "Test 2" } }
17
+ ]
18
+
19
+ expect(subject.call(tests)).to be true
20
+ end
21
+
22
+ it 'returns true if single test has informal option' do
23
+ tests = [{ "given" => { "date" => "2016-01-01", "regions" => ['us'], "options" => "informal" }, "expect" => { "name" => "Test Holiday" } } ]
24
+ expect(subject.call(tests)).to be true
25
+ end
26
+
27
+ it 'returns true if single test has single valid option' do
28
+ tests = [{ "given" => { "date" => "2016-01-01", "regions" => ['us'], "options" => "observed" }, "expect" => { "name" => "Test Holiday" } } ]
29
+ expect(subject.call(tests)).to be true
30
+ end
31
+
32
+ it 'returns true if single test has multiple valid options' do
33
+ tests = [{ "given" => { "date" => "2016-01-01", "regions" => ['us'], "options" => ["informal", "observed"] }, "expect" => { "name" => "Test Holiday" } } ]
34
+ expect(subject.call(tests)).to be true
35
+ end
36
+
37
+ it 'returns true if regions is an array' do
38
+ tests = [{ "given" => { "date" => "2016-01-01", "regions" => ['us', 'us_dc']}, "expect" => { "name" => "Test Holiday" } } ]
39
+ expect(subject.call(tests)).to be true
40
+ end
41
+
42
+ it 'returns true if dates are an array and all are valid dates' do
43
+ tests = [{ "given" => { "date" => ["2016-01-01", "2016-01-02", "2017-01-02"], "regions" => ['us', 'us_dc']}, "expect" => { "name" => "Test Holiday" } } ]
44
+ expect(subject.call(tests)).to be true
45
+ end
46
+ end
47
+
48
+ context 'failure' do
49
+ it 'raises error if tests are nil' do
50
+ expect { subject.call(nil) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
51
+ expect(e.message).to eq "Tests cannot be nil"
52
+ }
53
+ end
54
+
55
+ it 'raises error if tests are empty array' do
56
+ expect { subject.call([]) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
57
+ expect(e.message).to eq "Tests cannot be empty. They are too important to leave out!"
58
+ }
59
+ end
60
+
61
+ it 'raises error if tests are not an array' do
62
+ expect { subject.call("blah") }.to raise_error(Definitions::Errors::InvalidTest) { |e|
63
+ expect(e.message).to eq "Tests must be an array"
64
+ }
65
+ end
66
+
67
+ context 'single test' do
68
+ let(:tests) {
69
+ [
70
+ {
71
+ "given" => {
72
+ "date" => "2016-01-01",
73
+ "regions" => ['us', 'us_dc']
74
+ },
75
+ "expect" => { "name" => "Test Holiday" }
76
+ }
77
+ ]
78
+ }
79
+
80
+ context 'given' do
81
+ it 'raises error if no given value' do
82
+ tests.first.delete("given")
83
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
84
+ expect(e.message).to include "Test must contain given key"
85
+ }
86
+ end
87
+
88
+ it 'raises error if nil regions' do
89
+ tests.first["given"]["regions"] = nil
90
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
91
+ expect(e.message).to include "Test contains invalid regions (must be an array of strings)"
92
+ }
93
+ end
94
+
95
+ it 'raises error if empty regions' do
96
+ tests.first["given"]["regions"] = []
97
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
98
+ expect(e.message).to include "Test must contain at least one region"
99
+ }
100
+ end
101
+
102
+ it 'raises error if regions not an array' do
103
+ tests.first["given"]["regions"] = "invalid"
104
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
105
+ expect(e.message).to include "Test contains invalid regions (must be an array of strings)"
106
+ }
107
+ end
108
+
109
+ it 'raises error if regions is array of empty strings' do
110
+ tests.first["given"]["regions"] = [""]
111
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
112
+ expect(e.message).to include "Test cannot contain empty regions"
113
+ }
114
+ end
115
+
116
+ it 'raises error if single invalid option' do
117
+ tests.first["given"]["options"] = "blah"
118
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
119
+ expect(e.message).to include "Test contains invalid option(s)"
120
+ }
121
+ end
122
+
123
+ it 'raises error if array of options with single invalid' do
124
+ tests.first["given"]["options"] = ["informal", "blah"]
125
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
126
+ expect(e.message).to include "Test contains invalid option(s)"
127
+ }
128
+ end
129
+
130
+ it 'raises error if no date or year range keys' do
131
+ tests.first["given"].delete("date")
132
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
133
+ expect(e.message).to include "Test must contain some date"
134
+ }
135
+ end
136
+
137
+ it 'raises error if nil date' do
138
+ tests.first["given"]["date"] = nil
139
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
140
+ expect(e.message).to include "Test must contain valid date"
141
+ }
142
+ end
143
+
144
+ it 'raises error if invalid date' do
145
+ tests.first["given"]["date"] = "blah"
146
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
147
+ expect(e.message).to include "Test must contain valid date"
148
+ }
149
+ end
150
+ end
151
+
152
+ context 'expect' do
153
+ it 'raises error if expect key is not present' do
154
+ tests.first.delete("expect")
155
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
156
+ expect(e.message).to include "Test must contain expect key"
157
+ }
158
+ end
159
+
160
+ it 'raises error if holiday flag value not valid' do
161
+ tests.first["expect"]["holiday"] = "blah"
162
+ expect { subject.call(tests) }.to raise_error(Definitions::Errors::InvalidTest) { |e|
163
+ expect(e.message).to include"Test contains invalid holiday value (must be true/false)"
164
+ }
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end