We were seeing an exception when a user was following a proposal and
that proposal becomes hidden
With this commit we are skipping this proposals and hopefully fixing
this exception
We are also adjusting the count of followed proposals, without
including hidden proposals. It might be cleaner, to remove a `Follow`
when its `Followable` becomes hidden. But then we should probably
activate the `Follow` again if the `Followable` becomes non-hidden…
For now this commit should suffice 😌
538 lines
15 KiB
Ruby
538 lines
15 KiB
Ruby
require 'rails_helper'
|
|
|
|
feature 'Users' do
|
|
|
|
feature 'Show (public page)' do
|
|
|
|
background do
|
|
@user = create(:user)
|
|
1.times {create(:debate, author: @user)}
|
|
2.times {create(:proposal, author: @user)}
|
|
3.times {create(:budget_investment, author: @user)}
|
|
4.times {create(:comment, user: @user)}
|
|
|
|
visit user_path(@user)
|
|
end
|
|
|
|
scenario 'shows user public activity' do
|
|
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
|
|
@user.proposals.destroy_all
|
|
|
|
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
|
|
@user.proposals.each do |proposal|
|
|
expect(page).to have_content(proposal.title)
|
|
end
|
|
|
|
@user.debates.each do |debate|
|
|
expect(page).not_to have_content(debate.title)
|
|
end
|
|
|
|
@user.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
|
|
@user.proposals.destroy_all
|
|
visit user_path(@user)
|
|
|
|
expect(page).to have_content(@user.debates.first.title)
|
|
end
|
|
|
|
scenario 'shows investments by default if user has no proposals nor debates' do
|
|
@user.proposals.destroy_all
|
|
@user.debates.destroy_all
|
|
visit user_path(@user)
|
|
|
|
expect(page).to have_content(@user.budget_investments.first.title)
|
|
end
|
|
|
|
scenario 'shows comments by default if user has no proposals nor debates nor investments' do
|
|
@user.proposals.destroy_all
|
|
@user.debates.destroy_all
|
|
@user.budget_investments.destroy_all
|
|
visit user_path(@user)
|
|
|
|
@user.comments.each do |comment|
|
|
expect(page).to have_content(comment.body)
|
|
end
|
|
end
|
|
|
|
scenario 'filters' do
|
|
click_link '1 Debate'
|
|
|
|
@user.debates.each do |debate|
|
|
expect(page).to have_content(debate.title)
|
|
end
|
|
|
|
@user.proposals.each do |proposal|
|
|
expect(page).not_to have_content(proposal.title)
|
|
end
|
|
|
|
@user.comments.each do |comment|
|
|
expect(page).not_to have_content(comment.body)
|
|
end
|
|
|
|
click_link '4 Comments'
|
|
|
|
@user.comments.each do |comment|
|
|
expect(page).to have_content(comment.body)
|
|
end
|
|
|
|
@user.proposals.each do |proposal|
|
|
expect(page).not_to have_content(proposal.title)
|
|
end
|
|
|
|
@user.debates.each do |debate|
|
|
expect(page).not_to have_content(debate.title)
|
|
end
|
|
|
|
click_link '2 Proposals'
|
|
|
|
@user.proposals.each do |proposal|
|
|
expect(page).to have_content(proposal.title)
|
|
end
|
|
|
|
@user.comments.each do |comment|
|
|
expect(page).not_to have_content(comment.body)
|
|
end
|
|
|
|
@user.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", :js do
|
|
user = create(:user, :level_two)
|
|
budget = create(:budget, phase: '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
|
|
|
|
feature 'Public activity' do
|
|
background do
|
|
@user = create(:user)
|
|
end
|
|
|
|
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
|
|
|
|
feature 'User email' do
|
|
|
|
background do
|
|
@user = create(:user)
|
|
end
|
|
|
|
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' do
|
|
login_as(create(:administrator).user)
|
|
visit user_path(@user)
|
|
expect(page).to have_content(@user.email)
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
feature 'Public interests' do
|
|
background do
|
|
@user = create(:user)
|
|
end
|
|
|
|
scenario 'Display interests' do
|
|
proposal = create(:proposal, tag_list: "Sport")
|
|
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
|
|
|
login_as(@user)
|
|
visit account_path
|
|
|
|
check 'account_public_interests'
|
|
click_button 'Save changes'
|
|
|
|
logout
|
|
|
|
visit user_path(@user)
|
|
expect(page).to have_content("Sport")
|
|
end
|
|
|
|
scenario 'Not display interests when proposal has been destroyed' do
|
|
proposal = create(:proposal, tag_list: "Sport")
|
|
create(:follow, :followed_proposal, followable: proposal, user: @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
|
|
|
|
scenario 'No visible by default' do
|
|
visit user_path(@user)
|
|
|
|
expect(page).to have_content(@user.username)
|
|
expect(page).not_to have_css('#public_interests')
|
|
end
|
|
|
|
scenario 'User can display public page' do
|
|
proposal = create(:proposal, tag_list: "Sport")
|
|
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
|
|
|
login_as(@user)
|
|
visit account_path
|
|
|
|
check 'account_public_interests'
|
|
click_button 'Save changes'
|
|
|
|
logout
|
|
|
|
visit user_path(@user, filter: 'follows', page: '1')
|
|
|
|
expect(page).to have_css('#public_interests')
|
|
end
|
|
|
|
scenario 'Is always visible for the owner' do
|
|
proposal = create(:proposal, tag_list: "Sport")
|
|
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
|
|
|
login_as(@user)
|
|
visit account_path
|
|
|
|
uncheck 'account_public_interests'
|
|
click_button 'Save changes'
|
|
|
|
visit user_path(@user, filter: 'follows', page: '1')
|
|
expect(page).to have_css('#public_interests')
|
|
end
|
|
|
|
scenario 'Is always visible for admins' do
|
|
proposal = create(:proposal, tag_list: "Sport")
|
|
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
|
|
|
login_as(@user)
|
|
visit account_path
|
|
|
|
uncheck 'account_public_interests'
|
|
click_button 'Save changes'
|
|
|
|
logout
|
|
|
|
login_as(create(:administrator).user)
|
|
visit user_path(@user, filter: 'follows', page: '1')
|
|
expect(page).to have_css('#public_interests')
|
|
end
|
|
|
|
scenario 'Is always visible for moderators' do
|
|
proposal = create(:proposal, tag_list: "Sport")
|
|
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
|
|
|
login_as(@user)
|
|
visit account_path
|
|
|
|
uncheck 'account_public_interests'
|
|
click_button 'Save changes'
|
|
|
|
logout
|
|
|
|
login_as(create(:moderator).user)
|
|
visit user_path(@user, filter: 'follows', page: '1')
|
|
expect(page).to have_css('#public_interests')
|
|
end
|
|
|
|
scenario 'Should display generic interests title' do
|
|
proposal = create(:proposal, tag_list: "Sport")
|
|
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
|
|
|
@user.update(public_interests: true)
|
|
visit user_path(@user, filter: 'follows', page: '1')
|
|
|
|
expect(page).to have_content("Tags of elements this user follows")
|
|
end
|
|
|
|
scenario 'Should display custom interests title when user is visiting own user page' do
|
|
proposal = create(:proposal, tag_list: "Sport")
|
|
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
|
|
|
@user.update(public_interests: true)
|
|
login_as(@user)
|
|
visit user_path(@user, filter: 'follows', page: '1')
|
|
|
|
expect(page).to have_content("Tags of elements you follow")
|
|
end
|
|
end
|
|
|
|
feature '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['feature.debates'] = nil
|
|
visit user_path(user)
|
|
expect(page).to have_content('6 Comments')
|
|
|
|
Setting['feature.budgets'] = nil
|
|
visit user_path(user)
|
|
expect(page).to have_content('4 Comments')
|
|
|
|
Setting['feature.debates'] = true
|
|
Setting['feature.budgets'] = true
|
|
end
|
|
end
|
|
|
|
feature 'Following (public page)' do
|
|
|
|
before do
|
|
@user = create(:user)
|
|
end
|
|
|
|
scenario "Do not display follows' tab when user is not following any followables" do
|
|
visit user_path(@user)
|
|
|
|
expect(page).not_to have_content('0 Following')
|
|
end
|
|
|
|
scenario 'Active following tab by default when follows filters selected', :js do
|
|
proposal = create(:proposal, author: @user)
|
|
create(:follow, followable: proposal, user: @user)
|
|
|
|
visit user_path(@user, filter: "follows")
|
|
|
|
expect(page).to have_selector(".activity li.is-active", text: "1 Following")
|
|
end
|
|
|
|
scenario "Gracefully handle followables that have been hidden", :focus do
|
|
active_proposal = create(:proposal)
|
|
hidden_proposal = create(:proposal)
|
|
|
|
create(:follow, followable: active_proposal, user: @user)
|
|
create(:follow, followable: hidden_proposal, user: @user)
|
|
|
|
hidden_proposal.hide
|
|
visit user_path(@user)
|
|
|
|
expect(page).to have_content('1 Following')
|
|
end
|
|
|
|
describe 'Proposals' do
|
|
|
|
scenario 'Display following tab when user is following one proposal at least' do
|
|
proposal = create(:proposal)
|
|
create(:follow, followable: proposal, user: @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
|
|
proposal = create(:proposal)
|
|
create(:follow, followable: proposal, user: @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)
|
|
create(:follow, followable: proposal, user: @user)
|
|
login_as @user
|
|
|
|
visit user_path(@user, filter: "follows")
|
|
click_link 'Citizen proposals'
|
|
|
|
expect(page).to have_content proposal.title
|
|
end
|
|
end
|
|
|
|
describe 'Budget Investments' do
|
|
|
|
scenario 'Display following tab when user is following one budget investment at least' do
|
|
budget_investment = create(:budget_investment)
|
|
create(:follow, followable: budget_investment, user: @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
|
|
budget_investment = create(:budget_investment)
|
|
create(:follow, followable: budget_investment, user: @user)
|
|
|
|
visit user_path(@user, filter: "follows")
|
|
|
|
expect(page).to have_link('Investments', href: "#investments")
|
|
end
|
|
|
|
scenario '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
|
|
user = create(:user, :level_two)
|
|
budget_investment = create(:budget_investment, author: user)
|
|
create(:follow, followable: budget_investment, user: user)
|
|
|
|
visit user_path(user, filter: "follows")
|
|
click_link 'Investments'
|
|
|
|
expect(page).to have_link budget_investment.title
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
end
|