gitlab-org--gitlab-foss/spec/graphql/mutations/releases/create_spec.rb

152 lines
4.4 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Mutations::Releases::Create do
let_it_be(:project) { create(:project, :public, :repository) }
let_it_be(:milestone_12_3) { create(:milestone, project: project, title: '12.3') }
let_it_be(:milestone_12_4) { create(:milestone, project: project, title: '12.4') }
let_it_be(:reporter) { create(:user) }
let_it_be(:developer) { create(:user) }
let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) }
let(:tag) { 'v1.1.0'}
let(:ref) { 'master'}
let(:name) { 'Version 1.0'}
let(:description) { 'The first release :rocket:' }
let(:released_at) { Time.parse('2018-12-10') }
let(:milestones) { [milestone_12_3.title, milestone_12_4.title] }
let(:assets) do
{
links: [
{
name: 'An asset link',
url: 'https://gitlab.example.com/link',
filepath: '/permanent/link',
link_type: 'other'
}
]
}
end
let(:mutation_arguments) do
{
project_path: project.full_path,
tag: tag,
ref: ref,
name: name,
description: description,
released_at: released_at,
milestones: milestones,
assets: assets
}
end
around do |example|
freeze_time { example.run }
end
before do
project.add_reporter(reporter)
project.add_developer(developer)
end
describe '#resolve' do
subject(:resolve) do
mutation.resolve(**mutation_arguments)
end
let(:new_release) { subject[:release] }
context 'when the current user has access to create releases' do
let(:current_user) { developer }
it 'returns no errors' do
expect(resolve).to include(errors: [])
end
it 'creates the release with the correct tag' do
expect(new_release.tag).to eq(tag)
end
it 'creates the release with the correct name' do
expect(new_release.name).to eq(name)
end
it 'creates the release with the correct description' do
expect(new_release.description).to eq(description)
end
it 'creates the release with the correct released_at' do
expect(new_release.released_at).to eq(released_at)
end
it 'creates the release with the correct created_at' do
expect(new_release.created_at).to eq(Time.current)
end
it 'creates the release with the correct milestone associations' do
expected_milestone_titles = [milestone_12_3.title, milestone_12_4.title]
actual_milestone_titles = new_release.milestones.order_by_dates_and_title.map { |m| m.title }
expect(actual_milestone_titles).to eq(expected_milestone_titles)
end
describe 'asset links' do
let(:expected_link) { assets[:links].first }
let(:new_link) { new_release.links.first }
it 'creates a single asset link' do
expect(new_release.links.size).to eq(1)
end
it 'creates the link with the correct name' do
expect(new_link.name).to eq(expected_link[:name])
end
it 'creates the link with the correct url' do
expect(new_link.url).to eq(expected_link[:url])
end
it 'creates the link with the correct link type' do
expect(new_link.link_type).to eq(expected_link[:link_type])
end
it 'creates the link with the correct direct filepath' do
expect(new_link.filepath).to eq(expected_link[:filepath])
end
end
context 'with protected tag' do
context 'when user has access to the protected tag' do
let!(:protected_tag) { create(:protected_tag, :developers_can_create, name: '*', project: project) }
it 'does not have errors' do
subject
expect(resolve).to include(errors: [])
end
end
context 'when user does not have access to the protected tag' do
let!(:protected_tag) { create(:protected_tag, :maintainers_can_create, name: '*', project: project) }
it 'has an access error' do
subject
expect(resolve).to include(errors: ['Access Denied'])
end
end
end
end
context "when the current user doesn't have access to create releases" do
let(:current_user) { reporter }
it 'raises an error' do
expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
end
end
end
end