Merge pull request #3732 from consul/voters_in_specs
Simplify creating associations in specs
This commit is contained in:
@@ -79,6 +79,13 @@ FactoryBot.define do
|
||||
trait :drafting_budget do
|
||||
association :group, factory: [:budget_group, :drafting_budget]
|
||||
end
|
||||
|
||||
trait :with_investment_with_milestone do
|
||||
after(:create) do |heading|
|
||||
investment = create(:budget_investment, :winner, heading: heading)
|
||||
create(:milestone, milestoneable: investment)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
factory :budget_investment, class: "Budget::Investment" do
|
||||
@@ -183,6 +190,26 @@ FactoryBot.define do
|
||||
trait :with_image do
|
||||
after(:create) { |investment| create(:image, imageable: investment) }
|
||||
end
|
||||
|
||||
transient do
|
||||
voters { [] }
|
||||
followers { [] }
|
||||
ballots { [] }
|
||||
balloters { [] }
|
||||
end
|
||||
|
||||
after(:create) do |investment, evaluator|
|
||||
evaluator.voters.each { |voter| create(:vote, votable: investment, voter: voter) }
|
||||
evaluator.followers.each { |follower| create(:follow, followable: investment, user: follower) }
|
||||
|
||||
evaluator.ballots.each do |ballot|
|
||||
create(:budget_ballot_line, investment: investment, ballot: ballot)
|
||||
end
|
||||
|
||||
evaluator.balloters.each do |balloter|
|
||||
create(:budget_ballot_line, investment: investment, user: balloter)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
factory :budget_phase, class: "Budget::Phase" do
|
||||
@@ -198,6 +225,14 @@ FactoryBot.define do
|
||||
factory :budget_ballot, class: "Budget::Ballot" do
|
||||
association :user, factory: :user
|
||||
budget
|
||||
|
||||
transient { investments { [] } }
|
||||
|
||||
after(:create) do |ballot, evaluator|
|
||||
evaluator.investments.each do |investment|
|
||||
create(:budget_ballot_line, investment: investment, ballot: ballot)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
factory :budget_ballot_line, class: "Budget::Ballot::Line" do
|
||||
|
||||
@@ -9,6 +9,14 @@ FactoryBot.define do
|
||||
trait :milestone do
|
||||
kind { "milestone" }
|
||||
end
|
||||
|
||||
transient { taggables { [] } }
|
||||
|
||||
after(:create) do |tag, evaluator|
|
||||
evaluator.taggables.each do |taggable|
|
||||
create(:tagging, tag: tag, taggable: taggable)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
factory :tagging, class: "ActsAsTaggableOn::Tagging" do
|
||||
|
||||
@@ -35,5 +35,11 @@ FactoryBot.define do
|
||||
valuation.commentable.valuators << valuator
|
||||
end
|
||||
end
|
||||
|
||||
transient { voters { [] } }
|
||||
|
||||
after(:create) do |comment, evaluator|
|
||||
evaluator.voters.each { |voter| create(:vote, votable: comment, voter: voter) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -37,6 +37,12 @@ FactoryBot.define do
|
||||
4.times { create(:vote, votable: debate) }
|
||||
end
|
||||
end
|
||||
|
||||
transient { voters { [] } }
|
||||
|
||||
after(:create) do |debate, evaluator|
|
||||
evaluator.voters.each { |voter| create(:vote, votable: debate, voter: voter) }
|
||||
end
|
||||
end
|
||||
|
||||
factory :flag do
|
||||
|
||||
@@ -12,7 +12,11 @@ FactoryBot.define do
|
||||
publication_date { Date.current }
|
||||
|
||||
trait :with_image do
|
||||
after(:create) { |milestone| create(:image, imageable: milestone) }
|
||||
transient { image_title { "Current status of the project" } }
|
||||
|
||||
after(:create) do |milestone, evaluator|
|
||||
create(:image, imageable: milestone, title: evaluator.image_title)
|
||||
end
|
||||
end
|
||||
|
||||
factory :milestone_with_description do
|
||||
|
||||
@@ -6,6 +6,18 @@ FactoryBot.define do
|
||||
trait :read do
|
||||
read_at { Time.current }
|
||||
end
|
||||
|
||||
trait :for_proposal_notification do
|
||||
association :notifiable, factory: :proposal_notification
|
||||
end
|
||||
|
||||
trait :for_comment do
|
||||
association :notifiable, factory: :comment
|
||||
end
|
||||
|
||||
trait :for_poll_question do
|
||||
association :notifiable, factory: :poll_question
|
||||
end
|
||||
end
|
||||
|
||||
factory :admin_notification do
|
||||
|
||||
@@ -42,6 +42,14 @@ FactoryBot.define do
|
||||
trait :with_image do
|
||||
after(:create) { |poll| create(:image, imageable: poll) }
|
||||
end
|
||||
|
||||
transient { officers { [] } }
|
||||
|
||||
after(:create) do |poll, evaluator|
|
||||
evaluator.officers.each do |officer|
|
||||
create(:poll_officer_assignment, poll: poll, officer: officer)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
factory :poll_question, class: "Poll::Question" do
|
||||
@@ -121,16 +129,22 @@ FactoryBot.define do
|
||||
end
|
||||
|
||||
factory :poll_question_answer, class: "Poll::Question::Answer" do
|
||||
association :question, factory: :poll_question
|
||||
sequence(:title) { |n| "Answer title #{n}" }
|
||||
sequence(:description) { |n| "Answer description #{n}" }
|
||||
sequence(:given_order) { |n| n }
|
||||
|
||||
transient { poll { association(:poll) } }
|
||||
|
||||
question { association(:poll_question, poll: poll) }
|
||||
end
|
||||
|
||||
factory :poll_answer_video, class: "Poll::Question::Answer::Video" do
|
||||
association :answer, factory: :poll_question_answer
|
||||
title { "Sample video title" }
|
||||
url { "https://youtu.be/nhuNb0XtRhQ" }
|
||||
|
||||
transient { poll { association(:poll) } }
|
||||
|
||||
answer { association(:poll_question_answer, poll: poll) }
|
||||
end
|
||||
|
||||
factory :poll_booth, class: "Poll::Booth" do
|
||||
@@ -188,8 +202,10 @@ FactoryBot.define do
|
||||
trait :from_booth do
|
||||
origin { "booth" }
|
||||
|
||||
transient { booth { association(:poll_booth) } }
|
||||
|
||||
booth_assignment do
|
||||
association :poll_booth_assignment, poll: poll
|
||||
association :poll_booth_assignment, poll: poll, booth: booth
|
||||
end
|
||||
|
||||
officer_assignment do
|
||||
|
||||
@@ -78,6 +78,16 @@ FactoryBot.define do
|
||||
after(:create) { |proposal| create(:image, imageable: proposal) }
|
||||
end
|
||||
|
||||
transient do
|
||||
voters { [] }
|
||||
followers { [] }
|
||||
end
|
||||
|
||||
after(:create) do |proposal, evaluator|
|
||||
evaluator.voters.each { |voter| create(:vote, votable: proposal, voter: voter) }
|
||||
evaluator.followers.each { |follower| create(:follow, followable: proposal, user: follower) }
|
||||
end
|
||||
|
||||
factory :retired_proposal, traits: [:retired]
|
||||
end
|
||||
|
||||
|
||||
@@ -63,6 +63,25 @@ FactoryBot.define do
|
||||
trait :with_comment do
|
||||
after(:create) { |user| create(:comment, author: user) }
|
||||
end
|
||||
|
||||
transient do
|
||||
votables { [] }
|
||||
followables { [] }
|
||||
ballot_lines { [] }
|
||||
end
|
||||
|
||||
after(:create) do |user, evaluator|
|
||||
evaluator.votables.each { |votable| create(:vote, votable: votable, voter: user) }
|
||||
evaluator.followables.each { |followable| create(:follow, followable: followable, user: user) }
|
||||
|
||||
if evaluator.ballot_lines.any?
|
||||
ballot = create(:budget_ballot, budget: evaluator.ballot_lines.first.budget.reload, user: user)
|
||||
|
||||
evaluator.ballot_lines.each do |investment|
|
||||
create(:budget_ballot_line, investment: investment, ballot: ballot)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
factory :identity do
|
||||
@@ -92,7 +111,18 @@ FactoryBot.define do
|
||||
end
|
||||
|
||||
factory :poll_officer, class: "Poll::Officer" do
|
||||
user
|
||||
user { association(:user, username: name) }
|
||||
|
||||
transient do
|
||||
sequence(:name) { |n| "Officer #{n}" }
|
||||
polls { [] }
|
||||
end
|
||||
|
||||
after(:create) do |officer, evaluator|
|
||||
evaluator.polls.each do |poll|
|
||||
create(:poll_officer_assignment, poll: poll, officer: officer)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
factory :follow do
|
||||
|
||||
@@ -160,9 +160,8 @@ describe "Homepage" do
|
||||
end
|
||||
|
||||
scenario "Recomendations" do
|
||||
proposal1 = create(:proposal, tag_list: "Sport")
|
||||
proposal2 = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal1, user: user)
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
create(:proposal, tag_list: "Sport")
|
||||
|
||||
visit admin_homepage_path
|
||||
within("#setting_#{user_recommendations.id}") do
|
||||
|
||||
@@ -157,9 +157,7 @@ describe "Admin booths assignments" do
|
||||
booth = create(:poll_booth)
|
||||
officer_assignment = create(:poll_officer_assignment, poll: poll, booth: booth)
|
||||
officer = officer_assignment.officer
|
||||
|
||||
officer_assignment_2 = create(:poll_officer_assignment, poll: poll)
|
||||
officer_2 = officer_assignment_2.officer
|
||||
officer_2 = create(:poll_officer, polls: [poll])
|
||||
|
||||
visit admin_poll_path(poll)
|
||||
click_link "Booths (2)"
|
||||
|
||||
@@ -10,37 +10,27 @@ describe "Officer Assignments" do
|
||||
scenario "Index" do
|
||||
poll = create(:poll)
|
||||
|
||||
officer1 = create(:poll_officer)
|
||||
officer2 = create(:poll_officer)
|
||||
officer3 = create(:poll_officer)
|
||||
|
||||
officer_assignment = create(:poll_officer_assignment, poll: poll, officer: officer1)
|
||||
officer_assignment_2 = create(:poll_officer_assignment, poll: poll, officer: officer2)
|
||||
create(:poll_officer, name: "Bubbles", polls: [poll])
|
||||
create(:poll_officer, name: "Blossom", polls: [poll])
|
||||
create(:poll_officer, name: "Buttercup")
|
||||
|
||||
visit admin_poll_path(poll)
|
||||
|
||||
click_link "Officers (2)"
|
||||
|
||||
within("#officer_assignments") do
|
||||
expect(page).to have_content officer1.name
|
||||
expect(page).to have_content officer2.name
|
||||
expect(page).not_to have_content officer3.name
|
||||
expect(page).to have_content "Bubbles"
|
||||
expect(page).to have_content "Blossom"
|
||||
expect(page).not_to have_content "Buttercup"
|
||||
end
|
||||
end
|
||||
|
||||
scenario "Search", :js do
|
||||
poll = create(:poll)
|
||||
|
||||
user1 = create(:user, username: "John Snow")
|
||||
user2 = create(:user, username: "John Silver")
|
||||
user3 = create(:user, username: "John Edwards")
|
||||
|
||||
officer1 = create(:poll_officer, user: user1)
|
||||
officer2 = create(:poll_officer, user: user2)
|
||||
officer3 = create(:poll_officer, user: user3)
|
||||
|
||||
officer_assignment = create(:poll_officer_assignment, poll: poll, officer: officer1)
|
||||
officer_assignment_2 = create(:poll_officer_assignment, poll: poll, officer: officer2)
|
||||
create(:poll_officer, name: "John Snow", polls: [poll])
|
||||
create(:poll_officer, name: "John Silver", polls: [poll])
|
||||
create(:poll_officer, name: "John Edwards")
|
||||
|
||||
visit admin_poll_path(poll)
|
||||
|
||||
@@ -50,9 +40,9 @@ describe "Officer Assignments" do
|
||||
click_button "Search"
|
||||
|
||||
within("#search-officers-results") do
|
||||
expect(page).to have_content officer1.name
|
||||
expect(page).to have_content officer2.name
|
||||
expect(page).not_to have_content officer3.name
|
||||
expect(page).to have_content "John Snow"
|
||||
expect(page).to have_content "John Silver"
|
||||
expect(page).not_to have_content "John Edwards"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -25,14 +25,9 @@ describe "Stats" do
|
||||
end
|
||||
|
||||
scenario "Votes" do
|
||||
debate = create(:debate)
|
||||
create(:vote, votable: debate)
|
||||
|
||||
proposal = create(:proposal)
|
||||
2.times { create(:vote, votable: proposal) }
|
||||
|
||||
comment = create(:comment)
|
||||
3.times { create(:vote, votable: comment) }
|
||||
create(:debate, voters: Array.new(1) { create(:user) })
|
||||
create(:proposal, voters: Array.new(2) { create(:user) })
|
||||
create(:comment, voters: Array.new(3) { create(:user) })
|
||||
|
||||
visit admin_stats_path
|
||||
|
||||
@@ -113,11 +108,9 @@ describe "Stats" do
|
||||
|
||||
scenario "Number of supports in investment projects" do
|
||||
group_2 = create(:budget_group, budget: @budget)
|
||||
investment1 = create(:budget_investment, heading: create(:budget_heading, group: group_2))
|
||||
investment2 = create(:budget_investment, heading: @heading_all_city)
|
||||
|
||||
1.times { create(:vote, votable: investment1) }
|
||||
2.times { create(:vote, votable: investment2) }
|
||||
create(:budget_investment, heading: create(:budget_heading, group: group_2), voters: [create(:user)])
|
||||
create(:budget_investment, heading: @heading_all_city, voters: [create(:user), create(:user)])
|
||||
|
||||
visit admin_stats_path
|
||||
click_link "Participatory Budgets"
|
||||
@@ -129,17 +122,13 @@ describe "Stats" do
|
||||
end
|
||||
|
||||
scenario "Number of users that have supported an investment project" do
|
||||
user1 = create(:user, :level_two)
|
||||
user2 = create(:user, :level_two)
|
||||
user3 = create(:user, :level_two)
|
||||
|
||||
group_2 = create(:budget_group, budget: @budget)
|
||||
investment1 = create(:budget_investment, heading: create(:budget_heading, group: group_2))
|
||||
investment2 = create(:budget_investment, heading: @heading_all_city)
|
||||
|
||||
create(:vote, votable: investment1, voter: user1)
|
||||
create(:vote, votable: investment1, voter: user2)
|
||||
create(:vote, votable: investment2, voter: user1)
|
||||
create(:user, :level_two, votables: [investment1, investment2])
|
||||
create(:user, :level_two, votables: [investment1])
|
||||
create(:user, :level_two)
|
||||
|
||||
visit admin_stats_path
|
||||
click_link "Participatory Budgets"
|
||||
@@ -160,13 +149,9 @@ describe "Stats" do
|
||||
carabanchel = create(:budget_heading, group: group_districts)
|
||||
barajas = create(:budget_heading, group: group_districts)
|
||||
|
||||
all_city_investment = create(:budget_investment, heading: all_city)
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel)
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel)
|
||||
|
||||
Budget::Investment.all.each do |investment|
|
||||
create(:vote, votable: investment)
|
||||
end
|
||||
create(:budget_investment, heading: all_city, voters: [create(:user)])
|
||||
create(:budget_investment, heading: carabanchel, voters: [create(:user)])
|
||||
create(:budget_investment, heading: carabanchel, voters: [create(:user)])
|
||||
|
||||
visit admin_stats_path
|
||||
click_link "Participatory Budgets"
|
||||
@@ -215,16 +200,10 @@ describe "Stats" do
|
||||
end
|
||||
|
||||
scenario "Number of votes in investment projects" do
|
||||
ballot_1 = create(:budget_ballot, budget: @budget)
|
||||
ballot_2 = create(:budget_ballot, budget: @budget)
|
||||
investment_2 = create(:budget_investment, :feasible, :selected, budget: @budget)
|
||||
|
||||
group_2 = create(:budget_group, budget: @budget)
|
||||
heading_2 = create(:budget_heading, group: group_2)
|
||||
investment_2 = create(:budget_investment, :feasible, :selected, heading: heading_2)
|
||||
|
||||
create(:budget_ballot_line, ballot: ballot_1, investment: @investment)
|
||||
create(:budget_ballot_line, ballot: ballot_1, investment: investment_2)
|
||||
create(:budget_ballot_line, ballot: ballot_2, investment: investment_2)
|
||||
create(:user, ballot_lines: [@investment, investment_2])
|
||||
create(:user, ballot_lines: [investment_2])
|
||||
|
||||
visit admin_stats_path
|
||||
click_link "Participatory Budgets"
|
||||
@@ -236,16 +215,9 @@ describe "Stats" do
|
||||
end
|
||||
|
||||
scenario "Number of users that have voted a investment project" do
|
||||
user_1 = create(:user, :level_two)
|
||||
user_2 = create(:user, :level_two)
|
||||
user_3 = create(:user, :level_two)
|
||||
|
||||
ballot_1 = create(:budget_ballot, budget: @budget, user: user_1)
|
||||
ballot_2 = create(:budget_ballot, budget: @budget, user: user_2)
|
||||
ballot_3 = create(:budget_ballot, budget: @budget, user: user_3)
|
||||
|
||||
create(:budget_ballot_line, ballot: ballot_1, investment: @investment)
|
||||
create(:budget_ballot_line, ballot: ballot_2, investment: @investment)
|
||||
create(:user, ballot_lines: [@investment])
|
||||
create(:user, ballot_lines: [@investment])
|
||||
create(:user)
|
||||
|
||||
visit admin_stats_path
|
||||
click_link "Participatory Budgets"
|
||||
|
||||
@@ -322,9 +322,8 @@ describe "System Emails" do
|
||||
proposal_notification = create(:proposal_notification, proposal: proposal,
|
||||
title: "Proposal A Title",
|
||||
body: "Proposal A Notification Body")
|
||||
voter = create(:user, :level_two)
|
||||
voter = create(:user, :level_two, followables: [proposal])
|
||||
create(:notification, notifiable: proposal_notification, user: voter, emailed_at: nil)
|
||||
create(:follow, user: voter, followable: proposal)
|
||||
|
||||
visit admin_system_emails_path
|
||||
|
||||
|
||||
@@ -2,19 +2,19 @@ require "rails_helper"
|
||||
|
||||
describe "Ballots" do
|
||||
|
||||
let!(:user) { create(:user, :level_two) }
|
||||
let(:user) { create(:user, :level_two) }
|
||||
let!(:budget) { create(:budget, :balloting) }
|
||||
let!(:states) { create(:budget_group, budget: budget, name: "States") }
|
||||
let!(:california) { create(:budget_heading, group: states, name: "California", price: 1000) }
|
||||
let!(:new_york) { create(:budget_heading, group: states, name: "New York", price: 1000000) }
|
||||
|
||||
context "Load" do
|
||||
|
||||
let(:ballot) { create(:budget_ballot, user: user, budget: budget) }
|
||||
let(:user) do
|
||||
create(:user, :level_two, ballot_lines: [create(:budget_investment, :selected, heading: california)])
|
||||
end
|
||||
|
||||
before do
|
||||
budget.update(slug: "budget_slug")
|
||||
ballot.investments << create(:budget_investment, :selected, heading: california)
|
||||
login_as(user)
|
||||
end
|
||||
|
||||
@@ -43,7 +43,6 @@ describe "Ballots" do
|
||||
let!(:investment) { create(:budget_investment, :selected, heading: california) }
|
||||
|
||||
before do
|
||||
create(:budget_ballot, user: user, budget: budget)
|
||||
budget.update(slug: "budget_slug")
|
||||
login_as(user)
|
||||
end
|
||||
@@ -179,9 +178,7 @@ describe "Ballots" do
|
||||
end
|
||||
|
||||
scenario "Removing a investment", :js do
|
||||
investment = create(:budget_investment, :selected, heading: new_york, price: 10000)
|
||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||
ballot.investments << investment
|
||||
investment = create(:budget_investment, :selected, heading: new_york, price: 10000, balloters: [user])
|
||||
|
||||
visit budget_path(budget)
|
||||
click_link "States"
|
||||
@@ -343,12 +340,9 @@ describe "Ballots" do
|
||||
end
|
||||
|
||||
scenario "Change my heading", :js do
|
||||
investment1 = create(:budget_investment, :selected, heading: california)
|
||||
investment1 = create(:budget_investment, :selected, heading: california, balloters: [user])
|
||||
investment2 = create(:budget_investment, :selected, heading: new_york)
|
||||
|
||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||
ballot.investments << investment1
|
||||
|
||||
visit budget_investments_path(budget, heading_id: california.id)
|
||||
|
||||
within("#budget_investment_#{investment1.id}") do
|
||||
@@ -367,10 +361,7 @@ describe "Ballots" do
|
||||
end
|
||||
|
||||
scenario "View another heading" do
|
||||
investment = create(:budget_investment, :selected, heading: california)
|
||||
|
||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||
ballot.investments << investment
|
||||
create(:budget_investment, :selected, heading: california, balloters: [user])
|
||||
|
||||
visit budget_investments_path(budget, heading_id: new_york.id)
|
||||
|
||||
@@ -407,9 +398,8 @@ describe "Ballots" do
|
||||
investment4 = create(:budget_investment, :selected, price: 5, heading: heading2)
|
||||
investment5 = create(:budget_investment, :selected, price: 5, heading: heading2)
|
||||
|
||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||
|
||||
ballot.investments << investment1 << investment2 << investment3 << investment4 << investment5
|
||||
user = create(:user, :level_two,
|
||||
ballot_lines: [investment1, investment2, investment3, investment4, investment5])
|
||||
|
||||
login_as(user)
|
||||
visit budget_ballot_path(budget)
|
||||
@@ -442,8 +432,7 @@ describe "Ballots" do
|
||||
|
||||
scenario "Removing investments from ballot", :js do
|
||||
investment = create(:budget_investment, :selected, price: 10, heading: new_york)
|
||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||
ballot.investments << investment
|
||||
user = create(:user, :level_two, ballot_lines: [investment])
|
||||
|
||||
login_as(user)
|
||||
visit budget_ballot_path(budget)
|
||||
@@ -461,9 +450,7 @@ describe "Ballots" do
|
||||
scenario "Removing investments from ballot (sidebar)", :js do
|
||||
investment1 = create(:budget_investment, :selected, price: 10000, heading: new_york)
|
||||
investment2 = create(:budget_investment, :selected, price: 20000, heading: new_york)
|
||||
|
||||
ballot = create(:budget_ballot, budget: budget, user: user)
|
||||
ballot.investments << investment1 << investment2
|
||||
user = create(:user, :level_two, ballot_lines: [investment1, investment2])
|
||||
|
||||
login_as(user)
|
||||
visit budget_investments_path(budget, heading_id: new_york.id)
|
||||
@@ -588,9 +575,7 @@ describe "Ballots" do
|
||||
scenario "Different district", :js do
|
||||
bi1 = create(:budget_investment, :selected, heading: california)
|
||||
bi2 = create(:budget_investment, :selected, heading: new_york)
|
||||
|
||||
ballot = create(:budget_ballot, budget: budget, user: user)
|
||||
ballot.investments << bi1
|
||||
user = create(:user, :level_two, ballot_lines: [bi1])
|
||||
|
||||
login_as(user)
|
||||
visit budget_investments_path(budget, heading: new_york)
|
||||
@@ -605,9 +590,7 @@ describe "Ballots" do
|
||||
scenario "Insufficient funds (on page load)", :js do
|
||||
bi1 = create(:budget_investment, :selected, heading: california, price: 600)
|
||||
bi2 = create(:budget_investment, :selected, heading: california, price: 500)
|
||||
|
||||
ballot = create(:budget_ballot, budget: budget, user: user)
|
||||
ballot.investments << bi1
|
||||
user = create(:user, :level_two, ballot_lines: [bi1])
|
||||
|
||||
login_as(user)
|
||||
visit budget_investments_path(budget, heading_id: california.id)
|
||||
@@ -645,9 +628,7 @@ describe "Ballots" do
|
||||
scenario "Insufficient funds (removed after destroy)", :js do
|
||||
bi1 = create(:budget_investment, :selected, heading: california, price: 600)
|
||||
bi2 = create(:budget_investment, :selected, heading: california, price: 500)
|
||||
|
||||
ballot = create(:budget_ballot, budget: budget, user: user)
|
||||
ballot.investments << bi1
|
||||
user = create(:user, :level_two, ballot_lines: [bi1])
|
||||
|
||||
login_as(user)
|
||||
visit budget_investments_path(budget, heading_id: california.id)
|
||||
@@ -673,9 +654,7 @@ describe "Ballots" do
|
||||
scenario "Insufficient funds (removed after destroying from sidebar)", :js do
|
||||
bi1 = create(:budget_investment, :selected, heading: california, price: 600)
|
||||
bi2 = create(:budget_investment, :selected, heading: california, price: 500)
|
||||
|
||||
ballot = create(:budget_ballot, budget: budget, user: user)
|
||||
ballot.investments << bi1
|
||||
user = create(:user, :level_two, ballot_lines: [bi1])
|
||||
|
||||
login_as(user)
|
||||
visit budget_investments_path(budget, heading_id: california.id)
|
||||
|
||||
@@ -116,13 +116,10 @@ describe "Executions" do
|
||||
end
|
||||
|
||||
scenario "renders last milestone's image if investment has multiple milestones with images associated" do
|
||||
milestone1 = create(:milestone, milestoneable: investment1)
|
||||
milestone2 = create(:milestone, milestoneable: investment1)
|
||||
milestone3 = create(:milestone, milestoneable: investment1)
|
||||
milestone4 = create(:milestone, milestoneable: investment1)
|
||||
|
||||
create(:image, imageable: milestone2, title: "Image for first milestone with image")
|
||||
create(:image, imageable: milestone3, title: "Image for second milestone with image")
|
||||
create(:milestone, milestoneable: investment1)
|
||||
create(:milestone, :with_image, image_title: "First image", milestoneable: investment1)
|
||||
create(:milestone, :with_image, image_title: "Second image", milestoneable: investment1)
|
||||
create(:milestone, milestoneable: investment1)
|
||||
|
||||
visit budget_path(budget)
|
||||
|
||||
@@ -130,7 +127,7 @@ describe "Executions" do
|
||||
click_link "Milestones"
|
||||
|
||||
expect(page).to have_content(investment1.title)
|
||||
expect(page).to have_css("img[alt='#{milestone3.image.title}']")
|
||||
expect(page).to have_css("img[alt='Second image']")
|
||||
end
|
||||
|
||||
end
|
||||
@@ -276,19 +273,11 @@ describe "Executions" do
|
||||
end
|
||||
|
||||
context "Heading Order" do
|
||||
|
||||
def create_heading_with_investment_with_milestone(group:, name:)
|
||||
heading = create(:budget_heading, group: group, name: name)
|
||||
investment = create(:budget_investment, :winner, heading: heading)
|
||||
milestone = create(:milestone, milestoneable: investment)
|
||||
heading
|
||||
end
|
||||
|
||||
scenario "Non-city headings are displayed in alphabetical order" do
|
||||
heading.destroy!
|
||||
z_heading = create_heading_with_investment_with_milestone(group: group, name: "Zzz")
|
||||
a_heading = create_heading_with_investment_with_milestone(group: group, name: "Aaa")
|
||||
m_heading = create_heading_with_investment_with_milestone(group: group, name: "Mmm")
|
||||
z_heading = create(:budget_heading, :with_investment_with_milestone, group: group, name: "Zzz")
|
||||
a_heading = create(:budget_heading, :with_investment_with_milestone, group: group, name: "Aaa")
|
||||
m_heading = create(:budget_heading, :with_investment_with_milestone, group: group, name: "Mmm")
|
||||
|
||||
visit budget_executions_path(budget)
|
||||
|
||||
|
||||
@@ -789,11 +789,8 @@ describe "Budget Investments" do
|
||||
|
||||
per_page.times { create(:budget_investment, heading: heading) }
|
||||
|
||||
voted_investments = []
|
||||
per_page.times do
|
||||
investment = create(:budget_investment, heading: heading)
|
||||
create(:vote, votable: investment, voter: voter)
|
||||
voted_investments << investment
|
||||
voted_investments = Array.new(per_page) do
|
||||
create(:budget_investment, heading: heading, voters: [voter])
|
||||
end
|
||||
|
||||
login_as(voter)
|
||||
@@ -1354,11 +1351,9 @@ describe "Budget Investments" do
|
||||
carabanchel = create(:budget_heading, group: group)
|
||||
salamanca = create(:budget_heading, group: group)
|
||||
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel)
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel, voters: [author])
|
||||
salamanca_investment = create(:budget_investment, heading: salamanca)
|
||||
|
||||
create(:vote, votable: carabanchel_investment, voter: author)
|
||||
|
||||
login_as(author)
|
||||
visit budget_investments_path(budget, heading_id: carabanchel.id)
|
||||
|
||||
@@ -1374,11 +1369,9 @@ describe "Budget Investments" do
|
||||
another_heading1 = create(:budget_heading, group: group2)
|
||||
another_heading2 = create(:budget_heading, group: group2)
|
||||
|
||||
heading_investment = create(:budget_investment, heading: heading)
|
||||
heading_investment = create(:budget_investment, heading: heading, voters: [author])
|
||||
another_group_investment = create(:budget_investment, heading: another_heading1)
|
||||
|
||||
create(:vote, votable: heading_investment, voter: author)
|
||||
|
||||
login_as(author)
|
||||
visit budget_investments_path(budget, heading_id: another_heading1.id)
|
||||
|
||||
@@ -1417,8 +1410,7 @@ describe "Budget Investments" do
|
||||
end
|
||||
|
||||
scenario "Sidebar in show should display support text and count" do
|
||||
investment = create(:budget_investment, :selected, budget: budget)
|
||||
create(:vote, votable: investment)
|
||||
investment = create(:budget_investment, :selected, budget: budget, voters: [create(:user)])
|
||||
|
||||
visit budget_investment_path(budget, investment)
|
||||
|
||||
@@ -1429,8 +1421,7 @@ describe "Budget Investments" do
|
||||
end
|
||||
|
||||
scenario "Index should display support count" do
|
||||
investment = create(:budget_investment, budget: budget, heading: heading)
|
||||
create(:vote, votable: investment)
|
||||
investment = create(:budget_investment, budget: budget, heading: heading, voters: [create(:user)])
|
||||
|
||||
visit budget_investments_path(budget, heading_id: heading.id)
|
||||
|
||||
@@ -1440,8 +1431,7 @@ describe "Budget Investments" do
|
||||
end
|
||||
|
||||
scenario "Show should display support text and count" do
|
||||
investment = create(:budget_investment, budget: budget, heading: heading)
|
||||
create(:vote, votable: investment)
|
||||
investment = create(:budget_investment, budget: budget, heading: heading, voters: [create(:user)])
|
||||
|
||||
visit budget_investment_path(budget, investment)
|
||||
|
||||
@@ -1725,13 +1715,10 @@ describe "Budget Investments" do
|
||||
describe "Reclassification" do
|
||||
|
||||
scenario "Due to heading change" do
|
||||
user = create(:user, :level_two)
|
||||
investment = create(:budget_investment, :selected, heading: heading)
|
||||
user = create(:user, :level_two, ballot_lines: [investment])
|
||||
heading2 = create(:budget_heading, group: group)
|
||||
|
||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||
ballot.investments << investment
|
||||
|
||||
login_as(user)
|
||||
visit budget_ballot_path(budget)
|
||||
|
||||
@@ -1746,11 +1733,8 @@ describe "Budget Investments" do
|
||||
end
|
||||
|
||||
scenario "Due to being unfeasible" do
|
||||
user = create(:user, :level_two)
|
||||
investment = create(:budget_investment, :selected, heading: heading)
|
||||
|
||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||
ballot.investments << investment
|
||||
user = create(:user, :level_two, ballot_lines: [investment])
|
||||
|
||||
login_as(user)
|
||||
visit budget_ballot_path(budget)
|
||||
|
||||
@@ -13,10 +13,9 @@ describe "Votes" do
|
||||
describe "Index" do
|
||||
|
||||
scenario "Index shows user votes on proposals" do
|
||||
investment1 = create(:budget_investment, heading: heading)
|
||||
investment1 = create(:budget_investment, heading: heading, voters: [manuela])
|
||||
investment2 = create(:budget_investment, heading: heading)
|
||||
investment3 = create(:budget_investment, heading: heading)
|
||||
create(:vote, voter: manuela, votable: investment1, vote_flag: true)
|
||||
|
||||
visit budget_investments_path(budget, heading_id: heading.id)
|
||||
|
||||
|
||||
@@ -305,9 +305,8 @@ describe "Debates" do
|
||||
end
|
||||
|
||||
scenario "Update should not be posible if debate is not editable" do
|
||||
debate = create(:debate)
|
||||
Setting["max_votes_for_debate_edit"] = 2
|
||||
3.times { create(:vote, votable: debate) }
|
||||
debate = create(:debate, voters: Array.new(3) { create(:user) })
|
||||
|
||||
expect(debate).not_to be_editable
|
||||
login_as(debate.author)
|
||||
@@ -451,9 +450,8 @@ describe "Debates" do
|
||||
end
|
||||
|
||||
scenario "are shown on index header when account setting is enabled" do
|
||||
user = create(:user)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit debates_path
|
||||
@@ -466,9 +464,8 @@ describe "Debates" do
|
||||
end
|
||||
|
||||
scenario "should display text when there are no results" do
|
||||
user = create(:user)
|
||||
proposal = create(:proposal, tag_list: "Distinct_to_sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit debates_path
|
||||
@@ -490,9 +487,8 @@ describe "Debates" do
|
||||
end
|
||||
|
||||
scenario "can be sorted when there's a logged user" do
|
||||
user = create(:user)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit debates_path
|
||||
@@ -511,9 +507,8 @@ describe "Debates" do
|
||||
end
|
||||
|
||||
scenario "are not shown if account setting is disabled" do
|
||||
user = create(:user, recommended_debates: false)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, recommended_debates: false, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit debates_path
|
||||
@@ -523,9 +518,8 @@ describe "Debates" do
|
||||
end
|
||||
|
||||
scenario "are automatically disabled when dismissed from index", :js do
|
||||
user = create(:user)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit debates_path
|
||||
@@ -960,14 +954,13 @@ describe "Debates" do
|
||||
end
|
||||
|
||||
scenario "Reorder by recommendations results maintaing search" do
|
||||
user = create(:user, recommended_debates: true)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
user = create(:user, recommended_debates: true, followables: [proposal])
|
||||
|
||||
debate1 = create(:debate, title: "Show you got", cached_votes_total: 10, tag_list: "Sport")
|
||||
debate2 = create(:debate, title: "Show what you got", cached_votes_total: 1, tag_list: "Sport")
|
||||
debate3 = create(:debate, title: "Do not display with same tag", cached_votes_total: 100, tag_list: "Sport")
|
||||
debate4 = create(:debate, title: "Do not display", cached_votes_total: 1)
|
||||
proposal1 = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal1, user: user)
|
||||
|
||||
login_as(user)
|
||||
visit debates_path
|
||||
|
||||
@@ -258,13 +258,10 @@ describe "Emails" do
|
||||
scenario "notifications for proposals that I have supported" do
|
||||
user = create(:user, email_digest: true)
|
||||
|
||||
proposal1 = create(:proposal)
|
||||
proposal2 = create(:proposal)
|
||||
proposal1 = create(:proposal, voters: [user])
|
||||
proposal2 = create(:proposal, voters: [user])
|
||||
proposal3 = create(:proposal)
|
||||
|
||||
create(:vote, votable: proposal1, voter: user)
|
||||
create(:vote, votable: proposal2, voter: user)
|
||||
|
||||
reset_mailer
|
||||
|
||||
notification1 = create_proposal_notification(proposal1)
|
||||
@@ -306,13 +303,11 @@ describe "Emails" do
|
||||
|
||||
scenario "notifications moderated are not sent" do
|
||||
user = create(:user, email_digest: true)
|
||||
proposal = create(:proposal)
|
||||
proposal_notification = create(:proposal_notification, proposal: proposal)
|
||||
notification = create(:notification, notifiable: proposal_notification)
|
||||
notification = create(:notification, :for_proposal_notification)
|
||||
|
||||
reset_mailer
|
||||
|
||||
proposal_notification.moderate_system_email(create(:administrator).user)
|
||||
notification.notifiable.moderate_system_email(create(:administrator).user)
|
||||
|
||||
email_digest = EmailDigest.new(user)
|
||||
email_digest.deliver(Time.current)
|
||||
|
||||
@@ -25,9 +25,8 @@ describe "Home" do
|
||||
describe "Recommended" do
|
||||
|
||||
before do
|
||||
user = create(:user)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, followables: [proposal])
|
||||
login_as(user)
|
||||
end
|
||||
|
||||
|
||||
@@ -338,9 +338,7 @@ describe "Budget Investments" do
|
||||
scenario "Printing voted budget investments in balloting phase" do
|
||||
budget.update(phase: "balloting")
|
||||
|
||||
voted_investment = create(:budget_investment, :selected, heading: heading)
|
||||
ballot = create(:budget_ballot, user: create(:user, :level_two), budget: budget)
|
||||
ballot.investments << voted_investment
|
||||
voted_investment = create(:budget_investment, :selected, heading: heading, balloters: [create(:user)])
|
||||
|
||||
click_link "Print budget investments"
|
||||
|
||||
|
||||
@@ -128,7 +128,7 @@ describe "Notifications" do
|
||||
end
|
||||
|
||||
scenario "Notification's notifiable model no longer includes Notifiable module" do
|
||||
create(:notification, notifiable: create(:poll_question), user: user)
|
||||
create(:notification, :for_poll_question, user: user)
|
||||
|
||||
click_notifications_icon
|
||||
expect(page).to have_content("This resource is not available anymore.", count: 1)
|
||||
|
||||
@@ -19,13 +19,9 @@ describe "Officing Results", :with_frozen_time do
|
||||
end
|
||||
|
||||
scenario "Only polls where user is officer for results are accessible" do
|
||||
regular_officer_assignment_1 = create(:poll_officer_assignment, officer: poll_officer)
|
||||
regular_officer_assignment_2 = create(:poll_officer_assignment, officer: poll_officer)
|
||||
|
||||
not_allowed_poll_1 = create(:poll, :expired)
|
||||
not_allowed_poll_2 = regular_officer_assignment_1.booth_assignment.poll
|
||||
not_allowed_poll_2.update(ends_at: 1.day.ago)
|
||||
not_allowed_poll_3 = regular_officer_assignment_2.booth_assignment.poll
|
||||
not_allowed_poll_2 = create(:poll, officers: [poll_officer], ends_at: 1.day.ago)
|
||||
not_allowed_poll_3 = create(:poll, officers: [poll_officer])
|
||||
|
||||
visit root_path
|
||||
click_link "Polling officers"
|
||||
|
||||
@@ -136,13 +136,11 @@ describe "Polls" do
|
||||
end
|
||||
|
||||
scenario "Show answers with videos" do
|
||||
question = create(:poll_question, poll: poll)
|
||||
answer = create(:poll_question_answer, question: question, title: "Chewbacca")
|
||||
video = create(:poll_answer_video, answer: answer, title: "Awesome project video", url: "https://www.youtube.com/watch?v=123")
|
||||
create(:poll_answer_video, poll: poll, title: "Awesome video", url: "youtube.com/watch?v=123")
|
||||
|
||||
visit poll_path(poll)
|
||||
|
||||
expect(page).to have_link("Awesome project video", href: "https://www.youtube.com/watch?v=123")
|
||||
expect(page).to have_link("Awesome video", href: "youtube.com/watch?v=123")
|
||||
end
|
||||
|
||||
scenario "Lists questions from proposals as well as regular ones" do
|
||||
|
||||
@@ -30,9 +30,7 @@ describe "Proposal Notifications" do
|
||||
scenario "Send a notification (Active voter)" do
|
||||
proposal = create(:proposal)
|
||||
|
||||
voter = create(:user, :level_two)
|
||||
create(:vote, voter: voter, votable: proposal)
|
||||
|
||||
create(:user, :level_two, votables: [proposal])
|
||||
create_proposal_notification(proposal)
|
||||
|
||||
expect(Notification.count).to eq(1)
|
||||
@@ -40,9 +38,8 @@ describe "Proposal Notifications" do
|
||||
|
||||
scenario "Send a notification (Follower)" do
|
||||
proposal = create(:proposal)
|
||||
user_follower = create(:user)
|
||||
create(:follow, :followed_proposal, user: user_follower, followable: proposal)
|
||||
|
||||
create(:user, :level_two, followables: [proposal])
|
||||
create_proposal_notification(proposal)
|
||||
|
||||
expect(Notification.count).to eq(1)
|
||||
@@ -51,12 +48,8 @@ describe "Proposal Notifications" do
|
||||
scenario "Send a notification (Follower and Voter)" do
|
||||
proposal = create(:proposal)
|
||||
|
||||
user_voter_follower = create(:user)
|
||||
create(:follow, :followed_proposal, user: user_voter_follower, followable: proposal)
|
||||
create(:vote, voter: user_voter_follower, votable: proposal)
|
||||
|
||||
user_follower = create(:user)
|
||||
create(:follow, :followed_proposal, user: user_follower, followable: proposal)
|
||||
create(:user, followables: [proposal], votables: [proposal])
|
||||
create(:user, followables: [proposal])
|
||||
|
||||
create_proposal_notification(proposal)
|
||||
|
||||
@@ -65,11 +58,9 @@ describe "Proposal Notifications" do
|
||||
|
||||
scenario "Send a notification (Blocked voter)" do
|
||||
proposal = create(:proposal)
|
||||
voter = create(:user, :level_two, votables: [proposal])
|
||||
|
||||
voter = create(:user, :level_two)
|
||||
create(:vote, voter: voter, votable: proposal)
|
||||
voter.block
|
||||
|
||||
create_proposal_notification(proposal)
|
||||
|
||||
expect(Notification.count).to eq(0)
|
||||
@@ -77,11 +68,9 @@ describe "Proposal Notifications" do
|
||||
|
||||
scenario "Send a notification (Erased voter)" do
|
||||
proposal = create(:proposal)
|
||||
voter = create(:user, :level_two, votables: [proposal])
|
||||
|
||||
voter = create(:user, :level_two)
|
||||
create(:vote, voter: voter, votable: proposal)
|
||||
voter.erase
|
||||
|
||||
create_proposal_notification(proposal)
|
||||
|
||||
expect(Notification.count).to eq(0)
|
||||
@@ -153,11 +142,9 @@ describe "Proposal Notifications" do
|
||||
|
||||
scenario "Message about receivers (Same Followers and Voters)" do
|
||||
author = create(:user)
|
||||
proposal = create(:proposal, author: author)
|
||||
voter_follower = create(:user)
|
||||
|
||||
user_voter_follower = create(:user)
|
||||
create(:follow, :followed_proposal, user: user_voter_follower, followable: proposal)
|
||||
create(:vote, voter: user_voter_follower, votable: proposal)
|
||||
proposal = create(:proposal, author: author, voters: [voter_follower], followers: [voter_follower])
|
||||
|
||||
login_as(author)
|
||||
visit new_proposal_notification_path(proposal_id: proposal.id)
|
||||
@@ -208,15 +195,11 @@ describe "Proposal Notifications" do
|
||||
|
||||
scenario "Voters should receive a notification", :js do
|
||||
author = create(:user)
|
||||
|
||||
user1 = create(:user)
|
||||
user2 = create(:user)
|
||||
user3 = create(:user)
|
||||
|
||||
proposal = create(:proposal, author: author)
|
||||
|
||||
create(:vote, voter: user1, votable: proposal, vote_flag: true)
|
||||
create(:vote, voter: user2, votable: proposal, vote_flag: true)
|
||||
user1 = create(:user, votables: [proposal])
|
||||
user2 = create(:user, votables: [proposal])
|
||||
user3 = create(:user)
|
||||
|
||||
login_as(author)
|
||||
visit root_path
|
||||
@@ -266,15 +249,11 @@ describe "Proposal Notifications" do
|
||||
|
||||
scenario "Followers should receive a notification", :js do
|
||||
author = create(:user)
|
||||
|
||||
user1 = create(:user)
|
||||
user2 = create(:user)
|
||||
user3 = create(:user)
|
||||
|
||||
proposal = create(:proposal, author: author)
|
||||
|
||||
create(:follow, :followed_proposal, user: user1, followable: proposal)
|
||||
create(:follow, :followed_proposal, user: user2, followable: proposal)
|
||||
user1 = create(:user, followables: [proposal])
|
||||
user2 = create(:user, followables: [proposal])
|
||||
user3 = create(:user)
|
||||
|
||||
login_as author.reload
|
||||
visit root_path
|
||||
@@ -322,10 +301,7 @@ describe "Proposal Notifications" do
|
||||
scenario "Proposal hidden", :js do
|
||||
author = create(:user)
|
||||
user = create(:user)
|
||||
|
||||
proposal = create(:proposal, author: author)
|
||||
|
||||
create(:vote, voter: user, votable: proposal, vote_flag: true)
|
||||
proposal = create(:proposal, author: author, voters: [user])
|
||||
|
||||
login_as(author)
|
||||
visit root_path
|
||||
@@ -357,10 +333,7 @@ describe "Proposal Notifications" do
|
||||
scenario "Proposal retired by author", :js do
|
||||
author = create(:user)
|
||||
user = create(:user)
|
||||
|
||||
proposal = create(:proposal, author: author)
|
||||
|
||||
create(:vote, voter: user, votable: proposal, vote_flag: true)
|
||||
proposal = create(:proposal, author: author, voters: [user])
|
||||
|
||||
login_as(author)
|
||||
visit root_path
|
||||
@@ -376,11 +349,8 @@ describe "Proposal Notifications" do
|
||||
|
||||
scenario "for the same proposal", :js do
|
||||
author = create(:user)
|
||||
user = create(:user)
|
||||
|
||||
proposal = create(:proposal, author: author)
|
||||
|
||||
create(:follow, :followed_proposal, user: user, followable: proposal)
|
||||
user = create(:user, followables: [proposal])
|
||||
|
||||
login_as author.reload
|
||||
|
||||
|
||||
@@ -637,9 +637,8 @@ describe "Proposals" do
|
||||
end
|
||||
|
||||
scenario "Update should not be posible if proposal is not editable" do
|
||||
proposal = create(:proposal)
|
||||
Setting["max_votes_for_proposal_edit"] = 10
|
||||
11.times { create(:vote, votable: proposal) }
|
||||
Setting["max_votes_for_proposal_edit"] = 3
|
||||
proposal = create(:proposal, voters: Array.new(4) { create(:user) })
|
||||
|
||||
expect(proposal).not_to be_editable
|
||||
|
||||
@@ -750,9 +749,8 @@ describe "Proposals" do
|
||||
end
|
||||
|
||||
scenario "are shown on index header when account setting is enabled" do
|
||||
user = create(:user)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit proposals_path
|
||||
@@ -765,9 +763,8 @@ describe "Proposals" do
|
||||
end
|
||||
|
||||
scenario "should display text when there are no results" do
|
||||
user = create(:user)
|
||||
proposal = create(:proposal, tag_list: "Distinct_to_sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit proposals_path
|
||||
@@ -789,9 +786,8 @@ describe "Proposals" do
|
||||
end
|
||||
|
||||
scenario "can be sorted when there's a logged user" do
|
||||
user = create(:user)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit proposals_path
|
||||
@@ -810,9 +806,8 @@ describe "Proposals" do
|
||||
end
|
||||
|
||||
scenario "are not shown if account setting is disabled" do
|
||||
user = create(:user, recommended_proposals: false)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, recommended_proposals: false, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit proposals_path
|
||||
@@ -822,9 +817,8 @@ describe "Proposals" do
|
||||
end
|
||||
|
||||
scenario "are automatically disabled when dismissed from index", :js do
|
||||
user = create(:user)
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
user = create(:user, followables: [proposal])
|
||||
|
||||
login_as(user)
|
||||
visit proposals_path
|
||||
@@ -997,10 +991,10 @@ describe "Proposals" do
|
||||
end
|
||||
|
||||
scenario "do not show recommented proposal in selected proposals list" do
|
||||
create(:proposal, title: "Recommended", tag_list: "Economy")
|
||||
|
||||
user = create(:user)
|
||||
create(:follow, followable: create(:proposal, tag_list: "Economy"), user: user)
|
||||
|
||||
create(:proposal, tag_list: "Economy", followers: [user])
|
||||
create(:proposal, title: "Recommended", tag_list: "Economy")
|
||||
|
||||
login_as(user)
|
||||
visit proposals_path
|
||||
@@ -1481,12 +1475,11 @@ describe "Proposals" do
|
||||
scenario "Reorder by recommendations results maintaing search" do
|
||||
user = create(:user, recommended_proposals: true)
|
||||
|
||||
proposal1 = create(:proposal, title: "Show you got", cached_votes_up: 10, tag_list: "Sport")
|
||||
proposal2 = create(:proposal, title: "Show what you got", cached_votes_up: 1, tag_list: "Sport")
|
||||
proposal3 = create(:proposal, title: "Do not display with same tag", cached_votes_up: 100, tag_list: "Sport")
|
||||
proposal4 = create(:proposal, title: "Do not display", cached_votes_up: 1)
|
||||
proposal5 = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal5, user: user)
|
||||
create(:proposal, title: "Show you got", cached_votes_up: 10, tag_list: "Sport")
|
||||
create(:proposal, title: "Show what you got", cached_votes_up: 1, tag_list: "Sport")
|
||||
create(:proposal, title: "Do not display with same tag", cached_votes_up: 100, tag_list: "Sport")
|
||||
create(:proposal, title: "Do not display", cached_votes_up: 1)
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
|
||||
login_as(user)
|
||||
visit proposals_path
|
||||
|
||||
@@ -19,14 +19,9 @@ describe "Stats" do
|
||||
end
|
||||
|
||||
scenario "Votes" do
|
||||
debate = create(:debate)
|
||||
create(:vote, votable: debate)
|
||||
|
||||
proposal = create(:proposal)
|
||||
2.times { create(:vote, votable: proposal) }
|
||||
|
||||
comment = create(:comment)
|
||||
3.times { create(:vote, votable: comment) }
|
||||
create(:debate, voters: Array.new(1) { create(:user) })
|
||||
create(:proposal, voters: Array.new(2) { create(:user) })
|
||||
create(:comment, voters: Array.new(3) { create(:user) })
|
||||
|
||||
visit stats_path
|
||||
|
||||
|
||||
@@ -130,28 +130,25 @@ describe "Topics" do
|
||||
context "Destroy" do
|
||||
|
||||
scenario "Can destroy a topic" do
|
||||
proposal = create(:proposal)
|
||||
community = proposal.community
|
||||
user = create(:user)
|
||||
topic = create(:topic, community: community, author: user)
|
||||
topic = create(:topic, :with_community, author: user)
|
||||
|
||||
login_as(user)
|
||||
visit community_topic_path(community, topic)
|
||||
visit community_topic_path(topic.community, topic)
|
||||
|
||||
click_link "Delete topic"
|
||||
|
||||
expect(page).to have_content "Topic deleted successfully."
|
||||
expect(page).not_to have_content topic.title
|
||||
expect(page).to have_current_path(community_path(community))
|
||||
expect(page).to have_current_path(community_path(topic.community))
|
||||
end
|
||||
|
||||
scenario "Can not destroy a topic when user logged is not an author" do
|
||||
proposal = create(:proposal)
|
||||
community = proposal.community
|
||||
topic = create(:topic, community: community)
|
||||
user = create(:user)
|
||||
login_as(user)
|
||||
topic = create(:topic, :with_community)
|
||||
|
||||
visit community_path(community)
|
||||
login_as(user)
|
||||
visit community_path(topic.community)
|
||||
|
||||
expect(page).not_to have_link "Delete"
|
||||
end
|
||||
|
||||
@@ -239,8 +239,7 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "Display interests" do
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
||||
create(:proposal, tag_list: "Sport", followers: [@user])
|
||||
|
||||
login_as(@user)
|
||||
visit account_path
|
||||
@@ -255,8 +254,7 @@ describe "Users" do
|
||||
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 = create(:proposal, tag_list: "Sport", followers: [@user])
|
||||
proposal.destroy
|
||||
|
||||
login_as(@user)
|
||||
@@ -279,8 +277,7 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "User can display public page" do
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
||||
create(:proposal, tag_list: "Sport", followers: [@user])
|
||||
|
||||
login_as(@user)
|
||||
visit account_path
|
||||
@@ -296,8 +293,7 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "Is always visible for the owner" do
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
||||
create(:proposal, tag_list: "Sport", followers: [@user])
|
||||
|
||||
login_as(@user)
|
||||
visit account_path
|
||||
@@ -310,8 +306,7 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "Is always visible for admins" do
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
||||
create(:proposal, tag_list: "Sport", followers: [@user])
|
||||
|
||||
login_as(@user)
|
||||
visit account_path
|
||||
@@ -327,8 +322,7 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "Is always visible for moderators" do
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
||||
create(:proposal, tag_list: "Sport", followers: [@user])
|
||||
|
||||
login_as(@user)
|
||||
visit account_path
|
||||
@@ -344,8 +338,7 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "Should display generic interests title" do
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, :followed_proposal, followable: proposal, user: @user)
|
||||
create(:proposal, tag_list: "Sport", followers: [@user])
|
||||
|
||||
@user.update(public_interests: true)
|
||||
visit user_path(@user, filter: "follows", page: "1")
|
||||
@@ -354,8 +347,7 @@ describe "Users" do
|
||||
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)
|
||||
create(:proposal, tag_list: "Sport", followers: [@user])
|
||||
|
||||
@user.update(public_interests: true)
|
||||
login_as(@user)
|
||||
@@ -431,8 +423,7 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "Active following tab by default when follows filters selected", :js do
|
||||
proposal = create(:proposal, author: @user)
|
||||
create(:follow, followable: proposal, user: @user)
|
||||
create(:proposal, author: @user, followers: [@user])
|
||||
|
||||
visit user_path(@user, filter: "follows")
|
||||
|
||||
@@ -440,13 +431,9 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "Gracefully handle followables that have been hidden" do
|
||||
active_proposal = create(:proposal)
|
||||
hidden_proposal = create(:proposal)
|
||||
create(:proposal, followers: [@user])
|
||||
create(:proposal, followers: [@user]) { |proposal| proposal.hide }
|
||||
|
||||
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")
|
||||
@@ -455,8 +442,7 @@ describe "Users" do
|
||||
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)
|
||||
create(:proposal, followers: [@user])
|
||||
|
||||
visit user_path(@user)
|
||||
|
||||
@@ -464,8 +450,7 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "Display proposal tab when user is following one proposal at least" do
|
||||
proposal = create(:proposal)
|
||||
create(:follow, followable: proposal, user: @user)
|
||||
create(:proposal, followers: [@user])
|
||||
|
||||
visit user_path(@user, filter: "follows")
|
||||
|
||||
@@ -479,8 +464,8 @@ describe "Users" do
|
||||
end
|
||||
|
||||
scenario "Display proposals with link to proposal" do
|
||||
proposal = create(:proposal, author: @user)
|
||||
create(:follow, followable: proposal, user: @user)
|
||||
proposal = create(:proposal, author: @user, followers: [@user])
|
||||
|
||||
login_as @user
|
||||
|
||||
visit user_path(@user, filter: "follows")
|
||||
@@ -514,8 +499,7 @@ describe "Users" do
|
||||
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)
|
||||
create(:budget_investment, followers: [@user])
|
||||
|
||||
visit user_path(@user)
|
||||
|
||||
@@ -523,8 +507,7 @@ describe "Users" do
|
||||
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)
|
||||
create(:budget_investment, followers: [@user])
|
||||
|
||||
visit user_path(@user, filter: "follows")
|
||||
|
||||
@@ -539,8 +522,7 @@ describe "Users" do
|
||||
|
||||
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)
|
||||
budget_investment = create(:budget_investment, author: user, followers: [user])
|
||||
|
||||
visit user_path(user, filter: "follows")
|
||||
click_link "Investments"
|
||||
|
||||
@@ -188,10 +188,9 @@ describe "Votes" do
|
||||
before { login_as(@manuela) }
|
||||
|
||||
scenario "Index shows user votes on proposals" do
|
||||
proposal1 = create(:proposal)
|
||||
proposal1 = create(:proposal, voters: [@manuela])
|
||||
proposal2 = create(:proposal)
|
||||
proposal3 = create(:proposal)
|
||||
create(:vote, voter: @manuela, votable: proposal1, vote_flag: true)
|
||||
|
||||
visit proposals_path
|
||||
|
||||
|
||||
@@ -21,11 +21,8 @@ describe EmailDigest do
|
||||
it "returns only proposal notifications" do
|
||||
user = create(:user)
|
||||
|
||||
proposal_notification = create(:proposal_notification)
|
||||
comment = create(:comment)
|
||||
|
||||
notification1 = create(:notification, notifiable: proposal_notification, user: user)
|
||||
notification2 = create(:notification, notifiable: comment, user: user)
|
||||
notification1 = create(:notification, :for_proposal_notification, user: user)
|
||||
notification2 = create(:notification, :for_comment, user: user)
|
||||
|
||||
email_digest = EmailDigest.new(user)
|
||||
|
||||
@@ -40,8 +37,7 @@ describe EmailDigest do
|
||||
it "returns true when notifications have not been emailed" do
|
||||
user = create(:user)
|
||||
|
||||
proposal_notification = create(:proposal_notification)
|
||||
notification = create(:notification, notifiable: proposal_notification, user: user)
|
||||
notification = create(:notification, :for_proposal_notification, user: user)
|
||||
|
||||
email_digest = EmailDigest.new(user)
|
||||
expect(email_digest.pending_notifications?).to be
|
||||
@@ -50,8 +46,7 @@ describe EmailDigest do
|
||||
it "returns false when notifications have been emailed" do
|
||||
user = create(:user)
|
||||
|
||||
proposal_notification = create(:proposal_notification)
|
||||
notification = create(:notification, notifiable: proposal_notification, user: user, emailed_at: Time.current)
|
||||
notification = create(:notification, :for_proposal_notification, user: user, emailed_at: Time.current)
|
||||
|
||||
email_digest = EmailDigest.new(user)
|
||||
expect(email_digest.pending_notifications?).not_to be
|
||||
@@ -70,8 +65,7 @@ describe EmailDigest do
|
||||
it "delivers email if notifications pending" do
|
||||
user = create(:user)
|
||||
|
||||
proposal_notification = create(:proposal_notification)
|
||||
notification = create(:notification, notifiable: proposal_notification, user: user)
|
||||
notification = create(:notification, :for_proposal_notification, user: user)
|
||||
|
||||
reset_mailer
|
||||
email_digest = EmailDigest.new(user)
|
||||
@@ -84,8 +78,7 @@ describe EmailDigest do
|
||||
it "does not deliver email if no notifications pending" do
|
||||
user = create(:user)
|
||||
|
||||
proposal_notification = create(:proposal_notification)
|
||||
create(:notification, notifiable: proposal_notification, user: user, emailed_at: Time.current)
|
||||
create(:notification, :for_proposal_notification, user: user, emailed_at: Time.current)
|
||||
|
||||
reset_mailer
|
||||
email_digest = EmailDigest.new(user)
|
||||
|
||||
@@ -189,8 +189,7 @@ describe "Consul Schema" do
|
||||
end
|
||||
|
||||
it "returns nested votes for a proposal" do
|
||||
proposal = create(:proposal)
|
||||
2.times { create(:vote, votable: proposal) }
|
||||
proposal = create(:proposal, voters: [create(:user), create(:user)])
|
||||
|
||||
response = execute("{ proposal(id: #{proposal.id}) { votes_for { edges { node { public_created_at } } } } }")
|
||||
|
||||
@@ -535,15 +534,10 @@ describe "Consul Schema" do
|
||||
describe "Votes" do
|
||||
|
||||
it "only returns votes from proposals, debates and comments" do
|
||||
proposal = create(:proposal)
|
||||
debate = create(:debate)
|
||||
comment = create(:comment)
|
||||
budget_investment = create(:budget_investment)
|
||||
|
||||
proposal_vote = create(:vote, votable: proposal)
|
||||
debate_vote = create(:vote, votable: debate)
|
||||
comment_vote = create(:vote, votable: comment)
|
||||
budget_investment_vote = create(:vote, votable: budget_investment)
|
||||
create(:proposal, voters: [create(:user)])
|
||||
create(:debate, voters: [create(:user)])
|
||||
create(:comment, voters: [create(:user)])
|
||||
create(:budget_investment, voters: [create(:user)])
|
||||
|
||||
response = execute("{ votes { edges { node { votable_type } } } }")
|
||||
received_votables = extract_fields(response, "votes", "votable_type")
|
||||
@@ -552,11 +546,8 @@ describe "Consul Schema" do
|
||||
end
|
||||
|
||||
it "does not include votes from hidden debates" do
|
||||
visible_debate = create(:debate)
|
||||
hidden_debate = create(:debate, :hidden)
|
||||
|
||||
visible_debate_vote = create(:vote, votable: visible_debate)
|
||||
hidden_debate_vote = create(:vote, votable: hidden_debate)
|
||||
visible_debate = create(:debate, voters: [create(:user)])
|
||||
hidden_debate = create(:debate, :hidden, voters: [create(:user)])
|
||||
|
||||
response = execute("{ votes { edges { node { votable_id } } } }")
|
||||
received_debates = extract_fields(response, "votes", "votable_id")
|
||||
@@ -565,11 +556,8 @@ describe "Consul Schema" do
|
||||
end
|
||||
|
||||
it "does not include votes of hidden proposals" do
|
||||
visible_proposal = create(:proposal)
|
||||
hidden_proposal = create(:proposal, :hidden)
|
||||
|
||||
visible_proposal_vote = create(:vote, votable: visible_proposal)
|
||||
hidden_proposal_vote = create(:vote, votable: hidden_proposal)
|
||||
visible_proposal = create(:proposal, voters: [create(:user)])
|
||||
hidden_proposal = create(:proposal, :hidden, voters: [create(:user)])
|
||||
|
||||
response = execute("{ votes { edges { node { votable_id } } } }")
|
||||
received_proposals = extract_fields(response, "votes", "votable_id")
|
||||
@@ -578,11 +566,8 @@ describe "Consul Schema" do
|
||||
end
|
||||
|
||||
it "does not include votes of hidden comments" do
|
||||
visible_comment = create(:comment)
|
||||
hidden_comment = create(:comment, :hidden)
|
||||
|
||||
visible_comment_vote = create(:vote, votable: visible_comment)
|
||||
hidden_comment_vote = create(:vote, votable: hidden_comment)
|
||||
visible_comment = create(:comment, voters: [create(:user)])
|
||||
hidden_comment = create(:comment, :hidden, voters: [create(:user)])
|
||||
|
||||
response = execute("{ votes { edges { node { votable_id } } } }")
|
||||
received_comments = extract_fields(response, "votes", "votable_id")
|
||||
@@ -594,11 +579,8 @@ describe "Consul Schema" do
|
||||
visible_proposal = create(:proposal)
|
||||
hidden_proposal = create(:proposal, :hidden)
|
||||
|
||||
visible_proposal_comment = create(:comment, commentable: visible_proposal)
|
||||
hidden_proposal_comment = create(:comment, commentable: hidden_proposal)
|
||||
|
||||
visible_proposal_comment_vote = create(:vote, votable: visible_proposal_comment)
|
||||
hidden_proposal_comment_vote = create(:vote, votable: hidden_proposal_comment)
|
||||
visible_proposal_comment = create(:comment, commentable: visible_proposal, voters: [create(:user)])
|
||||
hidden_proposal_comment = create(:comment, commentable: hidden_proposal, voters: [create(:user)])
|
||||
|
||||
response = execute("{ votes { edges { node { votable_id } } } }")
|
||||
received_votables = extract_fields(response, "votes", "votable_id")
|
||||
@@ -610,11 +592,8 @@ describe "Consul Schema" do
|
||||
visible_debate = create(:debate)
|
||||
hidden_debate = create(:debate, :hidden)
|
||||
|
||||
visible_debate_comment = create(:comment, commentable: visible_debate)
|
||||
hidden_debate_comment = create(:comment, commentable: hidden_debate)
|
||||
|
||||
visible_debate_comment_vote = create(:vote, votable: visible_debate_comment)
|
||||
hidden_debate_comment_vote = create(:vote, votable: hidden_debate_comment)
|
||||
visible_debate_comment = create(:comment, commentable: visible_debate, voters: [create(:user)])
|
||||
hidden_debate_comment = create(:comment, commentable: hidden_debate, voters: [create(:user)])
|
||||
|
||||
response = execute("{ votes { edges { node { votable_id } } } }")
|
||||
received_votables = extract_fields(response, "votes", "votable_id")
|
||||
@@ -623,10 +602,8 @@ describe "Consul Schema" do
|
||||
end
|
||||
|
||||
it "does not include votes of debates that are not public" do
|
||||
not_public_debate = create(:debate)
|
||||
allow(Vote).to receive(:public_for_api).and_return([])
|
||||
|
||||
not_public_debate_vote = create(:vote, votable: not_public_debate)
|
||||
not_public_debate = create(:debate, voters: [create(:user)])
|
||||
|
||||
response = execute("{ votes { edges { node { votable_id } } } }")
|
||||
received_votables = extract_fields(response, "votes", "votable_id")
|
||||
@@ -635,10 +612,8 @@ describe "Consul Schema" do
|
||||
end
|
||||
|
||||
it "does not include votes of a hidden proposals" do
|
||||
not_public_proposal = create(:proposal)
|
||||
allow(Vote).to receive(:public_for_api).and_return([])
|
||||
|
||||
not_public_proposal_vote = create(:vote, votable: not_public_proposal)
|
||||
not_public_proposal = create(:proposal, voters: [create(:user)])
|
||||
|
||||
response = execute("{ votes { edges { node { votable_id } } } }")
|
||||
received_votables = extract_fields(response, "votes", "votable_id")
|
||||
@@ -647,10 +622,8 @@ describe "Consul Schema" do
|
||||
end
|
||||
|
||||
it "does not include votes of a hidden comments" do
|
||||
not_public_comment = create(:comment)
|
||||
allow(Vote).to receive(:public_for_api).and_return([])
|
||||
|
||||
not_public_comment_vote = create(:vote, votable: not_public_comment)
|
||||
not_public_comment = create(:comment, voters: [create(:user)])
|
||||
|
||||
response = execute("{ votes { edges { node { votable_id } } } }")
|
||||
received_votables = extract_fields(response, "votes", "votable_id")
|
||||
|
||||
@@ -13,11 +13,8 @@ describe Budget::Ballot do
|
||||
|
||||
it "is not valid with the same investment twice" do
|
||||
budget = create(:budget)
|
||||
heading = create(:budget_heading, budget: budget)
|
||||
investment = create(:budget_investment, :selected, heading: heading)
|
||||
|
||||
ballot = create(:budget_ballot, budget: budget)
|
||||
ballot.investments << investment
|
||||
investment = create(:budget_investment, :selected, budget: budget)
|
||||
ballot = create(:budget_ballot, budget: budget.reload, investments: [investment])
|
||||
|
||||
expect { ballot.investments << investment }.to raise_error(ActiveRecord::RecordNotUnique)
|
||||
end
|
||||
@@ -103,16 +100,14 @@ describe Budget::Ballot do
|
||||
|
||||
it "returns the heading with balloted investments for a group" do
|
||||
budget = create(:budget)
|
||||
ballot = create(:budget_ballot, budget: budget)
|
||||
group = create(:budget_group, budget: budget)
|
||||
|
||||
heading1 = create(:budget_heading, group: group)
|
||||
heading2 = create(:budget_heading, group: group)
|
||||
|
||||
inv1 = create(:budget_investment, :selected, heading: heading1)
|
||||
inv2 = create(:budget_investment, :selected, heading: heading2)
|
||||
|
||||
ballot = create(:budget_ballot, budget: budget)
|
||||
ballot.investments << inv2
|
||||
create(:budget_investment, :selected, heading: heading1)
|
||||
create(:budget_investment, :selected, heading: heading2, ballots: [ballot])
|
||||
|
||||
expect(ballot.heading_for_group(group)).to eq heading2
|
||||
end
|
||||
|
||||
@@ -748,11 +748,9 @@ describe Budget::Investment do
|
||||
carabanchel = create(:budget_heading, group: group)
|
||||
salamanca = create(:budget_heading, group: group)
|
||||
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel)
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel, voters: [user])
|
||||
salamanca_investment = create(:budget_investment, heading: salamanca)
|
||||
|
||||
create(:vote, votable: carabanchel_investment, voter: user)
|
||||
|
||||
expect(salamanca_investment.valid_heading?(user)).to eq(false)
|
||||
end
|
||||
|
||||
@@ -762,11 +760,9 @@ describe Budget::Investment do
|
||||
carabanchel = create(:budget_heading, group: group)
|
||||
salamanca = create(:budget_heading, group: group)
|
||||
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel)
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel, voters: [user])
|
||||
salamanca_investment = create(:budget_investment, heading: salamanca)
|
||||
|
||||
create(:vote, votable: carabanchel_investment, voter: user)
|
||||
|
||||
expect(salamanca_investment.valid_heading?(user)).to eq(true)
|
||||
end
|
||||
|
||||
@@ -776,11 +772,8 @@ describe Budget::Investment do
|
||||
carabanchel = create(:budget_heading, group: group)
|
||||
salamanca = create(:budget_heading, group: group)
|
||||
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel)
|
||||
salamanca_investment = create(:budget_investment, heading: salamanca)
|
||||
|
||||
create(:vote, votable: carabanchel_investment, voter: user)
|
||||
create(:vote, votable: salamanca_investment, voter: user)
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel, voters: [user])
|
||||
salamanca_investment = create(:budget_investment, heading: salamanca, voters: [user])
|
||||
|
||||
expect(carabanchel_investment.valid_heading?(user)).to eq(true)
|
||||
expect(salamanca_investment.valid_heading?(user)).to eq(true)
|
||||
@@ -792,11 +785,9 @@ describe Budget::Investment do
|
||||
end
|
||||
|
||||
it "allows votes in a group with a single heading after voting in that heading" do
|
||||
all_city_investment1 = create(:budget_investment, heading: heading)
|
||||
all_city_investment1 = create(:budget_investment, heading: heading, voters: [user])
|
||||
all_city_investment2 = create(:budget_investment, heading: heading)
|
||||
|
||||
create(:vote, votable: all_city_investment1, voter: user)
|
||||
|
||||
expect(all_city_investment2.valid_heading?(user)).to eq(true)
|
||||
end
|
||||
|
||||
@@ -805,9 +796,7 @@ describe Budget::Investment do
|
||||
carabanchel = create(:budget_heading, group: districts)
|
||||
|
||||
all_city_investment = create(:budget_investment, heading: heading)
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel)
|
||||
|
||||
create(:vote, votable: carabanchel_investment, voter: user)
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel, voters: [user])
|
||||
|
||||
expect(all_city_investment.valid_heading?(user)).to eq(true)
|
||||
end
|
||||
@@ -817,11 +806,9 @@ describe Budget::Investment do
|
||||
carabanchel = create(:budget_heading, group: districts)
|
||||
salamanca = create(:budget_heading, group: districts)
|
||||
|
||||
all_city_investment = create(:budget_investment, heading: heading)
|
||||
all_city_investment = create(:budget_investment, heading: heading, voters: [user])
|
||||
carabanchel_investment = create(:budget_investment, heading: carabanchel)
|
||||
|
||||
create(:vote, votable: all_city_investment, voter: user)
|
||||
|
||||
expect(carabanchel_investment.valid_heading?(user)).to eq(true)
|
||||
end
|
||||
|
||||
@@ -929,9 +916,8 @@ describe Budget::Investment do
|
||||
|
||||
describe "#with_supports" do
|
||||
it "returns proposals with supports" do
|
||||
inv1 = create(:budget_investment)
|
||||
inv1 = create(:budget_investment, voters: [create(:user)])
|
||||
inv2 = create(:budget_investment)
|
||||
create(:vote, votable: inv1)
|
||||
|
||||
expect(Budget::Investment.with_supports).to eq [inv1]
|
||||
expect(Budget::Investment.with_supports).not_to include(inv2)
|
||||
@@ -990,8 +976,7 @@ describe Budget::Investment do
|
||||
|
||||
inv1 = create(:budget_investment, :selected, budget: budget, heading: california)
|
||||
inv2 = create(:budget_investment, :selected, budget: budget, heading: new_york)
|
||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||
ballot.investments << inv1
|
||||
ballot = create(:budget_ballot, user: user, budget: budget, investments: [inv1])
|
||||
|
||||
expect(inv2.reason_for_not_being_ballotable_by(user, ballot)).to eq(:different_heading_assigned_html)
|
||||
end
|
||||
@@ -1003,8 +988,7 @@ describe Budget::Investment do
|
||||
inv1 = create(:budget_investment, :selected, budget: budget, heading: carabanchel, price: 30)
|
||||
inv2 = create(:budget_investment, :selected, budget: budget, heading: carabanchel, price: 10)
|
||||
|
||||
ballot = create(:budget_ballot, user: user, budget: budget)
|
||||
ballot.investments << inv1
|
||||
ballot = create(:budget_ballot, user: user, budget: budget, investments: [inv1])
|
||||
|
||||
expect(inv2.reason_for_not_being_ballotable_by(user, ballot)).to eq(:not_enough_money_html)
|
||||
end
|
||||
@@ -1074,10 +1058,7 @@ describe Budget::Investment do
|
||||
it "stores the votes for a reclassified investment" do
|
||||
investment = create(:budget_investment, :selected, heading: heading1)
|
||||
|
||||
3.times do
|
||||
ballot = create(:budget_ballot, budget: budget)
|
||||
ballot.investments << investment
|
||||
end
|
||||
3.times { create(:user, ballot_lines: [investment]) }
|
||||
|
||||
expect(investment.ballot_lines_count).to eq(3)
|
||||
|
||||
@@ -1098,10 +1079,7 @@ describe Budget::Investment do
|
||||
it "removes votes from invesment" do
|
||||
investment = create(:budget_investment, :selected, heading: heading1)
|
||||
|
||||
3.times do
|
||||
ballot = create(:budget_ballot, budget: budget)
|
||||
ballot.investments << investment
|
||||
end
|
||||
3.times { create(:user, ballot_lines: [investment]) }
|
||||
|
||||
expect(investment.ballot_lines_count).to eq(3)
|
||||
|
||||
@@ -1119,10 +1097,7 @@ describe Budget::Investment do
|
||||
it "stores reclassfied votes and removes actual votes if an investment has been reclassified" do
|
||||
investment = create(:budget_investment, :selected, heading: heading1)
|
||||
|
||||
3.times do
|
||||
ballot = create(:budget_ballot, budget: budget)
|
||||
ballot.investments << investment
|
||||
end
|
||||
3.times { create(:user, ballot_lines: [investment]) }
|
||||
|
||||
expect(investment.ballot_lines_count).to eq(3)
|
||||
|
||||
@@ -1137,10 +1112,7 @@ describe Budget::Investment do
|
||||
it "does not store reclassified votes nor remove actual votes if the investment has not been reclassifed" do
|
||||
investment = create(:budget_investment, :selected, heading: heading1)
|
||||
|
||||
3.times do
|
||||
ballot = create(:budget_ballot, budget: budget)
|
||||
ballot.investments << investment
|
||||
end
|
||||
3.times { create(:user, ballot_lines: [investment]) }
|
||||
|
||||
expect(investment.ballot_lines_count).to eq(3)
|
||||
|
||||
|
||||
@@ -6,24 +6,17 @@ describe Budget::Stats do
|
||||
let(:investment) { create(:budget_investment, :selected, budget: budget) }
|
||||
|
||||
describe "#participants" do
|
||||
let(:author) { investment.author }
|
||||
let(:author_and_voter) { create(:user, :hidden) }
|
||||
let(:voter) { create(:user) }
|
||||
let(:voter_and_balloter) { create(:user) }
|
||||
let(:balloter) { create(:user, :hidden) }
|
||||
let(:poll_balloter) { create(:user, :level_two) }
|
||||
let(:non_participant) { create(:user, :level_two) }
|
||||
let!(:author) { investment.author }
|
||||
let!(:author_and_voter) { create(:user, :hidden, votables: [investment]) }
|
||||
let!(:voter) { create(:user, votables: [investment]) }
|
||||
let!(:voter_and_balloter) { create(:user, votables: [investment], ballot_lines: [investment]) }
|
||||
let!(:balloter) { create(:user, :hidden, ballot_lines: [investment]) }
|
||||
let!(:poll_balloter) { create(:user, :level_two) }
|
||||
let!(:non_participant) { create(:user, :level_two) }
|
||||
|
||||
before do
|
||||
create(:budget_investment, :selected, budget: budget, author: author_and_voter)
|
||||
|
||||
create(:vote, votable: investment, voter: author_and_voter)
|
||||
create(:vote, votable: investment, voter: voter)
|
||||
create(:vote, votable: investment, voter: voter_and_balloter)
|
||||
|
||||
create(:budget_ballot_line, investment: investment, user: balloter)
|
||||
create(:budget_ballot_line, investment: investment, user: voter_and_balloter)
|
||||
|
||||
create(:poll_voter, :from_booth, user: poll_balloter, budget: budget)
|
||||
|
||||
create(:poll_voter, :from_booth, user: non_participant, budget: create(:budget))
|
||||
@@ -46,9 +39,7 @@ describe Budget::Stats do
|
||||
end
|
||||
|
||||
it "counts a user who is voter and balloter" do
|
||||
voter_and_balloter = create(:user)
|
||||
create(:vote, votable: investment, voter: voter_and_balloter)
|
||||
create(:budget_ballot_line, investment: investment, user: voter_and_balloter)
|
||||
create(:user, votables: [investment], ballot_lines: [investment])
|
||||
|
||||
expect(stats.total_participants_support_phase).to be 1
|
||||
end
|
||||
@@ -63,9 +54,7 @@ describe Budget::Stats do
|
||||
end
|
||||
|
||||
it "counts a user who is voter and balloter" do
|
||||
voter_and_balloter = create(:user)
|
||||
create(:vote, votable: investment, voter: voter_and_balloter)
|
||||
create(:budget_ballot_line, investment: investment, user: voter_and_balloter)
|
||||
create(:user, votables: [investment], ballot_lines: [investment])
|
||||
|
||||
expect(stats.total_participants_vote_phase).to be 1
|
||||
end
|
||||
@@ -78,8 +67,7 @@ describe Budget::Stats do
|
||||
end
|
||||
|
||||
it "counts once a user who is balloter and poll balloter" do
|
||||
poller_and_balloter = create(:user, :level_two)
|
||||
create(:budget_ballot_line, investment: investment, user: poller_and_balloter)
|
||||
poller_and_balloter = create(:user, :level_two, ballot_lines: [investment])
|
||||
create(:poll_voter, :from_booth, user: poller_and_balloter, budget: budget)
|
||||
|
||||
expect(stats.total_participants_vote_phase).to be 1
|
||||
|
||||
@@ -749,11 +749,11 @@ describe Debate do
|
||||
end
|
||||
|
||||
it "returns debates related to the user's interests ordered by cached_votes_total" do
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
|
||||
debate1 = create(:debate, cached_votes_total: 1, tag_list: "Sport")
|
||||
debate2 = create(:debate, cached_votes_total: 5, tag_list: "Sport")
|
||||
debate3 = create(:debate, cached_votes_total: 10, tag_list: "Sport")
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
|
||||
results = Debate.recommendations(user).sort_by_recommendations
|
||||
|
||||
@@ -761,9 +761,8 @@ describe Debate do
|
||||
end
|
||||
|
||||
it "does not return debates unrelated to user interests" do
|
||||
proposal1 = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal1, user: user)
|
||||
debate2 = create(:debate, tag_list: "Politics")
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
create(:debate, tag_list: "Politics")
|
||||
|
||||
results = Debate.recommendations(user)
|
||||
|
||||
@@ -771,9 +770,8 @@ describe Debate do
|
||||
end
|
||||
|
||||
it "does not return debates when user is the author" do
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
debate1 = create(:debate, author: user, tag_list: "Sport")
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
create(:debate, author: user, tag_list: "Sport")
|
||||
|
||||
results = Debate.recommendations(user)
|
||||
|
||||
|
||||
@@ -65,13 +65,9 @@ describe Poll::Officer do
|
||||
it "returns polls ordered by end date (desc)" do
|
||||
officer = create(:poll_officer)
|
||||
|
||||
poll_1 = create(:poll, ends_at: 1.day.ago)
|
||||
poll_2 = create(:poll, ends_at: 10.days.from_now)
|
||||
poll_3 = create(:poll, ends_at: 10.days.ago)
|
||||
|
||||
[poll_1, poll_2, poll_3].each do |poll|
|
||||
create(:poll_officer_assignment, officer: officer, poll: poll)
|
||||
end
|
||||
poll_1 = create(:poll, ends_at: 1.day.ago, officers: [officer])
|
||||
poll_2 = create(:poll, ends_at: 10.days.from_now, officers: [officer])
|
||||
poll_3 = create(:poll, ends_at: 10.days.ago, officers: [officer])
|
||||
|
||||
assigned_polls = officer.voting_days_assigned_polls
|
||||
|
||||
@@ -87,9 +83,9 @@ describe Poll::Officer do
|
||||
poll_2 = create(:poll)
|
||||
poll_3 = create(:poll)
|
||||
|
||||
create(:poll_officer_assignment, poll: poll_1, officer: officer, date: poll_1.starts_at, final: true)
|
||||
create(:poll_officer_assignment, poll: poll_1, officer: officer, date: poll_1.ends_at, final: true)
|
||||
create(:poll_officer_assignment, poll: poll_2, officer: officer, final: true)
|
||||
create(:poll_officer_assignment, :final, poll: poll_1, officer: officer, date: poll_1.starts_at)
|
||||
create(:poll_officer_assignment, :final, poll: poll_1, officer: officer, date: poll_1.ends_at)
|
||||
create(:poll_officer_assignment, :final, poll: poll_2, officer: officer)
|
||||
create(:poll_officer_assignment, poll: poll_3, officer: officer)
|
||||
|
||||
assigned_polls = officer.final_days_assigned_polls
|
||||
@@ -119,7 +115,7 @@ describe Poll::Officer do
|
||||
poll_3 = create(:poll, ends_at: 10.days.ago)
|
||||
|
||||
[poll_1, poll_2, poll_3].each do |poll|
|
||||
create(:poll_officer_assignment, officer: officer, poll: poll, final: true)
|
||||
create(:poll_officer_assignment, :final, officer: officer, poll: poll)
|
||||
end
|
||||
|
||||
assigned_polls = officer.final_days_assigned_polls
|
||||
|
||||
@@ -51,28 +51,24 @@ describe Poll::Voter do
|
||||
end
|
||||
|
||||
it "is not valid if the user has already voted in different booth in the same poll" do
|
||||
booth_assignment1 = create(:poll_booth_assignment, poll: poll)
|
||||
booth_assignment2 = create(:poll_booth_assignment, poll: poll)
|
||||
|
||||
user = create(:user, :level_two)
|
||||
|
||||
voter1 = create(:poll_voter, user: user, poll: poll, booth_assignment: booth_assignment1)
|
||||
voter2 = build(:poll_voter, user: user, poll: poll, booth_assignment: booth_assignment2)
|
||||
create(:poll_voter, :from_booth, user: user, poll: poll, booth: create(:poll_booth))
|
||||
|
||||
expect(voter2).not_to be_valid
|
||||
expect(voter2.errors.messages[:document_number]).to eq(["User has already voted"])
|
||||
voter = build(:poll_voter, :from_booth, user: user, poll: poll, booth: booth)
|
||||
|
||||
expect(voter).not_to be_valid
|
||||
expect(voter.errors.messages[:document_number]).to eq(["User has already voted"])
|
||||
end
|
||||
|
||||
it "is valid if the user has already voted in the same booth in different poll" do
|
||||
booth_assignment1 = create(:poll_booth_assignment, booth: booth)
|
||||
booth_assignment2 = create(:poll_booth_assignment, booth: booth, poll: poll)
|
||||
|
||||
user = create(:user, :level_two)
|
||||
|
||||
voter1 = create(:poll_voter, user: user, booth_assignment: booth_assignment1)
|
||||
voter2 = build(:poll_voter, user: user, booth_assignment: booth_assignment2)
|
||||
create(:poll_voter, :from_booth, user: user, booth: booth, poll: create(:poll))
|
||||
|
||||
expect(voter2).to be_valid
|
||||
voter = build(:poll_voter, :from_booth, user: user, booth: booth, poll: poll)
|
||||
|
||||
expect(voter).to be_valid
|
||||
end
|
||||
|
||||
it "is not valid if the user has voted via web" do
|
||||
|
||||
@@ -442,24 +442,19 @@ describe Proposal do
|
||||
|
||||
it "returns users that have voted for the proposal" do
|
||||
proposal = create(:proposal)
|
||||
voter1 = create(:user, :level_two)
|
||||
voter2 = create(:user, :level_two)
|
||||
voter1 = create(:user, :level_two, votables: [proposal])
|
||||
voter2 = create(:user, :level_two, votables: [proposal])
|
||||
voter3 = create(:user, :level_two)
|
||||
|
||||
create(:vote, voter: voter1, votable: proposal)
|
||||
create(:vote, voter: voter2, votable: proposal)
|
||||
|
||||
expect(proposal.voters).to match_array [voter1, voter2]
|
||||
expect(proposal.voters).not_to include(voter3)
|
||||
end
|
||||
|
||||
it "does not return users that have been erased" do
|
||||
proposal = create(:proposal)
|
||||
voter1 = create(:user, :level_two)
|
||||
voter2 = create(:user, :level_two)
|
||||
voter1 = create(:user, :level_two, votables: [proposal])
|
||||
voter2 = create(:user, :level_two, votables: [proposal])
|
||||
|
||||
create(:vote, voter: voter1, votable: proposal)
|
||||
create(:vote, voter: voter2, votable: proposal)
|
||||
voter2.erase
|
||||
|
||||
expect(proposal.voters).to eq [voter1]
|
||||
@@ -467,11 +462,9 @@ describe Proposal do
|
||||
|
||||
it "does not return users that have been blocked" do
|
||||
proposal = create(:proposal)
|
||||
voter1 = create(:user, :level_two)
|
||||
voter2 = create(:user, :level_two)
|
||||
voter1 = create(:user, :level_two, votables: [proposal])
|
||||
voter2 = create(:user, :level_two, votables: [proposal])
|
||||
|
||||
create(:vote, voter: voter1, votable: proposal)
|
||||
create(:vote, voter: voter2, votable: proposal)
|
||||
voter2.block
|
||||
|
||||
expect(proposal.voters).to eq [voter1]
|
||||
@@ -920,32 +913,25 @@ describe Proposal do
|
||||
|
||||
it "returns voters and followers" do
|
||||
proposal = create(:proposal)
|
||||
voter = create(:user, :level_two)
|
||||
follower = create(:user, :level_two)
|
||||
follow = create(:follow, user: follower, followable: proposal)
|
||||
create(:vote, voter: voter, votable: proposal)
|
||||
voter = create(:user, :level_two, votables: [proposal])
|
||||
follower = create(:user, :level_two, followables: [proposal])
|
||||
|
||||
expect(proposal.users_to_notify).to eq([voter, follower])
|
||||
end
|
||||
|
||||
it "returns voters and followers discarding duplicates" do
|
||||
proposal = create(:proposal)
|
||||
voter_and_follower = create(:user, :level_two)
|
||||
follow = create(:follow, user: voter_and_follower, followable: proposal)
|
||||
create(:vote, voter: voter_and_follower, votable: proposal)
|
||||
voter_and_follower = create(:user, :level_two, votables: [proposal], followables: [proposal])
|
||||
|
||||
expect(proposal.users_to_notify).to eq([voter_and_follower])
|
||||
end
|
||||
|
||||
it "returns voters and followers except the proposal author" do
|
||||
author = create(:user, :level_two)
|
||||
proposal = create(:proposal, author: author)
|
||||
voter_and_follower = create(:user, :level_two)
|
||||
|
||||
create(:follow, user: author, followable: proposal)
|
||||
create(:follow, user: voter_and_follower, followable: proposal)
|
||||
create(:vote, voter: author, votable: proposal)
|
||||
create(:vote, voter: voter_and_follower, votable: proposal)
|
||||
proposal = create(:proposal, author: author,
|
||||
voters: [author, voter_and_follower],
|
||||
followers: [author, voter_and_follower])
|
||||
|
||||
expect(proposal.users_to_notify).to eq([voter_and_follower])
|
||||
end
|
||||
@@ -963,11 +949,11 @@ describe Proposal do
|
||||
end
|
||||
|
||||
it "returns proposals related to the user's interests ordered by cached_votes_up" do
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
|
||||
proposal1 = create(:proposal, cached_votes_up: 1, tag_list: "Sport")
|
||||
proposal2 = create(:proposal, cached_votes_up: 5, tag_list: "Sport")
|
||||
proposal3 = create(:proposal, cached_votes_up: 10, tag_list: "Sport")
|
||||
proposal4 = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal4, user: user)
|
||||
|
||||
results = Proposal.recommendations(user).sort_by_recommendations
|
||||
|
||||
@@ -975,9 +961,8 @@ describe Proposal do
|
||||
end
|
||||
|
||||
it "does not return proposals unrelated to user interests" do
|
||||
proposal1 = create(:proposal, tag_list: "Sport")
|
||||
proposal2 = create(:proposal, tag_list: "Politics")
|
||||
create(:follow, followable: proposal1, user: user)
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
create(:proposal, tag_list: "Politics")
|
||||
|
||||
results = Proposal.recommendations(user)
|
||||
|
||||
@@ -985,8 +970,7 @@ describe Proposal do
|
||||
end
|
||||
|
||||
it "does not return proposals when user is follower" do
|
||||
proposal1 = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal1, user: user)
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
|
||||
results = Proposal.recommendations(user)
|
||||
|
||||
@@ -994,9 +978,8 @@ describe Proposal do
|
||||
end
|
||||
|
||||
it "does not return proposals when user is the author" do
|
||||
proposal1 = create(:proposal, tag_list: "Sport")
|
||||
proposal2 = create(:proposal, author: user, tag_list: "Sport")
|
||||
create(:follow, followable: proposal1, user: user)
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
create(:proposal, author: user, tag_list: "Sport")
|
||||
|
||||
results = Proposal.recommendations(user)
|
||||
|
||||
@@ -1004,9 +987,8 @@ describe Proposal do
|
||||
end
|
||||
|
||||
it "does not return archived proposals" do
|
||||
proposal1 = create(:proposal, tag_list: "Sport")
|
||||
archived_proposal = create(:proposal, :archived, tag_list: "Sport")
|
||||
create(:follow, followable: proposal1, user: user)
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
create(:proposal, :archived, tag_list: "Sport")
|
||||
|
||||
results = Proposal.recommendations(user)
|
||||
|
||||
@@ -1014,10 +996,8 @@ describe Proposal do
|
||||
end
|
||||
|
||||
it "does not return already supported proposals" do
|
||||
proposal1 = create(:proposal, tag_list: "Health")
|
||||
proposal2 = create(:proposal, tag_list: "Health")
|
||||
create(:vote, votable: proposal1, voter: user)
|
||||
create(:follow, followable: proposal2, user: user)
|
||||
create(:proposal, tag_list: "Health", followers: [user])
|
||||
create(:proposal, tag_list: "Health", voters: [user])
|
||||
|
||||
results = Proposal.recommendations(user)
|
||||
|
||||
|
||||
@@ -142,9 +142,8 @@ describe Signature do
|
||||
end
|
||||
|
||||
it "does not assign vote to user if already voted" do
|
||||
proposal = create(:proposal)
|
||||
user = create(:user, :level_two, document_number: "123A")
|
||||
vote = create(:vote, votable: proposal, voter: user)
|
||||
proposal = create(:proposal, voters: [user])
|
||||
signature_sheet = create(:signature_sheet, signable: proposal)
|
||||
signature = create(:signature, signature_sheet: signature_sheet, document_number: user.document_number)
|
||||
|
||||
@@ -154,9 +153,8 @@ describe Signature do
|
||||
end
|
||||
|
||||
it "does not assign vote to user if already voted on budget investment" do
|
||||
investment = create(:budget_investment)
|
||||
user = create(:user, :level_two, document_number: "123A")
|
||||
vote = create(:vote, votable: investment, voter: user)
|
||||
investment = create(:budget_investment, voters: [user])
|
||||
|
||||
signature_sheet = create(:signature_sheet, signable: investment)
|
||||
signature = create(:signature, document_number: user.document_number, signature_sheet: signature_sheet)
|
||||
|
||||
@@ -4,8 +4,7 @@ describe Tag do
|
||||
|
||||
it "decreases tag_count when a debate is hidden" do
|
||||
debate = create(:debate)
|
||||
tag = create(:tag)
|
||||
tagging = create(:tagging, tag: tag, taggable: debate)
|
||||
tag = create(:tag, taggables: [debate])
|
||||
|
||||
expect(tag.taggings_count).to eq(1)
|
||||
|
||||
@@ -17,8 +16,7 @@ describe Tag do
|
||||
|
||||
it "decreases tag_count when a proposal is hidden" do
|
||||
proposal = create(:proposal)
|
||||
tag = create(:tag)
|
||||
tagging = create(:tagging, tag: tag, taggable: proposal)
|
||||
tag = create(:tag, taggables: [proposal])
|
||||
|
||||
expect(tag.taggings_count).to eq(1)
|
||||
|
||||
|
||||
@@ -4,9 +4,6 @@ describe User do
|
||||
|
||||
describe "#headings_voted_within_group" do
|
||||
it "returns the headings voted by a user" do
|
||||
user1 = create(:user)
|
||||
user2 = create(:user)
|
||||
|
||||
budget = create(:budget)
|
||||
group = create(:budget_group, budget: budget)
|
||||
|
||||
@@ -19,9 +16,8 @@ describe User do
|
||||
san_franciso_investment = create(:budget_investment, heading: san_francisco)
|
||||
wyoming_investment = create(:budget_investment, heading: wyoming)
|
||||
|
||||
create(:vote, votable: wyoming_investment, voter: user1)
|
||||
create(:vote, votable: san_franciso_investment, voter: user1)
|
||||
create(:vote, votable: new_york_investment, voter: user1)
|
||||
user1 = create(:user, votables: [wyoming_investment, san_franciso_investment, new_york_investment])
|
||||
user2 = create(:user)
|
||||
|
||||
expect(user1.headings_voted_within_group(group)).to match_array [new_york, san_francisco, wyoming]
|
||||
expect(user1.headings_voted_within_group(group)).not_to include(another_heading)
|
||||
@@ -30,10 +26,9 @@ describe User do
|
||||
end
|
||||
|
||||
it "returns headings with multiple translations only once" do
|
||||
user = create(:user)
|
||||
group = create(:budget_group)
|
||||
heading = create(:budget_heading, group: group, name_en: "English", name_es: "Spanish")
|
||||
create(:vote, votable: create(:budget_investment, heading: heading), voter: user)
|
||||
user = create(:user, votables: [create(:budget_investment, heading: heading)])
|
||||
|
||||
expect(user.headings_voted_within_group(group).count).to eq 1
|
||||
end
|
||||
@@ -695,15 +690,13 @@ describe User do
|
||||
let(:user) { create(:user) }
|
||||
|
||||
it "returns followed object tags" do
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
|
||||
expect(user.interests).to eq ["Sport"]
|
||||
end
|
||||
|
||||
it "deals gracefully with hidden proposals" do
|
||||
proposal = create(:proposal, tag_list: "Sport")
|
||||
create(:follow, followable: proposal, user: user)
|
||||
proposal = create(:proposal, tag_list: "Sport", followers: [user])
|
||||
|
||||
proposal.hide
|
||||
|
||||
@@ -711,13 +704,9 @@ describe User do
|
||||
end
|
||||
|
||||
it "discards followed objects duplicated tags" do
|
||||
proposal1 = create(:proposal, tag_list: "Sport")
|
||||
proposal2 = create(:proposal, tag_list: "Sport")
|
||||
budget_investment = create(:budget_investment, tag_list: "Sport")
|
||||
|
||||
create(:follow, followable: proposal1, user: user)
|
||||
create(:follow, followable: proposal2, user: user)
|
||||
create(:follow, followable: budget_investment, user: user)
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
create(:proposal, tag_list: "Sport", followers: [user])
|
||||
create(:budget_investment, tag_list: "Sport", followers: [user])
|
||||
|
||||
expect(user.interests).to eq ["Sport"]
|
||||
end
|
||||
|
||||
@@ -5,29 +5,26 @@ describe Vote do
|
||||
describe "#for_debates" do
|
||||
it "does not returns votes for other votables" do
|
||||
debate = create(:debate)
|
||||
comment = create(:comment)
|
||||
create(:vote, votable: comment)
|
||||
create(:vote, votable: create(:comment))
|
||||
|
||||
expect(Vote.for_debates(debate).count).to eq(0)
|
||||
end
|
||||
|
||||
it "returns votes only for debates in parameters" do
|
||||
debate1 = create(:debate)
|
||||
debate1 = create(:debate, voters: [create(:user)])
|
||||
debate2 = create(:debate)
|
||||
create(:vote, votable: debate1)
|
||||
|
||||
expect(Vote.for_debates(debate1).count).to eq(1)
|
||||
expect(Vote.for_debates(debate2).count).to eq(0)
|
||||
end
|
||||
|
||||
it "accepts more than 1 debate" do
|
||||
debate1 = create(:debate)
|
||||
debate1 = create(:debate, voters: [create(:user)])
|
||||
debate2 = create(:debate)
|
||||
debate3 = create(:debate)
|
||||
create(:vote, votable: debate1)
|
||||
create(:vote, votable: debate3)
|
||||
debate3 = create(:debate, voters: [create(:user)])
|
||||
|
||||
expect(Vote.for_debates([debate1, debate2]).count).to eq(1)
|
||||
expect(Vote.for_debates([debate1, debate3]).count).to eq(2)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -67,8 +67,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
|
||||
end
|
||||
|
||||
scenario "Display unfollow button when user already following" do
|
||||
user = create(:user)
|
||||
follow = create(:follow, user: user, followable: followable)
|
||||
user = create(:user, followables: [followable])
|
||||
login_as(user)
|
||||
|
||||
visit send(followable_path, arguments)
|
||||
@@ -77,8 +76,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
|
||||
end
|
||||
|
||||
scenario "Updates follow button & show destroy notice after unfollow button is clicked", :js do
|
||||
user = create(:user)
|
||||
follow = create(:follow, user: user, followable: followable)
|
||||
user = create(:user, followables: [followable])
|
||||
login_as(user)
|
||||
|
||||
visit send(followable_path, arguments)
|
||||
@@ -91,8 +89,7 @@ shared_examples "followable" do |followable_class_name, followable_path, followa
|
||||
end
|
||||
|
||||
scenario "Should display destroy follower notice after user clicks on unfollow button", :js do
|
||||
user = create(:user)
|
||||
follow = create(:follow, user: user, followable: followable)
|
||||
user = create(:user, followables: [followable])
|
||||
login_as(user)
|
||||
destroy_notice_message = t("shared.followable.#{followable_class_name}.destroy.notice_html")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user