|
8 | 8 | let(:space) { VCAP::CloudController::Space.make(organization: org, created_at: Time.now.utc - 1.second) } |
9 | 9 | let!(:space_annotation) { VCAP::CloudController::SpaceAnnotationModel.make(key_prefix: 'pre.fix', key_name: 'baz', value: 'wow', space: space) } |
10 | 10 | let(:another_space) { VCAP::CloudController::Space.make } |
| 11 | + let(:parameters_mixed_data_types_as_json_string) do |
| 12 | + '{"boolean":true,"string":"a string","int":123,"float":3.14159,"optional":null,"object":{"a":"b"},"array":["c","d"]}' |
| 13 | + end |
| 14 | + let(:parameters_mixed_data_types_as_hash) do |
| 15 | + { |
| 16 | + boolean: true, |
| 17 | + string: 'a string', |
| 18 | + int: 123, |
| 19 | + float: 3.14159, |
| 20 | + optional: nil, |
| 21 | + object: { a: 'b' }, |
| 22 | + array: %w[c d] |
| 23 | + } |
| 24 | + end |
11 | 25 |
|
12 | 26 | describe 'GET /v3/service_instances/:guid' do |
13 | 27 | let(:api_call) { ->(user_headers) { get "/v3/service_instances/#{guid}", nil, user_headers } } |
@@ -605,6 +619,22 @@ def check_filtered_instances(*instances) |
605 | 619 | end |
606 | 620 | end |
607 | 621 |
|
| 622 | + context 'when the service broker returns parameters with mixed data types' do |
| 623 | + let(:body) { "{\"parameters\":#{parameters_mixed_data_types_as_json_string}}" } |
| 624 | + |
| 625 | + it 'correctly parses all data types and returns the desired JSON string' do |
| 626 | + allow_any_instance_of(VCAP::CloudController::ServiceInstanceRead).to receive(:fetch_parameters).and_wrap_original do |m, instance| |
| 627 | + result = m.call(instance) |
| 628 | + expect(result).to eq(parameters_mixed_data_types_as_hash) # correct internal representation |
| 629 | + result |
| 630 | + end |
| 631 | + |
| 632 | + get "/v3/service_instances/#{instance.guid}/parameters", nil, admin_headers |
| 633 | + expect(last_response).to have_status_code(200) |
| 634 | + expect(last_response).to match(/#{Regexp.escape(parameters_mixed_data_types_as_json_string)}/) |
| 635 | + end |
| 636 | + end |
| 637 | + |
608 | 638 | it 'sends the correct request to the service broker' do |
609 | 639 | get "/v3/service_instances/#{instance.guid}/parameters", nil, headers_for(user, scopes: %w[cloud_controller.admin]) |
610 | 640 |
|
@@ -1087,6 +1117,28 @@ def check_filtered_instances(*instances) |
1087 | 1117 | allow(Steno).to receive(:logger).with('cc.api').and_return(mock_logger) |
1088 | 1118 | end |
1089 | 1119 |
|
| 1120 | + context 'when providing parameters with mixed data types' do |
| 1121 | + let(:request_body) do |
| 1122 | + "{\"type\":\"managed\",\"name\":\"#{name}\"," \ |
| 1123 | + "\"relationships\":{\"space\":{\"data\":{\"guid\":\"#{space_guid}\"}},\"service_plan\":{\"data\":{\"guid\":\"#{service_plan_guid}\"}}}," \ |
| 1124 | + "\"parameters\":#{parameters_mixed_data_types_as_json_string}}" |
| 1125 | + end |
| 1126 | + |
| 1127 | + it 'correctly parses all data types and sends the desired JSON string to the service broker' do |
| 1128 | + post '/v3/service_instances', request_body, space_dev_headers |
| 1129 | + |
| 1130 | + expect_any_instance_of(VCAP::Services::ServiceBrokers::V2::Client).to receive(:provision). |
| 1131 | + with(instance, hash_including(arbitrary_parameters: parameters_mixed_data_types_as_hash)). # correct internal representation |
| 1132 | + and_call_original |
| 1133 | + |
| 1134 | + stub_request(:put, "#{instance.service_broker.broker_url}/v2/service_instances/#{instance.guid}"). |
| 1135 | + with(query: { 'accepts_incomplete' => true }, body: /"parameters":#{Regexp.escape(parameters_mixed_data_types_as_json_string)}/). |
| 1136 | + to_return(status: 201, body: '{}') |
| 1137 | + |
| 1138 | + execute_all_jobs(expected_successes: 1, expected_failures: 0) |
| 1139 | + end |
| 1140 | + end |
| 1141 | + |
1090 | 1142 | it 'creates a service instance in the database' do |
1091 | 1143 | api_call.call(space_dev_headers) |
1092 | 1144 |
|
@@ -1871,6 +1923,27 @@ def check_filtered_instances(*instances) |
1871 | 1923 | allow(Steno).to receive(:logger).with('cc.api').and_return(mock_logger) |
1872 | 1924 | end |
1873 | 1925 |
|
| 1926 | + context 'when providing parameters with mixed data types' do |
| 1927 | + let(:request_body) do |
| 1928 | + "{\"parameters\":#{parameters_mixed_data_types_as_json_string}}" |
| 1929 | + end |
| 1930 | + let(:instance) { VCAP::CloudController::ServiceInstance.last } |
| 1931 | + |
| 1932 | + it 'correctly parses all data types and sends the desired JSON string to the service broker' do |
| 1933 | + patch "/v3/service_instances/#{guid}", request_body, space_dev_headers |
| 1934 | + |
| 1935 | + expect_any_instance_of(VCAP::Services::ServiceBrokers::V2::Client).to receive(:update). |
| 1936 | + with(instance, instance.service_plan, hash_including(arbitrary_parameters: parameters_mixed_data_types_as_hash)). # correct internal representation |
| 1937 | + and_call_original |
| 1938 | + |
| 1939 | + stub_request(:patch, "#{instance.service_broker.broker_url}/v2/service_instances/#{instance.guid}"). |
| 1940 | + with(query: { 'accepts_incomplete' => true }, body: /"parameters":#{Regexp.escape(parameters_mixed_data_types_as_json_string)}/). |
| 1941 | + to_return(status: 200, body: '{}') |
| 1942 | + |
| 1943 | + execute_all_jobs(expected_successes: 1, expected_failures: 0) |
| 1944 | + end |
| 1945 | + end |
| 1946 | + |
1874 | 1947 | it 'responds with a pollable job' do |
1875 | 1948 | api_call.call(space_dev_headers) |
1876 | 1949 |
|
|
0 commit comments