2016-04-07 06:08:32 +08:00
|
|
|
require 'spec_helper'
|
|
|
|
|
|
|
|
describe GrapeSwagger::DocMethods::MoveParams do
|
2016-05-07 03:00:36 +08:00
|
|
|
include_context 'the api paths/defs'
|
2016-04-07 06:08:32 +08:00
|
|
|
|
|
|
|
subject { described_class }
|
|
|
|
|
|
|
|
it { expect(subject.to_s).to eql 'GrapeSwagger::DocMethods::MoveParams' }
|
|
|
|
|
|
|
|
describe 'find_post_put' do
|
|
|
|
let(:paths) { {} }
|
|
|
|
|
|
|
|
describe 'paths empty' do
|
|
|
|
specify { expect { |b| subject.find_post_put(paths, &b) }.not_to yield_control }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'no post/put given' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:paths) do
|
|
|
|
{
|
|
|
|
:'/foo' => { get: {}, delete: {} },
|
|
|
|
:'/bar/{key}' => { get: {}, delete: {} }
|
|
|
|
}
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
specify { expect { |b| subject.find_post_put(paths, &b) }.not_to yield_control }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'no post/put given' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:paths) do
|
|
|
|
{
|
|
|
|
:'/foo' => { get: {}, delete: {}, post: {}, put: {}, patch: {} },
|
|
|
|
:'/bar/{key}' => { get: {}, delete: {}, post: {}, put: {}, patch: {} }
|
|
|
|
}
|
|
|
|
end
|
|
|
|
let(:expected) do
|
|
|
|
[
|
|
|
|
{ post: {}, put: {}, patch: {} },
|
|
|
|
{ post: {}, put: {}, patch: {} }
|
|
|
|
]
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
specify { expect { |b| subject.find_post_put(paths, &b) }.to yield_control.twice }
|
|
|
|
specify { expect { |b| subject.find_post_put(paths, &b) }.to yield_successive_args *expected }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-04-08 09:05:35 +08:00
|
|
|
describe 'find_definition_and_params' do
|
2016-04-07 06:08:32 +08:00
|
|
|
specify do
|
|
|
|
subject.instance_variable_set(:@definitions, definitions)
|
2016-05-01 18:31:44 +08:00
|
|
|
subject.find_definition_and_params(found_path, :post)
|
|
|
|
expect(definitions.keys).to include 'InBody'
|
2016-04-07 06:08:32 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'move_params_to_new definition' do
|
|
|
|
let(:name) { 'Foo' }
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:definitions) { {} }
|
2016-04-07 06:08:32 +08:00
|
|
|
|
|
|
|
describe 'post request' do
|
|
|
|
let(:verb) { 'post' }
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) { paths['/in_body'][:post][:parameters] }
|
2016-04-07 06:08:32 +08:00
|
|
|
|
|
|
|
specify do
|
|
|
|
subject.instance_variable_set(:@definitions, definitions)
|
2016-04-08 09:05:35 +08:00
|
|
|
name = subject.send(:build_definition, name, verb)
|
|
|
|
subject.move_params_to_new(name, params)
|
2016-04-07 06:08:32 +08:00
|
|
|
|
|
|
|
expect(definitions[name]).to eql expected_post_defs
|
|
|
|
expect(params).to be_empty
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'put request' do
|
|
|
|
let(:verb) { 'put' }
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) { paths['/in_body/{key}'][:put][:parameters] }
|
2016-04-07 06:08:32 +08:00
|
|
|
|
|
|
|
specify do
|
|
|
|
subject.instance_variable_set(:@definitions, definitions)
|
2016-04-08 09:05:35 +08:00
|
|
|
name, definition = subject.send(:build_definition, name, verb)
|
|
|
|
subject.move_params_to_new(name, params)
|
2016-04-07 06:08:32 +08:00
|
|
|
|
|
|
|
expect(definitions[name]).to eql expected_put_defs
|
|
|
|
expect(params.length).to be 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-04-08 09:05:35 +08:00
|
|
|
describe 'nested definitions related' do
|
|
|
|
describe 'prepare_nested_names' do
|
|
|
|
before do
|
|
|
|
subject.send(:prepare_nested_names, params)
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
|
2016-04-08 09:05:35 +08:00
|
|
|
describe 'simple' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) { [{ in: 'body', name: 'address[street]', description: 'street', type: 'string', required: true }] }
|
|
|
|
let(:expected) { [{ in: 'body', name: 'street', description: 'street', type: 'string', required: true }] }
|
2016-04-08 09:05:35 +08:00
|
|
|
specify do
|
|
|
|
expect(params).to eql expected
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'nested' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) { [{ in: 'body', name: 'address[street][name]', description: 'street', type: 'string', required: true }] }
|
|
|
|
let(:expected) { [{ in: 'body', name: 'street[name]', description: 'street', type: 'string', required: true }] }
|
2016-04-08 09:05:35 +08:00
|
|
|
specify do
|
|
|
|
expect(params).to eql expected
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'array' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) { [{ in: 'body', name: 'address[][street_lines]', description: 'street lines', type: 'array', required: true }] }
|
|
|
|
let(:expected) { [{ in: 'body', name: 'street_lines', description: 'street lines', type: 'array', required: true }] }
|
2016-04-08 09:05:35 +08:00
|
|
|
specify do
|
|
|
|
expect(params).to eql expected
|
|
|
|
end
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-04-08 09:05:35 +08:00
|
|
|
describe 'private methods' do
|
|
|
|
describe 'build_definition' do
|
|
|
|
before do
|
|
|
|
subject.instance_variable_set(:@definitions, definitions)
|
|
|
|
subject.send(:build_definition, name, verb)
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
|
2016-04-08 09:05:35 +08:00
|
|
|
describe 'verb given' do
|
|
|
|
let(:verb) { 'post' }
|
|
|
|
let(:name) { 'Foo' }
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:definitions) { {} }
|
2016-04-08 09:05:35 +08:00
|
|
|
|
|
|
|
specify do
|
|
|
|
definition = definitions.to_a.first
|
|
|
|
expect(definition.first).to eql 'postRequestFoo'
|
2016-05-07 03:00:36 +08:00
|
|
|
expect(definition.last).to eql(type: 'object', properties: {}, required: [])
|
2016-04-08 09:05:35 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'no verb given' do
|
|
|
|
let(:name) { 'FooBar' }
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:definitions) { {} }
|
2016-04-08 09:05:35 +08:00
|
|
|
let(:verb) { nil }
|
|
|
|
|
|
|
|
specify do
|
|
|
|
definition = definitions.to_a.first
|
|
|
|
expect(definition.first).to eql 'FooBar'
|
2016-05-07 03:00:36 +08:00
|
|
|
expect(definition.last).to eql(type: 'object', properties: {}, required: [])
|
2016-04-08 09:05:35 +08:00
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-04-08 09:05:35 +08:00
|
|
|
describe 'build_body_parameter' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:response) { { schema: { '$ref' => '#/definitions/Somewhere' } } }
|
2016-04-08 09:05:35 +08:00
|
|
|
|
|
|
|
describe 'no name given' do
|
|
|
|
let(:name) { nil }
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:expected_param) do
|
|
|
|
{ name: 'Somewhere', in: 'body', required: true, schema: { '$ref' => '#/definitions/Somewhere' } }
|
|
|
|
end
|
2016-04-08 09:05:35 +08:00
|
|
|
specify do
|
|
|
|
parameter = subject.send(:build_body_parameter, response)
|
|
|
|
expect(parameter).to eql expected_param
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'name given' do
|
|
|
|
let(:name) { 'Foo' }
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:expected_param) do
|
|
|
|
{ name: 'Somewhere', in: 'body', required: true, schema: { '$ref' => "#/definitions/#{name}" } }
|
|
|
|
end
|
2016-04-08 09:05:35 +08:00
|
|
|
specify do
|
|
|
|
parameter = subject.send(:build_body_parameter, response, name)
|
|
|
|
expect(parameter).to eql expected_param
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'parse_model' do
|
|
|
|
let(:ref) { '#/definitions/InBody' }
|
|
|
|
subject(:object) { described_class.send(:parse_model, ref) }
|
|
|
|
|
|
|
|
specify { expect(object).to eql 'InBody' }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'movable' do
|
|
|
|
describe 'path' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:param) { { in: 'path', name: 'key', description: nil, type: 'integer', format: 'int32', required: true } }
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:movable?, param)).to be true }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'body' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:param) { { in: 'body', name: 'in_body', description: 'in_body', type: 'integer', format: 'int32', required: true } }
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:movable?, param)).to be true }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'query' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:param) { { in: 'query', name: 'in_query', description: 'in_query', type: 'integer', format: 'int32', required: true } }
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:movable?, param)).to be false }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'header' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:param) { { in: 'header', name: 'in_header', description: 'in_header', type: 'integer', format: 'int32', required: true } }
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:movable?, param)).to be false }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'deletable' do
|
|
|
|
describe 'path' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:param) { { in: 'path', name: 'key', description: nil, type: 'integer', format: 'int32', required: true } }
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:deletable?, param)).to be false }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'body' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:param) { { in: 'body', name: 'in_body_1', description: 'in_body_1', type: 'integer', format: 'int32', required: true } }
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:deletable?, param)).to be true }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'query' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:param) { { in: 'query', name: 'in_query_1', description: 'in_query_1', type: 'integer', format: 'int32', required: true } }
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:deletable?, param)).to be false }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'header' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:param) { { in: 'header', name: 'in_header_1', description: 'in_header_1', type: 'integer', format: 'int32', required: true } }
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:deletable?, param)).to be false }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'should move' do
|
|
|
|
describe 'no move' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) do
|
|
|
|
[
|
|
|
|
{ in: 'path', name: 'key', description: nil, type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'formData', name: 'in_form_data', description: 'in_form_data', type: 'integer', format: 'int32', required: true }
|
|
|
|
]
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:should_move?, params)).to be false }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'move' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) do
|
|
|
|
[
|
|
|
|
{ in: 'path', name: 'key', description: nil, type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'body', name: 'in_bosy', description: 'in_bosy', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'formData', name: 'in_form_data', description: 'in_form_data', type: 'integer', format: 'int32', required: true }
|
|
|
|
]
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(subject.send(:should_move?, params)).to be true }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'unify' do
|
|
|
|
before do
|
|
|
|
subject.send(:unify!, params) if subject.send(:should_move?, params)
|
|
|
|
end
|
|
|
|
describe 'param type with `:in` given' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) do
|
|
|
|
[
|
|
|
|
{ in: 'path', name: 'key', description: nil, type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'body', name: 'in_body', description: 'in_body', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'query', name: 'in_query', description: 'in_query', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'header', name: 'in_header', description: 'in_header', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'formData', name: 'in_form_data', description: 'in_form_data', type: 'integer', format: 'int32', required: true }
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:expected_params) do
|
|
|
|
[
|
|
|
|
{ in: 'path', name: 'key', description: nil, type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'body', name: 'in_body', description: 'in_body', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'query', name: 'in_query', description: 'in_query', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'header', name: 'in_header', description: 'in_header', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'body', name: 'in_form_data', description: 'in_form_data', type: 'integer', format: 'int32', required: true }
|
|
|
|
]
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(params).to eql expected_params }
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'let it as is' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) do
|
|
|
|
[
|
|
|
|
{ in: 'path', name: 'key', description: nil, type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'formData', name: 'in_form_data', description: 'in_form_data', type: 'integer', format: 'int32', required: true }
|
|
|
|
]
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:expected_params) do
|
|
|
|
[
|
|
|
|
{ in: 'path', name: 'key', description: nil, type: 'integer', format: 'int32', required: true },
|
|
|
|
{ in: 'formData', name: 'in_form_data', description: 'in_form_data', type: 'integer', format: 'int32', required: true }
|
|
|
|
]
|
|
|
|
end
|
|
|
|
it { expect(params).to eql expected_params }
|
2016-04-07 06:08:32 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
describe 'param type with `:param_type` given' do
|
2016-05-07 03:00:36 +08:00
|
|
|
let(:params) do
|
|
|
|
[
|
|
|
|
{ param_type: 'path', name: 'key', description: nil, type: 'integer', format: 'int32', required: true },
|
|
|
|
{ param_type: 'body', name: 'in_body', description: 'in_body', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ param_type: 'query', name: 'in_query', description: 'in_query', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ param_type: 'header', name: 'in_header', description: 'in_header', type: 'integer', format: 'int32', required: true },
|
|
|
|
{ param_type: 'formData', name: 'in_form_data', description: 'in_form_data', type: 'integer', format: 'int32', required: true }
|
|
|
|
]
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:expected_params) do
|
|
|
|
[
|
|
|
|
{ name: 'key', description: nil, type: 'integer', format: 'int32', required: true, in: 'path' },
|
|
|
|
{ name: 'in_body', description: 'in_body', type: 'integer', format: 'int32', required: true, in: 'body' },
|
|
|
|
{ name: 'in_query', description: 'in_query', type: 'integer', format: 'int32', required: true, in: 'query' },
|
|
|
|
{ name: 'in_header', description: 'in_header', type: 'integer', format: 'int32', required: true, in: 'header' },
|
|
|
|
{ name: 'in_form_data', description: 'in_form_data', type: 'integer', format: 'int32', required: true, in: 'body' }
|
|
|
|
]
|
|
|
|
end
|
2016-04-07 06:08:32 +08:00
|
|
|
it { expect(params).to eql expected_params }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|