diff options
Diffstat (limited to 'spec/graphql/mutations/design_management')
-rw-r--r-- | spec/graphql/mutations/design_management/move_spec.rb | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/spec/graphql/mutations/design_management/move_spec.rb b/spec/graphql/mutations/design_management/move_spec.rb new file mode 100644 index 00000000000..7519347d07c --- /dev/null +++ b/spec/graphql/mutations/design_management/move_spec.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Mutations::DesignManagement::Move do + include DesignManagementTestHelpers + + let_it_be(:issue) { create(:issue) } + let_it_be(:designs) { create_list(:design, 3, issue: issue) } + let_it_be(:developer) { create(:user, developer_projects: [issue.project]) } + + let(:user) { developer } + + let(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) } + + let(:current_design) { designs.first } + let(:previous_design) { designs.second } + let(:next_design) { designs.third } + + before do + enable_design_management + end + + describe "#resolve" do + subject(:resolve) do + args = { + current_design: current_design.to_global_id, + previous_design: previous_design&.to_global_id, + next_design: next_design&.to_global_id + }.compact + + mutation.resolve(args) + end + + shared_examples "resource not available" do + it "raises an error" do + expect { resolve }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable) + end + end + + context 'when the feature is not available' do + before do + enable_design_management(false) + end + + it_behaves_like 'resource not available' + end + + %i[current_design previous_design next_design].each do |binding| + context "When #{binding} cannot be found" do + let(binding) { build_stubbed(:design) } + + it_behaves_like 'resource not available' + end + end + + context 'the service runs' do + before do + expect_next_instance_of(::DesignManagement::MoveDesignsService) do |service| + expect(service).to receive(:execute).and_return(service_result) + end + end + + context 'raising an error' do + let(:service_result) { ServiceResponse.error(message: 'bang!') } + + it 'reports the service-level error' do + expect(resolve).to include(errors: ['bang!'], design_collection: eq(issue.design_collection)) + end + end + + context 'successfully' do + let(:service_result) { ServiceResponse.success } + + it 'reports the service-level error' do + expect(resolve).to include(errors: be_empty, design_collection: eq(issue.design_collection)) + end + end + end + end +end |