rspec_api_documentation icon indicating copy to clipboard operation
rspec_api_documentation copied to clipboard

no implicit conversion of String into Integer

Open lewispb opened this issue 5 years ago • 3 comments

Just updated from 5.1.0 to 6.1.0.

This is the spec:

patch "/api/v1/keyword-alerts" do
    parameter :data, required: true
    parameter :attributes, scope: [:data], required: true

    example "Update email attribute" do
      do_request data: [{
        id: 1,
        attributes: {
          email: false,
          keywords: []
        }
      }]

      expect(status).to eq(200)
      expect(JSON.parse(response_body)["data"][0]["attributes"]["email"]).to eq(false)
    end
end

It now fails with

Failure/Error:
       do_request data: [{
         id: 1,
         attributes: {
           email: false,
           keywords: []
         }
       }]

     TypeError:
       no implicit conversion of String into Integer

It passes when we remove these lines:

    parameter :data, required: true
    parameter :attributes, scope: [:data], required: true

The problematic code is in:

RspecApiDocumentation::DSL::Endpoint::Params#extended

lewispb avatar Feb 06 '20 14:02 lewispb

I'm seeing the same issue on 6.1.0, trying to document an array of objects.

parameter :data, '(array of objects) Description'
with_options scope: :data do
  parameter :key, '(string) Description'
end

example 'Example 1' do
  do_request(data: [{ key: 'val' }])
end

Error produced:

TypeError: no implicit conversion of String into Integer
# From: /usr/local/rvm/gems/ruby-2.4.5/gems/rspec_api_documentation-6.1.0/lib/rspec_api_documentation/dsl/endpoint/params.rb:33

Related to #398

jsmartt avatar Apr 01 '20 18:04 jsmartt

Same problem here. All I found during debugging was the following:

  1. It fails because somewhere on the way scope becomes an array of two elements, with the second element equals ''. (E.g. if we defined parameter :key, scope: %i[level_one], we will end up with the scope equal [:level_one, '']. That's what failing everything. I spent some time, but couldn't find where it happens.
  2. If we do not use example and do_request, but use request_example instead, it works just fine.

ngoral avatar Feb 16 '22 16:02 ngoral

Ah, I found the impostor =) You can see my comment in #413 and maybe say something.

ngoral avatar Feb 16 '22 17:02 ngoral