diff --git a/spec/factories/budgets.rb b/spec/factories/budgets.rb index d73a13b51..3f6e637ba 100644 --- a/spec/factories/budgets.rb +++ b/spec/factories/budgets.rb @@ -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 diff --git a/spec/factories/classifications.rb b/spec/factories/classifications.rb index bea7599ca..df2ba4456 100644 --- a/spec/factories/classifications.rb +++ b/spec/factories/classifications.rb @@ -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 diff --git a/spec/factories/comments.rb b/spec/factories/comments.rb index 368579902..1127836d5 100644 --- a/spec/factories/comments.rb +++ b/spec/factories/comments.rb @@ -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 diff --git a/spec/factories/debates.rb b/spec/factories/debates.rb index 671c0235b..3293df786 100644 --- a/spec/factories/debates.rb +++ b/spec/factories/debates.rb @@ -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 diff --git a/spec/factories/milestones.rb b/spec/factories/milestones.rb index f3ac481e4..9c6bfba2a 100644 --- a/spec/factories/milestones.rb +++ b/spec/factories/milestones.rb @@ -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 diff --git a/spec/factories/notifications.rb b/spec/factories/notifications.rb index f45453fcd..8b300f85c 100644 --- a/spec/factories/notifications.rb +++ b/spec/factories/notifications.rb @@ -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 diff --git a/spec/factories/polls.rb b/spec/factories/polls.rb index ca3c10649..9514bbb56 100644 --- a/spec/factories/polls.rb +++ b/spec/factories/polls.rb @@ -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 diff --git a/spec/factories/proposals.rb b/spec/factories/proposals.rb index 1f6faec63..aed8b8339 100644 --- a/spec/factories/proposals.rb +++ b/spec/factories/proposals.rb @@ -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 diff --git a/spec/factories/users.rb b/spec/factories/users.rb index 880afce96..069a2cda0 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -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 diff --git a/spec/features/admin/homepage/homepage_spec.rb b/spec/features/admin/homepage/homepage_spec.rb index 699dd8d5c..765e7647e 100644 --- a/spec/features/admin/homepage/homepage_spec.rb +++ b/spec/features/admin/homepage/homepage_spec.rb @@ -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 diff --git a/spec/features/admin/poll/booth_assigments_spec.rb b/spec/features/admin/poll/booth_assigments_spec.rb index 0441363fb..b70e84da2 100644 --- a/spec/features/admin/poll/booth_assigments_spec.rb +++ b/spec/features/admin/poll/booth_assigments_spec.rb @@ -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)" diff --git a/spec/features/admin/poll/officer_assignments_spec.rb b/spec/features/admin/poll/officer_assignments_spec.rb index d54ec0cac..b2735bcae 100644 --- a/spec/features/admin/poll/officer_assignments_spec.rb +++ b/spec/features/admin/poll/officer_assignments_spec.rb @@ -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 diff --git a/spec/features/admin/stats_spec.rb b/spec/features/admin/stats_spec.rb index 4f5dcf0b5..5bccc9abd 100644 --- a/spec/features/admin/stats_spec.rb +++ b/spec/features/admin/stats_spec.rb @@ -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" diff --git a/spec/features/admin/system_emails_spec.rb b/spec/features/admin/system_emails_spec.rb index c31899113..9be884a2a 100644 --- a/spec/features/admin/system_emails_spec.rb +++ b/spec/features/admin/system_emails_spec.rb @@ -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 diff --git a/spec/features/budgets/ballots_spec.rb b/spec/features/budgets/ballots_spec.rb index af6389666..34ef8d517 100644 --- a/spec/features/budgets/ballots_spec.rb +++ b/spec/features/budgets/ballots_spec.rb @@ -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) diff --git a/spec/features/budgets/executions_spec.rb b/spec/features/budgets/executions_spec.rb index 2c6535fe1..a6896885b 100644 --- a/spec/features/budgets/executions_spec.rb +++ b/spec/features/budgets/executions_spec.rb @@ -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) diff --git a/spec/features/budgets/investments_spec.rb b/spec/features/budgets/investments_spec.rb index 074e4a5cb..af5a13756 100644 --- a/spec/features/budgets/investments_spec.rb +++ b/spec/features/budgets/investments_spec.rb @@ -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) diff --git a/spec/features/budgets/votes_spec.rb b/spec/features/budgets/votes_spec.rb index 9e004ddf5..2134de1da 100644 --- a/spec/features/budgets/votes_spec.rb +++ b/spec/features/budgets/votes_spec.rb @@ -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) diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 4865b174c..a8723b7d9 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -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 diff --git a/spec/features/emails_spec.rb b/spec/features/emails_spec.rb index 7fa9e8f51..b3000594e 100644 --- a/spec/features/emails_spec.rb +++ b/spec/features/emails_spec.rb @@ -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) diff --git a/spec/features/home_spec.rb b/spec/features/home_spec.rb index c663ef73e..2122749c8 100644 --- a/spec/features/home_spec.rb +++ b/spec/features/home_spec.rb @@ -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 diff --git a/spec/features/management/budget_investments_spec.rb b/spec/features/management/budget_investments_spec.rb index e8c52633d..f72889276 100644 --- a/spec/features/management/budget_investments_spec.rb +++ b/spec/features/management/budget_investments_spec.rb @@ -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" diff --git a/spec/features/notifications_spec.rb b/spec/features/notifications_spec.rb index c2e0ac708..f9d60ffb3 100644 --- a/spec/features/notifications_spec.rb +++ b/spec/features/notifications_spec.rb @@ -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) diff --git a/spec/features/officing/results_spec.rb b/spec/features/officing/results_spec.rb index e73f5e41f..6bbeb9058 100644 --- a/spec/features/officing/results_spec.rb +++ b/spec/features/officing/results_spec.rb @@ -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" diff --git a/spec/features/polls/polls_spec.rb b/spec/features/polls/polls_spec.rb index ddb0f42cb..e24ebc692 100644 --- a/spec/features/polls/polls_spec.rb +++ b/spec/features/polls/polls_spec.rb @@ -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 diff --git a/spec/features/proposal_notifications_spec.rb b/spec/features/proposal_notifications_spec.rb index b239f9451..ccf6b86f0 100644 --- a/spec/features/proposal_notifications_spec.rb +++ b/spec/features/proposal_notifications_spec.rb @@ -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 diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index 8cc3a8561..148afd66b 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -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 diff --git a/spec/features/stats_spec.rb b/spec/features/stats_spec.rb index c28dec444..5c35e2eb6 100644 --- a/spec/features/stats_spec.rb +++ b/spec/features/stats_spec.rb @@ -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 diff --git a/spec/features/topics_spec.rb b/spec/features/topics_spec.rb index 0bf07dd96..999c3bf8a 100644 --- a/spec/features/topics_spec.rb +++ b/spec/features/topics_spec.rb @@ -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 diff --git a/spec/features/users_spec.rb b/spec/features/users_spec.rb index b6a965988..367f1ebcb 100644 --- a/spec/features/users_spec.rb +++ b/spec/features/users_spec.rb @@ -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" diff --git a/spec/features/votes_spec.rb b/spec/features/votes_spec.rb index 910be6ac1..827eef4ac 100644 --- a/spec/features/votes_spec.rb +++ b/spec/features/votes_spec.rb @@ -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 diff --git a/spec/lib/email_digests_spec.rb b/spec/lib/email_digests_spec.rb index af70ede35..15c9d743e 100644 --- a/spec/lib/email_digests_spec.rb +++ b/spec/lib/email_digests_spec.rb @@ -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) diff --git a/spec/lib/graphql_spec.rb b/spec/lib/graphql_spec.rb index b10b854b0..1731f4ae6 100644 --- a/spec/lib/graphql_spec.rb +++ b/spec/lib/graphql_spec.rb @@ -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") diff --git a/spec/models/budget/ballot_spec.rb b/spec/models/budget/ballot_spec.rb index 039706816..bcfcc6c28 100644 --- a/spec/models/budget/ballot_spec.rb +++ b/spec/models/budget/ballot_spec.rb @@ -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 diff --git a/spec/models/budget/investment_spec.rb b/spec/models/budget/investment_spec.rb index ebd984d15..94ab490d8 100644 --- a/spec/models/budget/investment_spec.rb +++ b/spec/models/budget/investment_spec.rb @@ -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) diff --git a/spec/models/budget/stats_spec.rb b/spec/models/budget/stats_spec.rb index b93514f64..93c831d7a 100644 --- a/spec/models/budget/stats_spec.rb +++ b/spec/models/budget/stats_spec.rb @@ -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 diff --git a/spec/models/debate_spec.rb b/spec/models/debate_spec.rb index f4ed41846..0b4f43256 100644 --- a/spec/models/debate_spec.rb +++ b/spec/models/debate_spec.rb @@ -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) diff --git a/spec/models/poll/officer_spec.rb b/spec/models/poll/officer_spec.rb index f494ed84e..199bf487f 100644 --- a/spec/models/poll/officer_spec.rb +++ b/spec/models/poll/officer_spec.rb @@ -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 diff --git a/spec/models/poll/voter_spec.rb b/spec/models/poll/voter_spec.rb index 03a3befb4..55fa0c4ab 100644 --- a/spec/models/poll/voter_spec.rb +++ b/spec/models/poll/voter_spec.rb @@ -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 diff --git a/spec/models/proposal_spec.rb b/spec/models/proposal_spec.rb index f37f6aad3..6df2ea848 100644 --- a/spec/models/proposal_spec.rb +++ b/spec/models/proposal_spec.rb @@ -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) diff --git a/spec/models/signature_spec.rb b/spec/models/signature_spec.rb index f194f3d22..b237ded42 100644 --- a/spec/models/signature_spec.rb +++ b/spec/models/signature_spec.rb @@ -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) diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb index 95dea8cb8..59dad7137 100644 --- a/spec/models/tag_spec.rb +++ b/spec/models/tag_spec.rb @@ -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) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index ad66de9a5..85dc77ddf 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -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 diff --git a/spec/models/vote_spec.rb b/spec/models/vote_spec.rb index 742f860bf..6e55c9600 100644 --- a/spec/models/vote_spec.rb +++ b/spec/models/vote_spec.rb @@ -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 diff --git a/spec/shared/features/followable.rb b/spec/shared/features/followable.rb index e0a94b3e9..4fd19c29b 100644 --- a/spec/shared/features/followable.rb +++ b/spec/shared/features/followable.rb @@ -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")