Skip to content
This repository was archived by the owner on Jun 2, 2021. It is now read-only.

Commit 51b0fd7

Browse files
blgmFelisiaM
authored andcommitted
v3: fix pagination href when fields feature in use
[#173248802]
1 parent 96e1dcc commit 51b0fd7

14 files changed

Lines changed: 166 additions & 85 deletions

app/messages/base_message.rb

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,20 @@ def audit_hash(exclude: [])
4242
request.deep_stringify_keys
4343
end
4444

45-
def to_param_hash(opts={ exclude: [] })
45+
def to_param_hash(exclude: [], fields: [])
4646
params = {}
47-
(requested_keys - opts[:exclude]).each do |key|
47+
(requested_keys - exclude).each do |key|
4848
val = self.try(key)
49-
params[key] = val.is_a?(Array) ? val.map { |v| v.gsub(',', CGI.escape(',')) }.join(',') : val
49+
50+
if fields.include?(key)
51+
val.each do |resource, selectors|
52+
params["#{key}[#{resource}]".to_sym] = selectors.join(',')
53+
end
54+
else
55+
params[key] = val.is_a?(Array) ? val.map { |v| v.gsub(',', CGI.escape(',')) }.join(',') : val
56+
end
5057
end
58+
5159
params
5260
end
5361

app/messages/list_message.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def initialize(params={})
2525
super(params)
2626
end
2727

28-
def to_param_hash(exclude: [])
29-
super(exclude: ALLOWED_PAGINATION_KEYS + exclude)
28+
def to_param_hash(exclude: [], fields: [])
29+
super(exclude: ALLOWED_PAGINATION_KEYS + exclude, fields: fields)
3030
end
3131

3232
class PaginationOrderValidator < ActiveModel::Validator

app/messages/service_instances_list_message.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ def self.from_params(params)
3737
super(params, @array_keys.map(&:to_s), fields: %w(fields))
3838
end
3939

40+
def to_param_hash
41+
super(fields: [:fields])
42+
end
43+
4044
def valid_order_by_values
4145
super << :name
4246
end

app/messages/service_offerings_list_message.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,9 @@ class ServiceOfferingsListMessage < MetadataListMessage
3030
def self.from_params(params)
3131
super(params, @array_keys.map(&:to_s), fields: %w(fields))
3232
end
33+
34+
def to_param_hash
35+
super(fields: [:fields])
36+
end
3337
end
3438
end

app/messages/service_plans_list_message.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ def self.from_params(params)
3636
super(params, @array_keys.map(&:to_s), fields: %w(fields))
3737
end
3838

39+
def to_param_hash
40+
super(fields: [:fields])
41+
end
42+
3943
def available?
4044
requested?(:available) && available == 'true'
4145
end

spec/field_message_spec_shared_examples.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,9 @@
5656
))
5757
end
5858
end
59+
60+
RSpec.shared_examples 'fields to_param_hash' do |resource, keys|
61+
it 'correctly formats the fields' do
62+
expect(message.to_param_hash).to include("fields[#{resource}]": keys)
63+
end
64+
end

spec/request/service_instances_spec.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,10 @@
241241
describe 'pagination' do
242242
let(:resources) { [msi_1, msi_2, upsi_1, upsi_2, ssi] }
243243
it_behaves_like 'paginated response', '/v3/service_instances'
244+
245+
it_behaves_like 'paginated fields response', '/v3/service_instances', 'space', 'guid,name,relationships.organization'
246+
247+
it_behaves_like 'paginated fields response', '/v3/service_instances', 'space.organization', 'name,guid'
244248
end
245249

246250
describe 'filters' do

spec/request/service_offerings_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,8 @@
466466

467467
let(:resources) { [service_offering_1, service_offering_2] }
468468
it_behaves_like 'paginated response', '/v3/service_offerings'
469+
470+
it_behaves_like 'paginated fields response', '/v3/service_offerings', 'service_broker', 'guid,name'
469471
end
470472

471473
context 'when the service offerings have labels and annotations' do

spec/request/service_plans_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@
291291

292292
let(:resources) { [service_plan_1, service_plan_2] }
293293
it_behaves_like 'paginated response', '/v3/service_plans'
294+
295+
it_behaves_like 'paginated fields response', '/v3/service_plans', 'service_offering.service_broker', 'name,guid'
294296
end
295297

296298
describe 'filters' do

spec/request_spec_shared_examples.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,20 @@ def expect_filtered_resources(endpoint, filter, list)
4141
end
4242
end
4343

44+
RSpec.shared_examples 'paginated fields response' do |endpoint, resource, keys|
45+
it 'presents the fields correctly in first, last and next' do
46+
filter = "fields[#{resource}]=#{keys}&per_page=1"
47+
get "#{endpoint}?#{filter}", nil, admin_headers
48+
expect(last_response).to have_status_code(200)
49+
50+
keys = keys.split(/,/).join('%2C')
51+
last_page = resources.length
52+
expect(parsed_response['pagination']['first']['href']).to include("#{endpoint}?fields%5B#{resource}%5D=#{keys}&page=1&per_page=1")
53+
expect(parsed_response['pagination']['next']['href']).to include("#{endpoint}?fields%5B#{resource}%5D=#{keys}&page=2&per_page=1")
54+
expect(parsed_response['pagination']['last']['href']).to include("#{endpoint}?fields%5B#{resource}%5D=#{keys}&page=#{last_page}&per_page=1")
55+
end
56+
end
57+
4458
RSpec.shared_examples 'permissions for list endpoint' do |roles|
4559
roles.each do |role|
4660
describe "as an #{role}" do

0 commit comments

Comments
 (0)