Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEtienne BaquƩ <ebaque@gitlab.com>2019-09-04 18:24:56 +0300
committerEtienne BaquƩ <ebaque@gitlab.com>2019-09-12 00:37:15 +0300
commit6968ce6bf9ac66b7395e478a865aee5579f5a09e (patch)
treed324e7abd5e9c2d634561ebe16dac781b1c69c80
parent76c0af2917550626c7ae9373933f274d6b845e0e (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.rb6
-rw-r--r--app/models/release.rb6
-rw-r--r--spec/models/milestone_spec.rb8
-rw-r--r--spec/models/release_spec.rb12
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