surveyor_gui 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +44 -0
- data/.travis.yml +17 -0
- data/Gemfile +7 -0
- data/LICENSE +21 -0
- data/MIT-LICENSE +20 -0
- data/README.md +159 -0
- data/Rakefile +66 -0
- data/app/controllers/answers_controller.rb +3 -0
- data/app/controllers/application_controller.rb +3 -0
- data/app/controllers/dependencys_controller.rb +286 -0
- data/app/controllers/question_groups_controller.rb +84 -0
- data/app/controllers/questions_controller.rb +187 -0
- data/app/controllers/survey_sections_controller.rb +80 -0
- data/app/controllers/surveyforms_controller.rb +4 -0
- data/app/controllers/surveyor_controller.rb +89 -0
- data/app/controllers/surveyor_gui/reports_controller.rb +339 -0
- data/app/controllers/surveyor_gui/responses_controller.rb +39 -0
- data/app/controllers/surveyor_gui/survey_controller.rb +16 -0
- data/app/facades/report_formatter.rb +44 -0
- data/app/facades/report_preview_wrapper.rb +11 -0
- data/app/facades/report_response_generator.rb +147 -0
- data/app/helpers/application_helper.rb +2 -0
- data/app/helpers/dependency_helper.rb +5 -0
- data/app/helpers/question_helper.rb +22 -0
- data/app/helpers/surveyform_helper.rb +179 -0
- data/app/helpers/surveyor_gui/report_helper.rb +19 -0
- data/app/helpers/surveyor_helper.rb +4 -0
- data/app/inputs/currency_input.rb +5 -0
- data/app/inputs/date_picker_input.rb +7 -0
- data/app/inputs/datetime_picker_input.rb +5 -0
- data/app/inputs/percent_input.rb +5 -0
- data/app/inputs/time_picker_input.rb +5 -0
- data/app/mailers/.gitkeep +0 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/answer.rb +4 -0
- data/app/models/column.rb +3 -0
- data/app/models/dependency.rb +4 -0
- data/app/models/dependency_condition.rb +4 -0
- data/app/models/permitted_params_decorator.rb +80 -0
- data/app/models/question.rb +4 -0
- data/app/models/question_group.rb +4 -0
- data/app/models/question_type.rb +7 -0
- data/app/models/response.rb +4 -0
- data/app/models/response_set.rb +4 -0
- data/app/models/row.rb +3 -0
- data/app/models/survey.rb +4 -0
- data/app/models/survey_section.rb +4 -0
- data/app/models/surveyform.rb +103 -0
- data/app/uploaders/blob_uploader.rb +48 -0
- data/app/views/dependencys/_column.html.erb +1 -0
- data/app/views/dependencys/_dependency.html.erb +22 -0
- data/app/views/dependencys/_dependency_condition_fields.html.erb +48 -0
- data/app/views/dependencys/_form.html.erb +20 -0
- data/app/views/dependencys/blank.html.erb +0 -0
- data/app/views/dependencys/edit.html.erb +1 -0
- data/app/views/dependencys/new.html.erb +1 -0
- data/app/views/layouts/application.html.erb +14 -0
- data/app/views/layouts/surveyor_gui_blank.html.erb +12 -0
- data/app/views/layouts/surveyor_gui_default.html.erb +16 -0
- data/app/views/layouts/surveyor_modified.html.erb +14 -0
- data/app/views/partials/_answer.html.haml +33 -0
- data/app/views/partials/_question.html.haml +33 -0
- data/app/views/partials/_question_group.html.haml +73 -0
- data/app/views/partials/_section.html.haml +13 -0
- data/app/views/question_groups/_form.html.erb +56 -0
- data/app/views/question_groups/_group_inline_field.html.erb +21 -0
- data/app/views/question_groups/_group_inline_fields.html.erb +25 -0
- data/app/views/question_groups/blank.html.erb +0 -0
- data/app/views/question_groups/edit.html.erb +1 -0
- data/app/views/question_groups/new.html.erb +1 -0
- data/app/views/questions/_answer_fields.html.erb +23 -0
- data/app/views/questions/_answer_options.html.erb +28 -0
- data/app/views/questions/_form.html.erb +65 -0
- data/app/views/questions/_grid_dropdown_columns.html.erb +10 -0
- data/app/views/questions/_grid_dropdown_fields.html.erb +42 -0
- data/app/views/questions/_grid_fields.html.erb +9 -0
- data/app/views/questions/_no_picks.html.erb +29 -0
- data/app/views/questions/_pick.html +21 -0
- data/app/views/questions/_picks.html.erb +12 -0
- data/app/views/questions/blank.html.erb +0 -0
- data/app/views/questions/edit.html.erb +1 -0
- data/app/views/questions/new.html.erb +1 -0
- data/app/views/survey_sections/_form.html.erb +13 -0
- data/app/views/survey_sections/blank.html.erb +0 -0
- data/app/views/survey_sections/edit.html.erb +1 -0
- data/app/views/survey_sections/new.html.erb +1 -0
- data/app/views/surveyforms/_form.html.erb +50 -0
- data/app/views/surveyforms/_question_field.html.erb +148 -0
- data/app/views/surveyforms/_question_group.html.erb +116 -0
- data/app/views/surveyforms/_question_group_fields.html.erb +3 -0
- data/app/views/surveyforms/_question_name_and_number.html.erb +6 -0
- data/app/views/surveyforms/_question_section.html.erb +15 -0
- data/app/views/surveyforms/_question_wrapper.html.erb +109 -0
- data/app/views/surveyforms/_survey_section_fields.html.erb +138 -0
- data/app/views/surveyforms/clone_survey.html.erb +13 -0
- data/app/views/surveyforms/edit.html.erb +5 -0
- data/app/views/surveyforms/index.html.erb +40 -0
- data/app/views/surveyforms/new.html.erb +1 -0
- data/app/views/surveyforms/show.html.erb +5 -0
- data/app/views/surveyor_gui/reports/_graphs.html.haml +21 -0
- data/app/views/surveyor_gui/reports/_grid.html.haml +42 -0
- data/app/views/surveyor_gui/reports/_grid_dropdown.html.haml +56 -0
- data/app/views/surveyor_gui/reports/_repeater.html.haml +28 -0
- data/app/views/surveyor_gui/reports/_show_report.html.haml +33 -0
- data/app/views/surveyor_gui/reports/_single_question.html.haml +70 -0
- data/app/views/surveyor_gui/reports/show.html.erb +14 -0
- data/app/views/surveyor_gui/responses/_grid.html.haml +20 -0
- data/app/views/surveyor_gui/responses/_grid_dropdown.html.haml +20 -0
- data/app/views/surveyor_gui/responses/_repeater.html.haml +22 -0
- data/app/views/surveyor_gui/responses/_survey_results.html.haml +40 -0
- data/app/views/surveyor_gui/responses/index.html.haml +24 -0
- data/app/views/surveyor_gui/responses/show.html.haml +42 -0
- data/app/views/surveyor_gui/shared/_grid_comments.html.haml +10 -0
- data/app/views/surveyor_gui/shared/_new_line.html.haml +2 -0
- data/app/views/surveyor_gui/shared/_pick_comments.html.haml +15 -0
- data/app/views/surveyor_gui/shared/_question_number.html.haml +9 -0
- data/app/views/surveyor_gui/shared/_report_data.html.haml +24 -0
- data/app/views/surveyor_gui/shared/_stars_report_data.html.haml +14 -0
- data/config.ru +4 -0
- data/config/environment.rb +0 -0
- data/config/routes.rb +71 -0
- data/db/migrate/20140307204049_add_template_to_surveys.rb +5 -0
- data/db/migrate/20140307235607_add_test_data_to_response_sets.rb +5 -0
- data/db/migrate/20140308171947_add_original_choice_to_answers.rb +5 -0
- data/db/migrate/20140308172118_add_blob_to_responses.rb +5 -0
- data/db/migrate/20140308172417_add_modifiable_to_survey_section.rb +5 -0
- data/db/migrate/20140308174532_add_modifiable_to_question.rb +5 -0
- data/db/migrate/20140308175305_add_dynamically_generate_to_questions.rb +5 -0
- data/db/migrate/20140311032923_add_dummy_blob_to_questions.rb +5 -0
- data/db/migrate/20140311160609_add_dynamic_source_to_questions.rb +5 -0
- data/db/migrate/20140311161714_add_report_code_to_questions.rb +5 -0
- data/db/migrate/20140530181134_add_is_comment_to_questions.rb +5 -0
- data/db/migrate/20140531012006_add_is_comment_to_answers.rb +5 -0
- data/db/migrate/20140531225529_create_rows.rb +9 -0
- data/db/migrate/20140601011151_create_columns.rb +11 -0
- data/db/migrate/20140602030330_add_column_id_to_answers.rb +5 -0
- data/db/migrate/20140603155606_add_column_id_to_responses.rb +5 -0
- data/db/migrate/20140606023527_add_column_id_to_dependency_conditions.rb +5 -0
- data/db/migrate/20140815165307_add_user_id_to_survey.rb +5 -0
- data/lib/assets/.gitkeep +0 -0
- data/lib/assets/images/addicon.png +0 -0
- data/lib/assets/images/datepicker.gif +0 -0
- data/lib/assets/images/delete.gif +0 -0
- data/lib/assets/images/delete.png +0 -0
- data/lib/assets/images/images/border.png +0 -0
- data/lib/assets/images/images/controls.png +0 -0
- data/lib/assets/images/images/loading.gif +0 -0
- data/lib/assets/images/images/loading_background.png +0 -0
- data/lib/assets/images/images/overlay.png +0 -0
- data/lib/assets/images/rails.png +0 -0
- data/lib/assets/images/star.gif +0 -0
- data/lib/assets/javascripts/.gitkeep +0 -0
- data/lib/assets/javascripts/surveyor_gui/jquery.MetaData.js +121 -0
- data/lib/assets/javascripts/surveyor_gui/jquery.blockUI.js +619 -0
- data/lib/assets/javascripts/surveyor_gui/jquery.rating.js +377 -0
- data/lib/assets/javascripts/surveyor_gui/jquery.validate.js +1188 -0
- data/lib/assets/javascripts/surveyor_gui/surveyor_add_ons.js +10 -0
- data/lib/assets/javascripts/surveyor_gui/surveyor_gui.js +1417 -0
- data/lib/assets/stylesheets/.gitkeep +0 -0
- data/lib/assets/stylesheets/surveyor_gui/jquery.rating.css +12 -0
- data/lib/assets/stylesheets/surveyor_gui/surveyor_add_ons.css +3 -0
- data/lib/assets/stylesheets/surveyor_gui/surveyor_gui.sass +650 -0
- data/lib/enumerable_extenders.rb +31 -0
- data/lib/generators/surveyor_gui/install_generator.rb +57 -0
- data/lib/generators/surveyor_gui/templates/app/assets/javascripts/surveyor_add_ons.js +2 -0
- data/lib/generators/surveyor_gui/templates/app/assets/javascripts/surveyor_gui_all.js +24 -0
- data/lib/generators/surveyor_gui/templates/app/assets/stylesheets/surveyor_add_ons.css.sass +1 -0
- data/lib/generators/surveyor_gui/templates/app/assets/stylesheets/surveyor_gui_all.css.sass +8 -0
- data/lib/generators/surveyor_gui/templates/app/helpers/surveyor_helper.rb +4 -0
- data/lib/generators/surveyor_gui/templates/app/models/response_set_user.rb +13 -0
- data/lib/generators/surveyor_gui/templates/app/views/layouts/surveyor_gui_default.html.erb +16 -0
- data/lib/generators/surveyor_gui/templates/config/initializers/simple_form.rb +140 -0
- data/lib/generators/surveyor_gui/templates/config/locales/en.yml +5 -0
- data/lib/surveyor_gui.rb +17 -0
- data/lib/surveyor_gui/engine.rb +30 -0
- data/lib/surveyor_gui/helpers/surveyor_helper_methods.rb +19 -0
- data/lib/surveyor_gui/models/answer_methods.rb +24 -0
- data/lib/surveyor_gui/models/column_methods.rb +43 -0
- data/lib/surveyor_gui/models/dependency_condition_methods.rb +53 -0
- data/lib/surveyor_gui/models/dependency_methods.rb +83 -0
- data/lib/surveyor_gui/models/question_and_group_shared_methods.rb +11 -0
- data/lib/surveyor_gui/models/question_group_methods.rb +55 -0
- data/lib/surveyor_gui/models/question_methods.rb +435 -0
- data/lib/surveyor_gui/models/question_type_methods.rb +493 -0
- data/lib/surveyor_gui/models/response_methods.rb +67 -0
- data/lib/surveyor_gui/models/response_set_methods.rb +54 -0
- data/lib/surveyor_gui/models/row_methods.rb +11 -0
- data/lib/surveyor_gui/models/survey_methods.rb +32 -0
- data/lib/surveyor_gui/models/survey_section_methods.rb +32 -0
- data/lib/surveyor_gui/surveyforms_controller_methods.rb +258 -0
- data/lib/surveyor_gui/version.rb +3 -0
- data/lib/tasks/.gitkeep +0 -0
- data/lib/tasks/surveyor_gui_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +13 -0
- data/spec/controllers/surveyforms_controller_spec.rb +361 -0
- data/spec/controllers/surveyor_controller_spec.rb +303 -0
- data/spec/factories.rb +181 -0
- data/spec/features/create_survey_spec.rb +418 -0
- data/spec/features/dependencies_spec.rb +61 -0
- data/spec/features/rearrange_survey_spec.rb +118 -0
- data/spec/features/ui_spec.rb +469 -0
- data/spec/fixtures/REDCapDemoDatabase_DataDictionary.csv +127 -0
- data/spec/fixtures/chinese_survey.rb +14 -0
- data/spec/fixtures/everything.rb +215 -0
- data/spec/fixtures/favorites-ish.rb +22 -0
- data/spec/fixtures/favorites.rb +22 -0
- data/spec/fixtures/feelings.rb +38 -0
- data/spec/fixtures/lifestyle.rb +55 -0
- data/spec/fixtures/numbers.rb +21 -0
- data/spec/fixtures/redcap_new_headers.csv +1 -0
- data/spec/fixtures/redcap_siblings.csv +1 -0
- data/spec/fixtures/redcap_whitespace.csv +1 -0
- data/spec/helpers/formtastic_custom_input_spec.rb +15 -0
- data/spec/helpers/surveyor_helper_spec.rb +116 -0
- data/spec/lib/common_spec.rb +37 -0
- data/spec/lib/parser_spec.rb +393 -0
- data/spec/lib/rake_kitchen_sink.rb +42 -0
- data/spec/lib/redcap_parser_spec.rb +129 -0
- data/spec/lib/unparser_spec.rb +126 -0
- data/spec/models/answer_spec.rb +144 -0
- data/spec/models/dependency_condition_spec.rb +428 -0
- data/spec/models/dependency_spec.rb +90 -0
- data/spec/models/question_group_spec.rb +66 -0
- data/spec/models/question_spec.rb +176 -0
- data/spec/models/response_set_spec.rb +452 -0
- data/spec/models/response_spec.rb +208 -0
- data/spec/models/survey_section_spec.rb +58 -0
- data/spec/models/survey_spec.rb +155 -0
- data/spec/models/surveyor_gui/question_spec.rb +60 -0
- data/spec/models/surveyor_gui/question_type_spec.rb +268 -0
- data/spec/models/validation_condition_spec.rb +98 -0
- data/spec/models/validation_spec.rb +64 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +119 -0
- data/spec/support/scenario_outline_helper.rb +39 -0
- data/spec/support/shared.rb +10 -0
- data/spec/support/surveyforms_creation_helpers.rb +312 -0
- data/spec/support/surveyforms_rearrangement_helpers.rb +170 -0
- data/spec/support/surveyor_api_helpers.rb +15 -0
- data/spec/support/surveyor_ui_helpers.rb +108 -0
- data/spec/support/wait_for_ajax.rb +11 -0
- data/spec/views/questions/edit.html.erb_spec.rb +73 -0
- data/spec/views/surveyforms/edit.html.erb_spec.rb +126 -0
- data/surveyor_gui.gemspec +52 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/mailers/.gitkeep +0 -0
- data/test/dummy/app/models/.gitkeep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +58 -0
- data/test/dummy/lib/assets/.gitkeep +0 -0
- data/test/dummy/log/.gitkeep +0 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/surveyor-gui_test.rb +7 -0
- data/test/test_helper.rb +15 -0
- data/vendor/assets/stylesheets/.gitkeep +0 -0
- data/vendor/assets/stylesheets/custom.sass +5 -0
- data/vendor/plugins/.gitkeep +0 -0
- metadata +664 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
class ScenarioOutline
|
5
|
+
attr_reader :examples
|
6
|
+
|
7
|
+
def initialize(example_string)
|
8
|
+
@example_string = example_string.gsub(/(^\n*)|(\s*\n*$)/,'')
|
9
|
+
@examples = parse_example_string
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def parse_example_string
|
14
|
+
example_string = StringIO.new(@example_string)
|
15
|
+
header = parse_line(example_string.readline)
|
16
|
+
example_lines = example_string.readlines
|
17
|
+
parse_example_lines(header, example_lines)
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse_line(line)
|
21
|
+
line.lstrip.slice(1..line.length).chomp.split('|')
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse_example_lines (header, example_lines)
|
25
|
+
examples=[]
|
26
|
+
example_lines.each do |example_line|
|
27
|
+
examples << make_an_example(header, example_line)
|
28
|
+
end
|
29
|
+
examples
|
30
|
+
end
|
31
|
+
|
32
|
+
def make_an_example(header, example_line)
|
33
|
+
newstruct = "{"
|
34
|
+
parse_line(example_line).each_with_index do |example, index|
|
35
|
+
newstruct += ":#{header[index].strip} => '#{example.strip}',"
|
36
|
+
end
|
37
|
+
OpenStruct.new(eval(newstruct.chop+"}"))
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
%w(favorites feelings lifestyle numbers favorites-ish everything).each do |name|
|
2
|
+
shared_context name do
|
3
|
+
before { Surveyor::Parser.parse_file( File.join(Rails.root, '..', 'spec', 'fixtures', "#{name}.rb"), trace: false) }
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
def gem_path(gem_name)
|
8
|
+
spec = Gem::Specification.find_by_name(gem_name)
|
9
|
+
spec.gem_dir
|
10
|
+
end
|
@@ -0,0 +1,312 @@
|
|
1
|
+
module SurveyFormsCreationHelpers
|
2
|
+
module CreateSurvey
|
3
|
+
def start_a_new_survey
|
4
|
+
visit new_surveyform_path
|
5
|
+
fill_in "Title", with: "How was Boston?"
|
6
|
+
click_button "Save Changes"
|
7
|
+
end
|
8
|
+
|
9
|
+
def first_section_title
|
10
|
+
find('.survey_section h2')
|
11
|
+
end
|
12
|
+
|
13
|
+
def first_question
|
14
|
+
find('.question span.questions')
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_question(&block)
|
18
|
+
#make sure prior jquery was completed
|
19
|
+
expect(page).not_to have_css('div.jquery_add_question_started, div.jquery_add_section_started')
|
20
|
+
fix_node_error do
|
21
|
+
all('#add_question').last.click
|
22
|
+
expect(page).to have_css('iframe')
|
23
|
+
end
|
24
|
+
within_frame 0 do
|
25
|
+
#then wait for window to pop up
|
26
|
+
find('form')
|
27
|
+
expect(find('h1')).to have_content("Add Question")
|
28
|
+
#then enter the question details
|
29
|
+
block.call
|
30
|
+
#then the window closes
|
31
|
+
end
|
32
|
+
expect(page).not_to have_css('div.jquery_add_question_started')
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_section
|
36
|
+
fix_node_error do
|
37
|
+
all('#add_section').last.click
|
38
|
+
expect(page).to have_css('iframe')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def fix_node_error(&block)
|
43
|
+
# fix Capybara::Poltergeist::ObsoleteNode: - seems like some kind of race problem
|
44
|
+
begin
|
45
|
+
yield(block)
|
46
|
+
rescue
|
47
|
+
sleep(1)
|
48
|
+
yield(block)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def select_question_type(type)
|
53
|
+
#within ".question_type" do
|
54
|
+
choose(type)
|
55
|
+
#end
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_answers
|
59
|
+
wait_for_ajax
|
60
|
+
page.all("div.answer .question_answers_text input")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
module BuildASurvey
|
65
|
+
def build_a_survey
|
66
|
+
#Given I'm on the "Create New Survey" page
|
67
|
+
visit new_surveyform_path
|
68
|
+
|
69
|
+
title_the_survey
|
70
|
+
title_the_first_section
|
71
|
+
add_a_text_question("Describe your day at Fenway Park.")
|
72
|
+
add_a_number_question
|
73
|
+
add_a_pick_one_question
|
74
|
+
add_a_pick_any_question
|
75
|
+
add_a_dropdown_question
|
76
|
+
add_a_date_question
|
77
|
+
add_a_label
|
78
|
+
add_a_slider_question
|
79
|
+
add_a_star_question
|
80
|
+
add_a_file_upload
|
81
|
+
|
82
|
+
add_a_new_section("Entertainment")
|
83
|
+
question_maker = QuestionsFactory.new
|
84
|
+
question_maker.make_question(3){|text| add_a_text_question(text)}
|
85
|
+
add_a_text_question("Describe your room.")
|
86
|
+
|
87
|
+
add_a_new_section("Food")
|
88
|
+
question_maker.make_question(3){|text| add_a_text_question(text)}
|
89
|
+
end
|
90
|
+
|
91
|
+
def build_a_three_question_survey
|
92
|
+
visit new_surveyform_path
|
93
|
+
title_the_survey
|
94
|
+
question_maker = QuestionsFactory.new
|
95
|
+
question_maker.make_question(3){|text| add_a_text_question(text)}
|
96
|
+
end
|
97
|
+
|
98
|
+
def build_a_three_section_survey
|
99
|
+
visit new_surveyform_path
|
100
|
+
title_the_survey
|
101
|
+
title_the_first_section ("Unique Section 1")
|
102
|
+
add_a_new_section("Unique Section 2")
|
103
|
+
add_a_new_section("Unique Section 3")
|
104
|
+
end
|
105
|
+
|
106
|
+
def title_the_survey
|
107
|
+
#When I fill in a title
|
108
|
+
fill_in "Title", with: "How was Boston?"
|
109
|
+
#And I save the survey
|
110
|
+
click_button "Save Changes"
|
111
|
+
end
|
112
|
+
|
113
|
+
def title_the_first_section(title="Accommodations")
|
114
|
+
#And I click "Edit Section Title"
|
115
|
+
click_button "Edit Section Title"
|
116
|
+
#Then I see a window pop-up
|
117
|
+
expect(page).to have_css('iframe')
|
118
|
+
within_frame 0 do
|
119
|
+
#And I enter a title
|
120
|
+
fill_in "Title", with: title
|
121
|
+
#And I save the title
|
122
|
+
click_button "Save Changes"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def add_a_text_question(text="Where did you stay?")
|
127
|
+
add_question do
|
128
|
+
#And I see a new form for "Add Question"
|
129
|
+
find('form')
|
130
|
+
expect(find('h1')).to have_content("Add Question")
|
131
|
+
#And I frame the question
|
132
|
+
fill_in "question_text", with: text
|
133
|
+
#And I select the "text" question type
|
134
|
+
select_question_type "Text"
|
135
|
+
#And I save the question
|
136
|
+
click_button "Save Changes"
|
137
|
+
#Then the window goes away
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def add_a_number_question
|
142
|
+
add_question do
|
143
|
+
#Given I've added a new question
|
144
|
+
#Then I select the "number" question type
|
145
|
+
select_question_type "Number"
|
146
|
+
#And I frame the question
|
147
|
+
fill_in "question_text", with: "How many days did you stay?"
|
148
|
+
#And I add the suffix, "days"
|
149
|
+
fill_in "question_suffix", with: "days"
|
150
|
+
#And I sav the question
|
151
|
+
click_button "Save Changes"
|
152
|
+
#Then the window goes away
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def add_a_pick_one_question
|
157
|
+
add_question do
|
158
|
+
#Then I select the "multiple choice" question type
|
159
|
+
select_question_type "Multiple Choice (only one answer)"
|
160
|
+
#And I frame the question
|
161
|
+
fill_in "question_text", with: "What type of room did you get?"
|
162
|
+
#And I add some choices"
|
163
|
+
fill_in "question_answers_textbox", with: """Deluxe King
|
164
|
+
Standard Queen
|
165
|
+
Standard Double"""
|
166
|
+
#And I save the question
|
167
|
+
click_button "Save Changes"
|
168
|
+
#Then the window goes away
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def add_a_pick_any_question
|
173
|
+
#Given I've added a new question
|
174
|
+
add_question do
|
175
|
+
#Then I select the "number" question type
|
176
|
+
select_question_type "Multiple Choice (multiple answers)"
|
177
|
+
#And I frame the question
|
178
|
+
fill_in "question_text", with: "What did you order from the minibar?"
|
179
|
+
#And I add some choices"
|
180
|
+
fill_in "question_answers_textbox", with: """Bottled Water
|
181
|
+
Kit Kats
|
182
|
+
Scotch"""
|
183
|
+
#And I save the question
|
184
|
+
click_button "Save Changes"
|
185
|
+
#Then the window goes away
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def add_a_dropdown_question
|
190
|
+
#Given I've added a new question
|
191
|
+
add_question do
|
192
|
+
#Then I select the "number" question type
|
193
|
+
select_question_type "Dropdown List"
|
194
|
+
#And I frame the question
|
195
|
+
fill_in "question_text", with: "What neighborhood were you in?"
|
196
|
+
#And I add some choices"
|
197
|
+
fill_in "question_answers_textbox", with: """ Financial District
|
198
|
+
Back Bay
|
199
|
+
North End"""
|
200
|
+
#And I save the question
|
201
|
+
click_button "Save Changes"
|
202
|
+
#Then the window goes away
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def add_a_date_question
|
207
|
+
#And I can see the question in my survey
|
208
|
+
#Given I've added a new question
|
209
|
+
add_question do
|
210
|
+
#Then I select the "number" question type
|
211
|
+
select_question_type "Date"
|
212
|
+
#And I frame the question
|
213
|
+
fill_in "question_text", with: "When did you checkout?"
|
214
|
+
#And I save the question
|
215
|
+
click_button "Save Changes"
|
216
|
+
#Then the window goes away
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def add_a_label
|
221
|
+
add_question do
|
222
|
+
#Then I select the "Label" question type
|
223
|
+
select_question_type "Label"
|
224
|
+
#And I frame the question
|
225
|
+
fill_in "question_text", with: "You don't need to answer the following questions if you are not comfortable."
|
226
|
+
#And I save the question
|
227
|
+
click_button "Save Changes"
|
228
|
+
#Then the window goes away
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def add_a_text_box_question
|
233
|
+
#Given I've added a new question
|
234
|
+
add_question do
|
235
|
+
#Then I select the "Text Box" question type
|
236
|
+
select_question_type "Text Box (for extended text, like notes, etc.)"
|
237
|
+
#And I frame the question
|
238
|
+
fill_in "question_text", with: "What did you think of the staff?"
|
239
|
+
#And I save the question
|
240
|
+
click_button "Save Changes"
|
241
|
+
#Then the window goes away
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
def add_a_slider_question
|
246
|
+
#Given I've added a new question
|
247
|
+
add_question do
|
248
|
+
#Then I select the "Slider" question type
|
249
|
+
select_question_type "Slider"
|
250
|
+
#And I frame the question
|
251
|
+
fill_in "question_text", with: "What did you think of the food?"
|
252
|
+
#And I add some choices"
|
253
|
+
fill_in "question_answers_textbox", with: """Sucked!
|
254
|
+
Meh
|
255
|
+
Good
|
256
|
+
Wicked good!"""
|
257
|
+
#And I save the question
|
258
|
+
click_button "Save Changes"
|
259
|
+
#Then the window goes away
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
def add_a_star_question
|
264
|
+
#Given I've added a new question
|
265
|
+
add_question do
|
266
|
+
#Then I select the "Star" question type
|
267
|
+
select_question_type "Star"
|
268
|
+
#And I frame the question
|
269
|
+
fill_in "question_text", with: "How would you rate your stay?"
|
270
|
+
#And I save the question
|
271
|
+
click_button "Save Changes"
|
272
|
+
#Then the window goes away
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
def add_a_file_upload
|
277
|
+
#Given I've added a new question
|
278
|
+
add_question do
|
279
|
+
#Then I select the "Star" question type
|
280
|
+
select_question_type "File Upload"
|
281
|
+
#And I frame the question
|
282
|
+
fill_in "question_text", with: "Please upload a copy of your bill."
|
283
|
+
#And I save the question
|
284
|
+
click_button "Save Changes"
|
285
|
+
#Then the window goes away
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def add_a_new_section(title)
|
290
|
+
#Then I add Section II
|
291
|
+
add_section
|
292
|
+
within_frame 0 do
|
293
|
+
fill_in "Title", with: title
|
294
|
+
click_button "Save Changes"
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
class QuestionsFactory
|
299
|
+
attr_reader :question_no
|
300
|
+
def initialize
|
301
|
+
@question_no = 1
|
302
|
+
end
|
303
|
+
|
304
|
+
def make_question(quantity,&block)
|
305
|
+
quantity.times do
|
306
|
+
block.call("Unique Question "+@question_no.to_s)
|
307
|
+
@question_no += 1
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
module CutAndPaste
|
2
|
+
def construct_scenario
|
3
|
+
examples = """
|
4
|
+
|from_item | over_under | to_item | order|
|
5
|
+
|2 | over | 1 | 213 |
|
6
|
+
|2 | over | 3 | 123 |
|
7
|
+
|2 | under | 1 | 123 |
|
8
|
+
|2 | under | 3 | 132 |
|
9
|
+
|1 | over | 2 | 312 |
|
10
|
+
|1 | over | 3 | 132 |
|
11
|
+
|1 | under | 2 | 321 |
|
12
|
+
|1 | under | 3 | 312 |
|
13
|
+
|3 | over | 1 | 312 |
|
14
|
+
|3 | over | 2 | 132 |
|
15
|
+
|3 | under | 1 | 132 |
|
16
|
+
|3 | under | 2 | 123 |
|
17
|
+
"""
|
18
|
+
#ScenarioOutline class found in spec/support/scenario_outline_helpers.rb
|
19
|
+
#use to simulate Cucumber type Scenario Outline
|
20
|
+
ScenarioOutline.new(examples)
|
21
|
+
end
|
22
|
+
|
23
|
+
def run_scenario
|
24
|
+
@scenario.examples.each do |example|
|
25
|
+
#e.g. puts "cut Unique Question 1 and paste it under Unique Question 2 resulting in 213"
|
26
|
+
puts "\tcut #{example.from_item} \
|
27
|
+
and paste it #{example.over_under} #{example.to_item}\
|
28
|
+
resulting in #{example.order}"
|
29
|
+
cut_and_paste_one_item(example)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def cut_and_paste_one_item(example)
|
34
|
+
_cut_item("Unique #{@item_name} "+example.from_item)
|
35
|
+
_paste_item(example.over_under, "Unique #{@item_name} "+example.to_item)
|
36
|
+
_check_order(example.order)
|
37
|
+
end
|
38
|
+
|
39
|
+
def cut_question(question)
|
40
|
+
cut_button = "$('fieldset.questions:contains(\"#{question}\") button:contains(\"Cut Question\")')[0].click();"
|
41
|
+
#When I cut <from_item>
|
42
|
+
page.execute_script(cut_button)
|
43
|
+
expect(page).not_to have_css('div.jquery_cut_question_started')
|
44
|
+
#Then I see paste buttons appear
|
45
|
+
expect(page).to have_content('Paste Question')
|
46
|
+
end
|
47
|
+
|
48
|
+
def cut_section(section)
|
49
|
+
cut_button = "$('div.survey_section:contains(\"#{section}\") button:contains(\"Cut Section\")')[0].click();"
|
50
|
+
#When I cut <from_item>
|
51
|
+
page.execute_script(cut_button)
|
52
|
+
expect(page).not_to have_css('div.jquery_cut_section_started')
|
53
|
+
#Then I see paste buttons appear
|
54
|
+
expect(page).to have_content('Paste Section')
|
55
|
+
end
|
56
|
+
|
57
|
+
def paste_section(position, section)
|
58
|
+
#And paste it <over_under> <to_item>
|
59
|
+
@_click_prev_paste_button_js = method(:_click_prev_paste_section_button_js)
|
60
|
+
@_click_next_paste_button_js = method(:_click_next_paste_section_button_js)
|
61
|
+
page.execute_script(_click_paste_button_js(position, section))
|
62
|
+
expect(page).not_to have_css('div.jquery_paste_section_started')
|
63
|
+
#Then I see cut buttons return
|
64
|
+
sleep 1
|
65
|
+
expect(page).to have_content('Cut Section')
|
66
|
+
end
|
67
|
+
|
68
|
+
def paste_question(position, question)
|
69
|
+
#And paste it <over_under> <to_item>
|
70
|
+
@_click_prev_paste_button_js = method(:_click_prev_paste_question_button_js)
|
71
|
+
@_click_next_paste_button_js = method(:_click_next_paste_question_button_js)
|
72
|
+
page.execute_script(_click_paste_button_js(position, question))
|
73
|
+
expect(page).not_to have_css('div.jquery_paste_question_started')
|
74
|
+
#Then I see cut buttons return
|
75
|
+
expect(page).to have_content('Cut Question')
|
76
|
+
end
|
77
|
+
|
78
|
+
def _click_paste_button_js(position, item)
|
79
|
+
if position == "over"
|
80
|
+
@_click_prev_paste_button_js.call(item)
|
81
|
+
else
|
82
|
+
@_click_next_paste_button_js.call(item)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
def _click_prev_paste_question_button_js(question)
|
88
|
+
#If the target question is the first in the section, the previous button will
|
89
|
+
#be found in the button bar div. This div is one level up and one position back in the DOM.
|
90
|
+
#Otherwise, it will be found at the bottom of the previous question (div.question).
|
91
|
+
"""
|
92
|
+
var to_item = $('fieldset.questions:contains(\"#{question}\")').closest('div.question');
|
93
|
+
var prev_question_in_section = to_item.prev('div.question');
|
94
|
+
if (prev_question_in_section.length < 1) {
|
95
|
+
prev_button_bar = to_item.closest('div.sortable_questions').prev('div.question_buttons_top');
|
96
|
+
prev_button = prev_button_bar.find('button:contains(\"Paste Question\")')[0];
|
97
|
+
} else {
|
98
|
+
prev_button = prev_question_in_section.find('button:contains(\"Paste Question\")')[0];
|
99
|
+
}
|
100
|
+
prev_button.click();
|
101
|
+
|
102
|
+
"""
|
103
|
+
end
|
104
|
+
|
105
|
+
def _click_next_paste_question_button_js(question)
|
106
|
+
"""
|
107
|
+
$('fieldset.questions:contains(\"#{question}\")').closest('div.question')
|
108
|
+
.find('button:contains(\"Paste Question\")')[0].click();
|
109
|
+
"""
|
110
|
+
end
|
111
|
+
|
112
|
+
def _click_prev_paste_section_button_js(section)
|
113
|
+
"""
|
114
|
+
$('div.survey_section:contains(\"#{section}\") div.section_top_button_bar button:contains(\"Paste Section\")')[0].click();
|
115
|
+
"""
|
116
|
+
end
|
117
|
+
|
118
|
+
def _click_next_paste_section_button_js(section)
|
119
|
+
"""
|
120
|
+
$('div.survey_section:contains(\"#{section}\") div.section_button_bar_bottom_inner button:contains(\"Paste Section\")')[0].click();
|
121
|
+
"""
|
122
|
+
end
|
123
|
+
|
124
|
+
def _check_order(order)
|
125
|
+
exp = ".*"
|
126
|
+
order.split("").each do |question|
|
127
|
+
exp += "Unique #{@item_name} #{question}.*"
|
128
|
+
end
|
129
|
+
regexp = Regexp.new exp
|
130
|
+
#Then I see the questions in the correct order
|
131
|
+
expect(page).to have_content(regexp)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
shared_context "question_cut_and_paste" do
|
136
|
+
include CutAndPaste
|
137
|
+
def initialize
|
138
|
+
@scenario = construct_scenario
|
139
|
+
@item_name = "Question"
|
140
|
+
end
|
141
|
+
|
142
|
+
def _cut_item(question)
|
143
|
+
cut_question(question)
|
144
|
+
end
|
145
|
+
|
146
|
+
def _paste_item(position, question)
|
147
|
+
paste_question(position, question)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
shared_context "section_cut_and_paste" do
|
153
|
+
include CutAndPaste
|
154
|
+
def initialize
|
155
|
+
@item_name = "Section"
|
156
|
+
@scenario = construct_scenario
|
157
|
+
end
|
158
|
+
|
159
|
+
def _cut_item(section)
|
160
|
+
cut_section(section)
|
161
|
+
end
|
162
|
+
|
163
|
+
def _paste_item(position, section)
|
164
|
+
paste_section(position, section)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
shared_context "question_and_section_cut_and_paste" do
|
169
|
+
include CutAndPaste
|
170
|
+
end
|