После JSON API с rswag - PullRequest
       15

После JSON API с rswag

1 голос
/ 04 февраля 2020

Я использую rswag для тестирования довольно распространенного приложения RubyOnRails JSON Api , но я не могу понять довольно распространенный случай, когда я загружаю файл в конечная точка.

Конечная точка ожидает обычный атрибут data в теле запроса с атрибутом file, содержащим двоичный файл, и я не могу заставить rswag сгенерировать запрос с правильными параметрами.

  path '/documents' do
    post 'Creates a document' do
      tags 'Documents'
      consumes 'multipart/form-data'
      produces 'application/vnd.api+json'

      parameter name: 'data',
                description: 'Whatever',
                attributes: {
                  schema: {
                    type: :object,
                    properties: {
                      file: { type: :binary },
                    },
                  },
                }

      response '201', 'success' do
        let(:data) do
          {
            attributes: {
              file: Rack::Test::UploadedFile.new($REALARGS),
            },
          }
        end

        schema "$ref": '#/definitions/post_document_responses/201'

        run_test! do |_example|
          # ACTUAL TEST
        end
      end
    end
  end

Существуют и другие более простые параметры (например, Авторизация), которые генерируются правильно, я уверен, что rswag подключен правильно. У запроса, который я вижу, нет параметров, я могу удалить параметр data и ничего не меняется. Я пробовал миллион комбинаций, всегда один и тот же результат, и я не знаю, что происходит.

params, которого ожидает контроллер, - data[attributes][file].

Может кто-нибудь помочь мне

1 Ответ

1 голос
/ 06 февраля 2020

В блоке parameter необходимо указать, куда он будет вставлен. Есть пример spe c, где я нашел ссылку на :formData, которая, как выясняется, должна быть установлена ​​ (т.е. вы не можете использовать :body, она просто отправляет пустой запрос).

После небольшой jiggery-pokery мне удалось получить ваш пример работы с вложенным атрибутом в данных формы:

path '/documents' do
  post 'Creates a document' do
    tags 'Documents'
    consumes 'multipart/form-data'
    produces 'application/vnd.api+json'

    parameter name: 'data[attributes][file]',
              description: 'Whatever',
              in: :formData,
              attributes: {
                schema: {
                  type: :object,
                  properties: {
                    file: { type: :binary },
                  },
                },
              }

    response '201', 'success' do
      let(:"data[attributes][file]") { Rack::Test::UploadedFile.new(Rails.root.join("spec/requests/api/v1/documents_post_spec.rb")) }
      end

      schema "$ref": '#/definitions/post_document_responses/201'

      run_test! do |_example|
        # ACTUAL TEST
      end
    end
  end
end
...