Merge pull request #3807 from consul/fix_budget_staff

Fix assigning staff members to budgets
This commit is contained in:
Javier Martín
2019-11-01 17:21:33 +01:00
committed by GitHub
31 changed files with 205 additions and 168 deletions

View File

@@ -2,13 +2,13 @@
"use strict";
App.BudgetEditAssociations = {
initialize: function() {
$(".js-budget-list-checkbox-user").on({
click: function() {
$(".js-budget-users-list [type='checkbox']").on({
change: function() {
var admin_count, tracker_count, valuator_count;
admin_count = $(".js-budget-list-checkbox-administrators:checkbox:checked").length;
valuator_count = $(".js-budget-list-checkbox-valuators:checkbox:checked").length;
tracker_count = $(".js-budget-list-checkbox-trackers:checkbox:checked").length;
admin_count = $("#administrators_list :checked").length;
valuator_count = $("#valuators_list :checked").length;
tracker_count = $("#trackers_list :checked").length;
App.I18n.set_pluralize($(".js-budget-show-administrators-list"), admin_count);
App.I18n.set_pluralize($(".js-budget-show-valuators-list"), valuator_count);

View File

@@ -36,10 +36,8 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
end
def edit
load_admins
load_valuators
load_staff
load_valuator_groups
load_trackers
load_tags
end
@@ -51,10 +49,8 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
Budget::Investment.filter_params(params).to_h),
notice: t("flash.actions.update.budget_investment")
else
load_admins
load_valuators
load_staff
load_valuator_groups
load_trackers
load_tags
render :edit
end
@@ -103,18 +99,10 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
@investment = @budget.investments.find(params[:id])
end
def load_admins
@admins = @budget.administrators.includes(:user).all
end
def load_trackers
@trackers = @budget.trackers.includes(:user).all.order(description: :asc)
.order("users.email ASC")
end
def load_valuators
@valuators = @budget.valuators.includes(:user).all.order(description: :asc)
.order("users.email ASC")
def load_staff
@admins = @budget.administrators.includes(:user)
@trackers = @budget.trackers.includes(:user).order(description: :asc).order("users.email ASC")
@valuators = @budget.valuators.includes(:user).order(description: :asc).order("users.email ASC")
end
def load_valuator_groups
@@ -122,7 +110,7 @@ class Admin::BudgetInvestmentsController < Admin::BaseController
end
def load_tags
@tags = Budget::Investment.tags_on(:valuation).order(:name).distinct
@tags = Budget::Investment.tags_on(:valuation_tags).order(:name).distinct
end
def load_ballot

View File

@@ -17,15 +17,11 @@ class Admin::BudgetsController < Admin::BaseController
end
def new
load_admins
load_valuators
load_trackers
load_staff
end
def edit
load_admins
load_valuators
load_trackers
load_staff
end
def calculate_winners
@@ -42,9 +38,7 @@ class Admin::BudgetsController < Admin::BaseController
if @budget.update(budget_params)
redirect_to admin_budgets_path, notice: t("admin.budgets.update.notice")
else
load_admins
load_valuators
load_trackers
load_staff
render :edit
end
end
@@ -54,9 +48,7 @@ class Admin::BudgetsController < Admin::BaseController
if @budget.save
redirect_to admin_budget_path(@budget), notice: t("admin.budgets.create.notice")
else
load_admins
load_valuators
load_trackers
load_staff
render :new
end
end
@@ -78,9 +70,6 @@ class Admin::BudgetsController < Admin::BaseController
descriptions = Budget::Phase::PHASE_KINDS.map { |p| "description_#{p}" }.map(&:to_sym)
valid_attributes = [:phase,
:currency_symbol,
:help_link,
:budget_milestone_tags,
:budget_valuation_tags,
administrator_ids: [],
valuator_ids: [],
tracker_ids: []
@@ -92,15 +81,9 @@ class Admin::BudgetsController < Admin::BaseController
@budget = Budget.find_by_slug_or_id! params[:id]
end
def load_admins
@admins = Administrator.includes(:user).all
end
def load_trackers
@trackers = Tracker.includes(:user).all.order(description: :asc).order("users.email ASC")
end
def load_valuators
@valuators = Valuator.includes(:user).all.order(description: :asc).order("users.email ASC")
def load_staff
@admins = Administrator.includes(:user)
@trackers = Tracker.includes(:user).order(description: :asc).order("users.email ASC")
@valuators = Valuator.includes(:user).order(description: :asc).order("users.email ASC")
end
end

View File

@@ -4,7 +4,7 @@ module BudgetExecutionsHelper
end
def options_for_milestone_tags
@budget.milestone_tags.map do |tag|
@budget.investments_milestone_tags.map do |tag|
["#{tag} (#{@budget.investments.winners.tagged_with(tag).count})", tag]
end
end

View File

@@ -53,16 +53,8 @@ module BudgetsHelper
Budget::Ballot.where(user: current_user, budget: @budget).first
end
def investment_tags_select_options(budget)
tags = Budget::Investment.by_budget(budget).tags_on(:valuation).order(:name).pluck(:name)
tags = tags.concat budget.budget_valuation_tags.split(",") if budget.budget_valuation_tags.present?
tags.uniq
end
def investment_milestone_tags_select_options(budget)
tags = Budget::Investment.by_budget(budget).tags_on(:milestone).order(:name).pluck(:name)
tags = tags.concat budget.budget_milestone_tags.split(",") if budget.budget_milestone_tags.present?
tags.uniq
def investment_tags_select_options(budget, context)
budget.investments.tags_on(context).order(:name).pluck(:name)
end
def unfeasible_or_unselected_filter

View File

@@ -1,7 +1,6 @@
module TranslatableFormHelper
def translatable_form_for(record, options = {})
options_full = options.merge(builder: TranslatableFormBuilder)
form_for(record, options_full) do |f|
form_for(record, options.merge(builder: TranslatableFormBuilder)) do |f|
yield(f)
end
end

View File

@@ -197,7 +197,7 @@ class Budget < ApplicationRecord
investments.winners.any?
end
def milestone_tags
def investments_milestone_tags
investments.winners.map(&:milestone_tag_list).flatten.uniq.sort
end

View File

@@ -16,6 +16,7 @@ class Budget
include Mappable
include Documentable
acts_as_taggable_on :valuation_tags
acts_as_votable
acts_as_paranoid column: :hidden_at
include ActsAsParanoidAliases
@@ -383,14 +384,6 @@ class Budget
self.valuator_groups.map(&:name).compact.join(", ").presence
end
def valuation_tag_list
tag_list_on(:valuation)
end
def valuation_tag_list=(tags)
set_tag_list_on(:valuation, tags)
end
def self.with_milestone_status_id(status_id)
includes(milestones: :translations).select do |investment|
investment.milestone_status_id == status_id.to_i

View File

@@ -1,4 +0,0 @@
class BudgetRolAssignment < ApplicationRecord
belongs_to :budget
belongs_to :user
end

2
app/models/tagging.rb Normal file
View File

@@ -0,0 +1,2 @@
class Tagging < ActsAsTaggableOn::Tagging
end

View File

@@ -45,7 +45,6 @@ class User < ApplicationRecord
inverse_of: :receiver
has_many :legislation_answers, class_name: "Legislation::Answer", dependent: :destroy, inverse_of: :user
has_many :follows
has_many :budget_rol_assignments
has_many :legislation_annotations,
class_name: "Legislation::Annotation",
foreign_key: :author_id,
@@ -80,7 +79,6 @@ class User < ApplicationRecord
foreign_key: :author_id,
inverse_of: :author
has_many :topics, foreign_key: :author_id, inverse_of: :author
has_many :budgets, through: :budget_rol_assignments
belongs_to :geozone
validates :username, presence: true, if: :username_required?

View File

@@ -49,13 +49,13 @@
</div>
<div class="small-12 medium-3 column">
<%= select_tag :tag_name,
options_for_select(investment_tags_select_options(@budget), params[:tag_name]),
options_for_select(investment_tags_select_options(@budget, "valuation_tags"), params[:tag_name]),
{ prompt: t("admin.budget_investments.index.tags_filter_all") } %>
</div>
<div class="small-12 medium-3 column">
<%= select_tag :milestone_tag_name,
options_for_select(investment_milestone_tags_select_options(@budget), params[:milestone_tag_name]),
options_for_select(investment_tags_select_options(@budget, "milestone_tags"), params[:milestone_tag_name]),
{ prompt: t("admin.budget_investments.index.milestone_tags_filter_all") } %>
</div>

View File

@@ -29,7 +29,7 @@
<p id="tags">
<strong><%= t("admin.budget_investments.show.tags") %>:</strong>
<%= @investment.tags_on(:valuation).pluck(:name).sort.join(", ") %>
<%= @investment.valuation_tags.pluck(:name).sort.join(", ") %>
</p>
<p id="assigned_valuator_groups">

View File

@@ -3,23 +3,9 @@
<p><%= t("admin.budgets.edit.empty_#{assignable_type}") %></p>
<% else %>
<h3><%= t("admin.budgets.edit.#{assignable_type}", count: 0) %></h3>
<table class="table-for-mobile">
<thead>
<tr>
<th class="small-8"><%= t("admin.budgets.edit.name") %></th>
<th class="small-4"><%= t("admin.budgets.edit.selected") %></th>
</tr>
</thead>
<tbody>
<% assignables.each do |assignable| %>
<tr>
<td class="small-8"><%= assignable.name %></td>
<td class="small-4 text-center">
<input type="checkbox" id="<%= assignable_type.singularize %>_<%= assignable.user.id %>" name="budget[<%= assignable_type.singularize %>_ids][]" value="<%= assignable.id %>" <%= "checked" if @budget.send(assignable_type).include? assignable %> class="js-budget-list-checkbox-<%= assignable_type %> js-budget-list-checkbox-user">
</td>
</tr>
<% end %>
</tbody>
</table>
<% field = "#{assignable_type.chomp("s")}_ids" %>
<%= form.collection_check_boxes field, assignables, :id, :name do |box| %>
<%= box.label { box.check_box + box.text } %>
<% end %>
<% end %>
</div>

View File

@@ -33,21 +33,9 @@
</div>
<div class="margin-top">
<%= render "/admin/budgets/association", assignable_type: "administrators", assignables: @admins, budget: @budget %>
<%= render "/admin/budgets/association", assignable_type: "valuators", assignables: @valuators, budget: @budget %>
<%= render "/admin/budgets/association", assignable_type: "trackers", assignables: @trackers, budget: @budget %>
</div>
<div class="margin-top">
<div class="small-12 medium-9 column end">
<%= f.text_field :budget_milestone_tags, placeholder: t("admin.budget_investments.edit.tags_placeholder") %>
</div>
<div class="small-12 medium-9 column end">
<%= f.text_field :budget_valuation_tags, placeholder: t("admin.budget_investments.edit.tags_placeholder") %>
</div>
<div class="small-12 medium-9 column end">
<%= f.text_field :help_link %>
</div>
<%= render "/admin/budgets/association", assignable_type: "administrators", assignables: @admins, form: f %>
<%= render "/admin/budgets/association", assignable_type: "valuators", assignables: @valuators, form: f %>
<%= render "/admin/budgets/association", assignable_type: "trackers", assignables: @trackers, form: f %>
</div>
<% if @budget.phases.present? %>

View File

@@ -141,9 +141,6 @@ en:
description_finished: "Description when the budget is finished"
phase: "Phase"
currency_symbol: "Currency"
budget_milestone_tags: "Milestone tags"
budget_valuation_tags: "Valuation tags"
help_link: "Help link"
budget/translation:
name: "Name"
budget/investment:

View File

@@ -109,10 +109,6 @@ en:
empty_administrators: "There are no administrators"
empty_valuators: "There are no valuators"
empty_trackers: "There are no trackers"
name: "Name"
selected: "Selected"
cancel: "Cancel"
save: "Save"
destroy:
success_notice: Budget deleted successfully
unable_notice: You cannot delete a budget that has associated investments

View File

@@ -143,9 +143,6 @@ es:
description_finished: "Descripción cuando el presupuesto ha finalizado / Resultados"
phase: "Fase"
currency_symbol: "Divisa"
budget_milestone_tags: "Etiquetas de seguimiento"
budget_valuation_tags: "Etiquetas de evaluación"
help_link: "Enlace de ayuda"
budget/translation:
name: "Nombre"
budget/investment:

View File

@@ -109,10 +109,6 @@ es:
empty_administrators: "No hay administradores"
empty_valuators: "No hay evaluadores"
empty_trackers: "No hay gestores de seguimiento"
name: "Nombre"
selected: "Seleccionado"
cancel: "Cancelar"
save: "Guardar"
destroy:
success_notice: Presupuesto eliminado correctamente
unable_notice: No se puede eliminar un presupuesto con proyectos asociados

View File

@@ -0,0 +1,9 @@
class DropBudgetRolAssignments < ActiveRecord::Migration[5.0]
def up
drop_table :budget_rol_assignments
end
def down
fail ActiveRecord::IrreversibleMigration
end
end

View File

@@ -0,0 +1,9 @@
class UseActsAsTaggableInBudgets < ActiveRecord::Migration[5.0]
def change
remove_column :budgets, :budget_milestone_tags, :string
remove_column :budgets, :budget_valuation_tags, :string
add_column :tags, :budgets_count, :integer, default: 0
add_index :tags, :budgets_count
end
end

View File

@@ -0,0 +1,6 @@
class RemoveHelpLinkFromBudgets < ActiveRecord::Migration[5.0]
def change
remove_column :budgets, :help_link, :string
remove_column :tags, :budgets_count, :integer, default: 0
end
end

View File

@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20191030160347) do
ActiveRecord::Schema.define(version: 20191031210734) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -340,16 +340,6 @@ ActiveRecord::Schema.define(version: 20191030160347) do
t.datetime "updated_at", null: false
end
create_table "budget_rol_assignments", force: :cascade do |t|
t.integer "budget_id"
t.integer "user_id"
t.string "rol"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["budget_id"], name: "index_budget_rol_assignments_on_budget_id", using: :btree
t.index ["user_id"], name: "index_budget_rol_assignments_on_user_id", using: :btree
end
create_table "budget_tracker_assignments", force: :cascade do |t|
t.integer "tracker_id"
t.integer "investment_id"
@@ -417,9 +407,6 @@ ActiveRecord::Schema.define(version: 20191030160347) do
t.text "description_drafting"
t.text "description_publishing_prices"
t.text "description_informing"
t.string "help_link"
t.string "budget_milestone_tags"
t.string "budget_valuation_tags"
end
create_table "campaigns", force: :cascade do |t|
@@ -1713,8 +1700,6 @@ ActiveRecord::Schema.define(version: 20191030160347) do
add_foreign_key "budget_administrators", "administrators"
add_foreign_key "budget_administrators", "budgets"
add_foreign_key "budget_investments", "communities"
add_foreign_key "budget_rol_assignments", "budgets"
add_foreign_key "budget_rol_assignments", "users"
add_foreign_key "budget_tracker_assignments", "trackers"
add_foreign_key "budget_trackers", "budgets"
add_foreign_key "budget_trackers", "trackers"

View File

@@ -4,6 +4,8 @@ namespace :consul do
desc "Runs tasks needed to upgrade from 1.0.0 to 1.1.0"
task "execute_release_1.1.0_tasks": [
"budgets:set_original_heading_id"
"budgets:set_original_heading_id",
"migrations:valuation_taggings",
"migrations:budget_admins_and_valuators"
]
end

20
lib/tasks/migrations.rake Normal file
View File

@@ -0,0 +1,20 @@
namespace :migrations do
desc "Migrates context of valuation taggings"
task valuation_taggings: :environment do
ApplicationLogger.new.info "Updating valuation taggings context"
Tagging.where(context: "valuation").update_all(context: "valuation_tags")
end
desc "Migrates budget staff"
task budget_admins_and_valuators: :environment do
ApplicationLogger.new.info "Updating budget administrators and valuators"
Budget.find_each do |budget|
investments = budget.investments.with_hidden
budget.update!(
administrator_ids: investments.where.not(administrator: nil).distinct.pluck(:administrator_id),
valuator_ids: Budget::ValuatorAssignment.where(investment: investments).distinct.pluck(:valuator_id)
)
end
end
end

View File

@@ -19,7 +19,7 @@ FactoryBot.define do
end
end
factory :tagging, class: "ActsAsTaggableOn::Tagging" do
factory :tagging do
context { "tags" }
association :taggable, factory: :proposal
tag

View File

@@ -510,8 +510,8 @@ describe "Admin budget investments" do
investment1 = create(:budget_investment, budget: budget, tag_list: "Education")
investment2 = create(:budget_investment, budget: budget, tag_list: "Health")
investment1.set_tag_list_on(:valuation, "Teachers")
investment2.set_tag_list_on(:valuation, "Hospitals")
investment1.set_tag_list_on(:valuation_tags, "Teachers")
investment2.set_tag_list_on(:valuation_tags, "Hospitals")
investment1.save!
investment2.save!
@@ -526,8 +526,8 @@ describe "Admin budget investments" do
investment1 = create(:budget_investment, budget: budget, tag_list: "Roads")
investment2 = create(:budget_investment, budget: new_budget, tag_list: "Accessibility")
investment1.set_tag_list_on(:valuation, "Roads")
investment2.set_tag_list_on(:valuation, "Accessibility")
investment1.set_tag_list_on(:valuation_tags, "Roads")
investment2.set_tag_list_on(:valuation_tags, "Accessibility")
investment1.save!
investment2.save!
@@ -1086,14 +1086,15 @@ describe "Admin budget investments" do
expect(page).not_to have_content "Mark as incompatible"
end
scenario "Add administrator" do
scenario "Add administrator", :js do
budget_investment = create(:budget_investment)
user = create(:user, username: "Marta", email: "marta@admins.org")
create(:administrator, user: user, description: "Marta desc")
visit edit_admin_budget_path(budget_investment.budget)
check "administrator_#{user.id}"
click_link "Select administrators"
check "Marta"
click_button "Update Budget"
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
@@ -1119,8 +1120,8 @@ describe "Admin budget investments" do
visit edit_admin_budget_path(budget_investment.budget)
check "valuator_#{user1.id}"
check "valuator_#{user3.id}"
check "Valentina"
check "Val"
click_button "Update Budget"
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
@@ -1191,7 +1192,7 @@ describe "Admin budget investments" do
scenario "Adds existing valuation tags", :js do
budget_investment1 = create(:budget_investment)
budget_investment1.set_tag_list_on(:valuation, "Education, Health")
budget_investment1.set_tag_list_on(:valuation_tags, "Education, Health")
budget_investment1.save!
budget_investment2 = create(:budget_investment)
@@ -1229,7 +1230,7 @@ describe "Admin budget investments" do
scenario "Changes valuation and user generated tags" do
budget_investment = create(:budget_investment, tag_list: "Park")
budget_investment.set_tag_list_on(:valuation, "Education")
budget_investment.set_tag_list_on(:valuation_tags, "Education")
budget_investment.save!
visit admin_budget_budget_investment_path(budget_investment.budget, budget_investment)
@@ -1670,7 +1671,7 @@ describe "Admin budget investments" do
end
scenario "Keeps the valuation tags", :js do
investment1.set_tag_list_on(:valuation, %w[Possimpible Truthiness])
investment1.set_tag_list_on(:valuation_tags, %w[Possimpible Truthiness])
investment1.save!
visit admin_budget_budget_investments_path(budget)

View File

@@ -232,13 +232,8 @@ describe "Admin budgets" do
end
context "Update" do
before do
create(:budget)
end
scenario "Update budget" do
visit admin_budgets_path
click_link "Edit budget"
visit edit_admin_budget_path(create(:budget))
fill_in "Name", with: "More trees on the streets"
click_button "Update Budget"
@@ -246,6 +241,37 @@ describe "Admin budgets" do
expect(page).to have_content("More trees on the streets")
expect(page).to have_current_path(admin_budgets_path)
end
scenario "Deselect all selected staff", :js do
admin = Administrator.first
valuator = create(:valuator)
tracker = create(:tracker)
budget = create(:budget, administrators: [admin], valuators: [valuator], trackers: [tracker])
visit edit_admin_budget_path(budget)
click_link "1 administrator selected"
uncheck admin.name
expect(page).to have_link "Select administrators"
click_link "1 valuator selected"
uncheck valuator.name
expect(page).to have_link "Select valuators"
click_link "1 tracker selected"
uncheck tracker.name
expect(page).to have_link "Select trackers"
click_button "Update Budget"
visit edit_admin_budget_path(budget)
expect(page).to have_link "Select administrators"
expect(page).to have_link "Select valuators"
expect(page).to have_link "Select trackers"
end
end
context "Calculate Budget's Winner Investments" do

View File

@@ -334,7 +334,7 @@ describe "Tags" do
scenario "Valuators do not see user tags" do
investment = create(:budget_investment, heading: heading, tag_list: "Park")
investment.set_tag_list_on(:valuation, "Education")
investment.set_tag_list_on(:valuation_tags, "Education")
investment.save!
login_as(admin)

View File

@@ -0,0 +1,68 @@
require "rails_helper"
describe "Migration tasks" do
describe "valuation_taggins" do
let(:run_rake_task) do
Rake::Task["migrations:valuation_taggings"].reenable
Rake.application.invoke_task("migrations:valuation_taggings")
end
it "updates taggings" do
valuation_tagging = create(:tagging, context: "valuation")
another_valuation_tagging = create(:tagging, context: "valuation")
valuation_tags_tagging = create(:tagging, context: "valuation_tags")
tags_tagging = create(:tagging)
run_rake_task
expect(valuation_tagging.reload.context).to eq "valuation_tags"
expect(another_valuation_tagging.reload.context).to eq "valuation_tags"
expect(valuation_tags_tagging.reload.context).to eq "valuation_tags"
expect(tags_tagging.reload.context).to eq "tags"
end
end
describe "budget_admins_and_valuators" do
let(:run_rake_task) do
Rake::Task["migrations:budget_admins_and_valuators"].reenable
Rake.application.invoke_task("migrations:budget_admins_and_valuators")
end
let(:old_budget) { create(:budget) }
let(:current_budget) { create(:budget) }
it "assigns administrators from existing investments" do
harold = create(:administrator)
john = create(:administrator)
root = create(:administrator)
create(:budget_investment, budget: old_budget, administrator: john)
create(:budget_investment, budget: old_budget, administrator: harold)
create(:budget_investment, budget: old_budget, administrator: nil)
create(:budget_investment, budget: current_budget, administrator: root)
run_rake_task
expect(old_budget.administrators).to match_array [john, harold]
expect(current_budget.administrators).to match_array [root]
end
it "assigns valuators from existing investments" do
tyrion = create(:valuator)
cersei = create(:valuator)
jaime = create(:valuator)
create(:budget_investment, budget: old_budget, valuators: [cersei])
create(:budget_investment, budget: old_budget, valuators: [jaime, cersei])
create(:budget_investment, budget: old_budget, valuators: [])
create(:budget_investment, budget: current_budget, valuators: [tyrion, jaime])
run_rake_task
expect(old_budget.valuators).to match_array [cersei, jaime]
expect(current_budget.valuators).to match_array [tyrion, jaime]
end
end
end

View File

@@ -296,7 +296,7 @@ describe Budget do
end
end
describe "#milestone_tags" do
describe "#investments_milestone_tags" do
let(:investment1) { build(:budget_investment, :winner) }
let(:investment2) { build(:budget_investment, :winner) }
let(:investment3) { build(:budget_investment) }
@@ -304,7 +304,7 @@ describe Budget do
it "returns an empty array if not investments milestone_tags" do
budget.investments << investment1
expect(budget.milestone_tags).to eq([])
expect(budget.investments_milestone_tags).to eq([])
end
it "returns array of investments milestone_tags" do
@@ -312,7 +312,7 @@ describe Budget do
investment1.save!
budget.investments << investment1
expect(budget.milestone_tags).to eq(["tag1"])
expect(budget.investments_milestone_tags).to eq(["tag1"])
end
it "returns uniq list of investments milestone_tags" do
@@ -323,7 +323,7 @@ describe Budget do
budget.investments << investment1
budget.investments << investment2
expect(budget.milestone_tags).to eq(["tag1"])
expect(budget.investments_milestone_tags).to eq(["tag1"])
end
it "returns tags only for winner investments" do
@@ -334,7 +334,7 @@ describe Budget do
budget.investments << investment1
budget.investments << investment3
expect(budget.milestone_tags).to eq(["tag1"])
expect(budget.investments_milestone_tags).to eq(["tag1"])
end
end
end