System tests are used to test the application from the user's point of view. To test for specific exceptions, particularly regarding authorization permissions, controller tests fit better. Another option would be to test the page displayed shows a certain text, like "Internal server error". I'm choosing controller tests because they're faster and we're basically testing the same scenario many times and we've already got a test checking what happens when users access a page raising an exception.
189 lines
5.5 KiB
Ruby
189 lines
5.5 KiB
Ruby
require "rails_helper"
|
|
|
|
describe "Admin legislation questions", :admin do
|
|
let!(:process) { create(:legislation_process, title: "An example legislation process") }
|
|
|
|
context "Index" do
|
|
scenario "Displaying legislation process questions" do
|
|
create(:legislation_question, process: process, title: "Question 1")
|
|
create(:legislation_question, process: process, title: "Question 2")
|
|
|
|
visit admin_legislation_processes_path(filter: "all")
|
|
|
|
within("tr", text: "An example legislation process") { click_link "Edit" }
|
|
click_link "Debate"
|
|
|
|
expect(page).to have_content("Question 1")
|
|
expect(page).to have_content("Question 2")
|
|
end
|
|
end
|
|
|
|
context "Create" do
|
|
scenario "Valid legislation question" do
|
|
visit admin_root_path
|
|
|
|
within("#side_menu") do
|
|
click_link "Collaborative Legislation"
|
|
end
|
|
|
|
click_link "All"
|
|
|
|
within("tr", text: "An example legislation process") { click_link "Edit" }
|
|
click_link "Debate"
|
|
|
|
click_link "Create question"
|
|
|
|
fill_in "Question", with: "Question 3"
|
|
click_button "Create question"
|
|
|
|
expect(page).to have_content "Question 3"
|
|
end
|
|
end
|
|
|
|
context "Update" do
|
|
scenario "Valid legislation question", :js do
|
|
create(:legislation_question, title: "Question 2", process: process)
|
|
|
|
visit admin_root_path
|
|
|
|
within("#side_menu") do
|
|
click_link "Collaborative Legislation"
|
|
end
|
|
|
|
click_link "All"
|
|
|
|
expect(page).not_to have_link "All"
|
|
|
|
within("tr", text: "An example legislation process") { click_link "Edit" }
|
|
click_link "Debate"
|
|
click_link "Question 2"
|
|
|
|
fill_in "Question", with: "Question 2b"
|
|
click_button "Save changes"
|
|
|
|
expect(page).to have_content "Question 2b"
|
|
end
|
|
end
|
|
|
|
context "Delete" do
|
|
scenario "Legislation question", :js do
|
|
create(:legislation_question, title: "Question 1", process: process)
|
|
question = create(:legislation_question, title: "Question 2", process: process)
|
|
question_option = create(:legislation_question_option, question: question, value: "Yes")
|
|
create(:legislation_answer, question: question, question_option: question_option)
|
|
|
|
visit edit_admin_legislation_process_question_path(process, question)
|
|
|
|
click_link "Delete"
|
|
|
|
expect(page).to have_content "Questions"
|
|
expect(page).to have_content "Question 1"
|
|
expect(page).not_to have_content "Question 2"
|
|
end
|
|
end
|
|
|
|
context "Legislation options" do
|
|
let!(:question) { create(:legislation_question) }
|
|
|
|
let(:edit_question_url) do
|
|
edit_admin_legislation_process_question_path(question.process, question)
|
|
end
|
|
|
|
let(:field_en) { fields_for(:en).first }
|
|
let(:field_es) { fields_for(:es).first }
|
|
|
|
def fields_for(locale)
|
|
within("#nested_question_options") do
|
|
page.all(
|
|
"[data-locale='#{locale}'] [id^='legislation_question_question_option'][id$='value']"
|
|
)
|
|
end
|
|
end
|
|
|
|
scenario "Edit an existing option", :js do
|
|
create(:legislation_question_option, question: question, value: "Original")
|
|
|
|
visit edit_question_url
|
|
find("#nested_question_options input").set("Changed")
|
|
click_button "Save changes"
|
|
|
|
expect(page).not_to have_css "#error_explanation"
|
|
|
|
visit edit_question_url
|
|
expect(page).to have_field(field_en[:id], with: "Changed")
|
|
end
|
|
|
|
scenario "Remove an option", :js do
|
|
create(:legislation_question_option, question: question, value: "Yes")
|
|
create(:legislation_question_option, question: question, value: "No")
|
|
|
|
visit edit_question_url
|
|
|
|
expect(page).to have_field fields_for(:en).first[:id], with: "Yes"
|
|
expect(page).to have_field fields_for(:en).last[:id], with: "No"
|
|
|
|
page.first(:link, "Remove option").click
|
|
|
|
expect(page).not_to have_field fields_for(:en).first[:id], with: "Yes"
|
|
expect(page).to have_field fields_for(:en).last[:id], with: "No"
|
|
|
|
click_button "Save changes"
|
|
visit edit_question_url
|
|
|
|
expect(page).not_to have_field fields_for(:en).first[:id], with: "Yes"
|
|
expect(page).to have_field fields_for(:en).last[:id], with: "No"
|
|
end
|
|
|
|
context "Special translation behaviour" do
|
|
before do
|
|
question.update!(title_en: "Title in English", title_es: "Título en Español")
|
|
end
|
|
|
|
scenario "Add translation for question option", :js do
|
|
visit edit_question_url
|
|
|
|
click_on "Add option"
|
|
|
|
find("#nested_question_options input").set("Option 1")
|
|
|
|
select "Español", from: :select_language
|
|
|
|
find("#nested_question_options input").set("Opción 1")
|
|
|
|
click_button "Save changes"
|
|
visit edit_question_url
|
|
|
|
expect(page).to have_field(field_en[:id], with: "Option 1")
|
|
|
|
select "Español", from: :select_language
|
|
|
|
expect(page).to have_field(field_es[:id], with: "Opción 1")
|
|
end
|
|
|
|
scenario "Add new question option after changing active locale", :js do
|
|
visit edit_question_url
|
|
|
|
select "Español", from: :select_language
|
|
|
|
click_on "Add option"
|
|
|
|
find("#nested_question_options input").set("Opción 1")
|
|
|
|
select "English", from: :select_language
|
|
|
|
find("#nested_question_options input").set("Option 1")
|
|
|
|
click_button "Save changes"
|
|
|
|
visit edit_question_url
|
|
|
|
expect(page).to have_field(field_en[:id], with: "Option 1")
|
|
|
|
select "Español", from: :select_language
|
|
|
|
expect(page).to have_field(field_es[:id], with: "Opción 1")
|
|
end
|
|
end
|
|
end
|
|
end
|