JavaScript is used by about 98% of web users, so by testing without it enabled, we're only testing that the application works for a very reduced number of users. We proceeded this way in the past because CONSUL started using Rails 4.2 and truncating the database between JavaScript tests with database cleaner, which made these tests terribly slow. When we upgraded to Rails 5.1 and introduced system tests, we started using database transactions in JavaScript tests, making these tests much faster. So now we can use JavaScript tests everywhere without critically slowing down our test suite.
227 lines
7.3 KiB
Ruby
227 lines
7.3 KiB
Ruby
require "rails_helper"
|
|
|
|
describe "Proposals" do
|
|
before do
|
|
login_as_manager
|
|
end
|
|
|
|
context "Create" do
|
|
scenario "Creating proposals on behalf of someone" do
|
|
user = create(:user, :level_two)
|
|
login_managed_user(user)
|
|
|
|
click_link "Create proposal"
|
|
|
|
within(".account-info") do
|
|
expect(page).to have_content "Identified as"
|
|
expect(page).to have_content user.username.to_s
|
|
expect(page).to have_content user.email.to_s
|
|
expect(page).to have_content user.document_number.to_s
|
|
end
|
|
|
|
fill_in "Proposal title", with: "Help refugees"
|
|
fill_in "Proposal summary", with: "In summary, what we want is..."
|
|
fill_in_ckeditor "Proposal text", with: "This is very important because..."
|
|
fill_in "proposal_video_url", with: "https://www.youtube.com/watch?v=yRYFKcMa_Ek"
|
|
check "proposal_terms_of_service"
|
|
|
|
click_button "Create proposal"
|
|
|
|
expect(page).to have_content "Proposal created successfully."
|
|
|
|
expect(page).to have_content "Help refugees"
|
|
expect(page).to have_content "In summary, what we want is..."
|
|
expect(page).to have_content "This is very important because..."
|
|
expect(page).to have_content "https://www.youtube.com/watch?v=yRYFKcMa_Ek"
|
|
expect(page).to have_content user.name
|
|
expect(page).to have_content I18n.l(Proposal.last.created_at.to_date)
|
|
|
|
expect(page).to have_current_path(management_proposal_path(Proposal.last))
|
|
end
|
|
|
|
scenario "Should not allow unverified users to create proposals" do
|
|
user = create(:user)
|
|
login_managed_user(user)
|
|
|
|
click_link "Create proposal"
|
|
|
|
expect(page).to have_content "User is not verified"
|
|
end
|
|
end
|
|
|
|
context "Show" do
|
|
scenario "When path matches the friendly url" do
|
|
proposal = create(:proposal)
|
|
|
|
user = create(:user, :level_two)
|
|
login_managed_user(user)
|
|
|
|
right_path = management_proposal_path(proposal)
|
|
visit right_path
|
|
|
|
expect(page).to have_current_path(right_path)
|
|
end
|
|
|
|
scenario "When path does not match the friendly url" do
|
|
proposal = create(:proposal)
|
|
|
|
user = create(:user, :level_two)
|
|
login_managed_user(user)
|
|
|
|
right_path = management_proposal_path(proposal)
|
|
old_path = "#{management_proposals_path}/#{proposal.id}-something-else"
|
|
visit old_path
|
|
|
|
expect(page).not_to have_current_path(old_path)
|
|
expect(page).to have_current_path(right_path)
|
|
end
|
|
|
|
scenario "Successful proposal" do
|
|
proposal = create(:proposal, :successful, title: "Success!")
|
|
|
|
login_managed_user(create(:user, :level_two))
|
|
visit management_proposal_path(proposal)
|
|
|
|
expect(page).to have_content("Success!")
|
|
end
|
|
end
|
|
|
|
scenario "Searching" do
|
|
proposal1 = create(:proposal, title: "Show me what you got")
|
|
proposal2 = create(:proposal, title: "Get Schwifty")
|
|
|
|
user = create(:user, :level_two)
|
|
login_managed_user(user)
|
|
|
|
click_link "Support proposals"
|
|
|
|
fill_in "search", with: "what you got"
|
|
click_button "Search"
|
|
|
|
expect(page).to have_current_path(management_proposals_path, ignore_query: true)
|
|
|
|
within(".proposals-list") do
|
|
expect(page).to have_css(".proposal", count: 1)
|
|
expect(page).to have_content(proposal1.title)
|
|
expect(page).to have_content(proposal1.summary)
|
|
expect(page).not_to have_content(proposal2.title)
|
|
expect(page).to have_css("a[href='#{management_proposal_path(proposal1)}']", text: proposal1.title)
|
|
end
|
|
end
|
|
|
|
scenario "Listing" do
|
|
proposal1 = create(:proposal, title: "Show me what you got")
|
|
proposal2 = create(:proposal, title: "Get Schwifty")
|
|
|
|
user = create(:user, :level_two)
|
|
login_managed_user(user)
|
|
|
|
click_link "Support proposals"
|
|
|
|
expect(page).to have_current_path(management_proposals_path)
|
|
|
|
within(".account-info") do
|
|
expect(page).to have_content "Identified as"
|
|
expect(page).to have_content user.username.to_s
|
|
expect(page).to have_content user.email.to_s
|
|
expect(page).to have_content user.document_number.to_s
|
|
end
|
|
|
|
within(".proposals-list") do
|
|
expect(page).to have_css(".proposal", count: 2)
|
|
expect(page).to have_css("a[href='#{management_proposal_path(proposal1)}']", text: proposal1.title)
|
|
expect(page).to have_content(proposal1.summary)
|
|
expect(page).to have_css("a[href='#{management_proposal_path(proposal2)}']", text: proposal2.title)
|
|
expect(page).to have_content(proposal2.summary)
|
|
end
|
|
end
|
|
|
|
context "Voting" do
|
|
let!(:proposal) { create(:proposal) }
|
|
|
|
scenario "Voting proposals on behalf of someone in index view" do
|
|
user = create(:user, :level_two)
|
|
login_managed_user(user)
|
|
|
|
click_link "Support proposals"
|
|
|
|
within(".proposals-list") do
|
|
click_link("Support")
|
|
expect(page).to have_content "1 support"
|
|
expect(page).to have_content "You have already supported this proposal. Share it!"
|
|
end
|
|
|
|
expect(page).to have_current_path(management_proposals_path)
|
|
end
|
|
|
|
scenario "Voting proposals on behalf of someone in show view" do
|
|
user = create(:user, :level_two)
|
|
login_managed_user(user)
|
|
|
|
click_link "Support proposals"
|
|
|
|
within(".proposals-list") { click_link proposal.title }
|
|
expect(page).to have_content proposal.code
|
|
within("#proposal_#{proposal.id}_votes") { click_link("Support") }
|
|
|
|
expect(page).to have_content "1 support"
|
|
expect(page).to have_content "You have already supported this proposal. Share it!"
|
|
expect(page).to have_content "Following"
|
|
expect(page).to have_current_path(management_proposal_path(proposal))
|
|
end
|
|
|
|
scenario "Should not allow unverified users to vote proposals" do
|
|
user = create(:user)
|
|
login_managed_user(user)
|
|
|
|
click_link "Support proposals"
|
|
|
|
expect(page).to have_content "User is not verified"
|
|
end
|
|
end
|
|
|
|
context "Printing" do
|
|
scenario "Printing proposals" do
|
|
6.times { create(:proposal) }
|
|
|
|
click_link "Print proposals"
|
|
|
|
expect(page).to have_css(".proposal", count: 5)
|
|
expect(page).to have_css("a[href='javascript:window.print();']", text: "Print")
|
|
end
|
|
|
|
scenario "Filtering proposals to be printed" do
|
|
worst_proposal = create(:proposal, title: "Worst proposal")
|
|
worst_proposal.update_column(:confidence_score, 2)
|
|
best_proposal = create(:proposal, title: "Best proposal")
|
|
best_proposal.update_column(:confidence_score, 10)
|
|
medium_proposal = create(:proposal, title: "Medium proposal")
|
|
medium_proposal.update_column(:confidence_score, 5)
|
|
|
|
user = create(:user, :level_two)
|
|
login_managed_user(user)
|
|
|
|
click_link "Print proposals"
|
|
|
|
expect(page).to have_selector(".js-order-selector[data-order='confidence_score']")
|
|
|
|
within(".proposals-list") do
|
|
expect(best_proposal.title).to appear_before(medium_proposal.title)
|
|
expect(medium_proposal.title).to appear_before(worst_proposal.title)
|
|
end
|
|
|
|
select "newest", from: "order-selector"
|
|
|
|
expect(page).to have_selector(".js-order-selector[data-order='created_at']")
|
|
|
|
expect(page).to have_current_path(/order=created_at/)
|
|
expect(page).to have_current_path(/page=1/)
|
|
|
|
within(".proposals-list") do
|
|
expect(medium_proposal.title).to appear_before(best_proposal.title)
|
|
expect(best_proposal.title).to appear_before(worst_proposal.title)
|
|
end
|
|
end
|
|
end
|
|
end
|