Skip to content

Error when validating array items with different conditionally required properties #2473

Description

@dub-wt

Hello,

If we define different properties required for array items by given condition then validation fails even if correct request is sent.

Please check the example below:

it 'test to demonstrate the validation issue' do
  subject.params do
    requires :a, type: String, allow_blank: false, values: %w[x y z]
    given a: ->(val) { val == 'z' } do
      requires :inner3, type: Array, allow_blank: false do
        requires :bar, type: String, allow_blank: false

        given bar: ->(val) { val == 'b' } do
          requires :baz, type: Array do
            requires :new_category, type: String
          end
        end

        given bar: ->(val) { val == 'c' } do
          requires :baz, type: Array do
            requires :baz_category, type: String
          end
        end

      end
    end
  end
  subject.post('/nested-dependency') { declared(params).to_json }

  test = {
    a: 'z',
    inner3: [
      { bar: 'b', baz: [{ new_category: 'nope' }] },
      { bar: 'c', baz: [{ baz_category: 'nope' }] }
    ]
  }

  post '/nested-dependency', **test

  expect(last_response.status).to eq(200)
end

Expected behavior: 200 OK

Actual behavior: 400 Bad request, "inner3[1][baz][0][new_category] is missing, inner3[1][baz][0][baz_category] is missing"

Thank you.

Activity

  1. dblock commented on Jul 16, 2024

    @dblock
    Member

    Check whether this is still the behavior on HEAD and turn it into a (failing) PR/spec?

    Note that your post may need a correct content-type, transforming what you post to a string, this may be a side-effect of form encoding.

  2. dub-wt commented on Jul 16, 2024

    @dub-wt
    Author

    I checked it on the latest commit and just have rechecked with passing Content-Type = application/json.
    Validation fails.

  3. dub-wt commented on Jul 17, 2024

    @dub-wt
    Author

    Here is the PR with failing spec: #2474

  4. dub-wt commented on Jul 17, 2024

    @dub-wt
    Author
    params do
            requires :items, type: Array, allow_blank: false do
              requires :item_type, type: String, allow_blank: false
    
              given item_type: ->(val) { val == 'type_a' } do
                requires :inner_items, type: Array do
                  requires :prop_a, type: String
                end
              end
    
              given item_type: ->(val) { val == 'type_b' } do
                requires :inner_items, type: Array do
                  requires :prop_b, type: String
                end
              end
            end
          end

    Looks like condition given item_type: ->(val) { val == 'type_a' } is ignored when validating nested array properties.
    They are always validated, but it should happen when item_type meets dependency.

  5. dblock commented on Jul 17, 2024

    @dblock
    Member

    Looks like condition given item_type: ->(val) { val == 'type_a' } is ignored when validating nested array properties.
    They are always validated, but it should happen when item_type meets dependency.

    And it works for nested hashes? Want to try to fix it?

  6. dub-wt commented on Jul 19, 2024

    @dub-wt
    Author

    No, it also doesn't work for nested hashes.
    Sure, will try to fix it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions