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