Files
nairobi/spec/features/users_spec.rb
rgarcia 88cde6d018 Deal gracefully with hidden followable in my activity
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 😌
2018-07-10 17:50:51 +02:00

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