From bdfd3269078bdf3724b490f85d46036e57912dcc Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 7 Sep 2016 11:53:24 +0200 Subject: [PATCH 1/5] implements some parts of the spending proposals importer --- lib/spending_proposals_importer.rb | 61 ++++++++++++++++++++ spec/lib/spending_proposals_importer_spec.rb | 57 ++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 lib/spending_proposals_importer.rb create mode 100644 spec/lib/spending_proposals_importer_spec.rb diff --git a/lib/spending_proposals_importer.rb b/lib/spending_proposals_importer.rb new file mode 100644 index 000000000..f879dcae7 --- /dev/null +++ b/lib/spending_proposals_importer.rb @@ -0,0 +1,61 @@ +class SpendingProposalsImporter + + def import(sp) + # feasibility + # unfeasibility_explanation + # heading_id + # valuator_assignments_count + # hidden_at + # comments_count + # group_id + # budget_id + # duration + + # comments + + budget = Budget.last || Budget.create!(name: Date.today.year.to_s, currency_symbol: "€") + + group = nil + heading = nil + + if sp.geozone_id.present? + group = budget.groups.find_or_create_by!(name: "Barrios") + heading = group.headings.find_or_create_by!(name: sp.geozone.name, price: 10000000) + else + group = budget.groups.find_or_create_by!(name: "Toda la ciudad") + heading = group.headings.find_or_create_by!(name: "Toda la ciudad", price: 10000000) + end + + feasibility = case sp.feasible + when FalseClass + 'unfeasible' + when TrueClass + 'feasible' + else + 'undecided' + end + + Budget::Investment.create!( + heading_id: heading.id, + author_id: sp.author_id, + administrator_id: sp.administrator_id, + title: sp.title, + description: sp.description, + external_url: sp.external_url, + price: sp.price, + price_explanation: sp.price_explanation, + internal_comments: sp.internal_comments, + feasibility: feasibility, + valuation_finished: sp.valuation_finished, + price_first_year: sp.price_first_year, + cached_votes_up: sp.cached_votes_up, + physical_votes: sp.physical_votes, + created_at: sp.created_at, + updated_at: sp.updated_at, + responsible_name: sp.responsible_name, + terms_of_service: "1" + ) + end + +end + diff --git a/spec/lib/spending_proposals_importer_spec.rb b/spec/lib/spending_proposals_importer_spec.rb new file mode 100644 index 000000000..1b424722f --- /dev/null +++ b/spec/lib/spending_proposals_importer_spec.rb @@ -0,0 +1,57 @@ +require 'rails_helper' + +describe SpendingProposalsImporter do + + let(:importer) { SpendingProposalsImporter.new } + + describe '#import' do + it "Imports a city spending proposal" do + sp = create(:spending_proposal) + + expect { importer.import(sp) }.to change{ Budget::Investment.count }.from(0).to(1) + + inv = Budget::Investment.last + + expect(inv.author).to eq(sp.author) + expect(inv.title).to eq(sp.title) + expect(inv.heading.name).to eq("Toda la ciudad") + expect(inv.heading.group.name).to eq("Toda la ciudad") + end + + it "Imports a city spending proposal" do + sp = create(:spending_proposal, geozone: create(:geozone, name: "Bel Air")) + + expect { importer.import(sp) }.to change{ Budget::Investment.count }.from(0).to(1) + + inv = Budget::Investment.last + + expect(inv.author).to eq(sp.author) + expect(inv.title).to eq(sp.title) + expect(inv.heading.name).to eq("Bel Air") + expect(inv.heading.group.name).to eq("Barrios") + end + + it "Uses existing budgets, headings and groups instead of creating new ones" do + sp1 = create(:spending_proposal, geozone: create(:geozone, name: "Bel Air")) + sp2 = create(:spending_proposal, geozone: create(:geozone, name: "Bel Air")) + + expect { importer.import(sp1) }.to change{ Budget::Investment.count }.from(0).to(1) + expect { importer.import(sp2) }.to change{ Budget::Investment.count }.from(1).to(2) + + inv1 = Budget::Investment.first + inv2 = Budget::Investment.last + + expect(inv2.heading).to eq(inv1.heading) + end + + it "Imports feasibility correctly" do + sp = create(:spending_proposal) + feasible = create(:spending_proposal, feasible: true) + unfeasible = create(:spending_proposal, feasible: false) + + expect(importer.import(sp).feasibility).to eq('undecided') + expect(importer.import(feasible).feasibility).to eq('feasible') + expect(importer.import(unfeasible).feasibility).to eq('unfeasible') + end + end +end From b8dffc6137740e816d93de8d8811594229129c64 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 7 Sep 2016 12:01:04 +0200 Subject: [PATCH 2/5] refactor some tests to their own test in importer --- spec/lib/spending_proposals_importer_spec.rb | 34 ++++++++++++-------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/spec/lib/spending_proposals_importer_spec.rb b/spec/lib/spending_proposals_importer_spec.rb index 1b424722f..88d60b360 100644 --- a/spec/lib/spending_proposals_importer_spec.rb +++ b/spec/lib/spending_proposals_importer_spec.rb @@ -5,12 +5,25 @@ describe SpendingProposalsImporter do let(:importer) { SpendingProposalsImporter.new } describe '#import' do + + it "Creates the budget if it doesn't exist" do + sp = create(:spending_proposal) + expect { importer.import(sp) }.to change{ Budget.count }.from(0).to(1) + importer.import(create(:spending_proposal)) + expect(Budget.count).to eq(1) + end + + it "Creates the and returns investments" do + inv = nil + sp = create(:spending_proposal) + expect { inv = importer.import(sp) }.to change{ Budget::Investment.count }.from(0).to(1) + expect(inv).to be_kind_of(Budget::Investment) + end + it "Imports a city spending proposal" do sp = create(:spending_proposal) - expect { importer.import(sp) }.to change{ Budget::Investment.count }.from(0).to(1) - - inv = Budget::Investment.last + inv = importer.import(sp) expect(inv.author).to eq(sp.author) expect(inv.title).to eq(sp.title) @@ -21,9 +34,7 @@ describe SpendingProposalsImporter do it "Imports a city spending proposal" do sp = create(:spending_proposal, geozone: create(:geozone, name: "Bel Air")) - expect { importer.import(sp) }.to change{ Budget::Investment.count }.from(0).to(1) - - inv = Budget::Investment.last + inv = importer.import(sp) expect(inv.author).to eq(sp.author) expect(inv.title).to eq(sp.title) @@ -35,18 +46,15 @@ describe SpendingProposalsImporter do sp1 = create(:spending_proposal, geozone: create(:geozone, name: "Bel Air")) sp2 = create(:spending_proposal, geozone: create(:geozone, name: "Bel Air")) - expect { importer.import(sp1) }.to change{ Budget::Investment.count }.from(0).to(1) - expect { importer.import(sp2) }.to change{ Budget::Investment.count }.from(1).to(2) - - inv1 = Budget::Investment.first - inv2 = Budget::Investment.last + inv1 = importer.import(sp1) + inv2 = importer.import(sp2) expect(inv2.heading).to eq(inv1.heading) end it "Imports feasibility correctly" do - sp = create(:spending_proposal) - feasible = create(:spending_proposal, feasible: true) + sp = create(:spending_proposal) + feasible = create(:spending_proposal, feasible: true) unfeasible = create(:spending_proposal, feasible: false) expect(importer.import(sp).feasibility).to eq('undecided') From c1bf89a09eb244be92dea262fe51df16d5a8e9d9 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 7 Sep 2016 13:02:26 +0200 Subject: [PATCH 3/5] adds more functionality to spending proposal importer --- lib/spending_proposals_importer.rb | 19 ++++++++----------- spec/lib/spending_proposals_importer_spec.rb | 13 +++++++++++++ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/lib/spending_proposals_importer.rb b/lib/spending_proposals_importer.rb index f879dcae7..5641c082b 100644 --- a/lib/spending_proposals_importer.rb +++ b/lib/spending_proposals_importer.rb @@ -1,16 +1,7 @@ class SpendingProposalsImporter def import(sp) - # feasibility - # unfeasibility_explanation - # heading_id - # valuator_assignments_count - # hidden_at - # comments_count - # group_id - # budget_id - # duration - + # votes # comments budget = Budget.last || Budget.create!(name: Date.today.year.to_s, currency_symbol: "€") @@ -35,7 +26,7 @@ class SpendingProposalsImporter 'undecided' end - Budget::Investment.create!( + investment = Budget::Investment.create!( heading_id: heading.id, author_id: sp.author_id, administrator_id: sp.administrator_id, @@ -45,7 +36,9 @@ class SpendingProposalsImporter price: sp.price, price_explanation: sp.price_explanation, internal_comments: sp.internal_comments, + duration: sp.time_scope, feasibility: feasibility, + unfeasibility_explanation: sp.feasible_explanation, valuation_finished: sp.valuation_finished, price_first_year: sp.price_first_year, cached_votes_up: sp.cached_votes_up, @@ -55,6 +48,10 @@ class SpendingProposalsImporter responsible_name: sp.responsible_name, terms_of_service: "1" ) + + investment.valuators = sp.valuation_assignments.map(&:valuator) + + investment end end diff --git a/spec/lib/spending_proposals_importer_spec.rb b/spec/lib/spending_proposals_importer_spec.rb index 88d60b360..598e028e3 100644 --- a/spec/lib/spending_proposals_importer_spec.rb +++ b/spec/lib/spending_proposals_importer_spec.rb @@ -61,5 +61,18 @@ describe SpendingProposalsImporter do expect(importer.import(feasible).feasibility).to eq('feasible') expect(importer.import(unfeasible).feasibility).to eq('unfeasible') end + + it "Imports valuation assignments" do + sp = create(:spending_proposal) + peter = create(:valuator) + john = create(:valuator) + sp.valuators << peter << john + + inv = importer.import(sp) + + expect(inv.valuator_assignments.count).to eq(2) + expect(inv.valuators).to include(peter) + expect(inv.valuators).to include(john) + end end end From b4c7675c31969c3fa70cb8261748c79b94bde935 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 7 Sep 2016 15:58:39 +0200 Subject: [PATCH 4/5] imports votes --- lib/spending_proposals_importer.rb | 4 ++++ spec/lib/spending_proposals_importer_spec.rb | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/spending_proposals_importer.rb b/lib/spending_proposals_importer.rb index 5641c082b..9fe6dfa32 100644 --- a/lib/spending_proposals_importer.rb +++ b/lib/spending_proposals_importer.rb @@ -51,6 +51,10 @@ class SpendingProposalsImporter investment.valuators = sp.valuation_assignments.map(&:valuator) + votes = ActsAsVotable::Vote.where(votable_type: 'SpendingProposal', votable_id: sp.id) + + votes.each {|v| investment.vote_by({voter: v.voter, vote: 'yes'}) } + investment end diff --git a/spec/lib/spending_proposals_importer_spec.rb b/spec/lib/spending_proposals_importer_spec.rb index 598e028e3..d8cb50082 100644 --- a/spec/lib/spending_proposals_importer_spec.rb +++ b/spec/lib/spending_proposals_importer_spec.rb @@ -74,5 +74,19 @@ describe SpendingProposalsImporter do expect(inv.valuators).to include(peter) expect(inv.valuators).to include(john) end + + it "Imports votes" do + sp = create(:spending_proposal) + votes = create_list(:vote, 4, votable: sp) + voters = votes.map(&:voter).sort_by(&:id) + + inv = importer.import(sp) + + expect(inv.total_votes).to eq(sp.total_votes) + + imported_votes = ActsAsVotable::Vote.where(votable_type: "Budget::Investment", votable_id: inv.id) + + expect(imported_votes.map(&:voter).sort_by(&:id)).to eq(voters) + end end end From 857a4ba42bd62db271283627457140d418878b90 Mon Sep 17 00:00:00 2001 From: kikito Date: Wed, 7 Sep 2016 18:08:33 +0200 Subject: [PATCH 5/5] Adds comment to the final part of spending_proposals_importer --- lib/spending_proposals_importer.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/spending_proposals_importer.rb b/lib/spending_proposals_importer.rb index 9fe6dfa32..72a3922b8 100644 --- a/lib/spending_proposals_importer.rb +++ b/lib/spending_proposals_importer.rb @@ -1,9 +1,6 @@ class SpendingProposalsImporter def import(sp) - # votes - # comments - budget = Budget.last || Budget.create!(name: Date.today.year.to_s, currency_symbol: "€") group = nil @@ -55,6 +52,16 @@ class SpendingProposalsImporter votes.each {|v| investment.vote_by({voter: v.voter, vote: 'yes'}) } + # Spending proposals are not commentable in Consul so we can not test this + # + # Comment.where(commentable_type: 'SpendingProposal', commentable_id: sp.id).update_all( + # commentable_type: 'Budget::Investment', commentable_id: investment.id + # ) + # Budget::Investment.reset_counters(investment.id, :comments) + + # Spending proposals have ballot_lines in Madrid, but not in consul, so we + # can not test this either + investment end