Skip to content

Commit 1f94310

Browse files
authored
Fix incorrectly passing shared examples (#3160)
* Fix incorrectly passing list permissions shared example - Detect if list endpoint permissions shared example gets unexpected keys in the codes & responses hash - Now, tests using this shared example will fail if they get an unexpected key in the hash - It was easy to accidentally confuse "response_object" with "response_objects", which resulted in incorrectly passing tests that did not check the response body - Fix multiple tests that were incorrectly passing and were detected by this guard * Fix incorrectly passing single object permissions shared example - Continuation of fix to the same issue for the list endpoint shared example * Fix incorrectly passing delete permissions shared example - Continuation of fix to the same issue for other shared examples - Since there were several places where "errors" were provided in tests, add support for that key, based on other shared example implementations
1 parent 4092c8c commit 1f94310

File tree

6 files changed

+212
-246
lines changed

6 files changed

+212
-246
lines changed

spec/request/domains_spec.rb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1896,10 +1896,7 @@
18961896
end
18971897

18981898
let(:expected_codes_and_responses) do
1899-
h = Hash.new(
1900-
code: 403,
1901-
response_object: { errors: [{ detail: "You do not have sufficient permissions for organization with guid '#{shared_org1.guid}' to unshare the domain." }] }
1902-
)
1899+
h = Hash.new(code: 403, errors: CF_NOT_AUTHORIZED)
19031900
h['admin'] = {
19041901
code: 204
19051902
}

spec/request/packages_spec.rb

Lines changed: 65 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -267,42 +267,32 @@
267267

268268
context 'when listing all packages for an app' do
269269
let(:api_call) { lambda { |user_headers| get "/v3/apps/#{app_model.guid}/packages", nil, user_headers } }
270-
let(:packages_response_object) do
271-
{
272-
'pagination' => {
273-
'total_results' => 1,
274-
'total_pages' => 1,
275-
'first' => { 'href' => "#{link_prefix}/v3/apps/#{guid}/packages?order_by=-created_at&page=1&per_page=2" },
276-
'last' => { 'href' => "#{link_prefix}/v3/apps/#{guid}/packages?order_by=-created_at&page=1&per_page=2" },
277-
'next' => nil,
278-
'previous' => nil,
279-
},
280-
'resources' => [
281-
{
282-
'guid' => package.guid,
283-
'type' => 'bits',
284-
'data' => {
285-
'checksum' => { 'type' => 'sha256', 'value' => anything },
286-
'error' => nil
287-
},
288-
'relationships' => { 'app' => { 'data' => { 'guid' => app_model.guid } } },
289-
'state' => VCAP::CloudController::PackageModel::CREATED_STATE,
290-
'metadata' => { 'labels' => {}, 'annotations' => {} },
291-
'created_at' => iso8601,
292-
'updated_at' => iso8601,
293-
'links' => {
294-
'self' => { 'href' => "#{link_prefix}/v3/packages/#{package.guid}" },
295-
'upload' => { 'href' => "#{link_prefix}/v3/packages/#{package.guid}/upload", 'method' => 'POST' },
296-
'download' => { 'href' => "#{link_prefix}/v3/packages/#{package.guid}/download" },
297-
'app' => { 'href' => "#{link_prefix}/v3/apps/#{guid}" },
298-
}
270+
let(:packages_response_objects) do
271+
[
272+
{
273+
'guid' => package.guid,
274+
'type' => 'bits',
275+
'data' => {
276+
'checksum' => { 'type' => 'sha256', 'value' => anything },
277+
'error' => nil
299278
},
300-
]
301-
}
279+
'relationships' => { 'app' => { 'data' => { 'guid' => app_model.guid } } },
280+
'state' => VCAP::CloudController::PackageModel::CREATED_STATE,
281+
'metadata' => { 'labels' => {}, 'annotations' => {} },
282+
'created_at' => iso8601,
283+
'updated_at' => iso8601,
284+
'links' => {
285+
'self' => { 'href' => "#{link_prefix}/v3/packages/#{package.guid}" },
286+
'upload' => { 'href' => "#{link_prefix}/v3/packages/#{package.guid}/upload", 'method' => 'POST' },
287+
'download' => { 'href' => "#{link_prefix}/v3/packages/#{package.guid}/download" },
288+
'app' => { 'href' => "#{link_prefix}/v3/apps/#{guid}" },
289+
}
290+
},
291+
]
302292
end
303293

304294
let(:expected_codes_and_responses) do
305-
h = Hash.new(code: 200, response_object: packages_response_object)
295+
h = Hash.new(code: 200, response_objects: packages_response_objects)
306296
h['org_auditor'] = { code: 404 }
307297
h['org_billing_manager'] = { code: 404 }
308298
h['no_role'] = { code: 404 }
@@ -500,56 +490,46 @@
500490
state: VCAP::CloudController::PackageModel::READY_STATE,
501491
docker_image: 'http://location-of-image.com')
502492
end
503-
let(:packages_response_object) do
504-
{
505-
'pagination' => {
506-
'total_results' => 3,
507-
'total_pages' => 2,
508-
'first' => { 'href' => "#{link_prefix}/v3/pagckaes?page=1&per_page=2" },
509-
'last' => { 'href' => "#{link_prefix}/v3/packages?page=2&per_page=2" },
510-
'next' => { 'href' => "#{link_prefix}/v3/packages?page=2&per_page=2" },
511-
'previous' => nil,
512-
},
513-
'resources' => [
514-
{
515-
'guid' => bits_package.guid,
516-
'type' => 'bits',
517-
'data' => {
518-
'checksum' => { 'type' => 'sha256', 'value' => anything },
519-
'error' => nil
520-
},
521-
'state' => VCAP::CloudController::PackageModel::CREATED_STATE,
522-
'relationships' => { 'app' => { 'data' => { 'guid' => app_model.guid } } },
523-
'metadata' => { 'labels' => {}, 'annotations' => {} },
524-
'created_at' => iso8601,
525-
'updated_at' => iso8601,
526-
'links' => {
527-
'self' => { 'href' => "#{link_prefix}/v3/packages/#{bits_package.guid}" },
528-
'upload' => { 'href' => "#{link_prefix}/v3/packages/#{bits_package.guid}/upload", 'method' => 'POST' },
529-
'download' => { 'href' => "#{link_prefix}/v3/packages/#{bits_package.guid}/download" },
530-
'app' => { 'href' => "#{link_prefix}/v3/apps/#{bits_package.app_guid}" },
531-
}
493+
let(:packages_response_objects) do
494+
[
495+
{
496+
'guid' => bits_package.guid,
497+
'type' => 'bits',
498+
'data' => {
499+
'checksum' => { 'type' => 'sha256', 'value' => anything },
500+
'error' => nil
532501
},
533-
{
534-
'guid' => docker_package.guid,
535-
'type' => 'docker',
536-
'data' => {
537-
'image' => 'http://location-of-image.com',
538-
'username' => nil,
539-
'password' => nil,
540-
},
541-
'state' => VCAP::CloudController::PackageModel::READY_STATE,
542-
'relationships' => { 'app' => { 'data' => { 'guid' => app_model.guid } } },
543-
'metadata' => { 'labels' => {}, 'annotations' => {} },
544-
'created_at' => iso8601,
545-
'updated_at' => iso8601,
546-
'links' => {
547-
'self' => { 'href' => "#{link_prefix}/v3/packages/#{docker_package.guid}" },
548-
'app' => { 'href' => "#{link_prefix}/v3/apps/#{docker_package.app_guid}" },
549-
}
502+
'state' => VCAP::CloudController::PackageModel::CREATED_STATE,
503+
'relationships' => { 'app' => { 'data' => { 'guid' => app_model.guid } } },
504+
'metadata' => { 'labels' => {}, 'annotations' => {} },
505+
'created_at' => iso8601,
506+
'updated_at' => iso8601,
507+
'links' => {
508+
'self' => { 'href' => "#{link_prefix}/v3/packages/#{bits_package.guid}" },
509+
'upload' => { 'href' => "#{link_prefix}/v3/packages/#{bits_package.guid}/upload", 'method' => 'POST' },
510+
'download' => { 'href' => "#{link_prefix}/v3/packages/#{bits_package.guid}/download" },
511+
'app' => { 'href' => "#{link_prefix}/v3/apps/#{bits_package.app_guid}" },
550512
}
551-
]
552-
}
513+
},
514+
{
515+
'guid' => docker_package.guid,
516+
'type' => 'docker',
517+
'data' => {
518+
'image' => 'http://location-of-image.com',
519+
'username' => nil,
520+
'password' => nil,
521+
},
522+
'state' => VCAP::CloudController::PackageModel::READY_STATE,
523+
'relationships' => { 'app' => { 'data' => { 'guid' => app_model.guid } } },
524+
'metadata' => { 'labels' => {}, 'annotations' => {} },
525+
'created_at' => iso8601,
526+
'updated_at' => iso8601,
527+
'links' => {
528+
'self' => { 'href' => "#{link_prefix}/v3/packages/#{docker_package.guid}" },
529+
'app' => { 'href' => "#{link_prefix}/v3/apps/#{docker_package.app_guid}" },
530+
}
531+
}
532+
]
553533
end
554534

555535
context 'when listing all packages' do
@@ -563,7 +543,11 @@
563543
}
564544

565545
let(:expected_codes_and_responses) do
566-
Hash.new(code: 200, response_object: packages_response_object)
546+
h = Hash.new(code: 200, response_objects: packages_response_objects)
547+
h['org_auditor'] = { code: 200, response_objects: [] }
548+
h['org_billing_manager'] = { code: 200, response_objects: [] }
549+
h['no_role'] = { code: 200, response_objects: [] }
550+
h
567551
end
568552

569553
it_behaves_like 'permissions for list endpoint', ALL_PERMISSIONS

0 commit comments

Comments
 (0)