rapidfire 4.0.0 → 5.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 (217) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +120 -96
  3. data/app/assets/config/manifest.js +3 -0
  4. data/app/controllers/rapidfire/application_controller.rb +6 -2
  5. data/app/controllers/rapidfire/attempts_controller.rb +2 -2
  6. data/app/controllers/rapidfire/questions_controller.rb +1 -1
  7. data/app/controllers/rapidfire/surveys_controller.rb +30 -13
  8. data/app/helpers/rapidfire/application_helper.rb +25 -0
  9. data/app/models/rapidfire/answer.rb +6 -1
  10. data/app/models/rapidfire/attempt.rb +1 -1
  11. data/app/models/rapidfire/question.rb +33 -3
  12. data/app/models/rapidfire/questions/checkbox.rb +1 -1
  13. data/app/models/rapidfire/questions/file.rb +6 -0
  14. data/app/models/rapidfire/questions/information.rb +6 -0
  15. data/app/models/rapidfire/questions/multi_file.rb +6 -0
  16. data/app/models/rapidfire/survey.rb +42 -2
  17. data/app/services/rapidfire/attempt_builder.rb +14 -2
  18. data/app/services/rapidfire/question_form.rb +5 -1
  19. data/app/services/rapidfire/survey_results.rb +38 -4
  20. data/app/views/rapidfire/answers/_checkbox.html.erb +1 -1
  21. data/app/views/rapidfire/answers/_date.html.erb +1 -1
  22. data/app/views/rapidfire/answers/_file.html.erb +5 -0
  23. data/app/views/rapidfire/answers/_information.html.erb +4 -0
  24. data/app/views/rapidfire/answers/_long.html.erb +1 -1
  25. data/app/views/rapidfire/answers/_multifile.html.erb +5 -0
  26. data/app/views/rapidfire/answers/_numeric.html.erb +1 -1
  27. data/app/views/rapidfire/answers/_radio.html.erb +1 -1
  28. data/app/views/rapidfire/answers/_select.html.erb +1 -1
  29. data/app/views/rapidfire/answers/_short.html.erb +1 -1
  30. data/app/views/rapidfire/attempts/_form.html.erb +1 -1
  31. data/app/views/rapidfire/attempts/edit.html.erb +1 -1
  32. data/app/views/rapidfire/attempts/new.html.erb +1 -1
  33. data/app/views/rapidfire/questions/_form.html.erb +1 -1
  34. data/app/views/rapidfire/surveys/_survey.html.erb +6 -0
  35. data/app/views/rapidfire/surveys/index.html.erb +7 -2
  36. data/app/views/rapidfire/surveys/results.html.erb +3 -1
  37. data/db/migrate/20190701274749_add_active_to_surveys.rb +12 -0
  38. data/lib/generators/rapidfire/active_survey_migration_generator.rb +18 -0
  39. data/lib/generators/rapidfire/templates/migrations/add_active_to_survey.rb +5 -0
  40. data/lib/rapidfire/version.rb +1 -1
  41. data/lib/tasks/change_delimiter_to_srsn.rake +1 -1
  42. data/lib/tasks/rapidfire.rake +10 -0
  43. data/spec/dummy/README.rdoc +1 -1
  44. data/spec/dummy/app/assets/config/mainfest.js +2 -0
  45. data/spec/dummy/app/models/application_record.rb +3 -0
  46. data/spec/dummy/app/models/user.rb +2 -0
  47. data/spec/dummy/app/views/layouts/application.html.erb +0 -2
  48. data/spec/dummy/config/application.rb +22 -3
  49. data/spec/dummy/config/environments/test.rb +5 -0
  50. data/spec/dummy/config/storage.yml +7 -0
  51. data/spec/dummy/db/migrate/20170701191422_create_users.rb +15 -0
  52. data/spec/dummy/db/migrate/20230402174122_create_active_storage_tables.active_storage.rb +67 -0
  53. data/spec/dummy/db/schema.rb +53 -17
  54. data/spec/dummy/db/test.sqlite3 +0 -0
  55. data/spec/dummy/log/test.log +76140 -14034
  56. data/spec/dummy/tmp/capybara/capybara-202304042341376066162578.html +29 -0
  57. data/spec/dummy/tmp/capybara/capybara-202304042343302647462912.html +29 -0
  58. data/spec/dummy/tmp/capybara/capybara-202304042343539524195351.html +29 -0
  59. data/spec/dummy/tmp/capybara/capybara-202304042344039569698410.html +29 -0
  60. data/spec/dummy/tmp/capybara/capybara-202304042344107081227684.html +29 -0
  61. data/spec/dummy/tmp/capybara/capybara-202304042346131668826835.html +29 -0
  62. data/spec/dummy/tmp/capybara/capybara-202304042346251478672095.html +29 -0
  63. data/spec/dummy/tmp/capybara/capybara-202304042346382011987550.html +29 -0
  64. data/spec/dummy/tmp/capybara/capybara-20230404234755589239852.html +29 -0
  65. data/spec/dummy/tmp/capybara/capybara-202304042348377947112508.html +29 -0
  66. data/spec/dummy/tmp/capybara/capybara-202304042348502970551073.html +55 -0
  67. data/spec/dummy/tmp/capybara/capybara-202304042351403473706214.html +29 -0
  68. data/spec/dummy/tmp/capybara/capybara-202304042352069122239363.html +29 -0
  69. data/spec/dummy/tmp/capybara/capybara-202304042353148433036065.html +29 -0
  70. data/spec/dummy/tmp/capybara/capybara-202304042353383278368450.html +29 -0
  71. data/spec/dummy/tmp/capybara/capybara-202304042358431743077504.html +20 -0
  72. data/spec/dummy/tmp/capybara/capybara-202304042358433434523512.html +20 -0
  73. data/spec/dummy/tmp/capybara/capybara-202304042358434379121493.html +20 -0
  74. data/spec/dummy/tmp/capybara/capybara-202304042358492996621343.html +20 -0
  75. data/spec/dummy/tmp/storage/2e/vk/2evksypp3ct4p9cjihfxwomru17i +1 -0
  76. data/spec/dummy/tmp/storage/9k/xt/9kxth5brdkw4huy7lciesekum0pt +1 -0
  77. data/spec/dummy/tmp/storage/cu/44/cu4452jrce4gd0ebcqop1d22kwbs +1 -0
  78. data/spec/dummy/tmp/storage/dl/oy/dloy0dbuquwe0f48bhugjca71pbv +1 -0
  79. data/spec/dummy/tmp/storage/h5/vc/h5vcb12f2cviqinrckfmmz4wtsa7 +1 -0
  80. data/spec/dummy/tmp/storage/ht/4x/ht4xma120asy3gd0fpeseddjzb2l +1 -0
  81. data/spec/dummy/tmp/storage/ip/au/ipauutuc5vy678hrwz4jx3rvm0n6 +1 -0
  82. data/spec/dummy/tmp/storage/j1/uy/j1uyrkrosby81sgq1mf59bs7oqee +1 -0
  83. data/spec/dummy/tmp/storage/nj/vv/njvvpx93zptrmlwbwiuxmxyh1jnf +1 -0
  84. data/spec/dummy/tmp/storage/nv/nx/nvnxlyvw3vd8xsq2sa4eazqepgbn +1 -0
  85. data/spec/dummy/tmp/storage/of/b4/ofb41sjj1mp33qs3wsivadhuts3p +1 -0
  86. data/spec/dummy/tmp/storage/og/ee/ogeerywp2y4szmnlrc5fnuya2evl +1 -0
  87. data/spec/dummy/tmp/storage/wz/oc/wzocvk4ahpp7kwc951u7f78nj259 +1 -0
  88. data/spec/dummy/tmp/storage/z3/vx/z3vxuitmnxld08m0qvt9057uyglc +1 -0
  89. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/1b/cx/1bcxhbuf0bwp8uduq76gye1v11al +1 -0
  90. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/40/x5/40x5xe5nmit9ngld2lngzfjp6r6x +1 -0
  91. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/7h/za/7hza4otjknyyo14szs2az8wiu7ai +1 -0
  92. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/ad/ct/adct5ysy5mq6kyptqk5q3fzfpwui +1 -0
  93. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/bl/yo/blyo13wkf0l9igpyq4anaqbomz0h +1 -0
  94. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/cc/g8/ccg8282dt6ixi4yvvwjt4noqa6pj +1 -0
  95. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/d3/gj/d3gjt0qoinigrbao1anp4hmvedjm +1 -0
  96. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/f2/bv/f2bvz6ws3xfrk17dpzhyacx3kys2 +1 -0
  97. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/f8/3z/f83z2f041tfpu39ygi0gu32wai8x +1 -0
  98. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/gt/rc/gtrco13ij0i2vi27t6wm1jhcve5p +1 -0
  99. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/k8/br/k8br0vtpgmpqxrl8mdsceymh3c8d +1 -0
  100. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/mw/le/mwle6olsgsk8h2pxvklj5q0yr9sc +1 -0
  101. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/n7/ja/n7jacvu07s9z9ai7acjq8kovdh02 +1 -0
  102. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/o1/2w/o12whqlkt6rc0yaq3b6fsowmewdp +1 -0
  103. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/o9/2g/o92go6wavds5oht0dso6m1ybvbh4 +1 -0
  104. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/om/7f/om7frlle7xz8pybxbydeq1q20hro +1 -0
  105. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/q6/78/q678f1u8v1nv07dbtm85knmw3b9q +1 -0
  106. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/qq/kc/qqkciwi2vymum1556755n85po1j9 +1 -0
  107. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/r4/wp/r4wpzje2mix0dtl8r2f4akh18fm1 +1 -0
  108. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/v1/h9/v1h9cuuwtwvz8p6fl574qum6k4ig +1 -0
  109. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/vb/mw/vbmwrl014lccj3jo61vojqscfxha +1 -0
  110. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/wn/q4/wnq49hhhxvh4gnc2782lf4zzlz46 +1 -0
  111. data/spec/dummy/tmp/storage-7.0.0-ruby-3.2.0/ya/go/yago1kn4o7p8jfob0cxetrif714s +1 -0
  112. data/spec/factories/questions_factory.rb +6 -0
  113. data/spec/factories/users_factory.rb +5 -0
  114. data/spec/features/rapidfire/answering_questions_spec.rb +47 -7
  115. data/spec/fixtures/files/one.txt +1 -0
  116. data/spec/fixtures/files/two.txt +1 -0
  117. data/spec/models/rapidfire/attempt_spec.rb +5 -1
  118. data/spec/models/rapidfire/questions/file_spec.rb +57 -0
  119. data/spec/models/rapidfire/questions/multi_file_spec.rb +60 -0
  120. data/spec/services/rapidfire/attempt_builder_spec.rb +61 -13
  121. metadata +184 -232
  122. data/spec/dummy/db/development.sqlite3 +0 -0
  123. data/spec/dummy/log/development.log +0 -200
  124. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-N/-Nnl5LNk36kVPJf_3kuN5xu7Ebj5HCbnrsyxphSIsdg.cache +0 -0
  125. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-o/-ojJ77Tf5UKdeHBEDmWtQ_3tnTJqQ0nd-YsKamqADUE.cache +0 -1
  126. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2b/2bErzwvSRmQv4cAljE5MLyihOZ0NcAw3J8cE3Lt0e4Q.cache +0 -0
  127. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4C/4CJwpaeIKdXtjEAju7_wQgXuYrzr55ARwRJeVKN7CPM.cache +0 -0
  128. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4U/4UispN4bfPqEzViX3T416Fr-T-7awbayU5fSryvLFNw.cache +0 -0
  129. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4k/4kH3sikLuE3o4jE_TNDlBNrlF7XAo_qYtBA6ckHGa5I.cache +0 -0
  130. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7d/7drzegBZRzthT8NYQjAVcg1mCXgXUj5USwB8GQ1o23Y.cache +0 -1
  131. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/80/80TT8hyotZ8-XWzQe7ELHNN8U6Mp2oGKwqa6Ckoksx0.cache +0 -1
  132. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8F/8FRx5PWf5mlaMlBnq_oPScrqvzB2csCEVlQ-FbB7Jy8.cache +0 -0
  133. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8M/8MNahq2o0fNDjjgT-erC9ZV3sFYg4ifFZqlLkcifOSA.cache +0 -1
  134. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8W/8WURt7NXtVdx9vbcRVtNXo2mqrL-0LPzw609oR1ZXnk.cache +0 -0
  135. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8k/8kFdViWjxSCYCA00vzJCIk-Hl7Dv6xCJ_Ce3jZALweg.cache +0 -1
  136. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9-/9-6v3_GF1yDfksWqHBJ96NiduUWyrW5R3k6MQzVpork.cache +0 -0
  137. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/94/94L1rKpX0k77vTIGtqElUDP4dpQXrCmvpI9CmQcZ_aM.cache +0 -1
  138. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9s/9s2S3Z_vncpN-gwuV05kcjhELi_kX-saO8shiQRx8cU.cache +0 -0
  139. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AS/AS1POBxm-FJcvGXfKUC02RI960YWQRZP6B5bJ9Pc8qU.cache +0 -1
  140. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AS/Asy0YwmSFpm-OyM4_Lb9v5CTPAePa74fljOfWyS3SJY.cache +0 -0
  141. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AY/AYSNFEx7wRHtwbVh3cNGid6wCMdfgyk9ocorMLfRqx4.cache +0 -0
  142. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bk/BkxzEgJOpM-iCKaxrcsZlyRZeZKYVDlUj0C-sPXVGPc.cache +0 -0
  143. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/CW/CW8uYbA8W5LQ0T8Bo2ygunrwYuaHB0kJJuXlPlGA5F8.cache +0 -1
  144. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Co/CooYsvCeOgtDx9ZKSzQADfurwS4WGsVpyNXMlWum68U.cache +0 -0
  145. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DC/DCdg25PhcFibsQItx9ofgOr68CacLQumta_lSKJCoOg.cache +0 -1
  146. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Db/DbmLC3wtG7ztEvkzmVAubW8vf37XdD0bT3Kh73oed1A.cache +0 -0
  147. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Db/dBQCcGB2fmK2CTrjrkLGxVmGKqBC2AZAx2C6TUMa1XY.cache +0 -0
  148. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dn/Dn7Jw00mRZVDDxhjSg9300HJb_1875nlul_DHMMinn8.cache +0 -1
  149. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/IH/IHV1NrIJaxcdliBIo7Z7i28Nqm-8xd7RplmATbQZysI.cache +0 -0
  150. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ie/IemA55SqXkoyW_cD7FDwSk834ZydXI6UJpy7QsD-H5Q.cache +0 -0
  151. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/K7/K7SHc_erMPqr16VuAuVxvKfOUmN9Xf9zCR5Mmr6jOTo.cache +0 -0
  152. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KG/KGhjc0Py_DB3csmx7Y7NGPUOfnsPXP_KJc94bFEIZls.cache +0 -1
  153. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lz/LzA8Mm_F0jmw6BK_4ca5scIcIGc6RjWV54G-BeQv8cA.cache +0 -0
  154. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/MP/MPTz2thdBdQPKUgb5k1oYWT6cmJYgRTEz_NEYDQt7E0.cache +0 -0
  155. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/MtTjUV8qKCTEH961LJhYQWADgVragV9D9xWWiCmxyNc.cache +0 -1
  156. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/O9/O9WxLI48Zh1ES7ZCQC-cX2C7A_-Wg_c_kUOsIHodXW0.cache +0 -0
  157. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Qo/QoZwnBtkSf3joyR1_5FKACUOgfoO35xMFOfLJkJqFD8.cache +0 -1
  158. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/R6/R6G-TFFztlxL5XDMIFX62wKkfUfmib6oV93z-xCZWsU.cache +0 -1
  159. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ry/Ry0Py6y0kHcEYq6qNWzUVQaMeP_p4kGPbD3ZchhmvEA.cache +0 -1
  160. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SD/SDy6hVbUInn62jE9aAJObZ8NmVkGE5sF7KxhzNEwjys.cache +0 -0
  161. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SD/sdxeRQBFEvjbUw-k3jsefKcslmEkm88PryW_XDPfOWU.cache +0 -0
  162. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SH/SHUtigN8XJz-0yTSrOMb-kFlv8iOSvIKmMU76EwSoY0.cache +0 -0
  163. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tg/TgTcVvqf5KTGti25aDSVdPzdEFSzFCA7TIgv36nVcSw.cache +0 -0
  164. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tj/TjvztGCZ2bx84O9DtrIqlbV9f36XZWuZRucFAwvdgJI.cache +0 -0
  165. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tw/Twx5_JY_0JVEAdweDWUNH8zBfK8PB6OnwROdMaXHv98.cache +0 -1
  166. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UD/UD9ueo8syy1g__X14lIaWY51JAsI5nkxjvn4iz7-B68.cache +0 -1
  167. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VY/VYOSVFxELVZ_dWFjIfo96exB1iYypEPPaE0U-NYUk3I.cache +0 -0
  168. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Vq/VqF69IHPfaZOy6Wd3s10PIQmt2iWbU7UKgi7gGhoY6c.cache +0 -1
  169. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/W3/W3k3ezbkIWPsSAffgGGMKKSe_1CPV2jCUAXtFPSKTjE.cache +0 -0
  170. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XY/XYnyPDtRIxqi5PSIcR0DKovMSyfgt-vquXm2oF4YcYU.cache +0 -0
  171. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Xe/Xez_IMQeyfLa4U_cntyZgtqAxc9P-spYMcKOwgwqfUk.cache +0 -1
  172. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Xp/XpKq_V1bVRTt2Dm9n2LFly2fc7rc63m5n0TkruAIT9U.cache +0 -1
  173. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/YQ/YQ07c7yZvQDkWCDNv-r_m3MczWVJMkpDlY6mItSQvDI.cache +0 -0
  174. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_D/_Du4UKNyRoKp1L8GangzMxQuHGRXv9UNLRFzUUG-8Mo.cache +0 -0
  175. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_i/_ioj978qaHpKe71YAPRTMr52bYBz1jBQH_a9jnVNxto.cache +0 -1
  176. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/a9/a9w-3USbjccL8aE_56A0EsenyNCD6btCxgmr4_s-LVk.cache +0 -0
  177. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/c6/c6TDdHnqxfaHueLdYt538jXw_7RBFpECFkp7A4pWUfs.cache +0 -1
  178. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dH/dH4Xkqb5rV9DHHmRa_ODseSEFnlwS0AXeHgoCYqkkZ8.cache +0 -0
  179. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dU/dUHj3xc9qlZfXc7VP69mfddx5l1sXwlfejSWXIdb1JQ.cache +0 -1
  180. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/de/derm8VJMOzbaRf2rY8Vz6WSHk5w-XAKJIsAIHU5Ng58.cache +0 -1
  181. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/e6/e6jkUzONoMPGAC7nyZsGla8Zm7wPlhXwijdHIYF-FTo.cache +0 -0
  182. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fJ/fJ5wsH-IHhi_3Wg-4Yk01_O8Bw8SpcxPh-PaN6n38CQ.cache +0 -0
  183. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/g3/g3XXzOg1WKmExnfECaHxaHbjrF8feoJ60TwJJQzWlhI.cache +0 -0
  184. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/g4/g4tbfWjrt8uCm6WfFre4E1yEp4WC9rV9pFrA_9VHQys.cache +0 -0
  185. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gm/gmSFGhfFSAm1wrLyyGXOUXMn-kygBbG7Zf3unPKzEWw.cache +0 -1
  186. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gz/gz6bIRfuHgLuNBVVsocUuzLbEU4gEneTbmvzi27eoho.cache +0 -0
  187. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hM/hMgVzrZus4Z8I8AXg5NPYgizKLI5WwSbt5NKdK00slk.cache +0 -0
  188. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iw/iwQwbZENFRwrGzETXtK_2_3aqWyAENDNwJAdJu1RoBg.cache +0 -1
  189. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kJ/kJSsmIsKQHNWdfJ2rMMpTZQ6DeAipIUyiXdftUlXr4I.cache +0 -0
  190. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ky/ky_7gNCiNp9E5HHXqszipoMZuSpcxD9ceXe46g_5VzI.cache +0 -1
  191. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lJ/lJf_GZ6JzbMPq2WIEKNQKFh5vI9T8ylMDcZQMcgj1fg.cache +0 -1
  192. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lo/lo0mbuMJiW9QksbTzvZ6N6aknuNrk1sJCprfNsMJw50.cache +0 -0
  193. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m8/m801v81Cvh2CcUpw7286U_9CC2tO0z4XBKhfVx8OabE.cache +0 -1
  194. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mY/mYUyrqDItAnpMyLO7mNA7gPs93yNLb7Hr66jqh-aJmk.cache +0 -1
  195. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oT/oT7WJVi5xRK0iTbo-MPPVRF3__YNxLiK-kG2oSzeHgA.cache +0 -1
  196. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pr/prpHKLWY8kH_ZR0CBQBubKTbYRVzUx-u2RzceRwSedM.cache +0 -0
  197. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/py/py8m2jF8ezxgbkf0QTl2FPU21gpWQgvz96UpLr4JCbQ.cache +0 -1
  198. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q3/q3AuG3GbIVzhGBdYCriWe8FktR40JLxYfJyauA0-CCs.cache +0 -1
  199. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q6/q6BYa32YJF11eGVapO4ouNl6gayPIsARgMavlzZmoi0.cache +0 -0
  200. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q7/q7yl5Q_Rk3hQdNI2dKzooG6EkbWvfGaywsvHDtNBX3E.cache +0 -0
  201. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rc/rcasFMX-bUWsjC8vmfqpoKL6LDbNyRqjBOBJn6KxQrM.cache +0 -1
  202. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rh/rh0ehR00zu0AmhmksJoUmSMhi6eKb30JpiSLU1Y7vGY.cache +0 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/t6/t6ve2uEx0ZpKYVPLJkiSm3_3nVj8hVs0ouPs-j1Y-Lw.cache +0 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tF/tFs-J47Vhauit7rJvH6_RG3NydHacSvI1Wn_BPK8OBs.cache +0 -1
  205. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/uU/uUfexZe40_0TvILVKPsXUS5gjsc4iul3OZCrWoXS0Qo.cache +0 -1
  206. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vF/vFj_rUSzkEPWTAvaVnIUzkZIbfolIXH2bitACRZYWAU.cache +0 -1
  207. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vk/vk-e_ORxd49RmmTia4r2ajyVw0p-xcUuz8uz8Nx_LUw.cache +0 -1
  208. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wa/wab9PO75nglTE-rq2pVPg22CRkZW_yTq_WcZ6BEp8T0.cache +0 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wd/wdHNDzQjfQYx2VQbObEoz4iNxGhcuum4uypNBmnuNpA.cache +0 -1
  210. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wu/wuO0z3wuhphrqHOHqZdrZd6lFv2u0_Gq7BkDoc_8cEw.cache +0 -1
  211. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/x7/x7KkTV3ibfIEysLB_ug5bfmnn2VLV_BldukPR3EoPBk.cache +0 -0
  212. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xg/xge95XbE6Me8MVp8Pnz9FbKOZhvzndxHzh-uOjZV5_s.cache +0 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xz/Xz-wkd5XTDRNs5mNRhBpx4RSe0LN9ajplnuDcli51jE.cache +0 -1
  214. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xz/xzFhuo3m7qD5I9Xc85aP9j6kR-iAOB0najl9uu7hdMc.cache +0 -1
  215. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yn/ynGH6ruy4vPfFCwXOH8rgd3f-UWmo05h37jjH0cii8E.cache +0 -1
  216. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yw/yw6SDVVxzUeXqN9VX1eCGWTN809mt05p0JnedEBCZ7w.cache +0 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zg/zg53gL5TWyca4nbWc_d4pFhJ7huiu6zm1BTDcALsP8c.cache +0 -1
@@ -26,5 +26,11 @@ FactoryGirl.define do
26
26
 
27
27
  factory :q_short, :class => "Rapidfire::Questions::Short" do
28
28
  end
29
+
30
+ factory :q_file, :class => "Rapidfire::Questions::File" do
31
+ end
32
+
33
+ factory :q_multifile, :class => "Rapidfire::Questions::MultiFile" do
34
+ end
29
35
  end
30
36
  end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :user do
3
+ name "Test User"
4
+ end
5
+ end
@@ -2,20 +2,23 @@ require 'spec_helper'
2
2
 
3
3
  describe "Surveys" do
4
4
  let!(:survey) { FactoryGirl.create(:survey, name: "Question Set", introduction: "Some introduction") }
5
- let!(:question1) { FactoryGirl.create(:q_long, survey: survey, question_text: "Long Question", validation_rules: { presence: "1" }) }
6
- let!(:question2) { FactoryGirl.create(:q_short, survey: survey, question_text: "Short Question") }
7
- let!(:question3) { FactoryGirl.create(:q_checkbox, survey: survey, question_text: "Checkbox question") }
8
- let!(:question4) { FactoryGirl.create(:q_checkbox, survey: survey, question_text: "Checkbox question", validation_rules: { presence: "1" }) }
9
5
 
10
- before do
6
+ it "displays survey introduction" do
11
7
  visit rapidfire.new_survey_attempt_path(survey)
12
- end
13
8
 
14
- it "displays survey introduction" do
15
9
  expect(page).to have_content "Some introduction"
16
10
  end
17
11
 
18
12
  describe "Answering Questions" do
13
+ let!(:question1) { FactoryGirl.create(:q_long, survey: survey, question_text: "Long Question", validation_rules: { presence: "1" }) }
14
+ let!(:question2) { FactoryGirl.create(:q_short, survey: survey, question_text: "Short Question") }
15
+ let!(:question3) { FactoryGirl.create(:q_checkbox, survey: survey, question_text: "Checkbox question") }
16
+ let!(:question4) { FactoryGirl.create(:q_checkbox, survey: survey, question_text: "Checkbox question", validation_rules: { presence: "1" }) }
17
+
18
+ before do
19
+ visit rapidfire.new_survey_attempt_path(survey)
20
+ end
21
+
19
22
  context "when all questions are answered" do
20
23
  before do
21
24
  fill_in "attempt_#{question1.id}_answer_text", with: "Long Answer"
@@ -85,4 +88,41 @@ describe "Surveys" do
85
88
  end
86
89
  end
87
90
  end
91
+
92
+ if "#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}" >= "5.2"
93
+ describe "Answering File uploads" do
94
+ context "when the question is single file upload" do
95
+ let!(:question1) { FactoryGirl.create(:q_file, survey: survey, question_text: "Avatar") }
96
+
97
+ it "persistes the file" do
98
+ visit rapidfire.new_survey_attempt_path(survey)
99
+
100
+ attach_file "attempt_#{question1.id}_file", file_fixture("one.txt")
101
+ click_button "Save"
102
+
103
+ answer = Rapidfire::Answer.first
104
+ expect(answer).to be_persisted
105
+ expect(answer.file.download).to eq("one\n")
106
+ end
107
+ end
108
+
109
+ context "when the question is multi file upload" do
110
+ let!(:question1) { FactoryGirl.create(:q_multifile, survey: survey, question_text: "Images") }
111
+
112
+ it "persistes the file" do
113
+ visit rapidfire.new_survey_attempt_path(survey)
114
+
115
+ attach_file "attempt_#{question1.id}_files", [file_fixture("one.txt"), file_fixture("two.txt")]
116
+ click_button "Save"
117
+
118
+ answer = Rapidfire::Answer.first
119
+ expect(answer).to be_persisted
120
+ expect(answer.files.length).to eq 2
121
+
122
+ expect(answer.files[0].download).to eq("two\n")
123
+ expect(answer.files[1].download).to eq("one\n")
124
+ end
125
+ end
126
+ end
127
+ end
88
128
  end
@@ -0,0 +1 @@
1
+ one
@@ -0,0 +1 @@
1
+ two
@@ -3,7 +3,11 @@ require 'spec_helper'
3
3
  describe Rapidfire::Attempt do
4
4
  describe "Associations" do
5
5
  it { is_expected.to belong_to(:survey) }
6
- it { is_expected.to belong_to(:user) }
6
+ if Rails::VERSION::MAJOR >= 5
7
+ it { is_expected.to belong_to(:user).optional }
8
+ else
9
+ it { is_expected.to belong_to(:user) }
10
+ end
7
11
  it { is_expected.to have_many(:answers) }
8
12
  end
9
13
  end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ def fixture_file_upload(path, mime_type)
4
+ Rack::Test::UploadedFile.new(Pathname.new(file_fixture_path).join(path), mime_type, false)
5
+ end
6
+
7
+ describe Rapidfire::Questions::File do
8
+ describe "Validations" do
9
+ it { is_expected.to validate_presence_of(:survey) }
10
+ it { is_expected.to validate_presence_of(:question_text) }
11
+ end
12
+
13
+ describe "Associations" do
14
+ it { is_expected.to belong_to(:survey) }
15
+ end
16
+
17
+ if "#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}" >= "5.2"
18
+ describe "validate_answer" do
19
+ let(:question) { FactoryGirl.create(:q_file, validation_rules: validation_rules) }
20
+ let(:answer) { FactoryGirl.build(:answer, question: question, file: file) }
21
+ before { answer.valid? }
22
+
23
+ context "when there are no validation rules" do
24
+ let(:validation_rules) { {} }
25
+ let(:file) { nil }
26
+
27
+ it "answer should pass validations" do
28
+ expect(answer.errors).to be_empty
29
+ end
30
+ end
31
+
32
+ context "when question needs a file attachment" do
33
+ let(:validation_rules) { { presence: "1" } }
34
+
35
+ context "when answer is empty" do
36
+ let(:file) { nil }
37
+
38
+ it "fails validations" do
39
+ expect(answer.errors).not_to be_empty
40
+ end
41
+
42
+ it "says answer should be present" do
43
+ expect(answer.errors[:file]).to include("can't be blank")
44
+ end
45
+ end
46
+
47
+ context "when answer is not empty" do
48
+ let(:file) { fixture_file_upload("one.txt", "text/plain") }
49
+
50
+ it "passes validations" do
51
+ expect(answer.errors).to be_empty
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ def fixture_file_upload(path, mime_type)
4
+ Rack::Test::UploadedFile.new(Pathname.new(file_fixture_path).join(path), mime_type, false)
5
+ end
6
+
7
+ describe Rapidfire::Questions::MultiFile do
8
+ describe "Validations" do
9
+ it { is_expected.to validate_presence_of(:survey) }
10
+ it { is_expected.to validate_presence_of(:question_text) }
11
+ end
12
+
13
+ describe "Associations" do
14
+ it { is_expected.to belong_to(:survey) }
15
+ end
16
+
17
+ if "#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}" >= "5.2"
18
+ describe "validate_answer" do
19
+ let(:question) { FactoryGirl.create(:q_multifile, validation_rules: validation_rules) }
20
+ let(:answer) { FactoryGirl.build(:answer, question: question, files: files) }
21
+ before { answer.valid? }
22
+
23
+ context "when there are no validation rules" do
24
+ let(:validation_rules) { {} }
25
+ let(:files) { [] }
26
+
27
+ it "answer should pass validations" do
28
+ expect(answer.errors).to be_empty
29
+ end
30
+ end
31
+
32
+ context "when question needs a file attachment" do
33
+ let(:validation_rules) { { presence: "1" } }
34
+
35
+ context "when answer is empty" do
36
+ let(:files) { [] }
37
+
38
+ it "fails validations" do
39
+ expect(answer.errors).not_to be_empty
40
+ end
41
+
42
+ it "says answer should be present" do
43
+ expect(answer.errors[:files]).to include("can't be blank")
44
+ end
45
+ end
46
+
47
+ context "when answer is not empty" do
48
+ let(:files) do
49
+ [fixture_file_upload("one.txt", "text/plain"),
50
+ fixture_file_upload("two.txt", "text/plain")]
51
+ end
52
+
53
+ it "passes validations" do
54
+ expect(answer.errors).to be_empty
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,5 +1,9 @@
1
1
  require 'spec_helper'
2
2
 
3
+ def fixture_file_upload(path, mime_type)
4
+ Rack::Test::UploadedFile.new(Pathname.new(file_fixture_path).join(path), mime_type, false)
5
+ end
6
+
3
7
  describe Rapidfire::AttemptBuilder do
4
8
  let(:survey) { FactoryGirl.create(:survey) }
5
9
  let(:question1) { FactoryGirl.create(:q_short, survey: survey) }
@@ -28,11 +32,6 @@ describe Rapidfire::AttemptBuilder do
28
32
  end
29
33
  let(:save_answers) { builder.save }
30
34
 
31
- before do
32
- [question1, question2]
33
- save_answers
34
- end
35
-
36
35
  context "when all the answers are valid" do
37
36
  let(:answer_params) do
38
37
  {
@@ -46,6 +45,7 @@ describe Rapidfire::AttemptBuilder do
46
45
  end
47
46
 
48
47
  it "successfully saves answers" do
48
+ save_answers
49
49
  builder.answers.each do |answer|
50
50
  expect(answer).to be_persisted
51
51
  expect(question_ids).to include(answer.question_id)
@@ -66,21 +66,69 @@ describe Rapidfire::AttemptBuilder do
66
66
  end
67
67
 
68
68
  it "fails to save those answers" do
69
+ save_answers
69
70
  expect(Rapidfire::Answer.count).to eq(0)
70
71
  end
71
72
 
72
- context "when requested to save without validations" do
73
- let(:save_answers) { builder.save(:validate => false) }
73
+ if Rails::VERSION::MAJOR < 5
74
+ context "when requested to save without validations" do
75
+ let(:save_answers) { builder.save(:validate => false) }
76
+
77
+ it "returns true" do
78
+ expect(save_answers).to be_truthy
79
+ end
80
+
81
+ it "saves all the answers" do
82
+ save_answers
83
+ builder.answers.each do |answer|
84
+ expect(answer).to be_persisted
85
+ expect(question_ids).to include(answer.question_id)
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ if "#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}" >= "5.2"
93
+ context "with a single file upload question" do
94
+ let(:question3) { FactoryGirl.create(:q_file, survey: survey) }
74
95
 
75
- it "returns true" do
96
+ let(:answer_params) do
97
+ {
98
+ question1.id.to_s => { :answer_text => "short answer" },
99
+ question2.id.to_s => { :answer_text => "long answer" },
100
+ question3.id.to_s => { :file => fixture_file_upload("one.txt", "text/plain") }
101
+ }
102
+ end
103
+
104
+ it "saves the file successfully" do
76
105
  expect(save_answers).to be_truthy
106
+
107
+ answer = Rapidfire::Answer.last
108
+ expect(answer).to be_persisted
109
+ expect(answer.file.download).to eq("one\n")
77
110
  end
111
+ end
78
112
 
79
- it "saves all the answers" do
80
- builder.answers.each do |answer|
81
- expect(answer).to be_persisted
82
- expect(question_ids).to include(answer.question_id)
83
- end
113
+ context "with multiple files upload question" do
114
+ let(:question3) { FactoryGirl.create(:q_multifile, survey: survey) }
115
+
116
+ let(:answer_params) do
117
+ {
118
+ question1.id.to_s => { :answer_text => "short answer" },
119
+ question2.id.to_s => { :answer_text => "long answer" },
120
+ question3.id.to_s => { :files => [fixture_file_upload("one.txt", "text/plain"),
121
+ fixture_file_upload("two.txt", "text/plain")]}
122
+ }
123
+ end
124
+
125
+ it "saves the file successfully" do
126
+ expect(save_answers).to be_truthy
127
+
128
+ answer = Rapidfire::Answer.last
129
+ expect(answer).to be_persisted
130
+ expect(answer.files[0].download).to eq("one\n")
131
+ expect(answer.files[1].download).to eq("two\n")
84
132
  end
85
133
  end
86
134
  end