diff --git a/packages/google-cloud-org-policy/docs/orgpolicy_v2/services_.rst b/packages/google-cloud-org-policy/docs/orgpolicy_v2/services_.rst new file mode 100644 index 000000000000..2442b5b1faf4 --- /dev/null +++ b/packages/google-cloud-org-policy/docs/orgpolicy_v2/services_.rst @@ -0,0 +1,6 @@ +Services for Google Cloud Orgpolicy v2 API +========================================== +.. toctree:: + :maxdepth: 2 + + org_policy diff --git a/packages/google-cloud-org-policy/docs/orgpolicy_v2/types_.rst b/packages/google-cloud-org-policy/docs/orgpolicy_v2/types_.rst new file mode 100644 index 000000000000..c73ac1cf5df3 --- /dev/null +++ b/packages/google-cloud-org-policy/docs/orgpolicy_v2/types_.rst @@ -0,0 +1,6 @@ +Types for Google Cloud Orgpolicy v2 API +======================================= + +.. automodule:: google.cloud.orgpolicy_v2.types + :members: + :show-inheritance: diff --git a/packages/google-cloud-org-policy/tests/unit/gapic/orgpolicy_v2/test_org_policy.py b/packages/google-cloud-org-policy/tests/unit/gapic/orgpolicy_v2/test_org_policy.py index 467c69e5293c..0361263b5664 100644 --- a/packages/google-cloud-org-policy/tests/unit/gapic/orgpolicy_v2/test_org_policy.py +++ b/packages/google-cloud-org-policy/tests/unit/gapic/orgpolicy_v2/test_org_policy.py @@ -2710,8 +2710,9 @@ def test_list_constraints_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.ListConstraintsResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.ListConstraintsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -2793,8 +2794,9 @@ def test_list_constraints_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.ListConstraintsResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.ListConstraintsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -2925,8 +2927,9 @@ def test_list_constraints_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.ListConstraintsResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.ListConstraintsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3044,8 +3047,9 @@ def test_list_policies_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.ListPoliciesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.ListPoliciesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3125,8 +3129,9 @@ def test_list_policies_rest_required_fields(request_type=orgpolicy.ListPoliciesR response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.ListPoliciesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.ListPoliciesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3255,8 +3260,9 @@ def test_list_policies_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.ListPoliciesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.ListPoliciesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3374,8 +3380,9 @@ def test_get_policy_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3448,8 +3455,9 @@ def test_get_policy_rest_required_fields(request_type=orgpolicy.GetPolicyRequest response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3568,8 +3576,9 @@ def test_get_policy_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3632,8 +3641,9 @@ def test_get_effective_policy_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3708,8 +3718,9 @@ def test_get_effective_policy_rest_required_fields( response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3830,8 +3841,9 @@ def test_get_effective_policy_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -3918,6 +3930,73 @@ def test_create_policy_rest(request_type): "alternate": {"launch": "launch_value", "spec": {}}, "dry_run_spec": {}, } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = orgpolicy.CreatePolicyRequest.meta.fields["policy"] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["policy"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["policy"][field])): + del request_init["policy"][field][i][subfield] + else: + del request_init["policy"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -3930,8 +4009,9 @@ def test_create_policy_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4005,8 +4085,9 @@ def test_create_policy_rest_required_fields(request_type=orgpolicy.CreatePolicyR response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4096,40 +4177,6 @@ def test_create_policy_rest_bad_request( # send a request that will satisfy transcoding request_init = {"parent": "projects/sample1"} - request_init["policy"] = { - "name": "name_value", - "spec": { - "etag": "etag_value", - "update_time": {"seconds": 751, "nanos": 543}, - "rules": [ - { - "values": { - "allowed_values": [ - "allowed_values_value1", - "allowed_values_value2", - ], - "denied_values": [ - "denied_values_value1", - "denied_values_value2", - ], - }, - "allow_all": True, - "deny_all": True, - "enforce": True, - "condition": { - "expression": "expression_value", - "title": "title_value", - "description": "description_value", - "location": "location_value", - }, - } - ], - "inherit_from_parent": True, - "reset": True, - }, - "alternate": {"launch": "launch_value", "spec": {}}, - "dry_run_spec": {}, - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -4168,8 +4215,9 @@ def test_create_policy_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4255,6 +4303,73 @@ def test_update_policy_rest(request_type): "alternate": {"launch": "launch_value", "spec": {}}, "dry_run_spec": {}, } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = orgpolicy.UpdatePolicyRequest.meta.fields["policy"] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init["policy"].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["policy"][field])): + del request_init["policy"][field][i][subfield] + else: + del request_init["policy"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -4267,8 +4382,9 @@ def test_update_policy_rest(request_type): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4339,8 +4455,9 @@ def test_update_policy_rest_required_fields(request_type=orgpolicy.UpdatePolicyR response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value @@ -4422,40 +4539,6 @@ def test_update_policy_rest_bad_request( # send a request that will satisfy transcoding request_init = {"policy": {"name": "projects/sample1/policies/sample2"}} - request_init["policy"] = { - "name": "projects/sample1/policies/sample2", - "spec": { - "etag": "etag_value", - "update_time": {"seconds": 751, "nanos": 543}, - "rules": [ - { - "values": { - "allowed_values": [ - "allowed_values_value1", - "allowed_values_value2", - ], - "denied_values": [ - "denied_values_value1", - "denied_values_value2", - ], - }, - "allow_all": True, - "deny_all": True, - "enforce": True, - "condition": { - "expression": "expression_value", - "title": "title_value", - "description": "description_value", - "location": "location_value", - }, - } - ], - "inherit_from_parent": True, - "reset": True, - }, - "alternate": {"launch": "launch_value", "spec": {}}, - "dry_run_spec": {}, - } request = request_type(**request_init) # Mock the http request call within the method and fake a BadRequest error. @@ -4493,8 +4576,9 @@ def test_update_policy_rest_flattened(): # Wrap the value into a proper Response obj response_value = Response() response_value.status_code = 200 - pb_return_value = orgpolicy.Policy.pb(return_value) - json_return_value = json_format.MessageToJson(pb_return_value) + # Convert return value to protobuf type + return_value = orgpolicy.Policy.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value