2020-05-24 23:13:21 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-06-23 00:09:42 +05:30
|
|
|
RSpec.describe Mutations::DesignManagement::Delete do
|
2020-05-24 23:13:21 +05:30
|
|
|
include DesignManagementTestHelpers
|
|
|
|
|
|
|
|
let(:issue) { create(:issue) }
|
|
|
|
let(:current_designs) { issue.designs.current }
|
|
|
|
let(:user) { issue.author }
|
|
|
|
let(:project) { issue.project }
|
|
|
|
let(:design_a) { create(:design, :with_file, issue: issue) }
|
|
|
|
let(:design_b) { create(:design, :with_file, issue: issue) }
|
|
|
|
let(:design_c) { create(:design, :with_file, issue: issue) }
|
|
|
|
let(:filenames) { [design_a, design_b, design_c].map(&:filename) }
|
|
|
|
|
|
|
|
let(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
stub_const('Errors', Gitlab::Graphql::Errors, transfer_nested_constants: true)
|
|
|
|
end
|
|
|
|
|
|
|
|
def run_mutation
|
|
|
|
mutation = described_class.new(object: nil, context: { current_user: user }, field: nil)
|
|
|
|
mutation.resolve(project_path: project.full_path, iid: issue.iid, filenames: filenames)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#resolve' do
|
|
|
|
let(:expected_response) do
|
|
|
|
{ errors: [], version: DesignManagement::Version.for_issue(issue).ordered.first }
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples "failures" do |error: Gitlab::Graphql::Errors::ResourceNotAvailable|
|
|
|
|
it "raises #{error.name}" do
|
|
|
|
expect { run_mutation }.to raise_error(error)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples "resource not available" do
|
|
|
|
it_behaves_like "failures"
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when the feature is not available" do
|
|
|
|
before do
|
|
|
|
enable_design_management(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like "resource not available"
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when the feature is available" do
|
|
|
|
before do
|
|
|
|
enable_design_management(true)
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when the user is not allowed to delete designs" do
|
|
|
|
let(:user) { create(:user) }
|
|
|
|
|
|
|
|
it_behaves_like "resource not available"
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'deleting an already deleted file' do
|
|
|
|
before do
|
|
|
|
run_mutation
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'fails with an argument error' do
|
|
|
|
expect { run_mutation }.to raise_error(Gitlab::Graphql::Errors::ArgumentError)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when deleting all the designs" do
|
|
|
|
let(:response) { run_mutation }
|
|
|
|
|
|
|
|
it "returns a new version, and no errors" do
|
|
|
|
expect(response).to include(expected_response)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'the current designs' do
|
|
|
|
before do
|
|
|
|
run_mutation
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'is empty' do
|
|
|
|
expect(current_designs).to be_empty
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-07-09 08:55:56 +05:30
|
|
|
it 'runs no more than 31 queries' do
|
2022-08-13 15:12:31 +05:30
|
|
|
allow(Gitlab::Tracking).to receive(:event) # rubocop:disable RSpec/ExpectGitlabTracking
|
|
|
|
|
2020-05-24 23:13:21 +05:30
|
|
|
filenames.each(&:present?) # ignore setup
|
2022-08-13 15:12:31 +05:30
|
|
|
# Queries: as of 2022-06-15
|
2020-05-24 23:13:21 +05:30
|
|
|
# -------------
|
|
|
|
# 01. routing query
|
|
|
|
# 02. find project by id
|
|
|
|
# 03. project.project_features
|
|
|
|
# 04. find namespace by id and type
|
|
|
|
# 05,06. project.authorizations for user (same query twice)
|
|
|
|
# 07. find issue by iid
|
|
|
|
# 08. find project by id
|
|
|
|
# 09. find namespace by id
|
|
|
|
# 10. find group namespace by id
|
|
|
|
# 11. project.authorizations for user (same query as 5)
|
2021-10-27 15:23:28 +05:30
|
|
|
# 12. find user by id
|
|
|
|
# 13. project.project_features (same query as 3)
|
|
|
|
# 14. project.authorizations for user (same query as 5)
|
|
|
|
# 15. current designs by filename and issue
|
|
|
|
# 16, 17 project.authorizations for user (same query as 5)
|
2023-07-09 08:55:56 +05:30
|
|
|
# 18. find design_management_repository for project
|
|
|
|
# 19. find route by id and source_type
|
|
|
|
# 20. find plan for standard context
|
2020-05-24 23:13:21 +05:30
|
|
|
# ------------- our queries are below:
|
2023-07-09 08:55:56 +05:30
|
|
|
# 21. start transaction 1
|
|
|
|
# 22. start transaction 2
|
|
|
|
# 23. find version by sha and issue
|
|
|
|
# 24. exists version with sha and issue?
|
|
|
|
# 25. leave transaction 2
|
|
|
|
# 26. create version with sha and issue
|
|
|
|
# 27. create design-version links
|
|
|
|
# 28. validate version.actions.present?
|
|
|
|
# 29. validate version.issue.present?
|
|
|
|
# 30. validate version.sha is unique
|
|
|
|
# 31. leave transaction 1
|
2020-05-24 23:13:21 +05:30
|
|
|
#
|
2023-07-09 08:55:56 +05:30
|
|
|
expect { run_mutation }.not_to exceed_query_limit(31)
|
2020-05-24 23:13:21 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when deleting a design" do
|
|
|
|
let(:filenames) { [design_a.filename] }
|
|
|
|
let(:response) { run_mutation }
|
|
|
|
|
|
|
|
it "returns the expected response" do
|
|
|
|
expect(response).to include(expected_response)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'the current designs' do
|
|
|
|
before do
|
|
|
|
run_mutation
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does contain designs b and c' do
|
|
|
|
expect(current_designs).to contain_exactly(design_b, design_c)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|