Welcome to mirror list, hosted at ThFree Co, Russian Federation.

renderer_spec.rb « docs « graphql « gitlab « lib « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b956328e344f92ae4cc323c1e97e614a9a31d0eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Graphql::Docs::Renderer do
  describe '#contents' do
    # Returns a Schema that uses the given `type`
    def mock_schema(type, field_description)
      query_type = Class.new(Types::BaseObject) do
        graphql_name 'Query'

        field :foo, type, null: true do
          description field_description
          argument :id, GraphQL::ID_TYPE, required: false, description: 'ID of the object.'
        end
      end

      GraphQL::Schema.define(query: query_type)
    end

    let_it_be(:template) { Rails.root.join('lib/gitlab/graphql/docs/templates/', 'default.md.haml') }
    let(:field_description) { 'List of objects.' }

    subject(:contents) do
      described_class.new(
        mock_schema(type, field_description).graphql_definition,
        output_dir: nil,
        template: template
      ).contents
    end

    context 'A type with a field with a [Array] return type' do
      let(:type) do
        Class.new(Types::BaseObject) do
          graphql_name 'ArrayTest'

          field :foo, [GraphQL::STRING_TYPE], null: false, description: 'A description.'
        end
      end

      specify do
        expectation = <<~DOC
          ### `ArrayTest`

          | Field | Type | Description |
          | ----- | ---- | ----------- |
          | `foo` | String! => Array | A description. |
        DOC

        is_expected.to include(expectation)
      end

      context 'query generation' do
        let(:expectation) do
          <<~DOC
            ### `foo`

            List of objects.

            #### Arguments

            | Name | Type | Description |
            | ---- | ---- | ----------- |
            | `id` | ID | ID of the object. |
          DOC
        end

        it 'generates the query with arguments' do
          expect(subject).to include(expectation)
        end

        context 'when description does not end with `.`' do
          let(:field_description) { 'List of objects' }

          it 'adds the `.` to the end' do
            expect(subject).to include(expectation)
          end
        end
      end
    end

    context 'A type with fields defined in reverse alphabetical order' do
      let(:type) do
        Class.new(Types::BaseObject) do
          graphql_name 'OrderingTest'

          field :foo, GraphQL::STRING_TYPE, null: false, description: 'A description of foo field.'
          field :bar, GraphQL::STRING_TYPE, null: false, description: 'A description of bar field.'
        end
      end

      specify do
        expectation = <<~DOC
          ### `OrderingTest`

          | Field | Type | Description |
          | ----- | ---- | ----------- |
          | `bar` | String! | A description of bar field. |
          | `foo` | String! | A description of foo field. |
        DOC

        is_expected.to include(expectation)
      end
    end

    context 'A type with a deprecated field' do
      let(:type) do
        Class.new(Types::BaseObject) do
          graphql_name 'DeprecatedTest'

          field :foo, GraphQL::STRING_TYPE, null: false, deprecated: { reason: 'This is deprecated', milestone: '1.10' }, description: 'A description.'
        end
      end

      specify do
        expectation = <<~DOC
          ### `DeprecatedTest`

          | Field | Type | Description |
          | ----- | ---- | ----------- |
          | `foo` **{warning-solid}** | String! | **Deprecated:** This is deprecated. Deprecated in 1.10. |
        DOC

        is_expected.to include(expectation)
      end
    end

    context 'A type with an emum field' do
      let(:type) do
        enum_type = Class.new(Types::BaseEnum) do
          graphql_name 'MyEnum'

          value 'BAZ', description: 'A description of BAZ.'
          value 'BAR', description: 'A description of BAR.', deprecated: { reason: 'This is deprecated', milestone: '1.10' }
        end

        Class.new(Types::BaseObject) do
          graphql_name 'EnumTest'

          field :foo, enum_type, null: false, description: 'A description of foo field.'
        end
      end

      specify do
        expectation = <<~DOC
          ### `MyEnum`

          | Value | Description |
          | ----- | ----------- |
          | `BAR` **{warning-solid}** | **Deprecated:** This is deprecated. Deprecated in 1.10. |
          | `BAZ` | A description of BAZ. |
        DOC

        is_expected.to include(expectation)
      end
    end
  end
end