From 87c21f586e72400ac84a02d70b22622d4f5a0ea1 Mon Sep 17 00:00:00 2001 From: Phil Date: Fri, 11 Mar 2016 15:06:45 -0800 Subject: [PATCH 1/2] Don't remove trailing slashes if supplied Some (ostensibly broken) API handlers may require a trailing slash. This patch keeps the trailing slash if it existed on the passed-in path. --- lib/resource_kit/endpoint_resolver.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/resource_kit/endpoint_resolver.rb b/lib/resource_kit/endpoint_resolver.rb index 5c55822..235ddae 100644 --- a/lib/resource_kit/endpoint_resolver.rb +++ b/lib/resource_kit/endpoint_resolver.rb @@ -12,8 +12,9 @@ def initialize(options = {}) def resolve(values = {}) uri = Addressable::URI.parse(path) new_path = generated_path(uri.path, values) + trailing_slash = uri.path[-1] == "/" ? "/" : "" - uri.path = normalized_path_components(new_path) + uri.path = normalized_path_components(new_path) + trailing_slash uri.query = append_query_values(uri, values) unless query_param_keys.empty? uri.to_s From 4151afe8f0ef22f6e109bd6485beff03430312bd Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 14 Mar 2016 14:45:14 -0700 Subject: [PATCH 2/2] Fix case for root path w/ trailing slashes and added specs --- lib/resource_kit/endpoint_resolver.rb | 2 +- .../resource_kit/endpoint_resolver_spec.rb | 76 +++++++++++-------- 2 files changed, 47 insertions(+), 31 deletions(-) diff --git a/lib/resource_kit/endpoint_resolver.rb b/lib/resource_kit/endpoint_resolver.rb index 235ddae..eccf90e 100644 --- a/lib/resource_kit/endpoint_resolver.rb +++ b/lib/resource_kit/endpoint_resolver.rb @@ -12,7 +12,7 @@ def initialize(options = {}) def resolve(values = {}) uri = Addressable::URI.parse(path) new_path = generated_path(uri.path, values) - trailing_slash = uri.path[-1] == "/" ? "/" : "" + trailing_slash = uri.path.length > 1 && uri.path[-1] == "/" ? "/" : "" uri.path = normalized_path_components(new_path) + trailing_slash uri.query = append_query_values(uri, values) unless query_param_keys.empty? diff --git a/spec/lib/resource_kit/endpoint_resolver_spec.rb b/spec/lib/resource_kit/endpoint_resolver_spec.rb index 27597ab..0bddb51 100644 --- a/spec/lib/resource_kit/endpoint_resolver_spec.rb +++ b/spec/lib/resource_kit/endpoint_resolver_spec.rb @@ -12,49 +12,65 @@ end describe '#resolve' do - let(:path) { '/users' } let(:query_param_keys) { [] } let(:options) { { path: path, query_param_keys: query_param_keys } } subject(:resolver) { ResourceKit::EndpointResolver.new(options) } - context 'simple resolve' do - it 'creates a populated URL from passed values' do - endpoint = resolver.resolve() - expect(endpoint).to eq('/users') - end - end + ["without a trailing slash", "with a trailing slash"].each do |cntxt| + context cntxt do + let(:trailing_slash) { cntxt =~ /with a/ ? "/" : "" } + let(:path) { "/users#{trailing_slash}" } - context 'substituted paths' do - let(:path) { '/users/:id' } + context 'simple resolve' do + it 'creates a populated URL from passed values' do + endpoint = resolver.resolve() + expect(endpoint).to eq(path) + end + end - it 'creates a populated URL from passed values' do - endpoint = resolver.resolve(id: 1066) - expect(endpoint).to eq('/users/1066') - end - end + context "at the root path" do + let(:path) { "/" } - context 'with query parameters' do - let(:query_param_keys) { [:per_page, :page] } + it "doesn't double-append or remove a slash" do + endpoint = resolver.resolve() + expect(endpoint).to eq("/") + end + end - it 'generates a URL with query parameters set correctly' do - endpoint = resolver.resolve(per_page: 2, page: 3) + context 'substituted paths' do + let(:path) { "/users/:id#{trailing_slash}" } - uri = Addressable::URI.parse(endpoint) - expect(uri.query_values).to eq("per_page" => '2', "page" => '3') - end - end + it 'creates a populated URL from passed values' do + endpoint = resolver.resolve(id: 1066) + expect(endpoint).to eq("/users/1066#{trailing_slash}") + end + end + + context 'with query parameters' do + let(:query_param_keys) { [:per_page, :page] } + + it 'generates a URL with query parameters set correctly' do + endpoint = resolver.resolve(per_page: 2, page: 3) + + uri = Addressable::URI.parse(endpoint) + expect(uri.query_values).to eq("per_page" => '2', "page" => '3') + end + end - context 'with query parameters already appended' do - let(:path) { '/:something/users?foo=bar' } - let(:query_param_keys) { [:per_page, :page] } + context 'with query parameters already appended' do + let(:path) { "/:something/users#{trailing_slash}?foo=bar" } + let(:query_param_keys) { [:per_page, :page] } - it 'appends the query params to the url that already has some' do - endpoint = resolver.resolve(something: 'testing', per_page: 2, page: 3) + it 'appends the query params to the url that already has some' do + endpoint = resolver.resolve(something: 'testing', per_page: 2, page: 3) - uri = Addressable::URI.parse(endpoint) - expect(uri.query_values).to eq("foo" => 'bar', "per_page" => '2', "page" => '3') + uri = Addressable::URI.parse(endpoint) + expect(uri.query_values).to eq("foo" => 'bar', "per_page" => '2', "page" => '3') + expect(uri.path).to eq("/testing/users#{trailing_slash}") + end + end end end end -end \ No newline at end of file +end