helena 0.3.3

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 (202) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +2 -0
  3. data/.gitignore +15 -0
  4. data/.rubocop.yml +16 -0
  5. data/.travis.yml +6 -0
  6. data/Gemfile +31 -0
  7. data/Gemfile.lock +290 -0
  8. data/LICENSE +16 -0
  9. data/README.md +90 -0
  10. data/Rakefile +29 -0
  11. data/app/assets/images/helena/.keep +0 -0
  12. data/app/assets/images/helena/helena_mobile_view.jpg +0 -0
  13. data/app/assets/images/helena/icons/export.svg +29 -0
  14. data/app/assets/images/helena/swissmadesoftware.png +0 -0
  15. data/app/assets/javascripts/helena/application.js +4 -0
  16. data/app/assets/javascripts/helena/survey.js +2 -0
  17. data/app/assets/stylesheets/helena/admin/labels.css.sass +7 -0
  18. data/app/assets/stylesheets/helena/admin/layout.css.sass +6 -0
  19. data/app/assets/stylesheets/helena/admin/question_groups.css.sass +7 -0
  20. data/app/assets/stylesheets/helena/admin/questions.css.sass +9 -0
  21. data/app/assets/stylesheets/helena/admin/sessions.css.sass +5 -0
  22. data/app/assets/stylesheets/helena/admin/subquestions.css.sass +7 -0
  23. data/app/assets/stylesheets/helena/admin/versions.css.sass +9 -0
  24. data/app/assets/stylesheets/helena/application.css.sass +21 -0
  25. data/app/assets/stylesheets/helena/forms.css.sass +13 -0
  26. data/app/assets/stylesheets/helena/layout.css.sass +3 -0
  27. data/app/assets/stylesheets/helena/question_groups.css.sass +4 -0
  28. data/app/controllers/helena/admin/application_controller.rb +31 -0
  29. data/app/controllers/helena/admin/question_groups_controller.rb +78 -0
  30. data/app/controllers/helena/admin/questions/checkbox_groups_controller.rb +17 -0
  31. data/app/controllers/helena/admin/questions/checkbox_matrix_controller.rb +9 -0
  32. data/app/controllers/helena/admin/questions/long_texts_controller.rb +13 -0
  33. data/app/controllers/helena/admin/questions/radio_groups_controller.rb +17 -0
  34. data/app/controllers/helena/admin/questions/radio_matrix_controller.rb +9 -0
  35. data/app/controllers/helena/admin/questions/short_texts_controller.rb +13 -0
  36. data/app/controllers/helena/admin/questions/static_texts_controller.rb +13 -0
  37. data/app/controllers/helena/admin/questions_controller.rb +105 -0
  38. data/app/controllers/helena/admin/sessions_controller.rb +35 -0
  39. data/app/controllers/helena/admin/surveys_controller.rb +78 -0
  40. data/app/controllers/helena/admin/versions_controller.rb +71 -0
  41. data/app/controllers/helena/application_controller.rb +15 -0
  42. data/app/controllers/helena/concerns/questions/matrix_questions.rb +24 -0
  43. data/app/controllers/helena/sessions_controller.rb +93 -0
  44. data/app/controllers/helena/surveys_controller.rb +11 -0
  45. data/app/helpers/helena/application_helper.rb +4 -0
  46. data/app/models/helena/answer.rb +48 -0
  47. data/app/models/helena/boolean_answer.rb +5 -0
  48. data/app/models/helena/concerns/application_model.rb +19 -0
  49. data/app/models/helena/concerns/questions/requirable.rb +19 -0
  50. data/app/models/helena/concerns/questions/validates_one_label.rb +22 -0
  51. data/app/models/helena/integer_answer.rb +5 -0
  52. data/app/models/helena/label.rb +18 -0
  53. data/app/models/helena/question.rb +63 -0
  54. data/app/models/helena/question_group.rb +18 -0
  55. data/app/models/helena/questions/checkbox_group.rb +17 -0
  56. data/app/models/helena/questions/long_text.rb +9 -0
  57. data/app/models/helena/questions/radio_group.rb +12 -0
  58. data/app/models/helena/questions/radio_matrix.rb +24 -0
  59. data/app/models/helena/questions/short_text.rb +9 -0
  60. data/app/models/helena/questions/static_text.rb +7 -0
  61. data/app/models/helena/session.rb +76 -0
  62. data/app/models/helena/string_answer.rb +5 -0
  63. data/app/models/helena/sub_question.rb +27 -0
  64. data/app/models/helena/survey.rb +29 -0
  65. data/app/models/helena/survey_detail.rb +10 -0
  66. data/app/models/helena/version.rb +33 -0
  67. data/app/views/helena/admin/question_groups/_form.html.haml +3 -0
  68. data/app/views/helena/admin/question_groups/edit.html.haml +3 -0
  69. data/app/views/helena/admin/question_groups/index.html.haml +41 -0
  70. data/app/views/helena/admin/question_groups/new.html.haml +3 -0
  71. data/app/views/helena/admin/questions/_form.html.haml +15 -0
  72. data/app/views/helena/admin/questions/_labels.html.haml +24 -0
  73. data/app/views/helena/admin/questions/_sub_questions.html.haml +32 -0
  74. data/app/views/helena/admin/questions/edit.html.haml +3 -0
  75. data/app/views/helena/admin/questions/index.html.haml +49 -0
  76. data/app/views/helena/admin/questions/new.html.haml +3 -0
  77. data/app/views/helena/admin/sessions/index.html.haml +46 -0
  78. data/app/views/helena/admin/surveys/_form.html.haml +10 -0
  79. data/app/views/helena/admin/surveys/edit.html.haml +5 -0
  80. data/app/views/helena/admin/surveys/index.html.haml +35 -0
  81. data/app/views/helena/admin/surveys/new.html.haml +3 -0
  82. data/app/views/helena/admin/versions/_form.html.haml +5 -0
  83. data/app/views/helena/admin/versions/default_session_report.html.haml +17 -0
  84. data/app/views/helena/admin/versions/edit.html.haml +3 -0
  85. data/app/views/helena/admin/versions/index.html.haml +35 -0
  86. data/app/views/helena/admin/versions/new.html.haml +3 -0
  87. data/app/views/helena/questions/_checkbox_group.html.haml +17 -0
  88. data/app/views/helena/questions/_long_text.html.haml +8 -0
  89. data/app/views/helena/questions/_radio_group.html.haml +13 -0
  90. data/app/views/helena/questions/_radio_matrix.html.haml +27 -0
  91. data/app/views/helena/questions/_short_text.html.haml +8 -0
  92. data/app/views/helena/sessions/edit.html.haml +16 -0
  93. data/app/views/helena/sessions/end_message.html.haml +5 -0
  94. data/app/views/helena/surveys/_survey.html.haml +3 -0
  95. data/app/views/helena/surveys/index.html.haml +2 -0
  96. data/bin/rails +8 -0
  97. data/config/i18n-tasks.yml +3 -0
  98. data/config/initializers/simple_form.rb +162 -0
  99. data/config/initializers/simple_form_bootstrap.rb +132 -0
  100. data/config/locales/en.yml +20 -0
  101. data/config/locales/models/label/en.yml +14 -0
  102. data/config/locales/models/question/en.yml +47 -0
  103. data/config/locales/models/question_group/en.yml +11 -0
  104. data/config/locales/models/session/en.yml +10 -0
  105. data/config/locales/models/sub_question/en.yml +14 -0
  106. data/config/locales/models/survey/en.yml +6 -0
  107. data/config/locales/models/version/en.yml +12 -0
  108. data/config/locales/simple_form.en.yml +26 -0
  109. data/config/locales/views/admin/question_groups/en.yml +12 -0
  110. data/config/locales/views/admin/questions/en.yml +16 -0
  111. data/config/locales/views/admin/sessions/en.yml +11 -0
  112. data/config/locales/views/admin/surveys/en.yml +10 -0
  113. data/config/locales/views/admin/versions/en.yml +8 -0
  114. data/config/locales/views/sessions/en.yml +9 -0
  115. data/config/routes.rb +28 -0
  116. data/db/seeds.rb +182 -0
  117. data/gpl-3.0.txt +674 -0
  118. data/helena.gemspec +40 -0
  119. data/lib/helena/engine.rb +6 -0
  120. data/lib/helena/version.rb +3 -0
  121. data/lib/helena/version_publisher.rb +16 -0
  122. data/lib/helena.rb +10 -0
  123. data/lib/tasks/helena_tasks.rake +4 -0
  124. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  125. data/spec/controllers/helena/admin/question_group_controller_spec.rb +59 -0
  126. data/spec/controllers/helena/admin/questions_controller_spec.rb +60 -0
  127. data/spec/controllers/helena/admin/sessions_controller_spec.rb +84 -0
  128. data/spec/controllers/helena/admin/survey_controller_spec.rb +89 -0
  129. data/spec/controllers/helena/admin/versions_controller_spec.rb +19 -0
  130. data/spec/controllers/helena/application_controller_spec.rb +15 -0
  131. data/spec/controllers/helena/sessions_controller_spec.rb +24 -0
  132. data/spec/dummy/README.rdoc +28 -0
  133. data/spec/dummy/Rakefile +6 -0
  134. data/spec/dummy/app/assets/images/.keep +0 -0
  135. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  136. data/spec/dummy/app/controllers/application_controller.rb +9 -0
  137. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  138. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  139. data/spec/dummy/app/mailers/.keep +0 -0
  140. data/spec/dummy/app/models/.keep +0 -0
  141. data/spec/dummy/app/models/concerns/.keep +0 -0
  142. data/spec/dummy/app/views/layouts/application.html.haml +24 -0
  143. data/spec/dummy/bin/bundle +3 -0
  144. data/spec/dummy/bin/rails +4 -0
  145. data/spec/dummy/bin/rake +4 -0
  146. data/spec/dummy/config/application.rb +27 -0
  147. data/spec/dummy/config/boot.rb +5 -0
  148. data/spec/dummy/config/environment.rb +5 -0
  149. data/spec/dummy/config/environments/development.rb +29 -0
  150. data/spec/dummy/config/environments/production.rb +80 -0
  151. data/spec/dummy/config/environments/test.rb +36 -0
  152. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  153. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  154. data/spec/dummy/config/initializers/session_store.rb +3 -0
  155. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  156. data/spec/dummy/config/locales/en.yml +23 -0
  157. data/spec/dummy/config/mongoid.yml +14 -0
  158. data/spec/dummy/config/routes.rb +4 -0
  159. data/spec/dummy/config.ru +4 -0
  160. data/spec/dummy/db/seeds.rb +1 -0
  161. data/spec/dummy/lib/assets/.keep +0 -0
  162. data/spec/dummy/log/.keep +0 -0
  163. data/spec/dummy/public/404.html +58 -0
  164. data/spec/dummy/public/422.html +58 -0
  165. data/spec/dummy/public/500.html +57 -0
  166. data/spec/dummy/public/favicon.ico +0 -0
  167. data/spec/factories/helena/answers.rb +24 -0
  168. data/spec/factories/helena/labels.rb +7 -0
  169. data/spec/factories/helena/question_groups.rb +6 -0
  170. data/spec/factories/helena/questions.rb +14 -0
  171. data/spec/factories/helena/sessions.rb +9 -0
  172. data/spec/factories/helena/sub_questions.rb +7 -0
  173. data/spec/factories/helena/survey_details.rb +6 -0
  174. data/spec/factories/helena/surveys.rb +7 -0
  175. data/spec/factories/helena/versions.rb +11 -0
  176. data/spec/features/helena/admin/manage_question_group_spec.rb +101 -0
  177. data/spec/features/helena/admin/manage_question_spec.rb +105 -0
  178. data/spec/features/helena/admin/manage_session_spec.rb +40 -0
  179. data/spec/features/helena/admin/manage_survey_spec.rb +141 -0
  180. data/spec/features/helena/admin/manage_version_spec.rb +74 -0
  181. data/spec/features/helena/admin/question_types/manage_checkbox_group_question_spec.rb +55 -0
  182. data/spec/features/helena/admin/question_types/manage_long_text_question_spec.rb +21 -0
  183. data/spec/features/helena/admin/question_types/manage_radio_group_question_spec.rb +59 -0
  184. data/spec/features/helena/admin/question_types/manage_radio_matrix_question_spec.rb +80 -0
  185. data/spec/features/helena/admin/question_types/manage_short_text_question_spec.rb +19 -0
  186. data/spec/features/helena/admin/question_types/manage_static_text_question_spec.rb +17 -0
  187. data/spec/features/helena/manage_session_spec.rb +284 -0
  188. data/spec/features/helena/manage_survey_spec.rb +24 -0
  189. data/spec/lib/version_publisher_spec.rb +26 -0
  190. data/spec/models/helena/answer_spec.rb +53 -0
  191. data/spec/models/helena/label_spec.rb +13 -0
  192. data/spec/models/helena/question_group_spec.rb +11 -0
  193. data/spec/models/helena/question_spec.rb +21 -0
  194. data/spec/models/helena/questions/radio_group_spec.rb +32 -0
  195. data/spec/models/helena/questions/radio_matrix_spec.rb +32 -0
  196. data/spec/models/helena/questions/short_text_spec.rb +10 -0
  197. data/spec/models/helena/session_spec.rb +20 -0
  198. data/spec/models/helena/sub_question_spec.rb +28 -0
  199. data/spec/models/helena/survey_spec.rb +14 -0
  200. data/spec/models/helena/version_spec.rb +15 -0
  201. data/spec/spec_helper.rb +43 -0
  202. metadata +485 -0
data/helena.gemspec ADDED
@@ -0,0 +1,40 @@
1
+ $:.push File.expand_path('../lib', __FILE__)
2
+
3
+ # Maintain your gem's version:
4
+ require 'helena/version'
5
+
6
+ # Describe your gem and declare its dependencies:
7
+ Gem::Specification.new do |s|
8
+ s.name = 'helena'
9
+ s.version = Helena::VERSION
10
+ s.authors = ['Markus Graf']
11
+ s.email = ['info@markusgraf.ch']
12
+ s.licenses = ['GPL-3']
13
+ s.homepage = 'https://github.com/gurix/helena'
14
+ s.summary = 'Helena is an online survey/test framework designed for agile
15
+ survey/test development, longitudinal studies and instant feedback.'
16
+ s.description = 'Helena is an online survey/test framework designed for agile
17
+ survey/test development, longitudinal studies and instant feedback.'
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
21
+
22
+ s.add_dependency 'rails', '~> 4.1'
23
+ s.add_dependency 'mongoid', '~> 4.0.0.rc2'
24
+ s.add_dependency 'mongoid_orderable', '~> 4.1'
25
+ s.add_dependency 'mongoid-simple-tags', '~> 0.1'
26
+ s.add_dependency 'haml-rails', '~> 0.5'
27
+ s.add_dependency 'jquery-rails', '~> 3.1'
28
+ s.add_dependency 'sass-rails', '~> 4.0.3' # version needed here http://stackoverflow.com/questions/22392862/undefined-method-environment-for-nilnilclass-when-importing-bootstrap
29
+ s.add_dependency 'bootstrap-sass', '~> 3.2'
30
+ s.add_dependency 'simple_form', '~> 3.1.0.rc2'
31
+ s.add_dependency 'breadcrumbs_on_rails', '~> 2.3'
32
+ s.add_dependency 'rails-i18n', '~> 4.0'
33
+
34
+ s.add_development_dependency 'rspec-rails', '~> 3'
35
+ s.add_development_dependency 'rspec-collection_matchers', '~> 1'
36
+ s.add_development_dependency 'factory_girl_rails', '~> 4.4'
37
+ s.add_development_dependency 'database_cleaner', '~> 1.3'
38
+ s.add_development_dependency 'ffaker', '~> 1.23'
39
+ s.add_development_dependency 'capybara', '~> 2.3'
40
+ end
@@ -0,0 +1,6 @@
1
+ module Helena
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Helena
4
+ config.i18n.load_path += Dir[config.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module Helena
2
+ VERSION = '0.3.3'
3
+ end
@@ -0,0 +1,16 @@
1
+ module Helena
2
+ class VersionPublisher
3
+ def self.publish(version)
4
+ copied_version = version.dup
5
+ copied_version.survey = version.survey
6
+ copied_version.version = newest_version_of(version.survey) + 1
7
+ copied_version.created_at = DateTime.now
8
+ copied_version.updated_at = DateTime.now
9
+ copied_version
10
+ end
11
+
12
+ def self.newest_version_of(survey)
13
+ survey.newest_version.version
14
+ end
15
+ end
16
+ end
data/lib/helena.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'helena/engine'
2
+ require 'haml'
3
+ require 'helena/version_publisher'
4
+ require 'mongoid'
5
+ require 'mongoid_orderable'
6
+ require 'mongoid-simple-tags'
7
+ require 'csv'
8
+
9
+ module Helena
10
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :helena do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,13 @@
1
+ <%%= simple_form_for(@<%= singular_table_name %>) do |f| %>
2
+ <%%= f.error_notification %>
3
+
4
+ <div class="form-inputs">
5
+ <%- attributes.each do |attribute| -%>
6
+ <%%= f.<%= attribute.reference? ? :association : :input %> :<%= attribute.name %> %>
7
+ <%- end -%>
8
+ </div>
9
+
10
+ <div class="form-actions">
11
+ <%%= f.button :submit %>
12
+ </div>
13
+ <%% end %>
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe Helena::Admin::QuestionGroupsController do
4
+ routes { Helena::Engine.routes }
5
+
6
+ let!(:survey) { create :survey }
7
+ let!(:draft_version) { create :version, version: 0, survey: survey }
8
+ let!(:first_question_group) { create :question_group, position: 1, version: draft_version }
9
+ let!(:second_question_group) { create :question_group, position: 2, version: draft_version }
10
+ let!(:third_question_group) { create :question_group, position: 3, version: draft_version }
11
+
12
+ it 'moves a question group down with resort' do
13
+ patch :move_down, survey_id: survey, id: first_question_group
14
+
15
+ expect(first_question_group.reload.position).to eq 2
16
+ expect(second_question_group.reload.position).to eq 1
17
+ expect(third_question_group.reload.position).to eq 3
18
+ end
19
+
20
+ it 'moves a question group up with resort' do
21
+ patch :move_up, survey_id: survey, id: third_question_group
22
+
23
+ expect(first_question_group.reload.position).to eq 1
24
+ expect(second_question_group.reload.position).to eq 3
25
+ expect(third_question_group.reload.position).to eq 2
26
+ end
27
+
28
+ it 'does not moves a question group down when already the first with resort' do
29
+ patch :move_down, survey_id: survey, id: third_question_group
30
+
31
+ expect(first_question_group.reload.position).to eq 1
32
+ expect(second_question_group.reload.position).to eq 2
33
+ expect(third_question_group.reload.position).to eq 3
34
+ end
35
+
36
+ it 'does not moves a question group up when already the first with resort' do
37
+ patch :move_up, survey_id: survey, id: first_question_group
38
+
39
+ expect(first_question_group.reload.position).to eq 1
40
+ expect(second_question_group.reload.position).to eq 2
41
+ expect(third_question_group.reload.position).to eq 3
42
+ end
43
+
44
+ it 'resort after deleting a question group' do
45
+ delete :destroy, survey_id: survey, id: first_question_group
46
+ # Note: first is destroyed, the others moving along so second_question_group becomes first_question_group and so on.
47
+ expect(first_question_group.reload.position).to eq 1
48
+ expect(second_question_group.reload.position).to eq 2
49
+ end
50
+
51
+ it 'counts position up when creating a new survey' do
52
+ post :create, survey_id: survey, question_group: { title: 'something' }
53
+
54
+ expect(first_question_group.reload.position).to eq 1
55
+ expect(second_question_group.reload.position).to eq 2
56
+ expect(third_question_group.reload.position).to eq 3
57
+ expect(draft_version.reload.question_groups.last.position).to eq 4
58
+ end
59
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe Helena::Admin::QuestionsController do
4
+ routes { Helena::Engine.routes }
5
+
6
+ let(:survey) { create :survey }
7
+ let(:draft_version) { create :version, survey: survey, version: 0 }
8
+ let(:question_group) { create :question_group, version: draft_version }
9
+ let!(:first_question) { create :question, position: 1, question_group: question_group }
10
+ let!(:second_question) { create :question, position: 2, question_group: question_group }
11
+ let!(:third_question) { create :question, position: 3, question_group: question_group }
12
+
13
+ it 'moves a question down with resort' do
14
+ patch :move_down, survey_id: survey, question_group_id: question_group, id: first_question
15
+
16
+ expect(first_question.reload.position).to eq 2
17
+ expect(second_question.reload.position).to eq 1
18
+ expect(third_question.reload.position).to eq 3
19
+ end
20
+
21
+ it 'moves a question up with resort' do
22
+ patch :move_up, survey_id: survey, question_group_id: question_group, id: third_question
23
+
24
+ expect(first_question.reload.position).to eq 1
25
+ expect(second_question.reload.position).to eq 3
26
+ expect(third_question.reload.position).to eq 2
27
+ end
28
+
29
+ it 'does not moves a question down when already the first with resort' do
30
+ patch :move_down, survey_id: survey, question_group_id: question_group, id: third_question
31
+
32
+ expect(first_question.reload.position).to eq 1
33
+ expect(second_question.reload.position).to eq 2
34
+ expect(third_question.reload.position).to eq 3
35
+ end
36
+
37
+ it 'does not moves a question up when already the first with resort' do
38
+ patch :move_up, survey_id: survey, question_group_id: question_group, id: first_question
39
+
40
+ expect(first_question.reload.position).to eq 1
41
+ expect(second_question.reload.position).to eq 2
42
+ expect(third_question.reload.position).to eq 3
43
+ end
44
+
45
+ it 'resort after deleting a question' do
46
+ delete :destroy, survey_id: survey, question_group_id: question_group, id: first_question
47
+ # Note: first is destroyed, the others moving along so second_question_group becomes first_question_group and so on.
48
+ expect(first_question.reload.position).to eq 1
49
+ expect(second_question.reload.position).to eq 2
50
+ end
51
+
52
+ it 'counts position up when creating a new survey' do
53
+ post :create, survey_id: survey, question_group_id: question_group, question: { question_text: 'something?', code: 'a38' }
54
+
55
+ expect(first_question.reload.position).to eq 1
56
+ expect(second_question.reload.position).to eq 2
57
+ expect(third_question.reload.position).to eq 3
58
+ expect(question_group.reload.questions.last.position).to eq 4
59
+ end
60
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe Helena::Admin::SessionsController do
4
+ routes { Helena::Engine.routes }
5
+
6
+ let(:survey) { create :survey }
7
+
8
+ context 'without authorization' do
9
+ before { allow_any_instance_of(ApplicationController).to receive(:can_administer?).and_return false }
10
+
11
+ specify 'trying to list surveys throws an error' do
12
+ expect { get :index, survey_id: survey }.to raise_error(ActionController::RoutingError, 'Access Denied')
13
+ end
14
+
15
+ specify 'trying to export surveys as json throws an error' do
16
+ expect { get :index, survey_id: survey, format: :json }.to raise_error(ActionController::RoutingError, 'Access Denied')
17
+ end
18
+
19
+ specify 'trying to export surveys as csv throws an error' do
20
+ expect { get :index, survey_id: survey, format: :csv }.to raise_error(ActionController::RoutingError, 'Access Denied')
21
+ end
22
+ end
23
+
24
+ context 'with authorization' do
25
+ before do
26
+ create :session, survey: survey, answers: [
27
+ build(:string_answer, code: 'string_answer_1', value: 'abc'),
28
+ build(:integer_answer, code: 'integer_answer_1', value: '123')
29
+ ]
30
+ create :session, survey: survey, answers: [
31
+ build(:string_answer, code: 'string_answer_2', value: 'def, xyz'),
32
+ build(:integer_answer, code: 'integer_answer_2', value: '456')
33
+ ]
34
+ end
35
+
36
+ it 'return json result of all sessions' do
37
+ get :index, survey_id: survey, format: :json
38
+
39
+ first_result = ActiveSupport::JSON.decode(response.body).first
40
+
41
+ expect(first_result['answers'].first['code']).to eq 'string_answer_2'
42
+ expect(first_result['answers'].first['value']).to eq 'def, xyz'
43
+ expect(first_result['answers'].last['code']).to eq 'integer_answer_2'
44
+ expect(first_result['answers'].last['value']).to eq 456
45
+
46
+ last_result = ActiveSupport::JSON.decode(response.body).last
47
+
48
+ expect(last_result['answers'].first['code']).to eq 'string_answer_1'
49
+ expect(last_result['answers'].first['value']).to eq 'abc'
50
+ expect(last_result['answers'].last['code']).to eq 'integer_answer_1'
51
+ expect(last_result['answers'].last['value']).to eq 123
52
+ end
53
+
54
+ it 'return csv result of all sessions' do
55
+ get :index, survey_id: survey, format: :csv
56
+
57
+ csv = CSV.parse(response.body)
58
+ %w(string_answer_2 integer_answer_2 string_answer_1 integer_answer_1).each do |code|
59
+ expect(csv.first).to include code
60
+ end
61
+
62
+ ['456', 'def, xyz'].each do |value|
63
+ expect(csv[1]).to include value
64
+ end
65
+
66
+ %w(123 abc).each do |value|
67
+ expect(csv[2]).to include value
68
+ end
69
+ end
70
+
71
+ specify 'csv header for all sessions does not allow same column names for answers and session fields' do
72
+ create :session, survey: survey, answers: [
73
+ build(:boolean_answer, code: 'completed', value: true),
74
+ build(:string_answer, code: 'token', value: 'abcdefghijklmnopqrstuvwxyz')
75
+ ]
76
+ get :index, survey_id: survey, format: :csv
77
+
78
+ csv = CSV.parse(response.body)
79
+ %w(answer_token answer_completed).each do |code|
80
+ expect(csv.first).to include code
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ describe Helena::Admin::SurveysController do
4
+ routes { Helena::Engine.routes }
5
+
6
+ context 'without authorization' do
7
+ before { allow_any_instance_of(ApplicationController).to receive(:can_administer?).and_return false }
8
+
9
+ specify 'trying to list surveys throws an error' do
10
+ expect { get :index }.to raise_error(ActionController::RoutingError, 'Access Denied')
11
+ end
12
+
13
+ specify 'trying to edit a survey throws an error' do
14
+ survey = create :survey
15
+ expect { get :edit, id: survey }.to raise_error(ActionController::RoutingError, 'Access Denied')
16
+ end
17
+
18
+ specify 'trying to update a survey throws an error' do
19
+ survey = create :survey
20
+ expect { patch :update, id: survey }.to raise_error(ActionController::RoutingError, 'Access Denied')
21
+ end
22
+
23
+ specify 'trying to delete a survey throws an error' do
24
+ survey = create :survey
25
+ expect { delete :destroy, id: survey }.to raise_error(ActionController::RoutingError, 'Access Denied')
26
+ end
27
+
28
+ specify 'trying to add a survey throws an error' do
29
+ expect { get :new }.to raise_error(ActionController::RoutingError, 'Access Denied')
30
+ end
31
+
32
+ specify 'trying to create a survey throws an error' do
33
+ expect { post :create, some: :data }.to raise_error(ActionController::RoutingError, 'Access Denied')
34
+ end
35
+ end
36
+
37
+ context 'with authorization' do
38
+ let!(:first_survey) { create :survey, position: 1, versions: [build(:base_version)] }
39
+ let!(:second_survey) { create :survey, position: 2, versions: [build(:base_version)] }
40
+ let!(:third_survey) { create :survey, position: 3, versions: [build(:base_version)] }
41
+
42
+ it 'moves a question group down with resort' do
43
+ patch :move_down, id: first_survey
44
+ expect(first_survey.reload.position).to eq 2
45
+ expect(second_survey.reload.position).to eq 1
46
+ expect(third_survey.reload.position).to eq 3
47
+ end
48
+
49
+ it 'moves a question group up with resort' do
50
+ patch :move_up, id: third_survey
51
+
52
+ expect(first_survey.reload.position).to eq 1
53
+ expect(second_survey.reload.position).to eq 3
54
+ expect(third_survey.reload.position).to eq 2
55
+ end
56
+
57
+ it 'does not moves a question group down when already the first with resort' do
58
+ patch :move_down, id: third_survey
59
+
60
+ expect(first_survey.reload.position).to eq 1
61
+ expect(second_survey.reload.position).to eq 2
62
+ expect(third_survey.reload.position).to eq 3
63
+ end
64
+
65
+ it 'does not moves a question group up when already the first with resort' do
66
+ patch :move_up, id: first_survey
67
+
68
+ expect(first_survey.reload.position).to eq 1
69
+ expect(second_survey.reload.position).to eq 2
70
+ expect(third_survey.reload.position).to eq 3
71
+ end
72
+
73
+ it 'resorts after deleting a question group' do
74
+ delete :destroy, id: first_survey
75
+
76
+ expect(second_survey.reload.position).to eq 1
77
+ expect(third_survey.reload.position).to eq 2
78
+ end
79
+
80
+ it 'counts position up when creating a new survey' do
81
+ post :create, survey: { name: 'New Survey', language: 'en' }
82
+
83
+ expect(first_survey.reload.position).to eq 1
84
+ expect(second_survey.reload.position).to eq 2
85
+ expect(third_survey.reload.position).to eq 3
86
+ expect(Helena::Survey.find_by(name: 'New Survey').position).to eq 4
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Helena::Admin::VersionsController do
4
+ routes { Helena::Engine.routes }
5
+
6
+ let(:survey) { create :survey }
7
+ let(:baseversion) { survey.versions.create version: 0 }
8
+
9
+ context 'with authorization' do
10
+ it 'deleting a version deletes also the associated sessions' do
11
+ published_version = Helena::VersionPublisher.publish baseversion
12
+ published_version.save
13
+
14
+ create :session, survey: survey, version: published_version
15
+
16
+ expect { delete :destroy, survey_id: survey, id: published_version }.to change { Helena::Session.count }.by(-1)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Helena::ApplicationController do
4
+ describe '.add_breadcrumb' do
5
+ it 'names an empty element "Untitled"' do
6
+ application_controller = Helena::ApplicationController.new
7
+
8
+ application_controller.add_breadcrumb('')
9
+ breadcrumbs = application_controller.add_breadcrumb(nil)
10
+
11
+ expect(breadcrumbs.first.name).to eq 'Untitled'
12
+ expect(breadcrumbs.last.name).to eq 'Untitled'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe Helena::SessionsController do
4
+ routes { Helena::Engine.routes }
5
+
6
+ let(:survey) { create :survey }
7
+ let(:session) do
8
+ baseversion = survey.versions.create version: 0
9
+ version = Helena::VersionPublisher.publish(baseversion)
10
+ version.save
11
+ create :session, survey: survey, version: version, answers: [
12
+ build(:string_answer, code: 'string_answer_1', value: 'abc'),
13
+ build(:integer_answer, code: 'integer_answer_1', value: '123')
14
+ ]
15
+ end
16
+
17
+ it 'return json result of the current session' do
18
+ get :show, token: session.view_token, format: :json
19
+
20
+ result = ActiveSupport::JSON.decode(response.body)
21
+ expect(result['answer']['string_answer_1']).to eq 'abc'
22
+ expect(result['answer']['integer_answer_1']).to eq 123
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ == README
2
+
3
+ This README would normally document whatever steps are necessary to get the
4
+ application up and running.
5
+
6
+ Things you may want to cover:
7
+
8
+ * Ruby version
9
+
10
+ * System dependencies
11
+
12
+ * Configuration
13
+
14
+ * Database creation
15
+
16
+ * Database initialization
17
+
18
+ * How to run the test suite
19
+
20
+ * Services (job queues, cache servers, search engines, etc.)
21
+
22
+ * Deployment instructions
23
+
24
+ * ...
25
+
26
+
27
+ Please feel free to use a different markup language if you do not plan to run
28
+ <tt>rake doc:app</tt>.
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require File.expand_path('../config/application', __FILE__)
5
+
6
+ Dummy::Application.load_tasks
File without changes
@@ -0,0 +1,13 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,9 @@
1
+ class ApplicationController < ActionController::Base
2
+ # Prevent CSRF attacks by raising an exception.
3
+ # For APIs, you may want to use :null_session instead.
4
+ protect_from_forgery with: :exception
5
+
6
+ def can_administer?
7
+ true
8
+ end
9
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
File without changes
File without changes
File without changes
@@ -0,0 +1,24 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title= strip_tags(render_breadcrumbs separator: '/')
5
+ = stylesheet_link_tag 'helena/application', media: 'all'
6
+ = javascript_include_tag 'helena/application'
7
+ %meta{ name: 'viewport', content: 'initial-scale=1.0' }
8
+ = csrf_meta_tags
9
+
10
+ %body
11
+ .container
12
+ - flash.each do |name, messages|
13
+ %div{class: "alert alert-#{name == 'notice' ? 'success' : 'danger'}"}
14
+ - if messages.is_a?(String)
15
+ = messages
16
+ - else
17
+ %ul
18
+ - messages.each do |message|
19
+ %li= message
20
+ %h1.hidden
21
+ Helena
22
+ %ol.breadcrumb
23
+ = render_breadcrumbs tag: :li, separator: ''
24
+ = yield
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../config/boot'
3
+ require 'rake'
4
+ Rake.application.run
@@ -0,0 +1,27 @@
1
+ require File.expand_path('../boot', __FILE__)
2
+
3
+ # Pick the frameworks you want:
4
+ require 'action_controller/railtie'
5
+ require 'action_mailer/railtie'
6
+ require 'sprockets/railtie'
7
+ require 'rails/mongoid'
8
+
9
+ Bundler.require(*Rails.groups)
10
+ require 'helena'
11
+
12
+ module Dummy
13
+ class Application < Rails::Application
14
+ # Settings in config/environments/* take precedence over those specified here.
15
+ # Application configuration should go into files in config/initializers
16
+ # -- all .rb files in that directory are automatically loaded.
17
+
18
+ # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
19
+ # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
20
+ # config.time_zone = 'Central Time (US & Canada)'
21
+
22
+ # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
23
+ # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
24
+ # config.i18n.default_locale = :de
25
+ config.i18n.enforce_available_locales = true
26
+ end
27
+ end
@@ -0,0 +1,5 @@
1
+ # Set up gems listed in the Gemfile.
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
3
+
4
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
5
+ $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require File.expand_path('../application', __FILE__)
3
+
4
+ # Initialize the Rails application.
5
+ Dummy::Application.initialize!
@@ -0,0 +1,29 @@
1
+ Dummy::Application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # In the development environment your application's code is reloaded on
5
+ # every request. This slows down response time but is perfect for development
6
+ # since you don't have to restart the web server when you make code changes.
7
+ config.cache_classes = false
8
+
9
+ # Do not eager load code on boot.
10
+ config.eager_load = false
11
+
12
+ # Show full error reports and disable caching.
13
+ config.consider_all_requests_local = true
14
+ config.action_controller.perform_caching = false
15
+
16
+ # Don't care if the mailer can't send.
17
+ config.action_mailer.raise_delivery_errors = false
18
+
19
+ # Print deprecation notices to the Rails logger.
20
+ config.active_support.deprecation = :log
21
+
22
+ # Raise an error on page load if there are pending migrations
23
+ # config.active_record.migration_error = :page_load
24
+
25
+ # Debug mode disables concatenation and preprocessing of assets.
26
+ # This option may cause significant delays in view rendering with a large
27
+ # number of complex assets.
28
+ config.assets.debug = true
29
+ end