Testing Multiple Attributes Iterator Validation in Grape Framework
This test suite validates the MultipleAttributesIterator class in Grape’s validation system, focusing on parameter handling and iteration behavior. It ensures proper handling of both hash and array parameters, along with special cases like empty optional values.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
ruby-grape/grape
spec/grape/validations/multiple_attributes_iterator_spec.rb
# frozen_string_literal: true
describe Grape::Validations::MultipleAttributesIterator do
describe '#each' do
subject(:iterator) { described_class.new(validator, scope, params) }
let(:scope) { Grape::Validations::ParamsScope.new(api: Class.new(Grape::API)) }
let(:validator) { double(attrs: %i[first second third]) }
context 'when params is a hash' do
let(:params) do
{ first: 'string', second: 'string' }
end
it 'yields the whole params hash without the list of attrs' do
expect { |b| iterator.each(&b) }.to yield_with_args(params)
end
end
context 'when params is an array' do
let(:params) do
[{ first: 'string1', second: 'string1' }, { first: 'string2', second: 'string2' }]
end
it 'yields each element of the array without the list of attrs' do
expect { |b| iterator.each(&b) }.to yield_successive_args(params[0], params[1])
end
end
context 'when params is empty optional placeholder' do
let(:params) { [Grape::DSL::Parameters::EmptyOptionalValue] }
it 'does not yield it' do
expect { |b| iterator.each(&b) }.to yield_successive_args
end
end
end
end