diff options
author | Etienne BaquƩ <ebaque@gitlab.com> | 2019-09-04 18:24:56 +0300 |
---|---|---|
committer | Etienne BaquƩ <ebaque@gitlab.com> | 2019-09-12 00:37:15 +0300 |
commit | 6968ce6bf9ac66b7395e478a865aee5579f5a09e (patch) | |
tree | d324e7abd5e9c2d634561ebe16dac781b1c69c80 | |
parent | 76c0af2917550626c7ae9373933f274d6b845e0e (diff) |
Set up has_many relation on Milestone and Release
Updated Release model and its spec file.
Updated Milestone model and its spec file.
-rw-r--r-- | app/models/milestone.rb | 6 | ||||
-rw-r--r-- | app/models/release.rb | 6 | ||||
-rw-r--r-- | spec/models/milestone_spec.rb | 8 | ||||
-rw-r--r-- | spec/models/release_spec.rb | 12 |
4 files changed, 16 insertions, 16 deletions
diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 7f46e5faf1a..e46e087e64a 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -28,8 +28,8 @@ class Milestone < ApplicationRecord # A one-to-one relationship is set up here as part of a MVC: https://gitlab.com/gitlab-org/gitlab-ce/issues/62402 # However, on the long term, we will want a many-to-many relationship between Release and Milestone. # The "has_one through" allows us today to set up this one-to-one relationship while setting up the architecture for the long-term (ie intermediate table). - has_one :milestone_release - has_one :release, through: :milestone_release + has_many :milestone_releases + has_many :releases, through: :milestone_releases has_internal_id :iid, scope: :project, init: ->(s) { s&.project&.milestones&.maximum(:iid) } has_internal_id :iid, scope: :group, init: ->(s) { s&.group&.milestones&.maximum(:iid) } @@ -66,7 +66,7 @@ class Milestone < ApplicationRecord validate :milestone_type_check validate :start_date_should_be_less_than_due_date, if: proc { |m| m.start_date.present? && m.due_date.present? } validate :dates_within_4_digits - validates_associated :milestone_release, message: -> (_, obj) { obj[:value].errors.full_messages.join(",") } + validates_associated :milestone_releases, message: -> (_, obj) { obj[:value].map(&:errors).map(&:full_messages).join(",") } strip_attributes :title diff --git a/app/models/release.rb b/app/models/release.rb index b2e65974aa0..96156baa5e5 100644 --- a/app/models/release.rb +++ b/app/models/release.rb @@ -15,8 +15,8 @@ class Release < ApplicationRecord # A one-to-one relationship is set up here as part of a MVC: https://gitlab.com/gitlab-org/gitlab-ce/issues/62402 # However, on the long term, we will want a many-to-many relationship between Release and Milestone. # The "has_one through" allows us today to set up this one-to-one relationship while setting up the architecture for the long-term (ie intermediate table). - has_one :milestone_release - has_one :milestone, through: :milestone_release + has_many :milestone_releases + has_many :milestones, through: :milestone_releases default_value_for :released_at, allows_nil: false do Time.zone.now @@ -26,7 +26,7 @@ class Release < ApplicationRecord validates :description, :project, :tag, presence: true validates :name, presence: true, on: :create - validates_associated :milestone_release, message: -> (_, obj) { obj[:value].errors.full_messages.join(",") } + validates_associated :milestone_releases, message: -> (_, obj) { obj[:value].map(&:errors).map(&:full_messages).join(",") } scope :sorted, -> { order(released_at: :desc) } diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb index 64030f5b92a..4a03bb46b78 100644 --- a/spec/models/milestone_spec.rb +++ b/spec/models/milestone_spec.rb @@ -55,20 +55,20 @@ describe Milestone do end end - describe 'milestone_release' do + describe 'milestone_releases' do let(:milestone) { build(:milestone, project: project) } context 'when it is tied to a release for another project' do it 'creates a validation error' do other_project = create(:project) - milestone.release = build(:release, project: other_project) + milestone.releases << build(:release, project: other_project) expect(milestone).not_to be_valid end end context 'when it is tied to a release for the same project' do it 'is valid' do - milestone.release = build(:release, project: project) + milestone.releases << build(:release, project: project) expect(milestone).to be_valid end end @@ -78,7 +78,7 @@ describe Milestone do describe "Associations" do it { is_expected.to belong_to(:project) } it { is_expected.to have_many(:issues) } - it { is_expected.to have_one(:release) } + it { is_expected.to have_many(:releases) } end let(:project) { create(:project, :public) } diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb index c690390e24d..c9000f268c0 100644 --- a/spec/models/release_spec.rb +++ b/spec/models/release_spec.rb @@ -13,7 +13,7 @@ RSpec.describe Release do it { is_expected.to belong_to(:project) } it { is_expected.to belong_to(:author).class_name('User') } it { is_expected.to have_many(:links).class_name('Releases::Link') } - it { is_expected.to have_one(:milestone) } + it { is_expected.to have_many(:milestones) } end describe 'validation' do @@ -38,15 +38,15 @@ RSpec.describe Release do context 'when a release is tied to a milestone for another project' do it 'creates a validation error' do - release.milestone = build(:milestone, project: create(:project)) - expect(release).not_to be_valid + milestone = build(:milestone, project: create(:project)) + expect { release.milestones << milestone }.to raise_error end end context 'when a release is tied to a milestone linked to the same project' do - it 'is valid' do - release.milestone = build(:milestone, project: project) - expect(release).to be_valid + it 'successfully links this release to this milestone' do + milestone = build(:milestone, project: project) + expect { release.milestones << milestone }.to change { MilestoneRelease.count }.by(1) end end end |