It could be argued that seeing which proposals a user follows is a good
indicator of which proposals a user has supported, since we're
automatically creating follows for supported proposals since commit
74fbde09f. So now, we're extending the `public_interests` funcionality,
so it only shows elements users are following if they've enabled it.
This is an improvement over using the `public_activity` attribute in two
ways:
* The `public_interests` attribute is disabled by default, so by default
other users won't be able to see what a user is following
* Who has created proposals/debates/investments/comments is public
information, while who is following which elements is not; so enabling
`public_activity` shouldn't imply potentially private information should
be displayed as well
We've considered removing the `public_interests` attribute completely
and just hiding the "following" page for everyone except its owner, but
keeping it provides more compatibility with existing installations.
503 lines
15 KiB
Ruby
503 lines
15 KiB
Ruby
require "rails_helper"
|
|
|
|
describe "Users" do
|
|
describe "Show (public page)" do
|
|
let(:user) { create(:user) }
|
|
|
|
let!(:debates) { 1.times.map { create(:debate, author: user) } }
|
|
let!(:proposals) { 2.times.map { create(:proposal, author: user) } }
|
|
let!(:investments) { 3.times.map { create(:budget_investment, author: user) } }
|
|
let!(:comments) { 4.times.map { create(:comment, user: user) } }
|
|
|
|
scenario "shows user public activity" do
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_content("1 Debate")
|
|
expect(page).to have_content("2 Proposals")
|
|
expect(page).to have_content("3 Investments")
|
|
expect(page).to have_content("4 Comments")
|
|
end
|
|
|
|
scenario "shows only items where user has activity" do
|
|
proposals.each(&:destroy)
|
|
|
|
visit user_path(user)
|
|
|
|
expect(page).not_to have_content("0 Proposals")
|
|
expect(page).to have_content("1 Debate")
|
|
expect(page).to have_content("3 Investments")
|
|
expect(page).to have_content("4 Comments")
|
|
end
|
|
|
|
scenario "default filter is proposals" do
|
|
visit user_path(user)
|
|
|
|
proposals.each do |proposal|
|
|
expect(page).to have_content(proposal.title)
|
|
end
|
|
|
|
debates.each do |debate|
|
|
expect(page).not_to have_content(debate.title)
|
|
end
|
|
|
|
comments.each do |comment|
|
|
expect(page).not_to have_content(comment.body)
|
|
end
|
|
end
|
|
|
|
scenario "shows debates by default if user has no proposals" do
|
|
proposals.each(&:destroy)
|
|
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_content(debates.first.title)
|
|
end
|
|
|
|
scenario "shows investments by default if user has no proposals nor debates" do
|
|
proposals.each(&:destroy)
|
|
debates.each(&:destroy)
|
|
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_content(investments.first.title)
|
|
end
|
|
|
|
scenario "shows comments by default if user has no proposals nor debates nor investments" do
|
|
proposals.each(&:destroy)
|
|
debates.each(&:destroy)
|
|
investments.each(&:destroy)
|
|
|
|
visit user_path(user)
|
|
|
|
comments.each do |comment|
|
|
expect(page).to have_content(comment.body)
|
|
end
|
|
end
|
|
|
|
scenario "filters" do
|
|
visit user_path(user)
|
|
|
|
click_link "1 Debate"
|
|
|
|
debates.each do |debate|
|
|
expect(page).to have_content(debate.title)
|
|
end
|
|
|
|
proposals.each do |proposal|
|
|
expect(page).not_to have_content(proposal.title)
|
|
end
|
|
|
|
comments.each do |comment|
|
|
expect(page).not_to have_content(comment.body)
|
|
end
|
|
|
|
click_link "4 Comments"
|
|
|
|
comments.each do |comment|
|
|
expect(page).to have_content(comment.body)
|
|
end
|
|
|
|
proposals.each do |proposal|
|
|
expect(page).not_to have_content(proposal.title)
|
|
end
|
|
|
|
debates.each do |debate|
|
|
expect(page).not_to have_content(debate.title)
|
|
end
|
|
|
|
click_link "2 Proposals"
|
|
|
|
proposals.each do |proposal|
|
|
expect(page).to have_content(proposal.title)
|
|
end
|
|
|
|
comments.each do |comment|
|
|
expect(page).not_to have_content(comment.body)
|
|
end
|
|
|
|
debates.each do |debate|
|
|
expect(page).not_to have_content(debate.title)
|
|
end
|
|
end
|
|
|
|
scenario "Show alert when user wants to delete a budget investment" do
|
|
user = create(:user, :level_two)
|
|
budget = create(:budget, :accepting)
|
|
budget_investment = create(:budget_investment, author_id: user.id, budget: budget)
|
|
|
|
login_as(user)
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_link budget_investment.title
|
|
|
|
within("#budget_investment_#{budget_investment.id}") do
|
|
dismiss_confirm { click_link "Delete" }
|
|
end
|
|
expect(page).to have_link budget_investment.title
|
|
|
|
within("#budget_investment_#{budget_investment.id}") do
|
|
accept_confirm { click_link "Delete" }
|
|
end
|
|
expect(page).not_to have_link budget_investment.title
|
|
end
|
|
end
|
|
|
|
describe "Public activity" do
|
|
let(:user) { create(:user) }
|
|
|
|
scenario "visible by default" do
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_content(user.username)
|
|
expect(page).not_to have_content("activity list private")
|
|
end
|
|
|
|
scenario "user can hide public page" do
|
|
login_as(user)
|
|
visit account_path
|
|
|
|
uncheck "account_public_activity"
|
|
click_button "Save changes"
|
|
|
|
logout
|
|
|
|
visit user_path(user)
|
|
expect(page).to have_content("activity list private")
|
|
end
|
|
|
|
scenario "is always visible for the owner" do
|
|
login_as(user)
|
|
visit account_path
|
|
|
|
uncheck "account_public_activity"
|
|
click_button "Save changes"
|
|
|
|
visit user_path(user)
|
|
expect(page).not_to have_content("activity list private")
|
|
end
|
|
|
|
scenario "is always visible for admins" do
|
|
login_as(user)
|
|
visit account_path
|
|
|
|
uncheck "account_public_activity"
|
|
click_button "Save changes"
|
|
|
|
logout
|
|
|
|
login_as(create(:administrator).user)
|
|
visit user_path(user)
|
|
expect(page).not_to have_content("activity list private")
|
|
end
|
|
|
|
scenario "is always visible for moderators" do
|
|
login_as(user)
|
|
visit account_path
|
|
|
|
uncheck "account_public_activity"
|
|
click_button "Save changes"
|
|
|
|
logout
|
|
|
|
login_as(create(:moderator).user)
|
|
visit user_path(user)
|
|
expect(page).not_to have_content("activity list private")
|
|
end
|
|
|
|
describe "User email" do
|
|
let(:user) { create(:user) }
|
|
|
|
scenario "is not shown if no user logged in" do
|
|
visit user_path(user)
|
|
expect(page).not_to have_content(user.email)
|
|
end
|
|
|
|
scenario "is not shown if logged in user is a regular user" do
|
|
login_as(create(:user))
|
|
visit user_path(user)
|
|
expect(page).not_to have_content(user.email)
|
|
end
|
|
|
|
scenario "is not shown if logged in user is moderator" do
|
|
login_as(create(:moderator).user)
|
|
visit user_path(user)
|
|
expect(page).not_to have_content(user.email)
|
|
end
|
|
|
|
scenario "is shown if logged in user is admin", :admin do
|
|
visit user_path(user)
|
|
expect(page).to have_content(user.email)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "Special comments" do
|
|
scenario "comments posted as moderator are not visible in user activity" do
|
|
moderator = create(:administrator).user
|
|
comment = create(:comment, user: moderator)
|
|
moderator_comment = create(:comment, user: moderator, moderator_id: moderator.id)
|
|
|
|
visit user_path(moderator)
|
|
expect(page).to have_content("1 Comment")
|
|
expect(page).to have_content(comment.body)
|
|
expect(page).not_to have_content(moderator_comment.body)
|
|
end
|
|
|
|
scenario "comments posted as admin are not visible in user activity" do
|
|
admin = create(:administrator).user
|
|
comment = create(:comment, user: admin)
|
|
admin_comment = create(:comment, user: admin, administrator_id: admin.id)
|
|
|
|
visit user_path(admin)
|
|
expect(page).to have_content(comment.body)
|
|
expect(page).not_to have_content(admin_comment.body)
|
|
end
|
|
|
|
scenario "valuation comments are not visible in user activity" do
|
|
admin = create(:administrator).user
|
|
comment = create(:comment, user: admin)
|
|
investment = create(:budget_investment)
|
|
valuation_comment = create(:comment, :valuation, user: admin, commentable: investment)
|
|
|
|
visit user_path(admin)
|
|
expect(page).to have_content(comment.body)
|
|
expect(page).not_to have_content(valuation_comment.body)
|
|
end
|
|
|
|
scenario "shows only comments from active features" do
|
|
user = create(:user)
|
|
1.times { create(:comment, user: user, commentable: create(:debate)) }
|
|
2.times { create(:comment, user: user, commentable: create(:budget_investment)) }
|
|
4.times { create(:comment, user: user, commentable: create(:proposal)) }
|
|
|
|
visit user_path(user)
|
|
expect(page).to have_content("7 Comments")
|
|
|
|
Setting["process.debates"] = nil
|
|
visit user_path(user)
|
|
expect(page).to have_content("6 Comments")
|
|
|
|
Setting["process.budgets"] = nil
|
|
visit user_path(user)
|
|
expect(page).to have_content("4 Comments")
|
|
end
|
|
end
|
|
|
|
describe "Following (public page)" do
|
|
let(:user) { create(:user) }
|
|
|
|
context "public interests is checked" do
|
|
let(:user) { create(:user, public_interests: true) }
|
|
|
|
scenario "can be accessed by anyone" do
|
|
create(:proposal, followers: [user], title: "Others follow me")
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_content "1 Following"
|
|
expect(page).to have_content "Others follow me"
|
|
end
|
|
|
|
scenario "Gracefully handle followables that have been hidden" do
|
|
create(:proposal, followers: [user])
|
|
create(:proposal, followers: [user], &:hide)
|
|
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_content("1 Following")
|
|
end
|
|
|
|
scenario "displays generic interests title" do
|
|
create(:proposal, tag_list: "Sport", followers: [user])
|
|
|
|
visit user_path(user, filter: "follows", page: "1")
|
|
|
|
expect(page).to have_content("Tags of elements this user follows")
|
|
end
|
|
|
|
describe "Proposals" do
|
|
scenario "Display following tab when user is following one proposal at least" do
|
|
create(:proposal, followers: [user])
|
|
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_content("1 Following")
|
|
end
|
|
|
|
scenario "Display proposal tab when user is following one proposal at least" do
|
|
create(:proposal, followers: [user])
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_link("Citizen proposals", href: "#citizen_proposals")
|
|
end
|
|
|
|
scenario "Do not display proposals' tab when user is not following any proposal" do
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).not_to have_link("Citizen proposals", href: "#citizen_proposals")
|
|
end
|
|
|
|
scenario "Display proposals with link to proposal" do
|
|
proposal = create(:proposal, author: user, followers: [user])
|
|
|
|
login_as user
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_link "Citizen proposals", href: "#citizen_proposals"
|
|
expect(page).to have_content proposal.title
|
|
end
|
|
|
|
scenario "Retired proposals do not have a link to the dashboard" do
|
|
proposal = create(:proposal, :retired, author: user)
|
|
login_as user
|
|
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_content proposal.title
|
|
expect(page).not_to have_link "Dashboard"
|
|
expect(page).to have_content("Dashboard not available for retired proposals")
|
|
end
|
|
|
|
scenario "Published proposals have a link to the dashboard" do
|
|
proposal = create(:proposal, :published, author: user)
|
|
login_as user
|
|
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_content proposal.title
|
|
expect(page).to have_link "Dashboard"
|
|
end
|
|
end
|
|
|
|
describe "Budget Investments" do
|
|
scenario "Display following tab when user is following one budget investment at least" do
|
|
create(:budget_investment, followers: [user])
|
|
|
|
visit user_path(user)
|
|
|
|
expect(page).to have_content("1 Following")
|
|
end
|
|
|
|
scenario "Display budget investment tab when user is following one budget investment at least" do
|
|
create(:budget_investment, followers: [user])
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_link("Investments", href: "#investments")
|
|
end
|
|
|
|
scenario "Do not display budget investment tab when user is not following any budget investment" do
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).not_to have_link("Investments", href: "#investments")
|
|
end
|
|
|
|
scenario "Display budget investment with link to budget investment" do
|
|
budget_investment = create(:budget_investment, author: user, followers: [user])
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_link "Investments", href: "#investments"
|
|
expect(page).to have_link budget_investment.title
|
|
end
|
|
end
|
|
end
|
|
|
|
context "public interests is not checked" do
|
|
let(:user) { create(:user, public_interests: false) }
|
|
|
|
scenario "can be accessed by its owner" do
|
|
create(:proposal, followers: [user], title: "Follow me!")
|
|
|
|
login_as(user)
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_content "1 Following"
|
|
expect(page).to have_content "Follow me!"
|
|
expect(page).to have_content "Tags of elements you follow"
|
|
end
|
|
|
|
scenario "cannot be accessed by anonymous users" do
|
|
create(:proposal, followers: [user])
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_content "You do not have permission to access this page"
|
|
expect(page).to have_current_path root_path
|
|
end
|
|
|
|
scenario "cannot be accessed by other users" do
|
|
create(:proposal, followers: [user])
|
|
|
|
login_as(create(:user))
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_content "You do not have permission to access this page"
|
|
expect(page).to have_current_path root_path
|
|
end
|
|
|
|
scenario "cannot be accessed by administrators" do
|
|
create(:proposal, followers: [user])
|
|
|
|
login_as(create(:administrator).user)
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_content "You do not have permission to access this page"
|
|
expect(page).to have_current_path root_path
|
|
end
|
|
end
|
|
|
|
scenario "Display interests" do
|
|
create(:proposal, tag_list: "Sport", followers: [user])
|
|
|
|
login_as(user)
|
|
visit account_path
|
|
|
|
check "account_public_interests"
|
|
click_button "Save changes"
|
|
|
|
logout
|
|
|
|
visit user_path(user, filter: "follows")
|
|
|
|
expect(page).to have_css "#public_interests"
|
|
expect(page).to have_content "Sport"
|
|
end
|
|
|
|
scenario "Do not display interests when proposal has been destroyed" do
|
|
proposal = create(:proposal, tag_list: "Sport", followers: [user])
|
|
proposal.destroy!
|
|
|
|
login_as(user)
|
|
visit account_path
|
|
|
|
check "account_public_interests"
|
|
click_button "Save changes"
|
|
|
|
logout
|
|
|
|
visit user_path(user)
|
|
expect(page).not_to have_content("Sport")
|
|
end
|
|
end
|
|
|
|
describe "Initials" do
|
|
scenario "display SVG avatars when loaded into the DOM" do
|
|
login_as(create(:user))
|
|
visit debate_path(create(:debate))
|
|
|
|
fill_in "Leave your comment", with: "I'm awesome"
|
|
click_button "Publish comment"
|
|
|
|
within ".comment", text: "I'm awesome" do
|
|
expect(page).to have_css "img.initialjs-avatar[src^='data:image/svg']"
|
|
end
|
|
end
|
|
end
|
|
end
|