Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lib/resource_kit/endpoint_resolver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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.length > 1 && 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
Expand Down
76 changes: 46 additions & 30 deletions spec/lib/resource_kit/endpoint_resolver_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
end