1# frozen_string_literal: true
2
3require 'spec_helper'
4
5RSpec.describe Resolvers::DesignManagement::Version::DesignAtVersionResolver do
6  include GraphqlHelpers
7
8  include_context 'four designs in three versions'
9
10  let(:current_user) { authorized_user }
11  let(:gql_context) { { current_user: current_user } }
12
13  let(:version) { third_version }
14  let(:design) { design_a }
15
16  let(:all_singular_args) do
17    {
18      id: global_id_of(dav(design)),
19      design_id: global_id_of(design),
20      filename: design.filename
21    }
22  end
23
24  shared_examples 'a bad argument' do
25    let(:err_class) { ::Gitlab::Graphql::Errors::ArgumentError }
26
27    it 'raises an appropriate error' do
28      expect { resolve_objects }.to raise_error(err_class)
29    end
30  end
31
32  describe '#resolve' do
33    describe 'passing combinations of arguments' do
34      context 'passing no arguments' do
35        let(:args) { {} }
36
37        it_behaves_like 'a bad argument'
38      end
39
40      context 'passing all arguments' do
41        let(:args) { all_singular_args }
42
43        it_behaves_like 'a bad argument'
44      end
45
46      context 'passing any two arguments' do
47        let(:args) { all_singular_args.slice(*all_singular_args.keys.sample(2)) }
48
49        it_behaves_like 'a bad argument'
50      end
51    end
52
53    %i[id design_id filename].each do |arg|
54      describe "passing #{arg}" do
55        let(:args) { all_singular_args.slice(arg) }
56
57        it 'finds the design' do
58          expect(resolve_objects).to eq(dav(design))
59        end
60
61        context 'when the user cannot see designs' do
62          let(:current_user) { create(:user) }
63
64          it 'returns nothing' do
65            expect(resolve_objects).to be_nil
66          end
67        end
68      end
69    end
70
71    describe 'attempting to retrieve an object not visible at this version' do
72      let(:design) { design_d }
73
74      %i[id design_id filename].each do |arg|
75        describe "passing #{arg}" do
76          let(:args) { all_singular_args.slice(arg) }
77
78          it 'does not find the design' do
79            expect(resolve_objects).to be_nil
80          end
81        end
82      end
83    end
84  end
85
86  def resolve_objects
87    resolve(described_class, obj: version, args: args, ctx: gql_context)
88  end
89
90  def dav(design)
91    build(:design_at_version, design: design, version: version)
92  end
93end
94