spec/grape/api_remount_spec.rb in grape-1.2.3 vs spec/grape/api_remount_spec.rb in grape-1.2.4

- old
+ new

@@ -61,25 +61,248 @@ expect(last_response.body).to eql '10 votes' end end end - context 'with a dynamically configured route' do - before do - a_remounted_api.namespace 'api' do - get "/#{configuration[:path]}" do - '10 votes' + describe 'with dynamic configuration' do + context 'when mounting an endpoint conditional on a configuration' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + get 'always' do + 'success' + end + + given configuration[:mount_sometimes] do + get 'sometimes' do + 'sometimes' + end + end end end - root_api.mount a_remounted_api, with: { path: 'votes' } - root_api.mount a_remounted_api, with: { path: 'scores' } + + it 'mounts the endpoints only when configured to do so' do + root_api.mount({ a_remounted_api => 'with_conditional' }, with: { mount_sometimes: true }) + root_api.mount({ a_remounted_api => 'without_conditional' }, with: { mount_sometimes: false }) + + get '/with_conditional/always' + expect(last_response.body).to eq 'success' + + get '/with_conditional/sometimes' + expect(last_response.body).to eq 'sometimes' + + get '/without_conditional/always' + expect(last_response.body).to eq 'success' + + get '/without_conditional/sometimes' + expect(last_response.status).to eq 404 + end end - it 'will use the dynamic configuration on all routes' do - get 'api/votes' - expect(last_response.body).to eql '10 votes' - get 'api/scores' - expect(last_response.body).to eql '10 votes' + context 'when executing a custom block on mount' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + get 'always' do + 'success' + end + + mounted do + configuration[:endpoints].each do |endpoint_name, endpoint_response| + get endpoint_name do + endpoint_response + end + end + end + end + end + + it 'mounts the endpoints only when configured to do so' do + root_api.mount a_remounted_api, with: { endpoints: { 'api_name' => 'api_response' } } + get 'api_name' + expect(last_response.body).to eq 'api_response' + end + end + + context 'when the configuration is part of the arguments of a method' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + get configuration[:endpoint_name] do + 'success' + end + end + end + + it 'mounts the endpoint in the location it is configured' do + root_api.mount a_remounted_api, with: { endpoint_name: 'some_location' } + get '/some_location' + expect(last_response.body).to eq 'success' + + get '/different_location' + expect(last_response.status).to eq 404 + + root_api.mount a_remounted_api, with: { endpoint_name: 'new_location' } + get '/new_location' + expect(last_response.body).to eq 'success' + end + + context 'when the configuration is the value in a key-arg pair' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + version 'v1', using: :param, parameter: configuration[:version_param] + get 'endpoint' do + 'version 1' + end + + version 'v2', using: :param, parameter: configuration[:version_param] + get 'endpoint' do + 'version 2' + end + end + end + + it 'takes the param from the configuration' do + root_api.mount a_remounted_api, with: { version_param: 'param_name' } + + get '/endpoint?param_name=v1' + expect(last_response.body).to eq 'version 1' + + get '/endpoint?param_name=v2' + expect(last_response.body).to eq 'version 2' + + get '/endpoint?wrong_param_name=v2' + expect(last_response.body).to eq 'version 1' + end + end + end + + context 'on the DescSCope' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + desc 'The description of this' do + tags ['not_configurable_tag', configuration[:a_configurable_tag]] + end + get 'location' do + 'success' + end + end + end + + it 'mounts the endpoint with the appropiate tags' do + root_api.mount({ a_remounted_api => 'integer' }, with: { a_configurable_tag: 'a configured tag' }) + end + end + + context 'on the ParamScope' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + params do + requires configuration[:required_param], type: configuration[:required_type] + end + + get 'location' do + 'success' + end + end + end + + it 'mounts the endpoint in the location it is configured' do + root_api.mount({ a_remounted_api => 'string' }, with: { required_param: 'param_key', required_type: String }) + root_api.mount({ a_remounted_api => 'integer' }, with: { required_param: 'param_integer', required_type: Integer }) + + get '/string/location', param_key: 'a' + expect(last_response.body).to eq 'success' + + get '/string/location', param_integer: 1 + expect(last_response.status).to eq 400 + + get '/integer/location', param_integer: 1 + expect(last_response.body).to eq 'success' + + get '/integer/location', param_integer: 'a' + expect(last_response.status).to eq 400 + end + + context 'on dynamic checks' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + params do + optional :restricted_values, values: -> { [configuration[:allowed_value], 'always'] } + end + + get 'location' do + 'success' + end + end + end + + it 'can read the configuration on lambdas' do + root_api.mount a_remounted_api, with: { allowed_value: 'sometimes' } + get '/location', restricted_values: 'always' + expect(last_response.body).to eq 'success' + get '/location', restricted_values: 'sometimes' + expect(last_response.body).to eq 'success' + get '/location', restricted_values: 'never' + expect(last_response.status).to eq 400 + end + end + end + + context 'when the configuration is read within a namespace' do + before do + a_remounted_api.namespace 'api' do + get "/#{configuration[:path]}" do + '10 votes' + end + end + root_api.mount a_remounted_api, with: { path: 'votes' } + root_api.mount a_remounted_api, with: { path: 'scores' } + end + + it 'will use the dynamic configuration on all routes' do + get 'api/votes' + expect(last_response.body).to eql '10 votes' + get 'api/scores' + expect(last_response.body).to eql '10 votes' + end + end + + context 'when the configuration is read in a helper' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + helpers do + def printed_response + configuration[:some_value] + end + end + + get 'location' do + printed_response + end + end + end + + it 'will use the dynamic configuration on all routes' do + root_api.mount(a_remounted_api, with: { some_value: 'response value' }) + + get '/location' + expect(last_response.body).to eq 'response value' + end + end + + context 'when the configuration is read within the response block' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + get 'location' do + configuration[:some_value] + end + end + end + + it 'will use the dynamic configuration on all routes' do + root_api.mount(a_remounted_api, with: { some_value: 'response value' }) + + get '/location' + expect(last_response.body).to eq 'response value' + end end end end end