diff options
-rw-r--r-- | app/models/release.rb | 2 | ||||
-rw-r--r-- | app/models/releases/source.rb | 4 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/release.json | 1 | ||||
-rw-r--r-- | spec/models/release_spec.rb | 25 | ||||
-rw-r--r-- | spec/models/releases/link_spec.rb | 68 | ||||
-rw-r--r-- | spec/models/releases/source_spec.rb | 39 |
6 files changed, 136 insertions, 3 deletions
diff --git a/app/models/release.rb b/app/models/release.rb index 2e014fcf882..50668ccabdd 100644 --- a/app/models/release.rb +++ b/app/models/release.rb @@ -31,7 +31,7 @@ class Release < ActiveRecord::Base end def assets_count - links.size + sources.size + links&.size.to_i + sources&.size.to_i end def sources diff --git a/app/models/releases/source.rb b/app/models/releases/source.rb index dc0482002ac..254abf86e77 100644 --- a/app/models/releases/source.rb +++ b/app/models/releases/source.rb @@ -21,13 +21,13 @@ module Releases Gitlab::Routing .url_helpers .project_archive_url(project, - id: File.join(tag_name, archive_path), + id: File.join(tag_name, archive_prefix), format: format) end private - def archive_path + def archive_prefix "#{project.path}-#{tag_name.tr('/', '-')}" end end diff --git a/spec/fixtures/api/schemas/release.json b/spec/fixtures/api/schemas/release.json index 234b82c5306..45fa8b074d4 100644 --- a/spec/fixtures/api/schemas/release.json +++ b/spec/fixtures/api/schemas/release.json @@ -18,6 +18,7 @@ "links": { "type": "array", "items": { + "id": "integer", "name": "string", "url": "string", "external": "boolean" diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb index 92ba2d82f58..157c96c1f65 100644 --- a/spec/models/release_spec.rb +++ b/spec/models/release_spec.rb @@ -10,10 +10,35 @@ RSpec.describe Release do describe 'associations' 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') } end describe 'validation' do it { is_expected.to validate_presence_of(:project) } it { is_expected.to validate_presence_of(:description) } end + + describe '#assets_count' do + subject { release.assets_count } + + it 'returns the number of sources' do + is_expected.to eq(Releases::Source::FORMATS.count) + end + + context 'when a links exists' do + let!(:link) { create(:release_link, release: release) } + + it 'counts the link as an asset' do + is_expected.to eq(1 + Releases::Source::FORMATS.count) + end + end + end + + describe '#sources' do + subject { release.sources } + + it 'returns sources' do + is_expected.to all(be_a(Releases::Source)) + end + end end diff --git a/spec/models/releases/link_spec.rb b/spec/models/releases/link_spec.rb new file mode 100644 index 00000000000..0f9ac7ec76a --- /dev/null +++ b/spec/models/releases/link_spec.rb @@ -0,0 +1,68 @@ +require 'rails_helper' + +RSpec.describe Releases::Link do + let(:release) { create(:release, project: project) } + let(:project) { create(:project) } + + describe 'associations' do + it { is_expected.to belong_to(:release) } + end + + describe 'validation' do + it { is_expected.to validate_presence_of(:url) } + it { is_expected.to validate_presence_of(:name) } + + context 'when url is invalid' do + let(:link) { build(:release_link, url: 'hoge') } + + it 'will be invalid' do + expect(link).to be_invalid + end + end + + context 'when duplicate name is added to a release' do + let!(:link) { create(:release_link, name: 'alpha', release: release) } + + it 'raises an error' do + expect do + create(:release_link, name: 'alpha', release: release) + end.to raise_error(ActiveRecord::RecordInvalid) + end + end + end + + describe '.sorted' do + subject { described_class.sorted } + + let!(:link_1) { create(:release_link, name: 'alpha', release: release, created_at: 1.day.ago) } + let!(:link_2) { create(:release_link, name: 'beta', release: release, created_at: 2.days.ago) } + + it 'returns a list of links by created_at order' do + is_expected.to eq([link_1, link_2]) + end + end + + describe '#internal?' do + subject { link.internal? } + + let(:link) { build(:release_link, release: release, url: url) } + let(:url) { "#{project.web_url}/-/jobs/140463678/artifacts/download" } + + it { is_expected.to be_truthy } + + context 'when link does not include project web url' do + let(:url) { 'https://google.com/-/jobs/140463678/artifacts/download' } + + it { is_expected.to be_falsy } + end + end + + describe '#external?' do + subject { link.external? } + + let(:link) { build(:release_link, release: release, url: url) } + let(:url) { 'https://google.com/-/jobs/140463678/artifacts/download' } + + it { is_expected.to be_truthy } + end +end diff --git a/spec/models/releases/source_spec.rb b/spec/models/releases/source_spec.rb new file mode 100644 index 00000000000..526ee8eafc9 --- /dev/null +++ b/spec/models/releases/source_spec.rb @@ -0,0 +1,39 @@ +require 'rails_helper' + +RSpec.describe Releases::Source do + set(:project) { create(:project, :repository, name: 'finance-cal') } + let(:tag_name) { 'v1.0' } + + describe '.all' do + subject { described_class.all(project, tag_name) } + + it 'returns all formats of sources' do + expect(subject.map(&:format)) + .to match_array(described_class::FORMATS) + end + end + + describe '#url' do + subject { source.url } + + let(:source) do + described_class.new(project: project, tag_name: tag_name, format: format) + end + + let(:format) { 'zip' } + + it 'returns zip archived source url' do + is_expected + .to eq("#{project.web_url}/-/archive/v1.0/finance-cal-v1.0.zip") + end + + context 'when ref is directory structure' do + let(:tag_name) { 'beta/v1.0' } + + it 'converts slash to dash' do + is_expected + .to eq("#{project.web_url}/-/archive/beta/v1.0/finance-cal-beta-v1.0.zip") + end + end + end +end |