fe 0.0.4 → 1.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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +16 -36
  3. data/app/assets/javascripts/fe/admin.js +0 -1
  4. data/app/assets/javascripts/fe/fe.admin.js +40 -16
  5. data/app/assets/javascripts/fe/fe.common.js +48 -14
  6. data/app/assets/javascripts/fe/fe.public.js +1 -414
  7. data/app/assets/javascripts/fe/fe.public.nojquery.js +450 -0
  8. data/app/assets/javascripts/fe/jquery.validate.pack.js +3 -15
  9. data/app/assets/stylesheets/360front.css +0 -0
  10. data/app/assets/stylesheets/fe/fe.screen.css.scss.erb +69 -10
  11. data/app/controllers/fe/admin/elements_controller.rb +64 -48
  12. data/app/controllers/fe/admin/email_templates_controller.rb +2 -2
  13. data/app/controllers/fe/admin/question_pages_controller.rb +1 -1
  14. data/app/controllers/fe/admin/question_sheets_controller.rb +2 -103
  15. data/app/controllers/fe/concerns/admin/question_sheets_controller_concern.rb +112 -0
  16. data/app/controllers/fe/concerns/answer_pages_controller_concern.rb +2 -1
  17. data/app/controllers/fe/concerns/answer_sheets_controller_concern.rb +1 -1
  18. data/app/controllers/fe/concerns/application_controller_concern.rb +13 -0
  19. data/app/controllers/fe/reference_sheets_controller.rb +2 -0
  20. data/app/controllers/fe/references_controller.rb +1 -0
  21. data/app/helpers/fe/application_helper.rb +5 -0
  22. data/app/mailers/fe/notifier.rb +11 -4
  23. data/app/models/answer_sheet.rb +2 -0
  24. data/app/models/fe/application.rb +2 -1
  25. data/app/models/fe/concerns/answer_pages_presenter_concern.rb +10 -1
  26. data/app/models/fe/concerns/answer_sheet_concern.rb +38 -8
  27. data/app/models/fe/concerns/choice_field_concern.rb +17 -10
  28. data/app/models/fe/date_field.rb +1 -1
  29. data/app/models/fe/element.rb +105 -31
  30. data/app/models/fe/page.rb +52 -20
  31. data/app/models/fe/page_element.rb +6 -1
  32. data/app/models/fe/page_link.rb +6 -3
  33. data/app/models/fe/person.rb +11 -8
  34. data/app/models/fe/question.rb +2 -6
  35. data/app/models/fe/question_grid.rb +1 -1
  36. data/app/models/fe/question_grid_with_total.rb +15 -0
  37. data/app/models/fe/question_set.rb +1 -1
  38. data/app/models/fe/question_sheet.rb +15 -13
  39. data/app/models/fe/reference_question.rb +0 -10
  40. data/app/models/fe/reference_sheet.rb +17 -13
  41. data/app/models/staff.rb +2 -0
  42. data/app/validators/email_validator.rb +11 -0
  43. data/app/views/fe/admin/elements/create.js.erb +1 -0
  44. data/app/views/fe/admin/elements/drop.js.erb +1 -0
  45. data/app/views/fe/admin/elements/duplicate.js.erb +1 -0
  46. data/app/views/fe/admin/panels/_advanced_options.html.erb +9 -3
  47. data/app/views/fe/admin/panels/_common_fields.html.erb +19 -5
  48. data/app/views/fe/admin/panels/_page.html.erb +1 -1
  49. data/app/views/fe/admin/panels/_prop_choice_field.html.erb +20 -11
  50. data/app/views/fe/admin/panels/_prop_element.html.erb +2 -9
  51. data/app/views/fe/admin/panels/_prop_page.html.erb +8 -3
  52. data/app/views/fe/admin/panels/_prop_paragraph.html.erb +38 -24
  53. data/app/views/fe/admin/panels/_prop_section.html.erb +8 -2
  54. data/app/views/fe/admin/panels/_prop_sheet.html.erb +4 -1
  55. data/app/views/fe/admin/question_pages/_element.html.erb +11 -1
  56. data/app/views/fe/answer_pages/_answer_page.html.erb +9 -8
  57. data/app/views/fe/answer_pages/_element.html.erb +6 -7
  58. data/app/views/fe/answer_pages/_page_name.html.erb +1 -0
  59. data/app/views/fe/answer_pages/update.js.erb +3 -3
  60. data/app/views/fe/answer_sheets/_answer_sheet.html.erb +3 -3
  61. data/app/views/fe/answer_sheets/_element.html.erb +52 -34
  62. data/app/views/fe/answer_sheets/_incomplete.html.erb +1 -1
  63. data/app/views/fe/answer_sheets/_page_link.html.erb +2 -2
  64. data/app/views/fe/answer_sheets/_pages_list.html.erb +3 -3
  65. data/app/views/fe/answer_sheets/_submit_to.html.erb +1 -0
  66. data/app/views/fe/answer_sheets/edit.html.erb +14 -14
  67. data/app/views/fe/answer_sheets/incomplete.js.erb +3 -0
  68. data/app/views/fe/answer_sheets/index.html.erb +3 -3
  69. data/app/views/fe/answer_sheets/show.html.erb +1 -1
  70. data/app/views/fe/applications/_logout.html.erb +1 -0
  71. data/app/views/fe/applications/show.html.erb +1 -0
  72. data/app/views/fe/questions/fe/_acceptance.html.erb +3 -3
  73. data/app/views/fe/questions/fe/_attachment_field.html.erb +7 -3
  74. data/app/views/fe/questions/fe/_checkbox_field.html.erb +26 -24
  75. data/app/views/fe/questions/fe/_date_field.html.erb +1 -2
  76. data/app/views/fe/questions/fe/_date_field_mmyy.html.erb +2 -2
  77. data/app/views/fe/questions/fe/_drop_down_field.html.erb +3 -2
  78. data/app/views/fe/questions/fe/_paragraph.html.erb +1 -1
  79. data/app/views/fe/questions/fe/_question_grid.html.erb +14 -9
  80. data/app/views/fe/questions/fe/_question_grid_with_total.html.erb +21 -14
  81. data/app/views/fe/questions/fe/_questions.html.erb +2 -2
  82. data/app/views/fe/questions/fe/_radio_button_field.html.erb +12 -11
  83. data/app/views/fe/questions/fe/_rating.html.erb +9 -8
  84. data/app/views/fe/questions/fe/_reference_discipler.html.erb +1 -1
  85. data/app/views/fe/questions/fe/_reference_friend.html.erb +1 -1
  86. data/app/views/fe/questions/fe/_reference_parent.html.erb +1 -1
  87. data/app/views/fe/questions/fe/_reference_peer.html.erb +1 -1
  88. data/app/views/fe/questions/fe/_reference_question.html.erb +22 -15
  89. data/app/views/fe/questions/fe/_reference_roommate.html.erb +1 -1
  90. data/app/views/fe/questions/fe/_reference_spiritual.html.erb +1 -1
  91. data/app/views/fe/questions/fe/_reference_staff.html.erb +1 -1
  92. data/app/views/fe/questions/fe/_section.html.erb +1 -1
  93. data/app/views/fe/questions/fe/_text_area_field.html.erb +10 -3
  94. data/app/views/fe/questions/fe/_text_field.html.erb +1 -1
  95. data/app/views/fe/questions/fe/_yes_no_field.erb +3 -3
  96. data/app/views/fe/reference_pages/_reference.html.erb +11 -11
  97. data/app/views/fe/reference_pages/edit.html.erb +7 -7
  98. data/app/views/fe/reference_sheets/done.html.erb +2 -2
  99. data/app/views/fe/reference_sheets/not_found.html.erb +4 -4
  100. data/app/views/fe/references/edit.html.erb +6 -6
  101. data/app/views/fe/references/show.html.erb +7 -7
  102. data/app/views/fe/references/submit.js.erb +1 -1
  103. data/app/views/fe/submit_pages/_thankyou.html.erb +1 -1
  104. data/app/views/fe/submit_pages/edit.html.erb +9 -9
  105. data/app/views/layouts/fe/_error_messages_for.html.erb +7 -0
  106. data/app/views/layouts/fe/application.html.erb +1 -1
  107. data/config/routes.rb +0 -36
  108. data/db/migrate/20131003044250_create_reference_sheets.rb +1 -0
  109. data/db/migrate/20140623153424_create_fe_people.rb +1 -1
  110. data/db/migrate/20140624180246_create_fe_addresses.rb +1 -1
  111. data/db/migrate/20140624182216_create_fe_phone_numbers.rb +16 -0
  112. data/db/migrate/20140625160545_create_fe_users.rb +1 -1
  113. data/db/migrate/20150504221439_add_all_element_ids_to_pages.rb +5 -0
  114. data/db/migrate/20150713022326_add_locale_columns.rb +9 -0
  115. data/db/migrate/20150714220730_add_locale_to_answer_sheet.rb +5 -0
  116. data/db/migrate/20150928085325_change_pages_all_element_ids_to_text.rb +5 -0
  117. data/db/migrate/20150930191538_add_locale_to_reference_sheets.rb +5 -0
  118. data/lib/access_key_generator.rb +12 -0
  119. data/lib/distinct_distinct_patch.rb +20 -0
  120. data/lib/fe.rb +4 -0
  121. data/lib/fe/engine.rb +16 -4
  122. data/lib/fe/version.rb +1 -1
  123. data/spec/controllers/fe/admin/elements_controller_spec.rb +201 -1
  124. data/spec/controllers/fe/admin/email_templates_controller_spec.rb +26 -1
  125. data/spec/controllers/fe/admin/question_pages_controller_spec.rb +8 -1
  126. data/spec/controllers/fe/admin/question_sheets_controller_spec.rb +48 -1
  127. data/spec/controllers/fe/answer_pages_controller_spec.rb +73 -1
  128. data/spec/controllers/fe/answer_sheets_controller_spec.rb +80 -1
  129. data/spec/controllers/fe/reference_pages_controller.rb +4 -0
  130. data/spec/controllers/fe/references_controller_spec.rb +4 -0
  131. data/spec/controllers/fe/submit_pages_controller_spec.rb +4 -0
  132. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  133. data/spec/dummy/app/helpers/application_helper.rb +9 -0
  134. data/spec/dummy/app/models/application.rb +3 -0
  135. data/spec/dummy/app/models/person.rb +11 -0
  136. data/spec/dummy/app/models/user.rb +3 -0
  137. data/spec/dummy/config/application.rb +2 -1
  138. data/spec/dummy/config/database.yml +20 -17
  139. data/spec/dummy/config/environments/production.rb +1 -5
  140. data/spec/dummy/config/environments/test.rb +3 -1
  141. data/spec/dummy/config/initializers/fast_gettext.rb +5 -0
  142. data/spec/dummy/config/secrets.yml +2 -2
  143. data/spec/dummy/db/migrate/20141203214017_core.fe_engine.rb +92 -0
  144. data/spec/dummy/db/migrate/20141203214018_create_reference_sheets.fe_engine.rb +25 -0
  145. data/spec/dummy/db/migrate/20141203214019_add_element_and_answer_fields.fe_engine.rb +11 -0
  146. data/spec/dummy/db/migrate/20141203214020_create_email_templates.fe_engine.rb +18 -0
  147. data/spec/dummy/db/migrate/20141203214021_add_max_lengths.fe_engine.rb +9 -0
  148. data/spec/dummy/db/migrate/20141203214022_create_join_table.fe_engine.rb +12 -0
  149. data/spec/dummy/db/migrate/20141203214023_remove_question_id_from_element.fe_engine.rb +10 -0
  150. data/spec/dummy/db/migrate/20141203214024_create_fe_people.fe_engine.rb +13 -0
  151. data/spec/dummy/db/migrate/20141203214025_create_fe_addresses.fe_engine.rb +21 -0
  152. data/{db/migrate/20140624182216_create_create_fe_phone_numbers.rb → spec/dummy/db/migrate/20141203214026_create_create_fe_phone_numbers.fe_engine.rb} +1 -0
  153. data/spec/dummy/db/migrate/20141203214027_create_fe_users.fe_engine.rb +13 -0
  154. data/spec/dummy/db/migrate/20141203214028_add_conditional_type_to_elements.fe_engine.rb +6 -0
  155. data/spec/dummy/db/migrate/20141203214029_add_conditional_answer_to_elements.fe_engine.rb +6 -0
  156. data/spec/dummy/db/migrate/20141203214030_remove_short_value_column.fe_engine.rb +6 -0
  157. data/spec/dummy/db/migrate/20141203214031_move_conditional_ids_used_for_choice_field_to_their_own_column.fe_engine.rb +8 -0
  158. data/spec/dummy/db/migrate/20150123215803_create_users.rb +9 -0
  159. data/spec/dummy/db/migrate/20150504222619_add_all_element_ids_to_pages.fe_engine.rb +6 -0
  160. data/spec/dummy/db/migrate/20150930190001_create_fe_phone_numbers.fe_engine.rb +20 -0
  161. data/spec/dummy/db/migrate/20150930190002_add_locale_columns.fe_engine.rb +10 -0
  162. data/spec/dummy/db/migrate/20150930190003_add_locale_to_answer_sheet.fe_engine.rb +6 -0
  163. data/spec/dummy/db/migrate/20150930190004_change_pages_all_element_ids_to_text.fe_engine.rb +6 -0
  164. data/spec/dummy/db/migrate/20150930191756_add_locale_to_reference_sheets.fe_engine.rb +6 -0
  165. data/spec/dummy/db/schema.rb +50 -20
  166. data/spec/dummy/log/development.log +5 -0
  167. data/spec/factories/applications.rb +0 -1
  168. data/spec/factories/dummy_applications.rb +6 -0
  169. data/spec/factories/dummy_people.rb +6 -0
  170. data/spec/factories/dummy_users.rb +6 -0
  171. data/spec/factories/elements.rb +28 -3
  172. data/spec/factories/email_templates.rb +5 -0
  173. data/spec/factories/fe_email_templates.rb +9 -0
  174. data/spec/factories/fe_people.rb +0 -2
  175. data/spec/factories/fe_user.rb +6 -0
  176. data/spec/factories/question_sheet.rb +1 -1
  177. data/spec/factories/reference_sheets.rb +9 -0
  178. data/spec/mailers/fe/notifier_spec.rb +39 -0
  179. data/spec/models/fe/choice_field_spec.rb +20 -0
  180. data/spec/models/fe/element_spec.rb +185 -0
  181. data/spec/models/fe/page_spec.rb +112 -0
  182. data/spec/models/fe/question_sheet_spec.rb +106 -0
  183. data/spec/models/fe/reference_sheet_spec.rb +20 -0
  184. data/spec/rails_helper.rb +41 -13
  185. data/spec/support/choices.xml +6 -0
  186. metadata +136 -48
  187. data/app/assets/javascripts/fe/rails.extra.js +0 -6
  188. data/app/controllers/fe/applications_controller.rb +0 -183
  189. data/app/controllers/fe/payments_controller.rb +0 -184
  190. data/app/models/fe/payment.rb +0 -77
  191. data/app/models/fe/payment_question.rb +0 -22
  192. data/app/views/fe/admin/panels/_prop_payment_question.html.erb +0 -1
  193. data/app/views/fe/application/_logout.html.erb +0 -1
  194. data/app/views/fe/payment_pages/_credit.html.erb +0 -47
  195. data/app/views/fe/payment_pages/_mail.html.erb +0 -27
  196. data/app/views/fe/payment_pages/_payment.html.erb +0 -6
  197. data/app/views/fe/payment_pages/_staff.html.erb +0 -25
  198. data/app/views/fe/payment_pages/_staff_results.html.erb +0 -17
  199. data/app/views/fe/payment_pages/edit.html.erb +0 -75
  200. data/app/views/fe/payment_pages/staff_search.js.erb +0 -2
  201. data/app/views/fe/payments/_credit.html.erb +0 -47
  202. data/app/views/fe/payments/_errors.html.erb +0 -1
  203. data/app/views/fe/payments/_payment.html.erb +0 -13
  204. data/app/views/fe/payments/_staff.html.erb +0 -21
  205. data/app/views/fe/payments/_staff_results.html.erb +0 -18
  206. data/app/views/fe/payments/approve.js.erb +0 -3
  207. data/app/views/fe/payments/create.js.erb +0 -19
  208. data/app/views/fe/payments/destroy.js.erb +0 -7
  209. data/app/views/fe/payments/edit.html.erb +0 -56
  210. data/app/views/fe/payments/error.js.erb +0 -3
  211. data/app/views/fe/payments/no_access.html.erb +0 -7
  212. data/app/views/fe/payments/staff_search.js.erb +0 -1
  213. data/app/views/fe/payments/update.html.erb +0 -24
  214. data/app/views/fe/questions/fe/_payment_question.html.erb +0 -70
  215. data/db/migrate/20140828045339_create_payments.rb +0 -13
  216. data/spec/dummy/db/test.sqlite3 +0 -0
  217. data/spec/factories/payments.rb +0 -7
  218. data/spec/models/fe/payment_question_spec.rb +0 -65
@@ -1,6 +1,6 @@
1
1
  class CreateFeUsers < ActiveRecord::Migration
2
2
  def change
3
- create_table :fe_users do |t|
3
+ create_table Fe::User do |t|
4
4
  t.integer :user_id
5
5
  t.datetime :last_login
6
6
  t.string :type
@@ -0,0 +1,5 @@
1
+ class AddAllElementIdsToPages < ActiveRecord::Migration
2
+ def change
3
+ add_column Fe::Page.table_name, :all_element_ids, :text
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ class AddLocaleColumns < ActiveRecord::Migration
2
+ def change
3
+ add_column Fe::QuestionSheet.table_name, :languages, :text
4
+ add_column Fe::Element.table_name, :label_translations, :text
5
+ add_column Fe::Element.table_name, :tip_translations, :text
6
+ add_column Fe::Element.table_name, :content_translations, :text
7
+ add_column Fe::Page.table_name, :label_translations, :text
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class AddLocaleToAnswerSheet < ActiveRecord::Migration
2
+ def change
3
+ add_column Fe.answer_sheet_class.constantize.table_name, :locale, :string, default: 'en'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class ChangePagesAllElementIdsToText < ActiveRecord::Migration
2
+ def change
3
+ change_column Fe::Page.table_name, :all_element_ids, :text
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddLocaleToReferenceSheets < ActiveRecord::Migration
2
+ def change
3
+ add_column Fe::ReferenceSheet.table_name, :locale, :string, default: 'en'
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ require 'securerandom'
2
+
3
+ module Fe
4
+ module AccessKeyGenerator
5
+ def generate_access_key
6
+ begin
7
+ self.access_key = SecureRandom.hex
8
+ end while self.class.exists?(access_key: access_key)
9
+ return access_key
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,20 @@
1
+ require 'active_record'
2
+
3
+ module DistinctDistinctPatch
4
+ def construct_limited_ids_condition(relation)
5
+ orders = relation.order_values.map { |val| val.presence }.compact
6
+ values = @klass.connection.distinct("#{@klass.connection.quote_table_name table_name}.#{primary_key}", orders)
7
+
8
+ relation = relation.dup.select(values)
9
+ relation.uniq_value = nil
10
+
11
+ id_rows = @klass.connection.select_all(relation.arel, 'SQL', relation.bind_values)
12
+ ids_array = id_rows.map {|row| row[primary_key]}
13
+
14
+ ids_array.empty? ? raise(ActiveRecord::ThrowResult) : table[primary_key].in(ids_array)
15
+ end
16
+ end
17
+
18
+ class ActiveRecord::Relation
19
+ include DistinctDistinctPatch
20
+ end
data/lib/fe.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "fe/engine"
2
2
 
3
3
  module Fe
4
+ LANGUAGES = { 'es' => 'Español', 'pt' => 'Português' }
4
5
  # prefix for database tables
5
6
  mattr_accessor :table_name_prefix
6
7
  self.table_name_prefix ||= 'fe_'
@@ -11,6 +12,9 @@ module Fe
11
12
  mattr_accessor :from_email
12
13
  self.from_email ||= 'info@example.com'
13
14
 
15
+ mattr_accessor :never_reuse_elements
16
+ self.never_reuse_elements = false
17
+
14
18
  def self.next_label(prefix, labels)
15
19
  max = labels.inject(0) do |m, label|
16
20
  num = label[/^#{prefix} ([0-9]+)$/i, 1].to_i # extract your digits
@@ -1,3 +1,5 @@
1
+ require 'acts_as_list'
2
+
1
3
  module Fe
2
4
  class Engine < ::Rails::Engine
3
5
  # isolate_namespace is causing problems accessing the app's url helpers when the app
@@ -37,12 +39,22 @@ module Fe
37
39
 
38
40
 
39
41
  config.to_prepare do
40
- Dir.glob(File.join(File.dirname(__FILE__), "..", "..", "app", "**", "*_concern.rb")).each do |c|
41
- require_dependency(c)
42
+ require_dependency('distinct_distinct_patch.rb')
43
+ require_dependency('access_key_generator')
44
+
45
+ # Loading concerns and dependencies here when running FE specs breaks the coverage report. The
46
+ # Rakefile will set SKIP_CONCERNS and SKIP_DECORATORS true and decorators/concerns are loaded from
47
+ # spec/rails_helper.rb instead
48
+ if ENV['SKIP_CONCERNS'] != 'true'
49
+ Dir.glob(File.join(File.dirname(__FILE__), "..", "..", "app", "**", "*_concern.rb")).each do |c|
50
+ require_dependency(c)
51
+ end
42
52
  end
43
53
 
44
- Dir.glob(File.join(Rails.root + 'app/decorators/**/*_decorator.rb')).each do |c|
45
- require_dependency(c)
54
+ if ENV['SKIP_CONCERNS'] != 'true'
55
+ Dir.glob(File.join(Rails.root + 'app/decorators/**/*_decorator.rb')).each do |c|
56
+ require_dependency(c)
57
+ end
46
58
  end
47
59
  end
48
60
 
@@ -1,3 +1,3 @@
1
1
  module Fe
2
- VERSION = "0.0.4"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -1,4 +1,204 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Admin::ElementsController do
3
+ describe Fe::Admin::ElementsController, type: :controller do
4
+ context '#show' do
5
+ it 'should work' do
6
+ answer_sheet = create(:answer_sheet)
7
+ page = create(:page)
8
+ question_sheet = page.question_sheet
9
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
10
+ element = create(:text_field_element)
11
+ create(:page_element, element: element, page: page)
12
+
13
+ xhr :get, :edit, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id
14
+ expect(assigns(:element)).to eq(element)
15
+ end
16
+ end
17
+ context '#new' do
18
+ it 'should work' do
19
+ answer_sheet = create(:answer_sheet)
20
+ page = create(:page)
21
+ question_sheet = page.question_sheet
22
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
23
+ element = create(:text_field_element, style: 'style')
24
+ create(:page_element, element: element, page: page)
25
+
26
+ xhr :get, :new, element_type: 'Fe::TextField', element: { style: 'style' }, question_sheet_id: question_sheet.id, page_id: page.id
27
+ expect(assigns(:questions)).to eq([element])
28
+ end
29
+ end
30
+ context '#use_existing' do
31
+ it 'should work' do
32
+ answer_sheet = create(:answer_sheet)
33
+ page = create(:page)
34
+ question_sheet = page.question_sheet
35
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
36
+ element = create(:text_field_element, style: 'style')
37
+
38
+ xhr :get, :use_existing, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id
39
+ expect(assigns(:page_element)).to_not be_nil
40
+ end
41
+ it 'should not put the same question on a questionnaire twice' do
42
+ answer_sheet = create(:answer_sheet)
43
+ page = create(:page)
44
+ question_sheet = page.question_sheet
45
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
46
+ element = create(:text_field_element, style: 'style')
47
+ create(:page_element, element: element, page: page)
48
+
49
+ xhr :get, :use_existing, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id
50
+ expect(assigns(:page_element)).to be_nil
51
+ end
52
+ end
53
+ context '#create' do
54
+ it 'should work' do
55
+ answer_sheet = create(:answer_sheet)
56
+ page = create(:page)
57
+ question_sheet = page.question_sheet
58
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
59
+
60
+ expect {
61
+ xhr :post, :create, element_type: 'Fe::TextField', element: { style: 'style' }, question_sheet_id: question_sheet.id, page_id: page.id
62
+ }.to change{Fe::Element.count}.by(1)
63
+
64
+ expect(assigns(:page_element)).to_not be_nil
65
+ new_element = Fe::Element.last
66
+ expect(assigns(:page_element).element).to eq(new_element)
67
+ expect(assigns(:page_element).page).to eq(page)
68
+ end
69
+ it 'should handle error saving element' do
70
+ answer_sheet = create(:answer_sheet)
71
+ page = create(:page)
72
+ question_sheet = page.question_sheet
73
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
74
+
75
+ expect {
76
+ xhr :post, :create, element_type: 'Fe::TextField', element: { slug: "Illegal Chars: #@$!" }, question_sheet_id: question_sheet.id, page_id: page.id
77
+ }.to change{Fe::Element.count}.by(0)
78
+
79
+ expect(assigns(:page_element)).to be_nil
80
+ expect(response).to render_template('error.js.erb')
81
+ end
82
+ end
83
+ context '#update' do
84
+ it 'should work' do
85
+ answer_sheet = create(:answer_sheet)
86
+ page = create(:page)
87
+ question_sheet = page.question_sheet
88
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
89
+ element = create(:text_field_element, style: 'style')
90
+ create(:page_element, element: element, page: page)
91
+
92
+ xhr :put, :update, element: { style: 'style' }, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id
93
+
94
+ expect(assigns(:element)).to eq(element)
95
+ expect(assigns(:element).style).to eq('style')
96
+ end
97
+ it 'should handle error saving element' do
98
+ answer_sheet = create(:answer_sheet)
99
+ page = create(:page)
100
+ question_sheet = page.question_sheet
101
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
102
+ element = create(:text_field_element, style: 'style')
103
+ create(:page_element, element: element, page: page)
104
+
105
+ xhr :put, :update, element: { slug: "Illegal Chars: #@$!" }, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id
106
+ expect(assigns(:element)).to eq(element)
107
+ expect(response).to render_template('error.js.erb')
108
+ end
109
+ end
110
+ context '#destroy' do
111
+ it 'should destroy the element when it is not used in any other pages' do
112
+ answer_sheet = create(:answer_sheet)
113
+ page = create(:page)
114
+ question_sheet = page.question_sheet
115
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
116
+ element = create(:text_field_element, style: 'style')
117
+ create(:page_element, element: element, page: page)
118
+
119
+ xhr :delete, :destroy, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id
120
+
121
+ expect(Fe::PageElement.find_by(page_id: page.id, element_id: element.id)).to be_nil
122
+ expect(Fe::Element.find_by(id: element.id)).to be_nil
123
+ end
124
+ it 'should not destroy the element when it is not used in any other pages, but it has answers' do
125
+ answer_sheet = create(:answer_sheet)
126
+ page = create(:page)
127
+ question_sheet = page.question_sheet
128
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
129
+ element = create(:text_field_element, style: 'style')
130
+ create(:page_element, element: element, page: page)
131
+ create(:answer, question: element, value: 'answer here', answer_sheet: answer_sheet)
132
+
133
+ xhr :delete, :destroy, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id
134
+
135
+ expect(Fe::PageElement.find_by(page_id: page.id, element_id: element.id)).to be_nil
136
+ expect(Fe::Element.find_by(id: element.id)).to_not be_nil
137
+ end
138
+ it 'should not destroy the element when it has no answers, but is being used in another page' do
139
+ answer_sheet = create(:answer_sheet)
140
+ page = create(:page)
141
+ page2 = create(:page)
142
+ question_sheet = page.question_sheet
143
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
144
+ element = create(:text_field_element, style: 'style')
145
+ create(:page_element, element: element, page: page)
146
+ create(:page_element, element: element, page: page2)
147
+
148
+ xhr :delete, :destroy, question_sheet_id: question_sheet.id, page_id: page.id, id: element.id
149
+
150
+ expect(Fe::PageElement.find_by(page_id: page.id, element_id: element.id)).to be_nil
151
+ expect(Fe::Element.find_by(id: element.id)).to_not be_nil
152
+ end
153
+ end
154
+
155
+ context '#reorder' do
156
+ it 'should work inside a question grid' do
157
+ answer_sheet = create(:answer_sheet)
158
+ page = create(:page)
159
+ question_sheet = page.question_sheet
160
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
161
+ element = create(:text_field_element, style: 'style')
162
+ element2 = create(:text_field_element, style: 'style')
163
+ element3 = create(:question_grid, style: 'style')
164
+ element4 = create(:text_field_element, style: 'style', question_grid_id: element3.id)
165
+ element5 = create(:text_field_element, style: 'style', question_grid_id: element3.id)
166
+ create(:page_element, element: element, page: page)
167
+ create(:page_element, element: element2, page: page)
168
+ create(:page_element, element: element3, page: page)
169
+
170
+ page_element_positions_before = Fe::PageElement.all.pluck(:position)
171
+
172
+ xhr :post, :reorder, question_sheet_id: question_sheet.id, page_id: page.id, "questions_list_#{element3.id}" => [ element5.id, element4.id ]
173
+ # it shouldn't touch the page elements
174
+ expect(Fe::PageElement.all.pluck(:position)).to eq(page_element_positions_before)
175
+ # it should put a new order on the question grid elements
176
+ expect(element5.reload.position).to eq(1)
177
+ expect(element4.reload.position).to eq(2)
178
+ end
179
+ it 'should work outside a question grid' do
180
+ answer_sheet = create(:answer_sheet)
181
+ page = create(:page)
182
+ question_sheet = page.question_sheet
183
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
184
+ element = create(:text_field_element, style: 'style')
185
+ element2 = create(:text_field_element, style: 'style')
186
+ element3 = create(:question_grid, style: 'style')
187
+ element4 = create(:text_field_element, style: 'style', question_grid_id: element3.id)
188
+ element5 = create(:text_field_element, style: 'style', question_grid_id: element3.id)
189
+ pe1 = create(:page_element, element: element, page: page)
190
+ pe2 = create(:page_element, element: element2, page: page)
191
+ pe3 = create(:page_element, element: element3, page: page)
192
+
193
+ question_grid_elements_positions_before = element3.reload.elements.pluck(:position)
194
+
195
+ xhr :post, :reorder, question_sheet_id: question_sheet.id, page_id: page.id, "questions_list" => [ element3.id, element.id, element2.id ]
196
+ # it shouldn't touch the question grid positions
197
+ expect(element3.reload.elements.pluck(:position)).to eq(question_grid_elements_positions_before)
198
+ # it should put a new order on the page elements
199
+ expect(pe3.reload.position).to eq(1)
200
+ expect(pe1.reload.position).to eq(2)
201
+ expect(pe2.reload.position).to eq(3)
202
+ end
203
+ end
4
204
  end
@@ -1,4 +1,29 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Admin::EmailTemplatesController do
3
+ describe Fe::Admin::EmailTemplatesController, type: :controller do
4
+ let(:email_template) { create(:email_template) }
5
+
6
+ context '#index' do
7
+ it 'should work' do
8
+ email_template = create(:email_template, name: 'Template')
9
+ get :index
10
+ expect(assigns(:email_templates)).to eq([email_template])
11
+ end
12
+ end
13
+
14
+ context '#new' do
15
+ it 'should work' do
16
+ get :new
17
+ expect(assigns(:email_template)).to_not be_nil
18
+ end
19
+ end
20
+
21
+ context '#create' do
22
+ it 'should work' do
23
+ expect {
24
+ post :create, email_template: { name: 'Name', subject: 'Subject', content: 'Content' }
25
+ }.to change{Fe::EmailTemplate.count}.by(1)
26
+ expect(assigns(:email_template)).to_not be_nil
27
+ end
28
+ end
4
29
  end
@@ -1,4 +1,11 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Admin::QuestionPagesController do
3
+ describe Fe::Admin::QuestionPagesController, type: :controller do
4
+ context '#show' do
5
+ it 'should work' do
6
+ page = create(:page)
7
+ question_sheet = page.question_sheet
8
+ xhr :get, :show, question_sheet_id: question_sheet.id, id: page.id
9
+ end
10
+ end
4
11
  end
@@ -1,4 +1,51 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::Admin::QuestionSheetsController do
3
+ describe Fe::Admin::QuestionSheetsController, type: :controller do
4
+ context '#index' do
5
+ it 'should work' do
6
+ active_qs = create(:question_sheet, archived: false)
7
+ archived_qs = create(:question_sheet, archived: true)
8
+ get :index
9
+ expect(assigns(:active_question_sheets)).to_not be_nil
10
+ expect(assigns(:archived_question_sheets)).to_not be_nil
11
+ expect(assigns(:active_question_sheets)).to eq([active_qs])
12
+ expect(assigns(:archived_question_sheets)).to eq([archived_qs])
13
+ end
14
+ end
15
+ context '#archive' do
16
+ it 'should work' do
17
+ active_qs = create(:question_sheet, archived: false)
18
+ request.env["HTTP_REFERER"] = '/'
19
+ post :archive, id: active_qs.id
20
+ expect(active_qs.reload.archived).to be true
21
+ end
22
+ end
23
+ context '#unarchive' do
24
+ it 'should work' do
25
+ active_qs = create(:question_sheet, archived: true)
26
+ request.env["HTTP_REFERER"] = '/'
27
+ post :unarchive, id: active_qs.id
28
+ expect(active_qs.reload.archived).to be false
29
+ end
30
+ end
31
+ context '#duplicate' do
32
+ it 'should work' do
33
+ qs = create(:question_sheet)
34
+ request.env["HTTP_REFERER"] = '/'
35
+ expect {
36
+ post :duplicate, id: qs.id
37
+ }.to change{Fe::QuestionSheet.count}.by(1)
38
+ expect(Fe::QuestionSheet.last.label).to eq("#{qs.label} - COPY")
39
+ end
40
+ end
41
+ context '#show' do
42
+ it 'should work' do
43
+ qs = create(:question_sheet)
44
+ p1 = create(:page, question_sheet: qs)
45
+ p2 = create(:page, question_sheet: qs)
46
+ get :show, id: qs.id
47
+ expect(assigns(:all_pages)).to eq([p1, p2])
48
+ expect(assigns(:page)).to eq(p1)
49
+ end
50
+ end
4
51
  end
@@ -1,4 +1,76 @@
1
1
  require 'rails_helper'
2
2
 
3
- describe Fe::AnswerPagesController do
3
+ describe Fe::AnswerPagesController, type: :controller do
4
+ context '#edit' do
5
+ it 'should work' do
6
+ answer_sheet = create(:answer_sheet)
7
+ page = create(:page)
8
+ question_sheet = page.question_sheet
9
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
10
+ get :edit, id: page.id, answer_sheet_id: answer_sheet.id
11
+ expect(response).to render_template('fe/answer_pages/_answer_page')
12
+ end
13
+ end
14
+ context '#update' do
15
+ it 'should work' do
16
+ answer_sheet = create(:answer_sheet)
17
+ page = create(:page)
18
+ question_sheet = page.question_sheet
19
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
20
+ element = create(:text_field_element)
21
+ create(:page_element, element: element, page: page)
22
+ # ref
23
+ reference_question = create(:reference_question)
24
+ reference_sheet = create(:reference_sheet, applicant_answer_sheet_id: answer_sheet.id, email: 'initial@ref.com')
25
+
26
+ xhr :put, :update, {
27
+ answers: { "#{element.id}" => 'answer here' },
28
+ reference: { "#{reference_sheet.id}" => {
29
+ relationship: 'roommate',
30
+ title: 'A',
31
+ first_name: 'FN',
32
+ last_name: 'LN',
33
+ phone: 'phone',
34
+ email: 'email@reference.com'
35
+ } },
36
+ id: page.id,
37
+ answer_sheet_id: answer_sheet.id
38
+ }
39
+
40
+ expect(response).to render_template('fe/answer_pages/update')
41
+ expect(Fe::Answer.find_by(answer_sheet_id: answer_sheet.id, question_id: element.id).value).to eq('answer here')
42
+ expect(reference_sheet.reload.email).to eq('email@reference.com')
43
+ end
44
+ it 'should store a reference sheet answer' do
45
+ # create a normal applicant sheet to make sure the answer isn't saved to that
46
+ answer_sheet = create(:answer_sheet)
47
+ page = create(:page)
48
+ question_sheet = page.question_sheet
49
+ create(:answer_sheet_question_sheet, answer_sheet: answer_sheet, question_sheet: question_sheet)
50
+ element = create(:text_field_element)
51
+ create(:page_element, element: element, page: page)
52
+ # ref
53
+ ref_page = create(:page, label: 'Ref Page')
54
+ ref_question_sheet = ref_page.question_sheet
55
+ ref_element = create(:text_field_element)
56
+ create(:page_element, element: ref_element, page: ref_page)
57
+ reference_question = create(:reference_question, related_question_sheet_id: ref_question_sheet.id)
58
+ reference_sheet = create(:reference_sheet, question_id: reference_question.id, applicant_answer_sheet_id: answer_sheet.id, email: 'initial@ref.com')
59
+
60
+ xhr :put, :update, {
61
+ answers: { "#{ref_element.id}" => 'ref answer here' },
62
+ id: ref_page.id,
63
+ answer_sheet_id: reference_sheet.id,
64
+ answer_sheet_type: 'Fe::ReferenceSheet'
65
+ }
66
+
67
+ expect(response).to render_template('fe/answer_pages/update')
68
+ expect(Fe::Answer.find_by(answer_sheet_id: reference_sheet.id, question_id: ref_element.id).value).to eq('ref answer here')
69
+ expect(Fe::Answer.find_by(answer_sheet_id: answer_sheet.id, question_id: element.id)).to be_nil
70
+ # check the associations on reference/answer sheet returns the correct answers
71
+ expect(reference_sheet.reload.answers.collect(&:value)).to eq(['ref answer here'])
72
+ expect(answer_sheet.reload.answers).to eq([])
73
+ end
74
+ end
75
+
4
76
  end