Make Milestones general, and not specific to Budget Investments

Generalize the Budget::Investment::Milestone model to a
polymorphic Milestone model so it can be used for entities
other than Budget::Investment.
This commit is contained in:
Marko Lovic
2018-07-16 15:00:56 +02:00
committed by Javi Martín
parent 81f516efd7
commit c0f6fa182f
23 changed files with 176 additions and 122 deletions

View File

@@ -2,19 +2,19 @@ class Admin::BudgetInvestmentMilestonesController < Admin::BaseController
include Translatable include Translatable
before_action :load_budget_investment, only: [:index, :new, :create, :edit, :update, :destroy] before_action :load_budget_investment, only: [:index, :new, :create, :edit, :update, :destroy]
before_action :load_budget_investment_milestone, only: [:edit, :update, :destroy] before_action :load_milestone, only: [:edit, :update, :destroy]
before_action :load_statuses, only: [:index, :new, :create, :edit, :update] before_action :load_statuses, only: [:index, :new, :create, :edit, :update]
def index def index
end end
def new def new
@milestone = Budget::Investment::Milestone.new @milestone = Milestone.new
end end
def create def create
@milestone = Budget::Investment::Milestone.new(milestone_params) @milestone = Milestone.new(milestone_params)
@milestone.investment = @investment @milestone.milestoneable = @investment
if @milestone.save if @milestone.save
redirect_to admin_budget_budget_investment_path(@investment.budget, @investment), redirect_to admin_budget_budget_investment_path(@investment.budget, @investment),
notice: t('admin.milestones.create.notice') notice: t('admin.milestones.create.notice')
@@ -47,22 +47,22 @@ class Admin::BudgetInvestmentMilestonesController < Admin::BaseController
image_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy] image_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
documents_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy] documents_attributes = [:id, :title, :attachment, :cached_attachment, :user_id, :_destroy]
attributes = [:publication_date, :budget_investment_id, :status_id, attributes = [:publication_date, :budget_investment_id, :status_id,
translation_params(Budget::Investment::Milestone), translation_params(Milestone),
image_attributes: image_attributes, documents_attributes: documents_attributes] image_attributes: image_attributes, documents_attributes: documents_attributes]
params.require(:budget_investment_milestone).permit(*attributes) params.require(:milestone).permit(*attributes)
end end
def load_budget_investment def load_budget_investment
@investment = Budget::Investment.find(params[:budget_investment_id]) @investment = Budget::Investment.find(params[:budget_investment_id])
end end
def load_budget_investment_milestone def load_milestone
@milestone = get_milestone @milestone = get_milestone
end end
def get_milestone def get_milestone
Budget::Investment::Milestone.find(params[:id]) Milestone.find(params[:id])
end end
def resource def resource

View File

@@ -24,6 +24,7 @@ class Budget
include Notifiable include Notifiable
include Filterable include Filterable
include Flaggable include Flaggable
include Milestoneable
belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id' belongs_to :author, -> { with_hidden }, class_name: 'User', foreign_key: 'author_id'
belongs_to :heading belongs_to :heading
@@ -40,8 +41,6 @@ class Budget
has_many :comments, -> {where(valuation: false)}, as: :commentable, class_name: 'Comment' has_many :comments, -> {where(valuation: false)}, as: :commentable, class_name: 'Comment'
has_many :valuations, -> {where(valuation: true)}, as: :commentable, class_name: 'Comment' has_many :valuations, -> {where(valuation: true)}, as: :commentable, class_name: 'Comment'
has_many :milestones
validates :title, presence: true validates :title, presence: true
validates :author, presence: true validates :author, presence: true
validates :description, presence: true validates :description, presence: true

View File

@@ -1,35 +0,0 @@
class Budget
class Investment
class Milestone < ActiveRecord::Base
include Imageable
include Documentable
documentable max_documents_allowed: 3,
max_file_size: 3.megabytes,
accepted_content_types: [ "application/pdf" ]
translates :title, :description, touch: true
include Globalizable
belongs_to :investment
belongs_to :status, class_name: 'Milestone::Status'
validates :investment, presence: true
validates :publication_date, presence: true
validate :description_or_status_present?
scope :order_by_publication_date, -> { order(publication_date: :asc, created_at: :asc) }
scope :published, -> { where("publication_date <= ?", Date.current) }
scope :with_status, -> { where("status_id IS NOT NULL") }
def self.title_max_length
80
end
def description_or_status_present?
unless description.present? || status_id.present?
errors.add(:description)
end
end
end
end
end

View File

@@ -0,0 +1,7 @@
module Milestoneable
extend ActiveSupport::Concern
included do
has_many :milestones, as: :milestoneable, dependent: :destroy
end
end

31
app/models/milestone.rb Normal file
View File

@@ -0,0 +1,31 @@
class Milestone < ActiveRecord::Base
include Imageable
include Documentable
documentable max_documents_allowed: 3,
max_file_size: 3.megabytes,
accepted_content_types: [ "application/pdf" ]
translates :title, :description, touch: true
include Globalizable
belongs_to :milestoneable, polymorphic: true
belongs_to :status
validates :milestoneable, presence: true
validates :publication_date, presence: true
validate :description_or_status_present?
scope :order_by_publication_date, -> { order(publication_date: :asc, created_at: :asc) }
scope :published, -> { where("publication_date <= ?", Date.current) }
scope :with_status, -> { where("status_id IS NOT NULL") }
def self.title_max_length
80
end
def description_or_status_present?
unless description.present? || status_id.present?
errors.add(:description)
end
end
end

View File

@@ -13,7 +13,7 @@
<%= f.translatable_fields do |translations_form| %> <%= f.translatable_fields do |translations_form| %>
<%= translations_form.hidden_field :title, value: l(Time.current, format: :datetime), <%= translations_form.hidden_field :title, value: l(Time.current, format: :datetime),
maxlength: Budget::Investment::Milestone.title_max_length %> maxlength: Milestone.title_max_length %>
<%= translations_form.text_area :description, <%= translations_form.text_area :description,
rows: 5, rows: 5,

View File

@@ -18,7 +18,7 @@
<td class="text-center"><%= milestone.id %></td> <td class="text-center"><%= milestone.id %></td>
<td> <td>
<%= link_to milestone.title, <%= link_to milestone.title,
edit_admin_budget_budget_investment_budget_investment_milestone_path(@investment.budget, edit_admin_budget_budget_investment_milestone_path(@investment.budget,
@investment, @investment,
milestone) %> milestone) %>
</td> </td>
@@ -46,7 +46,7 @@
</td> </td>
<td class="small-2"> <td class="small-2">
<%= link_to t("admin.milestones.index.delete"), <%= link_to t("admin.milestones.index.delete"),
admin_budget_budget_investment_budget_investment_milestone_path(@investment.budget, admin_budget_budget_investment_milestone_path(@investment.budget,
@investment, @investment,
milestone), milestone),
method: :delete, method: :delete,

View File

@@ -63,6 +63,6 @@
<p> <p>
<%= link_to t("admin.budget_investments.show.new_milestone"), <%= link_to t("admin.budget_investments.show.new_milestone"),
new_admin_budget_budget_investment_budget_investment_milestone_path(@budget, @investment), new_admin_budget_budget_investment_milestone_path(@budget, @investment),
class: "button hollow" %> class: "button hollow" %>
</p> </p>

View File

@@ -7,8 +7,8 @@ module ActionDispatch::Routing::UrlFor
case resource.class.name case resource.class.name
when "Budget::Investment" when "Budget::Investment"
[resource.budget, resource] [resource.budget, resource]
when "Budget::Investment::Milestone" when "Milestone"
[resource.investment.budget, resource.investment, resource] [resource.milestoneable.budget, resource.milestoneable, resource]
when "Legislation::Annotation" when "Legislation::Annotation"
[resource.draft_version.process, resource.draft_version, resource] [resource.draft_version.process, resource.draft_version, resource]
when "Legislation::Proposal", "Legislation::Question", "Legislation::DraftVersion" when "Legislation::Proposal", "Legislation::Question", "Legislation::DraftVersion"

View File

@@ -10,7 +10,7 @@ en:
budget/investment: budget/investment:
one: "Investment" one: "Investment"
other: "Investments" other: "Investments"
budget/investment/milestone: milestone:
one: "milestone" one: "milestone"
other: "milestones" other: "milestones"
milestone/status: milestone/status:

View File

@@ -10,7 +10,7 @@ es:
budget/investment: budget/investment:
one: "Proyecto de gasto" one: "Proyecto de gasto"
other: "Proyectos de gasto" other: "Proyectos de gasto"
budget/investment/milestone: milestone:
one: "hito" one: "hito"
other: "hitos" other: "hitos"
milestone/status: milestone/status:

View File

@@ -62,7 +62,7 @@ namespace :admin do
end end
resources :budget_investments, only: [:index, :show, :edit, :update] do resources :budget_investments, only: [:index, :show, :edit, :update] do
resources :budget_investment_milestones resources :milestones, controller: 'budget_investment_milestones'
member { patch :toggle_selection } member { patch :toggle_selection }
end end

View File

@@ -148,7 +148,7 @@ end
section "Creating investment milestones" do section "Creating investment milestones" do
Budget::Investment.find_each do |investment| Budget::Investment.find_each do |investment|
milestone = Budget::Investment::Milestone.new(investment_id: investment.id, publication_date: Date.tomorrow, status_id: Milestone::Status.all.sample) milestone = investment.milestones.build(publication_date: Date.tomorrow, status_id: Milestone::Status.all.sample)
I18n.available_locales.map do |locale| I18n.available_locales.map do |locale|
Globalize.with_locale(locale) do Globalize.with_locale(locale) do
milestone.description = "Description for locale #{locale}" milestone.description = "Description for locale #{locale}"

View File

@@ -0,0 +1,27 @@
class MakeInvestmentMilestonesPolymorphic < ActiveRecord::Migration
def change
create_table :milestones do |t|
t.references :milestoneable, polymorphic: true
t.string "title", limit: 80
t.text "description"
t.datetime "publication_date"
t.references :status, index: true
t.timestamps null: false
end
reversible do |change|
change.up do
Milestone.create_translation_table!({
title: :string,
description: :text
})
end
change.down do
Milestone.drop_translation_table!
end
end
end
end

View File

@@ -791,6 +791,31 @@ ActiveRecord::Schema.define(version: 20181016204729) do
add_index "milestone_statuses", ["hidden_at"], name: "index_milestone_statuses_on_hidden_at", using: :btree add_index "milestone_statuses", ["hidden_at"], name: "index_milestone_statuses_on_hidden_at", using: :btree
create_table "milestone_translations", force: :cascade do |t|
t.integer "milestone_id", null: false
t.string "locale", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "title"
t.text "description"
end
add_index "milestone_translations", ["locale"], name: "index_milestone_translations_on_locale", using: :btree
add_index "milestone_translations", ["milestone_id"], name: "index_milestone_translations_on_milestone_id", using: :btree
create_table "milestones", force: :cascade do |t|
t.integer "milestoneable_id"
t.string "milestoneable_type"
t.string "title", limit: 80
t.text "description"
t.datetime "publication_date"
t.integer "status_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_index "milestones", ["status_id"], name: "index_milestones_on_status_id", using: :btree
create_table "moderators", force: :cascade do |t| create_table "moderators", force: :cascade do |t|
t.integer "user_id" t.integer "user_id"
end end

View File

@@ -3,7 +3,7 @@ namespace :globalize do
[ [
AdminNotification, AdminNotification,
Banner, Banner,
Budget::Investment::Milestone, Milestone,
I18nContent, I18nContent,
Legislation::DraftVersion, Legislation::DraftVersion,
Legislation::Process, Legislation::Process,

View File

@@ -198,8 +198,8 @@ FactoryBot.define do
sequence(:description) { |n| "Milestone status #{n} description" } sequence(:description) { |n| "Milestone status #{n} description" }
end end
factory :budget_investment_milestone, class: 'Budget::Investment::Milestone' do factory :milestone, class: 'Milestone' do
association :investment, factory: :budget_investment association :milestoneable, factory: :budget_investment
association :status, factory: :milestone_status association :status, factory: :milestone_status
sequence(:title) { |n| "Budget investment milestone #{n} title" } sequence(:title) { |n| "Budget investment milestone #{n} title" }
description 'Milestone description' description 'Milestone description'

View File

@@ -10,13 +10,13 @@ feature 'Admin budget investment milestones' do
end end
it_behaves_like "translatable", it_behaves_like "translatable",
"budget_investment_milestone", "milestone",
"edit_admin_budget_budget_investment_budget_investment_milestone_path", "edit_admin_budget_budget_investment_milestone_path",
%w[description] %w[description]
context "Index" do context "Index" do
scenario 'Displaying milestones' do scenario 'Displaying milestones' do
milestone = create(:budget_investment_milestone, investment: @investment) milestone = create(:milestone, milestoneable: @investment)
create(:image, imageable: milestone) create(:image, imageable: milestone)
document = create(:document, documentable: milestone) document = create(:document, documentable: milestone)
@@ -46,9 +46,9 @@ feature 'Admin budget investment milestones' do
click_link 'Create new milestone' click_link 'Create new milestone'
select status.name, from: 'budget_investment_milestone_status_id' select status.name, from: 'milestone_status_id'
fill_in 'Description', with: 'New description milestone' fill_in 'Description', with: 'New description milestone'
fill_in 'budget_investment_milestone_publication_date', with: Date.current fill_in 'milestone_publication_date', with: Date.current
click_button 'Create milestone' click_button 'Create milestone'
@@ -61,7 +61,7 @@ feature 'Admin budget investment milestones' do
visit admin_budget_budget_investment_path(@investment.budget, @investment) visit admin_budget_budget_investment_path(@investment.budget, @investment)
click_link 'Create new milestone' click_link 'Create new milestone'
expect(find("#budget_investment_milestone_status_id").disabled?).to be true expect(find("#milestone_status_id").disabled?).to be true
end end
scenario "Show validation errors on milestone form" do scenario "Show validation errors on milestone form" do
@@ -73,7 +73,7 @@ feature 'Admin budget investment milestones' do
click_button 'Create milestone' click_button 'Create milestone'
within "#new_budget_investment_milestone" do within "#new_milestone" do
expect(page).to have_content "can't be blank", count: 1 expect(page).to have_content "can't be blank", count: 1
expect(page).to have_content 'New description milestone' expect(page).to have_content 'New description milestone'
end end
@@ -82,7 +82,7 @@ feature 'Admin budget investment milestones' do
context "Edit" do context "Edit" do
scenario "Change title, description and document names" do scenario "Change title, description and document names" do
milestone = create(:budget_investment_milestone, investment: @investment) milestone = create(:milestone, milestoneable: @investment)
create(:image, imageable: milestone) create(:image, imageable: milestone)
document = create(:document, documentable: milestone) document = create(:document, documentable: milestone)
@@ -94,8 +94,8 @@ feature 'Admin budget investment milestones' do
expect(page).to have_css("img[alt='#{milestone.image.title}']") expect(page).to have_css("img[alt='#{milestone.image.title}']")
fill_in 'Description', with: 'Changed description' fill_in 'Description', with: 'Changed description'
fill_in 'budget_investment_milestone_publication_date', with: Date.current fill_in 'milestone_publication_date', with: Date.current
fill_in 'budget_investment_milestone_documents_attributes_0_title', with: 'New document title' fill_in 'milestone_documents_attributes_0_title', with: 'New document title'
click_button 'Update milestone' click_button 'Update milestone'
@@ -108,7 +108,7 @@ feature 'Admin budget investment milestones' do
context "Delete" do context "Delete" do
scenario "Remove milestone" do scenario "Remove milestone" do
milestone = create(:budget_investment_milestone, investment: @investment, title: "Title will it remove") milestone = create(:milestone, milestoneable: @investment, title: "Title will it remove")
visit admin_budget_budget_investment_path(@investment.budget, @investment) visit admin_budget_budget_investment_path(@investment.budget, @investment)

View File

@@ -12,7 +12,7 @@ feature 'Executions' do
let!(:investment3) { create(:budget_investment, :incompatible, heading: heading) } let!(:investment3) { create(:budget_investment, :incompatible, heading: heading) }
scenario 'only displays investments with milestones' do scenario 'only displays investments with milestones' do
create(:budget_investment_milestone, investment: investment1) create(:milestone, milestoneable: investment1)
visit budget_path(budget) visit budget_path(budget)
click_link 'See results' click_link 'See results'
@@ -28,7 +28,7 @@ feature 'Executions' do
end end
scenario "Do not display headings with no winning investments for selected status" do scenario "Do not display headings with no winning investments for selected status" do
create(:budget_investment_milestone, investment: investment1) create(:milestone, milestoneable: investment1)
empty_group = create(:budget_group, budget: budget) empty_group = create(:budget_group, budget: budget)
empty_heading = create(:budget_heading, group: empty_group, price: 1000) empty_heading = create(:budget_heading, group: empty_group, price: 1000)
@@ -63,7 +63,7 @@ feature 'Executions' do
context 'Images' do context 'Images' do
scenario 'renders milestone image if available' do scenario 'renders milestone image if available' do
milestone1 = create(:budget_investment_milestone, investment: investment1) milestone1 = create(:milestone, milestoneable: investment1)
create(:image, imageable: milestone1) create(:image, imageable: milestone1)
visit budget_path(budget) visit budget_path(budget)
@@ -76,7 +76,7 @@ feature 'Executions' do
end end
scenario 'renders investment image if no milestone image is available' do scenario 'renders investment image if no milestone image is available' do
create(:budget_investment_milestone, investment: investment2) create(:milestone, milestoneable: investment2)
create(:image, imageable: investment2) create(:image, imageable: investment2)
visit budget_path(budget) visit budget_path(budget)
@@ -89,7 +89,7 @@ feature 'Executions' do
end end
scenario 'renders default image if no milestone nor investment images are available' do scenario 'renders default image if no milestone nor investment images are available' do
create(:budget_investment_milestone, investment: investment4) create(:milestone, milestoneable: investment4)
visit budget_path(budget) visit budget_path(budget)
@@ -101,17 +101,17 @@ feature 'Executions' do
end end
scenario "renders last milestone's image if investment has multiple milestones with images associated" do scenario "renders last milestone's image if investment has multiple milestones with images associated" do
milestone1 = create(:budget_investment_milestone, investment: investment1, milestone1 = create(:milestone, milestoneable: investment1,
publication_date: Date.yesterday) publication_date: Date.yesterday)
milestone2 = create(:budget_investment_milestone, investment: investment1, milestone2 = create(:milestone, milestoneable: investment1,
publication_date: Date.yesterday) publication_date: Date.yesterday)
milestone3 = create(:budget_investment_milestone, investment: investment1, milestone3 = create(:milestone, milestoneable: investment1,
publication_date: Date.yesterday) publication_date: Date.yesterday)
milestone4 = create(:budget_investment_milestone, investment: investment1, milestone4 = create(:milestone, milestoneable: investment1,
publication_date: Date.yesterday) publication_date: Date.yesterday)
create(:image, imageable: milestone2, title: 'Image for first milestone with image') create(:image, imageable: milestone2, title: 'Image for first milestone with image')
create(:image, imageable: milestone3, title: 'Image for second milestone with image') create(:image, imageable: milestone3, title: 'Image for second milestone with image')
@@ -133,13 +133,13 @@ feature 'Executions' do
let!(:status2) { create(:milestone_status, name: I18n.t('seeds.budgets.statuses.bidding')) } let!(:status2) { create(:milestone_status, name: I18n.t('seeds.budgets.statuses.bidding')) }
scenario 'Filters select with counter are shown' do scenario 'Filters select with counter are shown' do
create(:budget_investment_milestone, investment: investment1, create(:milestone, milestoneable: investment1,
publication_date: Date.yesterday, publication_date: Date.yesterday,
status: status1) status: status1)
create(:budget_investment_milestone, investment: investment2, create(:milestone, milestoneable: investment2,
publication_date: Date.yesterday, publication_date: Date.yesterday,
status: status2) status: status2)
visit budget_path(budget) visit budget_path(budget)
@@ -152,8 +152,8 @@ feature 'Executions' do
end end
scenario 'by milestone status', :js do scenario 'by milestone status', :js do
create(:budget_investment_milestone, investment: investment1, status: status1) create(:milestone, milestoneable: investment1, status: status1)
create(:budget_investment_milestone, investment: investment2, status: status2) create(:milestone, milestoneable: investment2, status: status2)
create(:milestone_status, name: I18n.t('seeds.budgets.statuses.executing_project')) create(:milestone_status, name: I18n.t('seeds.budgets.statuses.executing_project'))
visit budget_path(budget) visit budget_path(budget)
@@ -181,13 +181,13 @@ feature 'Executions' do
end end
scenario 'are based on latest milestone status', :js do scenario 'are based on latest milestone status', :js do
create(:budget_investment_milestone, investment: investment1, create(:milestone, milestoneable: investment1,
publication_date: 1.month.ago, publication_date: 1.month.ago,
status: status1) status: status1)
create(:budget_investment_milestone, investment: investment1, create(:milestone, milestoneable: investment1,
publication_date: Date.yesterday, publication_date: Date.yesterday,
status: status2) status: status2)
visit budget_path(budget) visit budget_path(budget)
click_link 'See results' click_link 'See results'
@@ -201,13 +201,13 @@ feature 'Executions' do
end end
scenario 'milestones with future dates are not shown', :js do scenario 'milestones with future dates are not shown', :js do
create(:budget_investment_milestone, investment: investment1, create(:milestone, milestoneable: investment1,
publication_date: Date.yesterday, publication_date: Date.yesterday,
status: status1) status: status1)
create(:budget_investment_milestone, investment: investment1, create(:milestone, milestoneable: investment1,
publication_date: Date.tomorrow, publication_date: Date.tomorrow,
status: status2) status: status2)
visit budget_path(budget) visit budget_path(budget)
click_link 'See results' click_link 'See results'
@@ -226,7 +226,7 @@ feature 'Executions' do
def create_heading_with_investment_with_milestone(group:, name:) def create_heading_with_investment_with_milestone(group:, name:)
heading = create(:budget_heading, group: group, name: name) heading = create(:budget_heading, group: group, name: name)
investment = create(:budget_investment, :winner, heading: heading) investment = create(:budget_investment, :winner, heading: heading)
milestone = create(:budget_investment_milestone, investment: investment) milestone = create(:milestone, milestoneable: investment)
heading heading
end end
@@ -261,7 +261,7 @@ feature 'Executions' do
scenario 'Milestone not yet published' do scenario 'Milestone not yet published' do
status = create(:milestone_status) status = create(:milestone_status)
unpublished_milestone = create(:budget_investment_milestone, investment: investment1, unpublished_milestone = create(:milestone, milestoneable: investment1,
status: status, publication_date: Date.tomorrow) status: status, publication_date: Date.tomorrow)
visit budget_executions_path(budget, status: status.id) visit budget_executions_path(budget, status: status.id)

View File

@@ -1121,13 +1121,13 @@ feature 'Budget Investments' do
scenario "Show milestones", :js do scenario "Show milestones", :js do
user = create(:user) user = create(:user)
investment = create(:budget_investment) investment = create(:budget_investment)
create(:budget_investment_milestone, investment: investment, create(:milestone, milestoneable: investment,
description_en: "Last milestone with a link to https://consul.dev", description_en: "Last milestone with a link to https://consul.dev",
description_es: "Último hito con el link https://consul.dev", description_es: "Último hito con el link https://consul.dev",
publication_date: Date.tomorrow) publication_date: Date.tomorrow)
first_milestone = create(:budget_investment_milestone, investment: investment, first_milestone = create(:milestone, milestoneable: investment,
description: "First milestone", description: "First milestone",
publication_date: Date.yesterday) publication_date: Date.yesterday)
image = create(:image, imageable: first_milestone) image = create(:image, imageable: first_milestone)
document = create(:document, documentable: first_milestone) document = create(:document, documentable: first_milestone)

View File

@@ -151,7 +151,7 @@ describe "Globalize tasks" do
before { I18n.locale = :"pt-BR" } before { I18n.locale = :"pt-BR" }
let!(:milestone) do let!(:milestone) do
create(:budget_investment_milestone).tap do |milestone| create(:milestone).tap do |milestone|
milestone.translations.delete_all milestone.translations.delete_all
milestone.update_column(:title, "Português") milestone.update_column(:title, "Português")
milestone.reload milestone.reload

View File

@@ -1,9 +1,9 @@
require 'rails_helper' require 'rails_helper'
describe Budget::Investment::Milestone do describe Milestone do
describe "Validations" do describe "Validations" do
let(:milestone) { build(:budget_investment_milestone) } let(:milestone) { build(:milestone) }
it "is valid" do it "is valid" do
expect(milestone).to be_valid expect(milestone).to be_valid
@@ -25,8 +25,8 @@ describe Budget::Investment::Milestone do
expect(milestone).to be_valid expect(milestone).to be_valid
end end
it "is not valid without an investment" do it "is not valid without a milestoneable" do
milestone.investment_id = nil milestone.milestoneable_id = nil
expect(milestone).not_to be_valid expect(milestone).not_to be_valid
end end
@@ -48,7 +48,7 @@ describe Budget::Investment::Milestone do
end end
describe "#description_or_status_present?" do describe "#description_or_status_present?" do
let(:milestone) { build(:budget_investment_milestone) } let(:milestone) { build(:milestone) }
it "is not valid when status is removed and there's no description" do it "is not valid when status is removed and there's no description" do
milestone.update(description: nil) milestone.update(description: nil)
@@ -71,14 +71,14 @@ describe Budget::Investment::Milestone do
describe ".published" do describe ".published" do
it "uses the application's time zone date", :with_different_time_zone do it "uses the application's time zone date", :with_different_time_zone do
published_in_local_time_zone = create(:budget_investment_milestone, published_in_local_time_zone = create(:milestone,
publication_date: Date.today) publication_date: Date.today)
published_in_application_time_zone = create(:budget_investment_milestone, published_in_application_time_zone = create(:milestone,
publication_date: Date.current) publication_date: Date.current)
expect(Budget::Investment::Milestone.published).to include(published_in_application_time_zone) expect(Milestone.published).to include(published_in_application_time_zone)
expect(Budget::Investment::Milestone.published).not_to include(published_in_local_time_zone) expect(Milestone.published).not_to include(published_in_local_time_zone)
end end
end end
end end

View File

@@ -317,7 +317,7 @@ end
# even share the same colour. # even share the same colour.
def update_button_text def update_button_text
case translatable_class.name case translatable_class.name
when "Budget::Investment::Milestone" when "Milestone"
"Update milestone" "Update milestone"
when "AdminNotification" when "AdminNotification"
"Update notification" "Update notification"