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

- old
+ new

@@ -95,10 +95,100 @@ get '/without_conditional/sometimes' expect(last_response.status).to eq 404 end end + context 'when using an expression derived from a configuration' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + get(mounted { "api_name_#{configuration[:api_name]}" }) do + 'success' + end + end + end + + before do + root_api.mount a_remounted_api, with: { + api_name: 'a_name' + } + end + + it 'mounts the endpoint with the name' do + get 'api_name_a_name' + expect(last_response.body).to eq 'success' + end + + it 'does not mount the endpoint with a null name' do + get 'api_name_' + expect(last_response.body).not_to eq 'success' + end + + context 'when the expression lives in a namespace' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + namespace :base do + get(mounted { "api_name_#{configuration[:api_name]}" }) do + 'success' + end + end + end + end + + it 'mounts the endpoint with the name' do + get 'base/api_name_a_name' + expect(last_response.body).to eq 'success' + end + + it 'does not mount the endpoint with a null name' do + get 'base/api_name_' + expect(last_response.body).not_to eq 'success' + end + end + end + + context 'when executing a standard block within a `mounted` block with all dynamic params' do + subject(:a_remounted_api) do + Class.new(Grape::API) do + mounted do + desc configuration[:description] do + headers configuration[:headers] + end + get configuration[:endpoint] do + configuration[:response] + end + end + end + end + + let(:api_endpoint) { 'custom_endpoint' } + let(:api_response) { 'custom response' } + let(:endpoint_description) { 'this is a custom API' } + let(:headers) do + { + 'XAuthToken' => { + 'description' => 'Validates your identity', + 'required' => true + } + } + end + + it 'mounts the API and obtains the description and headers definition' do + root_api.mount a_remounted_api, with: { + description: endpoint_description, + headers: headers, + endpoint: api_endpoint, + response: api_response + } + get api_endpoint + expect(last_response.body).to eq api_response + expect(a_remounted_api.instances.last.endpoints.first.options[:route_options][:description]) + .to eq endpoint_description + expect(a_remounted_api.instances.last.endpoints.first.options[:route_options][:headers]) + .to eq headers + end + end + context 'when executing a custom block on mount' do subject(:a_remounted_api) do Class.new(Grape::API) do get 'always' do 'success' @@ -259,9 +349,77 @@ 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 'a very complex configuration example' do + before do + top_level_api = Class.new(Grape::API) do + remounted_api = Class.new(Grape::API) do + get configuration[:endpoint_name] do + configuration[:response] + end + end + + expression_namespace = mounted { configuration[:namespace].to_s * 2 } + given(mounted { configuration[:should_mount_expressed] != false }) do + namespace expression_namespace do + mount remounted_api, with: { endpoint_name: configuration[:endpoint_name], response: configuration[:endpoint_response] } + end + end + end + root_api.mount top_level_api, with: configuration_options + end + + context 'when the namespace should be mounted' do + let(:configuration_options) do + { + should_mount_expressed: true, + namespace: 'bang', + endpoint_name: 'james', + endpoint_response: 'bond' + } + end + + it 'gets a response' do + get 'bangbang/james' + expect(last_response.body).to eq 'bond' + end + end + + context 'when should be mounted is nil' do + let(:configuration_options) do + { + should_mount_expressed: nil, + namespace: 'bang', + endpoint_name: 'james', + endpoint_response: 'bond' + } + end + + it 'gets a response' do + get 'bangbang/james' + expect(last_response.body).to eq 'bond' + end + end + + context 'when it should not be mounted' do + let(:configuration_options) do + { + should_mount_expressed: false, + namespace: 'bang', + endpoint_name: 'james', + endpoint_response: 'bond' + } + end + + it 'gets a response' do + get 'bangbang/james' + expect(last_response.body).not_to eq 'bond' + end end end context 'when the configuration is read in a helper' do subject(:a_remounted_api) do