quby 4.0.4 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +0 -1
  3. data/lib/quby.rb +2 -10
  4. data/lib/quby/answers/entities/answer.rb +4 -2
  5. data/lib/quby/answers/services/score_calculator.rb +1 -3
  6. data/lib/quby/engine.rb +0 -1
  7. data/lib/quby/questionnaires.rb +1 -0
  8. data/lib/quby/questionnaires/api.rb +5 -1
  9. data/lib/quby/questionnaires/deserializer.rb +441 -0
  10. data/lib/quby/questionnaires/dsl.rb +12 -15
  11. data/lib/quby/questionnaires/entities.rb +1 -0
  12. data/lib/quby/questionnaires/entities/charting/line_chart.rb +23 -0
  13. data/lib/quby/questionnaires/entities/charting/overview_chart.rb +3 -1
  14. data/lib/quby/questionnaires/entities/definition.rb +3 -5
  15. data/lib/quby/questionnaires/entities/fields.rb +0 -15
  16. data/lib/quby/questionnaires/entities/question.rb +9 -32
  17. data/lib/quby/questionnaires/entities/questionnaire.rb +4 -15
  18. data/lib/quby/questionnaires/entities/questions/checkbox_question.rb +0 -24
  19. data/lib/quby/questionnaires/entities/questions/date_question.rb +0 -8
  20. data/lib/quby/questionnaires/entities/score_calculation.rb +40 -3
  21. data/lib/quby/questionnaires/repos.rb +1 -0
  22. data/lib/quby/questionnaires/repos/bundle_disk_repo.rb +51 -0
  23. data/lib/quby/table_backend/range_tree.rb +0 -51
  24. data/lib/quby/version.rb +1 -1
  25. data/spec/features/tables_spec.rb +40 -0
  26. data/spec/fixtures/score_test.rb +4 -0
  27. data/spec/internal/log/test-events.log +183 -0
  28. data/spec/internal/log/test.log +5522 -0
  29. data/spec/internal/tmp/cache/assets/sprockets/v3.0/00/00nglkSepN01iGiDa7URmJtWQP-xSWffZb9wJgBqUr4.cache +2 -0
  30. data/spec/internal/tmp/cache/assets/sprockets/v3.0/1V/1VQnRlqKBL0MybpMmC3EVtA2s6-ZX-GSGs2Cza3g3kI.cache +1 -0
  31. data/spec/internal/tmp/cache/assets/sprockets/v3.0/1_/1_J_3havMjJDCz3iAQXAXXBh6tBQRJ3OpdWm3W46ss8.cache +1 -0
  32. data/spec/internal/tmp/cache/assets/sprockets/v3.0/4G/4gcYvPHmPX3fZw9xr6plMl5Hfbo2xTWwcD7T7lIlD4Y.cache +2 -0
  33. data/spec/internal/tmp/cache/assets/sprockets/v3.0/4_/4_FK6PMcF1eyIQx7RtVQ5t8c6X7smPQmJWNN5YTImVc.cache +1 -0
  34. data/spec/internal/tmp/cache/assets/sprockets/v3.0/4d/4Dd15Upcg8_kiEsx_5wpQNrjM1sCk0tGTtWGhtmCKpg.cache +1 -0
  35. data/spec/internal/tmp/cache/assets/sprockets/v3.0/4h/4hd8RzwlWb2IEeLLZN0s-3_sdJXtw6nu2k5baLb9vNs.cache +0 -0
  36. data/spec/internal/tmp/cache/assets/sprockets/v3.0/5X/5xFJleOz2sGyE9gbs8KPkToDiv3s9bwFzroBRcjPELY.cache +0 -0
  37. data/spec/internal/tmp/cache/assets/sprockets/v3.0/6Y/6y1tV_fKJP9YIQn-dF847aZ9kza1O7iyTEUht42D7nc.cache +0 -0
  38. data/spec/internal/tmp/cache/assets/sprockets/v3.0/6d/6dfYZY_DkQe892FZVDUbBbrINslzVUkLZePdnVxO3Ps.cache +1 -0
  39. data/spec/internal/tmp/cache/assets/sprockets/v3.0/6w/6WcYsWQCgw0z_URAWGhOsbiKXcqVxZ--ImazY5S-2Gk.cache +2 -0
  40. data/spec/internal/tmp/cache/assets/sprockets/v3.0/77/77EJjFGVCRzLbhJy6KZZUYe5w0LxsqZQcmFcHAbxKeQ.cache +1 -0
  41. data/spec/internal/tmp/cache/assets/sprockets/v3.0/7f/7fvhJnfiJknq6sA-MPtumXlL5qB-rfH__Heye13NyHc.cache +1 -0
  42. data/spec/internal/tmp/cache/assets/sprockets/v3.0/8W/8W6AwDwFqo6egmWyt6Cs0vf_XJbT2YxPs2sqbo0Q9kk.cache +2 -0
  43. data/spec/internal/tmp/cache/assets/sprockets/v3.0/8c/8cQ8uBhUhrouKwor0Z87dDCxyPbqbLvK8KEFEgjHxqM.cache +0 -0
  44. data/spec/internal/tmp/cache/assets/sprockets/v3.0/9L/9LJo1U9wQdfWrrn3HkNZTgIZc6jeHvWbGk8tJ4m_Qec.cache +1 -0
  45. data/spec/internal/tmp/cache/assets/sprockets/v3.0/9o/9oXJXZnA6F49i4EflydD0Ivx6dhSxGGDD69G-N5NSCg.cache +0 -0
  46. data/spec/internal/tmp/cache/assets/sprockets/v3.0/A1/a1jgtYtDHIb04Og07H6_XNmhXppaAnFiO88kgq80edQ.cache +1 -0
  47. data/spec/internal/tmp/cache/assets/sprockets/v3.0/AC/ACV6t4unw39Kpn2DnbBtHeJYLoAHyyBN1DTRXs6a2ik.cache +1 -0
  48. data/spec/internal/tmp/cache/assets/sprockets/v3.0/BO/BoVO8e1GTTGHfnJTOByDxMlvVi9fNGyOdSubqCbBITI.cache +2 -0
  49. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Ba/babjk3aW-jBoEw_ERhmT5ZQprEqilJCWmImrvVskWk8.cache +0 -0
  50. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Cg/cgb1vvOogMD0V1lqQ5k_mny7Z38rbqBdIumlGh5sZ_E.cache +0 -0
  51. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Cw/CwjNk_RYiC93RW8vRs7fWsHcwKTg7uE9OLifRm3Y6WA.cache +2 -0
  52. data/spec/internal/tmp/cache/assets/sprockets/v3.0/DY/Dy1qsY0W-eyFR6RVKSCCli-XsitpaXD4DwTjXL86t2M.cache +1 -0
  53. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Dk/DkGOwkJNeDdljv4b8QbwtPVrsghwYuA6EOxx1goEQg0.cache +1 -0
  54. data/spec/internal/tmp/cache/assets/sprockets/v3.0/FG/fGmVSU-v7aZV9-CLG5U2OmteGgWTuAotlFcwFyx4Eqs.cache +1 -0
  55. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Fd/fDidWZjSZsPN4uAEyVYABV2WFCSR7AZE0l8U-9XOw7U.cache +0 -0
  56. data/spec/internal/tmp/cache/assets/sprockets/v3.0/G1/G1RRwpldS5MGQ5x-WHyPWzXJWDOd2qyWMMFumuU4-Ms.cache +1 -0
  57. data/spec/internal/tmp/cache/assets/sprockets/v3.0/GG/ggGfy_gZryUPmYwgenN3A4jv0q-buxyjCGdLB6wfHxQ.cache +1 -0
  58. data/spec/internal/tmp/cache/assets/sprockets/v3.0/GY/gYwYoJrifknCG-a0FXlM1NU6tUj1JXxm27s-a0uP_IE.cache +1 -0
  59. data/spec/internal/tmp/cache/assets/sprockets/v3.0/I6/i64Ysik0cyoTrYF0-O63B7sN3AdIgeoJ7zLh9pMC2u4.cache +0 -0
  60. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Ic/ICKeOd4yOff3JGsfU1XliLgXfJtTPKSbXsqNVZAb1-Y.cache +1 -0
  61. data/spec/internal/tmp/cache/assets/sprockets/v3.0/J7/J75M1l--IMcCn-Wy7uWv17SWaj0DFaGiiwac63pENPQ.cache +1 -0
  62. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Jh/JHPqsKZsrkvQg23ukphinYoViiIw3askwCMP8VrHTMk.cache +1 -0
  63. data/spec/internal/tmp/cache/assets/sprockets/v3.0/K9/k9tOCRdX5tsxa5LImq7MZk0WzC692t8tx5LzLln0l4Q.cache +0 -0
  64. data/spec/internal/tmp/cache/assets/sprockets/v3.0/LY/ly4TNAIbW9ghgXz8mxfmskR_6AkuiMiG-RIFGhewgQ0.cache +1 -0
  65. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Lq/LQ9fP0wIqVc5s-AtP3ESWJr0qpkDe-VpTxpgYl-9FfU.cache +1 -0
  66. data/spec/internal/tmp/cache/assets/sprockets/v3.0/MO/MOmnpcaRW98Ke-zTOOCSZ0ODnnQntKhQr0vFc_un1_A.cache +1 -0
  67. data/spec/internal/tmp/cache/assets/sprockets/v3.0/OX/OxOBsUA5EpScoZgEt_UhsHzhu-GGmxKnHpCwnhbTwiM.cache +1 -0
  68. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Ot/oTVAc3-iuSlg7XAM-YIAhw3cdc5yhgL2-tK3N7sfOfU.cache +0 -0
  69. data/spec/internal/tmp/cache/assets/sprockets/v3.0/PK/pKNcBOgAbCyIwsWIvnlmiPiFxrw6nUo_nTz7wWFDr80.cache +1 -0
  70. data/spec/internal/tmp/cache/assets/sprockets/v3.0/QB/QBMvSW7SYbYcm5lSjybgO7fhHDFIQjJWOvefH0MQC-A.cache +0 -0
  71. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Qs/QSbtm1y8JKPV0MQkpiC0hEisaSjKZ3tp2AWHSrhO30Y.cache +1 -0
  72. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Sp/SpyGDguFy3tp0sim1miZOehEDpE97oueO7wl3oUFYcE.cache +1 -0
  73. data/spec/internal/tmp/cache/assets/sprockets/v3.0/TW/TwtJPRSE9lmwTuSP0lezWSRSBp2u43zuF196FQcHY-c.cache +1 -0
  74. data/spec/internal/tmp/cache/assets/sprockets/v3.0/VX/Vxn9zv60MCKUBfRhrjefo-MEzFej81PPEutxTPQ4VLQ.cache +0 -0
  75. data/spec/internal/tmp/cache/assets/sprockets/v3.0/Vr/vrqPEzlsuORocHY0EbtGdFomRmrcoAa6wWSDMx642-Q.cache +2 -0
  76. data/spec/internal/tmp/cache/assets/sprockets/v3.0/WH/WHVQ0GBe51hbYqv2g7YYo7EIw9PSzt9-RqU7hKP2dc4.cache +1 -0
  77. data/spec/internal/tmp/cache/assets/sprockets/v3.0/_B/_B796ezRHfk7H8YKj7zr3-gRy6Mw2IVn2NbHu-k20ug.cache +1 -0
  78. data/spec/internal/tmp/cache/assets/sprockets/v3.0/_W/_Wh-7b1t-Xm19wg3KPtkXq7DOpohaL5OhnLggzJLpj4.cache +0 -0
  79. data/spec/internal/tmp/cache/assets/sprockets/v3.0/b2/B2y-2qTbQYKRm6_sCQ6qfUeVfl9rKXUvotTDm56w4bs.cache +1 -0
  80. data/spec/internal/tmp/cache/assets/sprockets/v3.0/bw/bwFR2MLpvJvPSAPJzSLWk6TUDCw5TlBFUUuq7z_Y9vg.cache +1 -0
  81. data/spec/internal/tmp/cache/assets/sprockets/v3.0/c7/c7ubvrHhbhAYh-K4srvM9EqwWdbWTLrsLMgjG5XQDbY.cache +1 -0
  82. data/spec/internal/tmp/cache/assets/sprockets/v3.0/cX/CXpMzZYfJy6HIOVXN0IyYilvy6J4CDgFZIwqKm8OQEU.cache +1 -0
  83. data/spec/internal/tmp/cache/assets/sprockets/v3.0/eN/EN0enu5dkKEnIz-DVCpbhkfeph7wImeXnlqb7SXMrjE.cache +1 -0
  84. data/spec/internal/tmp/cache/assets/sprockets/v3.0/fu/fuP9zP6C6rj650HLkypoTfYN2KD1ecB9HdtlbhbA2cg.cache +1 -0
  85. data/spec/internal/tmp/cache/assets/sprockets/v3.0/gr/gRPXI3EsVPwysy9YKW_6yDxaqRRr4Idxtexf7zCHECw.cache +1 -0
  86. data/spec/internal/tmp/cache/assets/sprockets/v3.0/h0/h0P63ZZdlSbtztDOe0V9r7jtCoy0L2bAf_iDNKLJ0nk.cache +1 -0
  87. data/spec/internal/tmp/cache/assets/sprockets/v3.0/i-/i-Or0Xuxbbm3-HdE_xGIf6sAx2vhUa3eVMpbT37lyEo.cache +1 -0
  88. data/spec/internal/tmp/cache/assets/sprockets/v3.0/iF/iFP67If98izMEAAMKnAFi2dWAb8TNlHNayZKNjXdAMs.cache +1 -0
  89. data/spec/internal/tmp/cache/assets/sprockets/v3.0/iH/Ih2svq5ul-xibfRUfd1fxigouli6U19Rf80FrTSoMak.cache +1 -0
  90. data/spec/internal/tmp/cache/assets/sprockets/v3.0/ka/Ka_YEbZNQxpS8XAA7xZturgPr2vLYQq60KK1uwou4Lo.cache +1 -0
  91. data/spec/internal/tmp/cache/assets/sprockets/v3.0/kq/KqkIGfAdJjTcr53lFl1aDAMUeqhhKdXGyTlHVlCz0R4.cache +1 -0
  92. data/spec/internal/tmp/cache/assets/sprockets/v3.0/mR/mRDPkwomGSfjpIWEKtPPBSx5cBHssvH8v0gCSI33P3Y.cache +1 -0
  93. data/spec/internal/tmp/cache/assets/sprockets/v3.0/n4/n4qaNjjNvKB0VAbVJlP_BjFlcLf70TsBzcIMc7VO9dw.cache +2 -0
  94. data/spec/internal/tmp/cache/assets/sprockets/v3.0/nY/nykt5oy2ExUYa8g1phLCDRqwb55BuUot5ZBbRdNuCCw.cache +2 -0
  95. data/spec/internal/tmp/cache/assets/sprockets/v3.0/nv/nvmgm4bOtxCbD6EA14ZIwDcYO8fxXOoEk_s7V-uRMMM.cache +1 -0
  96. data/spec/internal/tmp/cache/assets/sprockets/v3.0/oG/og5ypFjbFAX_nH7oxK6Bn5Ejh81BMDBSMxbGcL5ZbQs.cache +1 -0
  97. data/spec/internal/tmp/cache/assets/sprockets/v3.0/oO/oO4iBwOm5E7uLH39zeR8zun4eBM-WxZKvEMpIYKx6SU.cache +1 -0
  98. data/spec/internal/tmp/cache/assets/sprockets/v3.0/pN/PnQ-dEclV6jTDE4kkqw4G9dBpHArAgUnATOpRrQAsGc.cache +1 -0
  99. data/spec/internal/tmp/cache/assets/sprockets/v3.0/pe/pet4fFbc2Cm2SD_ZBO_s83Gey29EXE26u-7lwn2O8gM.cache +1 -0
  100. data/spec/internal/tmp/cache/assets/sprockets/v3.0/qo/Qoqb-JjTe1BiY4rICKHm5e6bsPt-DHXZc4ADXESjw2I.cache +1 -0
  101. data/spec/internal/tmp/cache/assets/sprockets/v3.0/qx/QXICLj9xx1EI9rBeXLXpKOeHGll_LBWHRWlpb1DK424.cache +1 -0
  102. data/spec/internal/tmp/cache/assets/sprockets/v3.0/rM/rMF4Y2UGkmBABLlC1eSSqb6y6g_Z3uUCLBtFvz_LoyI.cache +1 -0
  103. data/spec/internal/tmp/cache/assets/sprockets/v3.0/ty/ty1qAnpL07anYdhIJoiPYLcsWKejuzy6JaxU9mI7egw.cache +1 -0
  104. data/spec/internal/tmp/cache/assets/sprockets/v3.0/uH/UHs9nE45XS7v4QlMjSjhwHbqYIKC06FsEjMSMIfKanU.cache +1 -0
  105. data/spec/internal/tmp/cache/assets/sprockets/v3.0/v8/v8VXJ3AQom-JqxBYAB7tOjV-tt4IdDb6YyFEzlsWV8c.cache +1 -0
  106. data/spec/internal/tmp/cache/assets/sprockets/v3.0/vD/VDI2CxkTg7-DuMcLmofLvch0yukSl88oI_AjGgN-hQ8.cache +1 -0
  107. data/spec/internal/tmp/cache/assets/sprockets/v3.0/wq/wqhk46aZc1Bbb8gTCOZKxTvwTV0ANLSz8VdQYACo03E.cache +1 -0
  108. data/spec/internal/tmp/cache/assets/sprockets/v3.0/xy/Xy8Yk--iYZNupHMjUtYX1AQ0BppsvThCh_ZAizblCb0.cache +1 -0
  109. data/spec/internal/tmp/cache/assets/sprockets/v3.0/zu/zUCfHRTHprn06F5WxH6wp_BLs9-yhs-foc0j0Y7BYbg.cache +1 -0
  110. data/spec/internal/tmp/cache/assets/sprockets/v3.0/zx/ZX2IY3eKQjBy93tlH7_Xg7zGZKYuaQ-E8YPvtPT_4vM.cache +1 -0
  111. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-35.705.html +1 -0
  112. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-35.705.png +0 -0
  113. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-36.005.html +1 -0
  114. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-36.005.png +0 -0
  115. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-36.276.html +1 -0
  116. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-36.276.png +0 -0
  117. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-36.556.html +1 -0
  118. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-36.556.png +0 -0
  119. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-36.818.html +1 -0
  120. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-36.818.png +0 -0
  121. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-37.083.html +1 -0
  122. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-37.083.png +0 -0
  123. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-37.350.html +1 -0
  124. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-37.350.png +0 -0
  125. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-37.620.html +1 -0
  126. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-37.620.png +0 -0
  127. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-37.885.html +1 -0
  128. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-37.885.png +0 -0
  129. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-38.152.html +1 -0
  130. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-27-38.152.png +0 -0
  131. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-28-14.063.html +207 -0
  132. data/spec/internal/tmp/capybara/screenshot_2020-11-17-14-28-14.063.png +0 -0
  133. data/spec/quby/answers/entities/score_spec.rb +4 -0
  134. data/spec/quby/answers/services/answer_validations_spec.rb +8 -8
  135. data/spec/quby/answers/services/score_calculator_spec.rb +4 -14
  136. data/spec/quby/questionnaires/deserializer/questionnaire_spec.rb +237 -0
  137. data/spec/quby/questionnaires/dsl_spec.rb +0 -9
  138. data/spec/quby/questionnaires/entities/fields_spec.rb +3 -3
  139. data/spec/quby/questionnaires/entities/question_spec.rb +0 -8
  140. data/spec/quby/questionnaires/entities/questionnaire_spec.rb +2 -26
  141. data/spec/quby/table_backend/range_tree_spec.rb +46 -13
  142. data/spec/spec_helper.rb +1 -1
  143. metadata +230 -53
  144. data/lib/quby/lookup_table.rb +0 -29
  145. data/lib/quby/lookup_table_repo.rb +0 -24
  146. data/lib/quby/questionnaires/dsl/base.rb +0 -20
  147. data/lib/quby/questionnaires/dsl/calls_custom_methods.rb +0 -29
  148. data/lib/quby/questionnaires/dsl/charting/bar_chart_builder.rb +0 -18
  149. data/lib/quby/questionnaires/dsl/charting/chart_builder.rb +0 -91
  150. data/lib/quby/questionnaires/dsl/charting/line_chart_builder.rb +0 -57
  151. data/lib/quby/questionnaires/dsl/charting/overview_chart_builder.rb +0 -31
  152. data/lib/quby/questionnaires/dsl/charting/radar_chart_builder.rb +0 -18
  153. data/lib/quby/questionnaires/dsl/helpers.rb +0 -51
  154. data/lib/quby/questionnaires/dsl/panel_builder.rb +0 -80
  155. data/lib/quby/questionnaires/dsl/question_builder.rb +0 -40
  156. data/lib/quby/questionnaires/dsl/questionnaire_builder.rb +0 -260
  157. data/lib/quby/questionnaires/dsl/questions/base.rb +0 -179
  158. data/lib/quby/questionnaires/dsl/questions/checkbox_question_builder.rb +0 -20
  159. data/lib/quby/questionnaires/dsl/questions/date_question_builder.rb +0 -18
  160. data/lib/quby/questionnaires/dsl/questions/deprecated_question_builder.rb +0 -18
  161. data/lib/quby/questionnaires/dsl/questions/float_question_builder.rb +0 -21
  162. data/lib/quby/questionnaires/dsl/questions/integer_question_builder.rb +0 -21
  163. data/lib/quby/questionnaires/dsl/questions/radio_question_builder.rb +0 -20
  164. data/lib/quby/questionnaires/dsl/questions/select_question_builder.rb +0 -18
  165. data/lib/quby/questionnaires/dsl/questions/string_question_builder.rb +0 -20
  166. data/lib/quby/questionnaires/dsl/questions/text_question_builder.rb +0 -22
  167. data/lib/quby/questionnaires/dsl/score_builder.rb +0 -22
  168. data/lib/quby/questionnaires/dsl/standardized_panel_generators.rb +0 -33
  169. data/lib/quby/questionnaires/dsl/table_builder.rb +0 -48
  170. data/lib/quby/questionnaires/services/definition_validator.rb +0 -298
  171. data/spec/benchmarks/load_normscore_csv.rb +0 -18
  172. data/spec/quby/lookup_table_repo_spec.rb +0 -20
  173. data/spec/quby/lookup_table_spec.rb +0 -38
  174. data/spec/quby/questionnaires/dsl/calls_custom_methods_spec.rb +0 -38
  175. data/spec/quby/questionnaires/dsl/charting/bar_chart_builder_spec.rb +0 -41
  176. data/spec/quby/questionnaires/dsl/charting/chart_builder_spec.rb +0 -127
  177. data/spec/quby/questionnaires/dsl/charting/line_chart_builder_spec.rb +0 -66
  178. data/spec/quby/questionnaires/dsl/charting/radar_chart_builder_spec.rb +0 -41
  179. data/spec/quby/questionnaires/dsl/helpers_spec.rb +0 -80
  180. data/spec/quby/questionnaires/dsl/questionnaire_builder_spec.rb +0 -480
  181. data/spec/quby/questionnaires/services/definition_validator_spec.rb +0 -793
  182. data/spec/support/examples_for_chart_builders.rb +0 -59
@@ -1,793 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
-
5
- module Quby::Questionnaires::Services
6
- describe DefinitionValidator do
7
- let(:questionnaire) { Quby::Questionnaires::DSL.build('test', 'title "Test"') }
8
-
9
- def make_definition(definition = 'title "Test"')
10
- Quby::Questionnaires::Entities::Definition.new(key: 'test', sourcecode: definition, path: 'fake definition test')
11
- end
12
-
13
- describe "fields#answer_keys and fields#input_keys need to be symbols" do
14
- before do
15
- allow(Quby::Questionnaires::DSL).to receive(:build_from_definition).and_return(questionnaire)
16
- end
17
-
18
- it 'passes when answer_keys and input_keys are symbols' do
19
- valid_definition = make_definition
20
- questionnaire.fields.answer_keys << :v_foo
21
- questionnaire.fields.input_keys << :v_foo_a1
22
- valid_definition.valid?
23
- expect(valid_definition.errors).to be_empty
24
- end
25
-
26
- it 'fails when an answer_keys is not a symbol' do
27
- invalid_definition = make_definition
28
- questionnaire.fields.answer_keys << 'v_foo'
29
- invalid_definition.valid?
30
- expect(invalid_definition.errors[:sourcecode].first[:message])
31
- .to include("Answer key v_foo is not a symbol")
32
- end
33
-
34
- it 'fails when an input_keys is not a symbol' do
35
- invalid_definition = make_definition
36
- questionnaire.fields.input_keys << 'v_foo_a1'
37
- invalid_definition.valid?
38
- expect(invalid_definition.errors[:sourcecode].first[:message])
39
- .to include("Input key v_foo_a1 is not a symbol")
40
- end
41
- end
42
-
43
- describe "questionnaire needs a title" do
44
- it "throws an error if the questionnaire does not have a title" do
45
- invalid_definition = make_definition("")
46
- invalid_definition.valid?
47
- expect(invalid_definition.errors[:sourcecode].first[:message])
48
- .to include("Questionnaire title is missing.")
49
- end
50
-
51
- it "throws an error if the title is empty" do
52
- invalid_definition = make_definition(<<-END)
53
- title ""
54
- END
55
- invalid_definition.valid?
56
- expect(invalid_definition.errors[:sourcecode].first[:message])
57
- .to include("Questionnaire title is missing.")
58
- end
59
- end
60
-
61
- describe 'questions with activemodel validation errors' do
62
- it "throws an error if the question to be hidden does not exist" do
63
- invalid_definition = make_definition(<<-END)
64
- title "Test"
65
- question :v_1, type: :string, show_values: :error do
66
- title "Testvraag"
67
- end
68
- END
69
- invalid_definition.valid?
70
- expect(invalid_definition.errors[:sourcecode].first[:message])
71
- .to include("Question v_1 is invalid: Show values option invalid: error.")
72
- end
73
- end
74
-
75
- describe ":hides_questions" do
76
- it "throws an error if the question to be hidden does not exist" do
77
- invalid_definition = make_definition(<<-END)
78
- title "Test"
79
- question :v_1, type: :radio do
80
- title "Testvraag"
81
- option :a1, value: 0, hides_questions: [:v_2]
82
- end
83
- END
84
- invalid_definition.valid?
85
- expect(invalid_definition.errors[:sourcecode].first[:message])
86
- .to include("Question v_1 option a1 hides_questions references nonexistent question v_2")
87
- end
88
-
89
- it "throws an error if the question to be hidden is a subquestion" do
90
- invalid_definition = make_definition(<<-END)
91
- title "Test"
92
- question :v_1, type: :radio do
93
- title "Testvraag"
94
- option :a1, value: 0, hides_questions: [:v_1_a1_sq] do
95
- question :v_1_a1_sq, type: :string
96
- end
97
- end
98
- END
99
- invalid_definition.valid?
100
- expect(invalid_definition.errors[:sourcecode].first[:message])
101
- .to include("Question v_1 option a1 hides_questions references subquestion v_1_a1_sq")
102
- end
103
-
104
- it 'does not throw an error when the question to be hidden exists' do
105
- definition = make_definition(<<-END)
106
- title "Test"
107
- question :v_1, type: :radio do
108
- title "Testvraag"
109
- option :a1, value: 0, hides_questions: [:v_2]
110
- end
111
-
112
- question :v_2, type: :textarea do
113
- title "Testvraag"
114
- end
115
- END
116
- expect(definition.valid?).to be_truthy
117
- end
118
- end
119
-
120
- describe ":shows_questions" do
121
- it "throws an error if the question to be shown does not exist" do
122
- invalid_definition = make_definition(<<-END)
123
- title "Test"
124
- question :v_1, type: :radio do
125
- title "Testvraag"
126
- option :a1, value: 0, shows_questions: [:v_2]
127
- end
128
- END
129
- invalid_definition.valid?
130
- expect(invalid_definition.errors[:sourcecode].first[:message])
131
- .to include("Question v_1 option a1 shows_questions references nonexistent question v_2")
132
- end
133
-
134
- it "throws an error if the question to be shown is a subquestion" do
135
- invalid_definition = make_definition(<<-END)
136
- title "Test"
137
- question :v_1, type: :radio do
138
- title "Testvraag"
139
- option :a1, value: 0, shows_questions: [:v_1_a1_sq] do
140
- question :v_1_a1_sq, type: :string
141
- end
142
- end
143
- END
144
- invalid_definition.valid?
145
- expect(invalid_definition.errors[:sourcecode].first[:message])
146
- .to include("Question v_1 option a1 shows_questions references subquestion v_1_a1_sq")
147
- end
148
-
149
- it 'does not throw an error when the question to be shown exists' do
150
- definition = make_definition(<<-END)
151
- title "Test"
152
- question :v_1, type: :radio do
153
- title "Testvraag"
154
- option :a1, value: 0, shows_questions: [:v_2]
155
- end
156
-
157
- question :v_2, type: :textarea do
158
- title 'Testvraag'
159
- end
160
- END
161
- expect(definition.valid?).to be_truthy
162
- end
163
- end
164
-
165
- describe ":default_invisible" do
166
- it 'throws an error if a subquestion has default_invisible set' do
167
- invalid_definition = make_definition(<<-END)
168
- title "Test"
169
- question :v_1, type: :radio do
170
- title "Testvraag"
171
- option :a1
172
- option :a2, shows_questions: [:v_1_a1_sq] do
173
- question :v_1_a1_sq, type: :string, default_invisible: true
174
- end
175
- end
176
- END
177
- invalid_definition.valid?
178
- expect(invalid_definition.errors[:sourcecode].first[:message])
179
- .to include("Question v_1_a1_sq is a subquestion with default_invisible")
180
- end
181
-
182
- it 'does not throw an error if a non-subquestion has default_invisible set' do
183
- valid_definition = make_definition(<<-END)
184
- title "Test"
185
- question :v_1, type: :string default_invisible: true
186
- END
187
- valid_definition.valid?
188
- expect(valid_definition.errors[:sourcecode].first[:message]).to be_truthy
189
- end
190
- end
191
-
192
- describe ":validates_question_key_format" do
193
- it "validates length of the question keys" do
194
- long_key = make_definition(<<-END)
195
- title "Test"
196
- question :questionthree, type: :radio do
197
- title "Testvraag"
198
- option :a1, value: 0, description: 'some_description'
199
- end
200
- END
201
- valid_key = make_definition(<<-END)
202
- title "Test"
203
- question :v_12345678901, type: :radio do
204
- title "Testvraag"
205
- option :a1, value: 0, description: 'some_description'
206
- end
207
- END
208
- expect(long_key.valid?).to be_falsey
209
- expect(valid_key.valid?).to be_truthy
210
- end
211
-
212
- it "validates that question key starts with a `v_`" do
213
- invalid_key = make_definition(<<-END)
214
- title "Test"
215
- question :one, type: :radio do
216
- title "Testvraag"
217
- option :a1, value: 0, description: 'some_description', hides_questions: [:two]
218
- end
219
- END
220
- valid_key = make_definition(<<-END)
221
- title "Test"
222
- question :v_2, type: :radio do
223
- title "Testvraag"
224
- option :a1, value: 0, description: 'some_description'
225
- end
226
- END
227
- expect(invalid_key.valid?).to be_falsey
228
- expect(valid_key.valid?).to be_truthy
229
- end
230
-
231
- it "validates check_box question options start with `v_`" do
232
- invalid_keys = make_definition(<<-END)
233
- title "Test"
234
- question :v_4, type: :check_box do
235
- title "Testvraag met een check_box"
236
- option :q1, description: 'some_description'
237
- end
238
- END
239
- valid_keys = make_definition(<<-END)
240
- title "Test"
241
- question :v_4, type: :check_box do
242
- title "Testvraag met een check_box"
243
- option :v_q1, description: 'some_description'
244
- inner_title 'blaat'
245
- option :v_q2, description: 'more_description'
246
- end
247
- END
248
- expect(invalid_keys.valid?).to be_falsey
249
- expect(valid_keys.valid?).to be_truthy
250
- end
251
-
252
- it "validates check_box question options length" do
253
- invalid_keys = make_definition(<<-END)
254
- title "Test"
255
- question :v_4, type: :check_box do
256
- title "Testvraag met een check_box"
257
- option :v_q1_has_a_very_long_key, description: 'some_description'
258
- end
259
- END
260
- valid_keys = make_definition(<<-END)
261
- title "Test"
262
- question :v_4, type: :check_box do
263
- title "Testvraag met een check_box"
264
- option :v_q1, description: 'some_description'
265
- end
266
- END
267
- expect(invalid_keys.valid?).to be_falsey
268
- expect(valid_keys.valid?).to be_truthy
269
- end
270
-
271
- it "validates question date keys" do
272
- invalid_keys = make_definition(<<-END)
273
- title "Test"
274
- question :v_6, type: :date, year_key: :invalid_key, month_key: :v_62, day_key: :v_63 do
275
- title "Testvraag met een datum"
276
- end
277
- END
278
- valid_keys = make_definition(<<-END)
279
- title "Test"
280
- question :v_6, type: :date, year_key: :v_61, month_key: :v_62, day_key: :v_63 do
281
- title "Testvraag met een datum"
282
- end
283
- END
284
- expect(invalid_keys.valid?).to be_falsey
285
- expect(valid_keys.valid?).to be_truthy
286
- end
287
- end
288
-
289
- describe 'subquestion validation' do
290
- it 'does not accept subquestions in question of type select' do
291
- select_type_without_subquestions = make_definition(<<-END)
292
- title "Test"
293
- question :v_7, type: :select do
294
- title "Vraag met hidden options"
295
- option :a1, :value => 1, :description => "Keuze1"
296
- option :a2, :value => 2, :description => "Keuze2"
297
- end
298
- END
299
- select_type_with_subquestions = make_definition(<<-END)
300
- title "Test"
301
- question :v_8, type: :select do
302
- title "Vraag met hidden options"
303
- option :a3, :value => 1, :description => "Keuze1"
304
- option :a4, :value => 2, :description => "Keuze2"
305
- option :a5, :value => 7, :description => "Anders, namelijk:"
306
- question :v_8a, :type => :radio do
307
- option :a7a, :value => 11, :description => "Keuze 3"
308
- option :a7b, :value => 12, :description => "Keuze 4"
309
- end
310
- end
311
- END
312
-
313
- expect(select_type_with_subquestions.valid?).to be_falsey
314
- expect(select_type_without_subquestions.valid?).to be_truthy
315
- end
316
- end
317
-
318
- describe 'score key validation' do
319
- it 'accepts score keys that are the correct length' do
320
- valid_definition = make_definition(<<-END)
321
- title "Test"
322
- score 'ok_key_length', label: 'some_label',
323
- schema: [{key: :wait_what_this_key_is_very_long, label: 'Score', export_key: :wat}] do
324
- { wait_what_this_key_is_very_long: 42 }
325
- end
326
- END
327
- expect(valid_definition).to be_valid
328
- end
329
-
330
- it 'reject score keys that are too long' do
331
- invalid_definition = make_definition(<<-END)
332
- title "Test"
333
- score 'score_whose_key_is_longer_than_max', label: 'some_label',
334
- schema: [{key: :t_score, label: 'Score', export_key: :wat}] do
335
- { t_score: 42 }
336
- end
337
- END
338
- expect(invalid_definition).not_to be_valid
339
- end
340
-
341
- it 'reject score key if already defined' do
342
- definition = make_definition(<<-END)
343
- title "Test"
344
- question :v_6, type: :radio, title: 'foo'
345
- score 'foo_score', label: 'some_label',
346
- schema: [{key: :t_score, label: 'Score', export_key: :wat}] do
347
- { t_score: 42 }
348
- end
349
- score 'foo_score', label: 'some_label',
350
- schema: [{key: :t_score, label: 'Score', export_key: :wat}] do
351
- { t_score: 43 }
352
- end
353
- END
354
- expect(definition).not_to be_valid
355
- end
356
- end
357
-
358
- describe 'score label validation' do
359
- it 'accepts the label option' do
360
- score_definition = make_definition(<<-END)
361
- title "Test"
362
- score 'score_key', label: 'score_label',
363
- schema: [{key: :value, label: 'Score', export_key: :sc1}] do {value: 42} end
364
- END
365
- expect(score_definition).to be_valid
366
- end
367
-
368
- it 'rejects score definitions without the label option' do
369
- score_definition = make_definition(<<-END)
370
- title "Test"
371
- score 'score_key',
372
- schema: [{key: :value, label: 'Score', export_key: :sc1}] do {value: 42} end
373
- END
374
- expect(score_definition).not_to be_valid
375
- end
376
- end
377
-
378
- describe 'title validations' do
379
- context ':title and :context_free_title do not exist' do
380
- it 'fails' do
381
- definition = make_definition(<<-END)
382
- title "Test"
383
- question :v_6, type: :radio
384
- END
385
- expect(definition.valid?).to be false
386
- end
387
-
388
- it 'does not fail with :allow_blank_titles option' do
389
- definition = make_definition(<<-END)
390
- title "Test"
391
- question :v_6, type: :radio, allow_blank_titles: true do
392
- end
393
- END
394
- expect(definition.valid?).to be true
395
- end
396
-
397
- it 'does not fail on table question' do
398
- definition = make_definition(<<-END)
399
- title "Test"
400
- table columns: 4 do
401
- end
402
- END
403
- expect(definition.valid?).to be true
404
- end
405
- end
406
-
407
- context ':title or :context_free_title exist' do
408
- it 'does not fail when :title exists' do
409
- definition = make_definition(<<-END)
410
- title "Test"
411
- question :v_6, type: :radio do
412
- title 'foo'
413
- end
414
- END
415
- expect(definition.valid?).to be true
416
- end
417
-
418
- it 'does not fail when :context_free_title exists' do
419
- definition = make_definition(<<-END)
420
- title "Test"
421
- question :v_6, type: :radio do
422
- context_free_title 'bar'
423
- end
424
- END
425
- expect(definition.valid?).to be true
426
- end
427
- end
428
-
429
- context 'default question options' do
430
- it 'is valid when no title exist and default question options set to true' do
431
- definition = make_definition(<<-END)
432
- title "Test"
433
- default_question_options allow_blank_titles: true
434
- question :v_6, type: :radio do
435
- context_free_title 'bar'
436
- end
437
- END
438
- expect(definition).to be_valid
439
- end
440
- end
441
-
442
- context 'subquestions' do
443
- it 'acts the same on subquestions' do
444
- definition = make_definition(<<-END)
445
- title "Test"
446
- default_question_options allow_blank_titles: true
447
- question :v_22a, :type => :check_box do
448
- option :v_22_a01, :description => "Niet genoeg informatie"
449
- end
450
- END
451
- expect(definition).to be_valid
452
- end
453
-
454
- it 'acts the same on title_question' do
455
- definition = make_definition(<<-END)
456
- title "Test"
457
- default_question_options allow_blank_titles: true
458
- question :v_100a, :type => :radio, :presentation => :horizontal, :required => false do
459
- title " 100a."
460
- title_question :v_100a_01, :type => :string, :title => ''
461
- option :a1, :value => 0, :description => "Optie 1"
462
- option :a2, :value => 1, :description => "Optie 2"
463
- option :a3, :value => 2, :description => "Optie 3"
464
- end
465
- END
466
- expect(definition).to be_valid
467
- end
468
- end
469
-
470
- context 'spaces before question number' do
471
- it 'is valid when title starts with 0 or 1 spaces before question number' do
472
- definition = make_definition(<<-END)
473
- title "Test"
474
- question :v_1, type: :string do
475
- title "1\\\\. Title"
476
- end
477
- END
478
- expect(definition).to be_valid
479
- end
480
-
481
- it 'is invalid when title starts with more than 1 space before question number' do
482
- definition = make_definition(<<-END)
483
- title "Test"
484
- question :v_1, type: :string do
485
- title " 1\\\\. Title"
486
- end
487
- END
488
- expect(definition).to be_invalid
489
- end
490
- end
491
- end
492
-
493
- describe 'subquestions inside a table' do
494
- it 'accepts title_questions' do
495
- expect(make_definition(<<-END).valid?).to be_truthy
496
- title "Test"
497
- panel do
498
- table do
499
- question :v_1, type: :radio do
500
- title "Question"
501
- title_question :v_2, :type => :string, :title => "Title Question", :depends_on => [:v_1_a1]
502
- option :a1, value: 1, description: "Option 1"
503
- option :a2, value: 2, description: "Option 2"
504
- end
505
- end
506
- end
507
- END
508
- end
509
-
510
- it 'does not accept subquestions in questions inside a table' do
511
- expect(make_definition(<<-END).valid?).to be_falsey
512
- title "Test"
513
- panel do
514
- table do
515
- question :v_1, type: :radio do
516
- title "Question"
517
- option :a1, value: 1, description: "Option 1"
518
- option :a2, value: 2, description: "Option 2" do
519
- question :v_2, type: :string, title: 'Subquestion'
520
- end
521
- end
522
- end
523
- end
524
- END
525
- end
526
- end
527
-
528
- describe 'flags' do
529
- it 'does not accept shows_questions arrays with unknown keys' do
530
- expect(make_definition(<<-END).valid?).to be_falsey
531
- title "Test"
532
- flag key: 'a', description: 'a flag', shows_questions: [:v_22]
533
- END
534
- end
535
-
536
- it 'does not accept hides_questions arrays with unknown keys' do
537
- expect(make_definition(<<-END).valid?).to be_falsey
538
- title "Test"
539
- flag key: 'a', description: 'a flag', hides_questions: [:v_22]
540
- END
541
- end
542
-
543
- it 'accepts shows_questions arrays with known keys' do
544
- expect(make_definition(<<-END).valid?).to be_truthy
545
- title "Test"
546
- flag key: 'a', description: 'a flag', shows_questions: [:v_22]
547
- question :v_22, type: :string do
548
- title 'Question'
549
- end
550
- END
551
- end
552
-
553
- it 'accepts hides_questions arrays with known keys' do
554
- expect(make_definition(<<-END).valid?).to be_truthy
555
- title "Test"
556
- flag key: 'a', description: 'a flag', hides_questions: [:v_22]
557
- question :v_22, type: :string do
558
- title 'Question'
559
- end
560
- END
561
- end
562
-
563
- it 'accepts depends_on with known flags' do
564
- definition = make_definition <<-END
565
- title 'Test'
566
- flag key: :test, description_true: 'Test flag', description_false: 'Test flag uit'
567
- flag key: :test2, description_true: 'Test flag 2', description_false: 'Test flag 2 uit', depends_on: :test_test
568
- END
569
- definition.valid?
570
- expect(definition.errors.full_messages).to be_blank
571
- end
572
-
573
- it 'does not accept a flag depending on a non existing flag key' do
574
- definition = make_definition <<-END
575
- title 'Test'
576
- flag key: :test, description_true: 'Test flag', description_false: 'Test flag uit', depends_on: :nonexistent
577
- END
578
- definition.valid?
579
- expect(definition.errors[:sourcecode].first[:message]).to include "Flag test_test depends_on nonexistent flag 'nonexistent'"
580
- end
581
- end
582
-
583
- describe 'respondent_types' do
584
- it 'is optional' do
585
- expect(make_definition(<<-END).valid?).to be_truthy
586
- title "Test"
587
- END
588
- end
589
-
590
- it 'accepts valid respondent_types' do
591
- expect(make_definition(<<-END).valid?).to be_truthy
592
- title "Test"
593
- respondent_types :patient, :parent
594
- END
595
- end
596
-
597
- it 'does not accept invalid respondent_types' do
598
- expect(make_definition(<<-END).valid?).to be_falsey
599
- title "Test"
600
- respondent_types :santa_claus
601
- END
602
- end
603
- end
604
-
605
- describe 'outcome_tables' do
606
- it 'checks if outcome tables are valid' do
607
- expect(make_definition(<<-END).valid?).to be_truthy
608
- title "Test"
609
- score(:key, label: 'score', schema: [{key: :value, label: 'Score', export_key: :key}]) do {value: 'oh1'} end
610
- score(:key2, label: 'score2', schema: [{key: :value, label: 'Score 2', export_key: :key2}]) do {value: 'oh2'} end
611
-
612
- outcome_table key: :test_outcome_table,
613
- score_keys: %i[key key2],
614
- subscore_keys: [:value]
615
- END
616
- end
617
-
618
- it 'fails if there is an error in outcome tables' do
619
- definition = make_definition(<<-END)
620
- title "Test"
621
- score(:key, label: 'score', schema: [{key: :value, label: 'Score', export_key: :key}]) do {value: 'oh1'} end
622
- score(:key2, label: 'score2', schema: [{key: :value, label: 'Score 2', export_key: :key2}]) do {value: 'oh2'} end
623
-
624
- outcome_table key: :test_outcome_table,
625
- score_keys: %i[key unknown_key_1 unknown_key_2],
626
- subscore_keys: [:value]
627
- END
628
- expect(definition.valid?).to be_falsey
629
- expect(definition.errors.full_messages.first).to include('Score keys :unknown_key_1 not found in score schemas')
630
- end
631
- end
632
- describe '#validate_values_unique' do
633
- it 'fails on duplicate option values' do
634
- definition = make_definition(<<-END)
635
- title "Test"
636
- question :v_1, type: :scale do
637
- title 'Ah'
638
- option :a1, value: 0
639
- option :a2, value: 0
640
- end
641
- END
642
- expect(definition.valid?).to be false
643
- expect(definition.errors.full_messages.first).to \
644
- include('v_1:a2: Another option with value 0 is already defined.')
645
- end
646
-
647
- it 'does not complain about checkbox questions' do
648
- definition = make_definition(<<-END)
649
- title "Test"
650
- question :v_1, type: :check_box do
651
- title "Testvraag met een check_box"
652
- option :v_1a1, description: 'some_description'
653
- option :v_1a2, description: 'more_description'
654
- end
655
- END
656
- expect(definition.valid?).to be true
657
- end
658
-
659
- it 'skips validation if question was passed allow_duplicate_option_values: true' do
660
- definition = make_definition(<<-END)
661
- title "Test"
662
- question :v_1, type: :scale, allow_duplicate_option_values: true do
663
- title 'Ah'
664
- option :a1, value: 0
665
- option :a2, value: 0
666
- end
667
- END
668
- expect(definition.valid?).to be true
669
- end
670
-
671
- it 'skips placeholder options' do
672
- definition = make_definition(<<-END)
673
- title "Test"
674
- question :v_1, type: :select do
675
- title 'Ah'
676
- option :a1, placeholder: true
677
- option :a2, placeholder: true
678
- end
679
- END
680
- expect(definition.valid?).to be true
681
- end
682
-
683
- it 'skips inner titles' do
684
- definition = make_definition(<<-END)
685
- title "Test"
686
- question :v_1, type: :radio do
687
- title "Wat is de hoogst genoten opleiding die u hebt afgerond?"
688
- option :a0, value: 0, description: "Geen"
689
- inner_title "Basisonderwijs:"
690
- option :a1, value: 1, description: "Basisonderwijs"
691
- option :a2, value: 2, description: "(SBO) Speciale School voor Basisonderwijs"
692
- option :a3, value: 3, description: "(SO) Speciaal Onderwijs"
693
- inner_title "Voortgezet onderwijs:"
694
- end
695
- END
696
- expect(definition.valid?).to be true
697
- end
698
-
699
- it 'checks if all options have values' do
700
- definition = make_definition(<<-END)
701
- title "Test"
702
- question :v_1, type: :scale do
703
- title 'Ah'
704
- option :a1
705
- end
706
- END
707
- expect(definition.valid?).to be false
708
- expect(definition.errors.full_messages.first).to \
709
- include('v_1:a1: Has no option value defined.')
710
- end
711
- end
712
-
713
- describe '#validate_placeholder_options_nil_values' do
714
- it 'validates placeholder options do not have values' do
715
- definition = make_definition(<<-END)
716
- title "Test"
717
- question :v_1, type: :select do
718
- title 'Ah'
719
- option :a1, placeholder: true, value: 32
720
- end
721
- END
722
- expect(definition.valid?).to be false
723
- expect(definition.errors.full_messages.first).to \
724
- include('v_1:a1: Placeholder options should not have values defined.')
725
- end
726
- end
727
-
728
- describe '#validate_markdown' do
729
- it 'validates question titles' do
730
- definition = make_definition(<<-END)
731
- title "Test"
732
- question :v_1, type: :string, title: 'a <b> tag'
733
- END
734
- expect(definition.valid?).to be false
735
- expect(definition.errors.full_messages.first).to include('That tag isn\'t allowed here')
736
- end
737
-
738
- it 'validates question description' do
739
- definition = make_definition(<<-END)
740
- title "Test"
741
- question :v_1, type: :string, title: 'fine', description: 'a <b> tag'
742
- END
743
- expect(definition.valid?).to be false
744
- expect(definition.errors.full_messages.first).to include('That tag isn\'t allowed here')
745
- end
746
-
747
- it 'validates option description' do
748
- definition = make_definition(<<-END)
749
- title "Test"
750
- question :v_1, type: :select, title: 'fine' do
751
- option :a1, value: 32, description: 'a <b> tag'
752
- end
753
- END
754
- expect(definition.valid?).to be false
755
- expect(definition.errors.full_messages.first).to include('That tag isn\'t allowed here')
756
- end
757
- end
758
-
759
- describe '#validate_raw_content_items' do
760
- it 'validates html fields' do
761
- definition = make_definition(<<-END)
762
- title "Test"
763
- panel do
764
- html "A <b> tag"
765
- end
766
- END
767
- expect(definition.valid?).to be false
768
- expect(definition.errors.full_messages.first).to include('That tag isn\'t allowed here')
769
- end
770
-
771
- it 'allows video elements' do
772
- definition = make_definition(<<-END)
773
- title "Test"
774
- panel do
775
- html "A <video></video> tag"
776
- end
777
- END
778
- expect(definition.valid?).to be true
779
- end
780
-
781
- it 'validates items with raw_content' do
782
- definition = make_definition(<<-END)
783
- title "Test"
784
- panel do
785
- question :v_1, type: :float, title: 'q', raw_content: "<p>a <b> tag</p>"
786
- end
787
- END
788
- expect(definition.valid?).to be false
789
- expect(definition.errors.full_messages.first).to include('That tag isn\'t allowed here')
790
- end
791
- end
792
- end
793
- end