require "rails_helper" describe "Debates" do scenario "Disabled with a feature flag" do Setting["process.debates"] = nil expect { visit debates_path }.to raise_exception(FeatureFlags::FeatureDisabled) end context "Concerns" do it_behaves_like "notifiable in-app", :debate it_behaves_like "relationable", Debate it_behaves_like "remotely_translatable", :debate, "debates_path", {} it_behaves_like "remotely_translatable", :debate, "debate_path", { "id": "id" } it_behaves_like "flaggable", :debate end scenario "Index" do debates = [create(:debate), create(:debate), create(:debate)] visit debates_path expect(page).to have_selector("#debates .debate", count: 3) debates.each do |debate| within("#debates") do expect(page).to have_content debate.title expect(page).to have_content debate.description expect(page).to have_css("a[href='#{debate_path(debate)}']", text: debate.title) end end end scenario "Paginated Index" do per_page = 3 allow(Debate).to receive(:default_per_page).and_return(per_page) (per_page + 2).times { create(:debate) } visit debates_path expect(page).to have_selector("#debates .debate", count: per_page) within("ul.pagination") do expect(page).to have_content("1") expect(page).to have_content("2") expect(page).not_to have_content("3") click_link "Next", exact: false end expect(page).to have_selector("#debates .debate", count: 2) end scenario "Index view mode" do debates = [create(:debate), create(:debate), create(:debate)] visit debates_path click_button "View mode" click_link "List" debates.each do |debate| within("#debates") do expect(page).to have_link debate.title expect(page).not_to have_content debate.description end end click_button "View mode" click_link "Cards" debates.each do |debate| within("#debates") do expect(page).to have_link debate.title expect(page).to have_content debate.description end end end scenario "Show" do debate = create(:debate) visit debate_path(debate) expect(page).to have_content debate.title expect(page).to have_content "Debate description" expect(page).to have_content debate.author.name expect(page).to have_content I18n.l(debate.created_at.to_date) expect(page).to have_selector(avatar(debate.author.name)) expect(page.html).to include "
This is
" check "debate_terms_of_service" click_button "Start a debate" expect(page).to have_content "Debate created successfully." expect(page).to have_content "Testing an attack" expect(page.html).to include "This is alert('an attack');
" expect(page.html).not_to include "" expect(page.html).not_to include "<p>This is" end scenario "Autolinking is applied to description" do author = create(:user) login_as(author) visit new_debate_path fill_in "Debate title", with: "Testing auto link" fill_in "Initial debate text", with: "This is a link www.example.org
" check "debate_terms_of_service" click_button "Start a debate" expect(page).to have_content "Debate created successfully." expect(page).to have_content "Testing auto link" expect(page).to have_link("www.example.org", href: "http://www.example.org") end scenario "JS injection is prevented but autolinking is respected" do author = create(:user) js_injection_string = " click me http://example.org" login_as(author) visit new_debate_path fill_in "Debate title", with: "Testing auto link" fill_in "Initial debate text", with: js_injection_string check "debate_terms_of_service" click_button "Start a debate" expect(page).to have_content "Debate created successfully." expect(page).to have_content "Testing auto link" expect(page).to have_link("http://example.org", href: "http://example.org") expect(page).not_to have_link("click me") expect(page.html).not_to include "" click_link "Edit" expect(page).to have_current_path(edit_debate_path(Debate.last)) expect(page).not_to have_link("click me") expect(page.html).not_to include "" end scenario "Update should not be posible if logged user is not the author" do debate = create(:debate) expect(debate).to be_editable login_as(create(:user)) visit edit_debate_path(debate) expect(page).not_to have_current_path(edit_debate_path(debate)) expect(page).to have_current_path(root_path) expect(page).to have_content "You do not have permission to carry out the action 'edit' on debate." end scenario "Update should not be posible if debate is not editable" do Setting["max_votes_for_debate_edit"] = 2 debate = create(:debate, voters: Array.new(3) { create(:user) }) expect(debate).not_to be_editable login_as(debate.author) visit edit_debate_path(debate) expect(page).not_to have_current_path(edit_debate_path(debate)) expect(page).to have_current_path(root_path) expect(page).to have_content "You do not have permission to" end scenario "Update should be posible for the author of an editable debate" do debate = create(:debate) login_as(debate.author) visit edit_debate_path(debate) expect(page).to have_current_path(edit_debate_path(debate)) fill_in "Debate title", with: "End child poverty" fill_in "Initial debate text", with: "Let's do something to end child poverty" click_button "Save changes" expect(page).to have_content "Debate updated successfully." expect(page).to have_content "End child poverty" expect(page).to have_content "Let's do something to end child poverty" end scenario "Errors on update" do debate = create(:debate) login_as(debate.author) visit edit_debate_path(debate) fill_in "Debate title", with: "" click_button "Save changes" expect(page).to have_content error_message end describe "Debate index order filters" do scenario "Default order is hot_score", :js do best_debate = create(:debate, title: "Best") best_debate.update_column(:hot_score, 10) worst_debate = create(:debate, title: "Worst") worst_debate.update_column(:hot_score, 2) medium_debate = create(:debate, title: "Medium") medium_debate.update_column(:hot_score, 5) visit debates_path expect(best_debate.title).to appear_before(medium_debate.title) expect(medium_debate.title).to appear_before(worst_debate.title) end scenario "Debates are ordered by confidence_score", :js do best_debate = create(:debate, title: "Best") best_debate.update_column(:confidence_score, 10) worst_debate = create(:debate, title: "Worst") worst_debate.update_column(:confidence_score, 2) medium_debate = create(:debate, title: "Medium") medium_debate.update_column(:confidence_score, 5) visit debates_path click_link "highest rated" expect(page).to have_selector("a.is-active", text: "highest rated") within "#debates" do expect(best_debate.title).to appear_before(medium_debate.title) expect(medium_debate.title).to appear_before(worst_debate.title) end expect(current_url).to include("order=confidence_score") expect(current_url).to include("page=1") end scenario "Debates are ordered by newest", :js do best_debate = create(:debate, title: "Best", created_at: Time.current) medium_debate = create(:debate, title: "Medium", created_at: Time.current - 1.hour) worst_debate = create(:debate, title: "Worst", created_at: Time.current - 1.day) visit debates_path click_link "newest" expect(page).to have_selector("a.is-active", text: "newest") within "#debates" do expect(best_debate.title).to appear_before(medium_debate.title) expect(medium_debate.title).to appear_before(worst_debate.title) end expect(current_url).to include("order=created_at") expect(current_url).to include("page=1") end context "Recommendations" do let!(:best_debate) { create(:debate, title: "Best", cached_votes_total: 10, tag_list: "Sport") } let!(:medium_debate) { create(:debate, title: "Medium", cached_votes_total: 5, tag_list: "Sport") } let!(:worst_debate) { create(:debate, title: "Worst", cached_votes_total: 1, tag_list: "Sport") } scenario "can't be sorted if there's no logged user" do visit debates_path expect(page).not_to have_selector("a", text: "recommendations") end scenario "are shown on index header when account setting is enabled" do proposal = create(:proposal, tag_list: "Sport") user = create(:user, followables: [proposal]) login_as(user) visit debates_path expect(page).to have_css(".recommendation", count: 3) expect(page).to have_link "Best" expect(page).to have_link "Medium" expect(page).to have_link "Worst" expect(page).to have_link "See more recommendations" end scenario "should display text when there are no results" do proposal = create(:proposal, tag_list: "Distinct_to_sport") user = create(:user, followables: [proposal]) login_as(user) visit debates_path click_link "recommendations" expect(page).to have_content "There are no debates related to your interests" end scenario "should display text when user has no related interests" do user = create(:user) login_as(user) visit debates_path click_link "recommendations" expect(page).to have_content "Follow proposals so we can give you recommendations" end scenario "can be sorted when there's a logged user" do proposal = create(:proposal, tag_list: "Sport") user = create(:user, followables: [proposal]) login_as(user) visit debates_path click_link "recommendations" expect(page).to have_selector("a.is-active", text: "recommendations") within "#debates" do expect(best_debate.title).to appear_before(medium_debate.title) expect(medium_debate.title).to appear_before(worst_debate.title) end expect(current_url).to include("order=recommendations") expect(current_url).to include("page=1") end scenario "are not shown if account setting is disabled" do proposal = create(:proposal, tag_list: "Sport") user = create(:user, recommended_debates: false, followables: [proposal]) login_as(user) visit debates_path expect(page).not_to have_css(".recommendation", count: 3) expect(page).not_to have_link("recommendations") end scenario "are automatically disabled when dismissed from index", :js do proposal = create(:proposal, tag_list: "Sport") user = create(:user, followables: [proposal]) login_as(user) visit debates_path within("#recommendations") do expect(page).to have_content("Best") expect(page).to have_content("Worst") expect(page).to have_content("Medium") expect(page).to have_css(".recommendation", count: 3) accept_confirm { click_link "Hide recommendations" } end expect(page).not_to have_link("recommendations") expect(page).not_to have_css(".recommendation", count: 3) expect(page).to have_content("Recommendations for debates are now disabled for this account") user.reload visit account_path expect(find("#account_recommended_debates")).not_to be_checked expect(user.recommended_debates).to be(false) end end end context "Search" do context "Basic search" do scenario "Search by text" do debate1 = create(:debate, title: "Get Schwifty") debate2 = create(:debate, title: "Schwifty Hello") debate3 = create(:debate, title: "Do not show me") visit debates_path within(".expanded #search_form") do fill_in "search", with: "Schwifty" click_button "Search" end within("#debates") do expect(page).to have_css(".debate", count: 2) expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end scenario "Maintain search criteria" do visit debates_path within(".expanded #search_form") do fill_in "search", with: "Schwifty" click_button "Search" end expect(page).to have_selector("input[name='search'][value='Schwifty']") end end context "Advanced search" do scenario "Search by text", :js do debate1 = create(:debate, title: "Get Schwifty") debate2 = create(:debate, title: "Schwifty Hello") debate3 = create(:debate, title: "Do not show me") visit debates_path click_link "Advanced search" fill_in "Write the text", with: "Schwifty" click_button "Filter" expect(page).to have_content("There are 2 debates") within("#debates") do expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end context "Search by author type" do scenario "Public employee", :js do ana = create :user, official_level: 1 john = create :user, official_level: 2 debate1 = create(:debate, author: ana) debate2 = create(:debate, author: ana) debate3 = create(:debate, author: john) visit debates_path click_link "Advanced search" select Setting["official_level_1_name"], from: "advanced_search_official_level" click_button "Filter" expect(page).to have_content("There are 2 debates") within("#debates") do expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end scenario "Municipal Organization", :js do ana = create :user, official_level: 2 john = create :user, official_level: 3 debate1 = create(:debate, author: ana) debate2 = create(:debate, author: ana) debate3 = create(:debate, author: john) visit debates_path click_link "Advanced search" select Setting["official_level_2_name"], from: "advanced_search_official_level" click_button "Filter" expect(page).to have_content("There are 2 debates") within("#debates") do expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end scenario "General director", :js do ana = create :user, official_level: 3 john = create :user, official_level: 4 debate1 = create(:debate, author: ana) debate2 = create(:debate, author: ana) debate3 = create(:debate, author: john) visit debates_path click_link "Advanced search" select Setting["official_level_3_name"], from: "advanced_search_official_level" click_button "Filter" expect(page).to have_content("There are 2 debates") within("#debates") do expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end scenario "City councillor", :js do ana = create :user, official_level: 4 john = create :user, official_level: 5 debate1 = create(:debate, author: ana) debate2 = create(:debate, author: ana) debate3 = create(:debate, author: john) visit debates_path click_link "Advanced search" select Setting["official_level_4_name"], from: "advanced_search_official_level" click_button "Filter" expect(page).to have_content("There are 2 debates") within("#debates") do expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end scenario "Mayoress", :js do ana = create :user, official_level: 5 john = create :user, official_level: 4 debate1 = create(:debate, author: ana) debate2 = create(:debate, author: ana) debate3 = create(:debate, author: john) visit debates_path click_link "Advanced search" select Setting["official_level_5_name"], from: "advanced_search_official_level" click_button "Filter" expect(page).to have_content("There are 2 debates") within("#debates") do expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end end context "Search by date" do context "Predefined date ranges" do scenario "Last day", :js do debate1 = create(:debate, created_at: 1.minute.ago) debate2 = create(:debate, created_at: 1.hour.ago) debate3 = create(:debate, created_at: 2.days.ago) visit debates_path click_link "Advanced search" select "Last 24 hours", from: "js-advanced-search-date-min" click_button "Filter" within("#debates") do expect(page).to have_css(".debate", count: 2) expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end scenario "Last week", :js do debate1 = create(:debate, created_at: 1.day.ago) debate2 = create(:debate, created_at: 5.days.ago) debate3 = create(:debate, created_at: 8.days.ago) visit debates_path click_link "Advanced search" select "Last week", from: "js-advanced-search-date-min" click_button "Filter" within("#debates") do expect(page).to have_css(".debate", count: 2) expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end scenario "Last month", :js do debate1 = create(:debate, created_at: 10.days.ago) debate2 = create(:debate, created_at: 20.days.ago) debate3 = create(:debate, created_at: 33.days.ago) visit debates_path click_link "Advanced search" select "Last month", from: "js-advanced-search-date-min" click_button "Filter" within("#debates") do expect(page).to have_css(".debate", count: 2) expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end scenario "Last year", :js do debate1 = create(:debate, created_at: 300.days.ago) debate2 = create(:debate, created_at: 350.days.ago) debate3 = create(:debate, created_at: 370.days.ago) visit debates_path click_link "Advanced search" select "Last year", from: "js-advanced-search-date-min" click_button "Filter" within("#debates") do expect(page).to have_css(".debate", count: 2) expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end end scenario "Search by custom date range", :js do debate1 = create(:debate, created_at: 2.days.ago) debate2 = create(:debate, created_at: 3.days.ago) debate3 = create(:debate, created_at: 9.days.ago) visit debates_path click_link "Advanced search" select "Customized", from: "js-advanced-search-date-min" fill_in "advanced_search_date_min", with: 7.days.ago fill_in "advanced_search_date_max", with: 1.day.ago click_button "Filter" within("#debates") do expect(page).to have_css(".debate", count: 2) expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).not_to have_content(debate3.title) end end scenario "Search by custom invalid date range", :js do debate1 = create(:debate, created_at: 2.years.ago) debate2 = create(:debate, created_at: 3.days.ago) debate3 = create(:debate, created_at: 9.days.ago) visit debates_path click_link "Advanced search" select "Customized", from: "js-advanced-search-date-min" fill_in "advanced_search_date_min", with: "9" fill_in "advanced_search_date_max", with: "444444444" click_button "Filter" within("#debates") do expect(page).to have_css(".debate", count: 3) expect(page).to have_content(debate1.title) expect(page).to have_content(debate2.title) expect(page).to have_content(debate3.title) end end scenario "Search by multiple filters", :js do ana = create :user, official_level: 1 john = create :user, official_level: 1 create(:debate, title: "Get Schwifty", author: ana, created_at: 1.minute.ago) create(:debate, title: "Hello Schwifty", author: john, created_at: 2.days.ago) create(:debate, title: "Save the forest") visit debates_path click_link "Advanced search" fill_in "Write the text", with: "Schwifty" select Setting["official_level_1_name"], from: "advanced_search_official_level" select "Last 24 hours", from: "js-advanced-search-date-min" click_button "Filter" within("#debates") do expect(page).to have_css(".debate", count: 1) expect(page).to have_content "Get Schwifty" end end scenario "Maintain advanced search criteria", :js do visit debates_path click_link "Advanced search" fill_in "Write the text", with: "Schwifty" select Setting["official_level_1_name"], from: "advanced_search_official_level" select "Last 24 hours", from: "js-advanced-search-date-min" click_button "Filter" within "#js-advanced-search" do expect(page).to have_selector("input[name='search'][value='Schwifty']") expect(page).to have_select("advanced_search[official_level]", selected: Setting["official_level_1_name"]) expect(page).to have_select("advanced_search[date_min]", selected: "Last 24 hours") end end scenario "Maintain custom date search criteria", :js do visit debates_path click_link "Advanced search" select "Customized", from: "js-advanced-search-date-min" fill_in "advanced_search_date_min", with: 7.days.ago.strftime("%d/%m/%Y") fill_in "advanced_search_date_max", with: 1.day.ago.strftime("%d/%m/%Y") click_button "Filter" within "#js-advanced-search" do expect(page).to have_select("advanced_search[date_min]", selected: "Customized") expect(page).to have_selector("input[name='advanced_search[date_min]'][value*='#{7.days.ago.strftime("%d/%m/%Y")}']") expect(page).to have_selector("input[name='advanced_search[date_max]'][value*='#{1.day.ago.strftime("%d/%m/%Y")}']") end end end end scenario "Order by relevance by default", :js do create(:debate, title: "Show you got", cached_votes_up: 10) create(:debate, title: "Show what you got", cached_votes_up: 1) create(:debate, title: "Show you got", cached_votes_up: 100) visit debates_path fill_in "search", with: "Show you got" click_button "Search" expect(page).to have_selector("a.is-active", text: "relevance") within("#debates") do expect(all(".debate")[0].text).to match "Show you got" expect(all(".debate")[1].text).to match "Show you got" expect(all(".debate")[2].text).to match "Show what you got" end end scenario "Reorder results maintaing search", :js do create(:debate, title: "Show you got", cached_votes_up: 10, created_at: 1.week.ago) create(:debate, title: "Show what you got", cached_votes_up: 1, created_at: 1.month.ago) create(:debate, title: "Show you got", cached_votes_up: 100, created_at: Time.current) create(:debate, title: "Do not display", cached_votes_up: 1, created_at: 1.week.ago) visit debates_path fill_in "search", with: "Show you got" click_button "Search" click_link "newest" expect(page).to have_selector("a.is-active", text: "newest") within("#debates") do expect(all(".debate")[0].text).to match "Show you got" expect(all(".debate")[1].text).to match "Show you got" expect(all(".debate")[2].text).to match "Show what you got" expect(page).not_to have_content "Do not display" end end scenario "Reorder by recommendations results maintaing search" do proposal = create(:proposal, tag_list: "Sport") user = create(:user, recommended_debates: true, followables: [proposal]) create(:debate, title: "Show you got", cached_votes_total: 10, tag_list: "Sport") create(:debate, title: "Show what you got", cached_votes_total: 1, tag_list: "Sport") create(:debate, title: "Do not display with same tag", cached_votes_total: 100, tag_list: "Sport") create(:debate, title: "Do not display", cached_votes_total: 1) login_as(user) visit debates_path fill_in "search", with: "Show you got" click_button "Search" click_link "recommendations" expect(page).to have_selector("a.is-active", text: "recommendations") within("#debates") do expect(all(".debate")[0].text).to match "Show you got" expect(all(".debate")[1].text).to match "Show what you got" expect(page).not_to have_content "Do not display with same tag" expect(page).not_to have_content "Do not display" end end scenario "After a search do not show featured debates" do create_featured_debates create(:debate, title: "Abcdefghi") visit debates_path within(".expanded #search_form") do fill_in "search", with: "Abcdefghi" click_button "Search" end expect(page).not_to have_selector("#debates .debate-featured") expect(page).not_to have_selector("#featured-debates") end end scenario "Conflictive" do good_debate = create(:debate) conflictive_debate = create(:debate, :conflictive) visit debate_path(conflictive_debate) expect(page).to have_content "This debate has been flagged as inappropriate by several users." visit debate_path(good_debate) expect(page).not_to have_content "This debate has been flagged as inappropriate by several users." end scenario "Erased author" do user = create(:user) debate = create(:debate, author: user) user.erase visit debates_path expect(page).to have_content("User deleted") visit debate_path(debate) expect(page).to have_content("User deleted") end context "Filter" do context "By geozone" do let(:california) { Geozone.create(name: "California") } let(:new_york) { Geozone.create(name: "New York") } before do create(:debate, geozone: california, title: "Bigger sequoias") create(:debate, geozone: california, title: "Green beach") create(:debate, geozone: new_york, title: "Sully monument") end pending "From map" do visit debates_path click_link "map" within("#html_map") do url = find("area[title='California']")[:href] visit url end within("#debates") do expect(page).to have_css(".debate", count: 2) expect(page).to have_content("Bigger sequoias") expect(page).to have_content("Green beach") expect(page).not_to have_content("Sully monument") end end pending "From geozone list" do visit debates_path click_link "map" within("#geozones") do click_link "California" end within("#debates") do expect(page).to have_css(".debate", count: 2) expect(page).to have_content("Bigger sequoias") expect(page).to have_content("Green beach") expect(page).not_to have_content("Sully monument") end end pending "From debate" do debate = create(:debate, geozone: california, title: "Surf college") visit debate_path(debate) within("#geozone") do click_link "California" end within("#debates") do expect(page).to have_css(".debate", count: 3) expect(page).to have_content("Surf college") expect(page).to have_content("Bigger sequoias") expect(page).to have_content("Green beach") expect(page).not_to have_content("Sully monument") end end end end context "Suggesting debates" do scenario "Shows up to 5 suggestions", :js do create(:debate, title: "First debate has 1 vote", cached_votes_up: 1) create(:debate, title: "Second debate has 2 votes", cached_votes_up: 2) create(:debate, title: "Third debate has 3 votes", cached_votes_up: 3) create(:debate, title: "This one has 4 votes", description: "This is the fourth debate", cached_votes_up: 4) create(:debate, title: "Fifth debate has 5 votes", cached_votes_up: 5) create(:debate, title: "Sixth debate has 6 votes", description: "This is the sixth debate", cached_votes_up: 6) create(:debate, title: "This has seven votes, and is not suggest", description: "This is the seven", cached_votes_up: 7) login_as(create(:user)) visit new_debate_path fill_in "Debate title", with: "debate" check "debate_terms_of_service" within("div.js-suggest") do expect(page).to have_content "You are seeing 5 of 6 debates containing the term 'debate'" end end scenario "No found suggestions", :js do create(:debate, title: "First debate has 10 vote", cached_votes_up: 10) create(:debate, title: "Second debate has 2 votes", cached_votes_up: 2) login_as(create(:user)) visit new_debate_path fill_in "Debate title", with: "proposal" check "debate_terms_of_service" within("div.js-suggest") do expect(page).not_to have_content "You are seeing" end end end scenario "Mark/Unmark a debate as featured" do debate = create(:debate) login_as(create(:administrator).user) visit debates_path within("#debates") do expect(page).not_to have_content "Featured" end click_link debate.title click_link "Featured" visit debates_path within("#debates") do expect(page).to have_content "Featured" end within("#featured-debates") do expect(page).to have_content debate.title end visit debate_path(debate) click_link "Unmark featured" within("#debates") do expect(page).not_to have_content "Featured" end end scenario "Index include featured debates" do create(:debate, featured_at: Time.current) create(:debate) login_as(create(:administrator).user) visit debates_path within("#debates") do expect(page).to have_content("Featured") end end scenario "Index do not show featured debates if none is marked as featured" do create(:debate) create(:debate) login_as(create(:administrator).user) visit debates_path within("#debates") do expect(page).not_to have_content("Featured") end end end