From 762e443afab50e1960c6682fac5336926f3b2327 Mon Sep 17 00:00:00 2001 From: Bu Sun Kim Date: Mon, 22 Mar 2021 21:50:33 +0000 Subject: [PATCH 1/2] fix: sae empty IAM bindings --- google/api_core/iam.py | 6 +++++- tests/unit/test_iam.py | 18 +++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/google/api_core/iam.py b/google/api_core/iam.py index f1309360..91e2f595 100644 --- a/google/api_core/iam.py +++ b/google/api_core/iam.py @@ -136,7 +136,11 @@ def __getitem__(self, key): for b in self._bindings: if b["role"] == key: return b["members"] - return set() + # binding does not yet exist, create one + new_binding = {"role": key, "members": set()} + self._bindings.append(new_binding) + return new_binding["members"] + def __setitem__(self, key, value): self.__check_version__() diff --git a/tests/unit/test_iam.py b/tests/unit/test_iam.py index 896e10de..f9771f0f 100644 --- a/tests/unit/test_iam.py +++ b/tests/unit/test_iam.py @@ -32,11 +32,11 @@ def test_ctor_defaults(self): policy = self._make_one() assert policy.etag is None assert policy.version is None + assert len(policy) == 0 + assert dict(policy) == {} assert policy.owners == empty assert policy.editors == empty assert policy.viewers == empty - assert len(policy) == 0 - assert dict(policy) == {} def test_ctor_explicit(self): VERSION = 1 @@ -45,16 +45,24 @@ def test_ctor_explicit(self): policy = self._make_one(ETAG, VERSION) assert policy.etag == ETAG assert policy.version == VERSION + assert len(policy) == 0 + assert dict(policy) == {} assert policy.owners == empty assert policy.editors == empty assert policy.viewers == empty - assert len(policy) == 0 - assert dict(policy) == {} def test___getitem___miss(self): policy = self._make_one() assert policy["nonesuch"] == set() + def test__getitem___and_set(self): + from google.api_core.iam import OWNER_ROLE + policy = self._make_one() + + # get the policy using the getter and then modify it + policy[OWNER_ROLE].add("user:phred@example.com") + assert dict(policy) == {OWNER_ROLE: {"user:phred@example.com"}} + def test___getitem___version3(self): policy = self._make_one("DEADBEEF", 3) with pytest.raises(InvalidOperationException, match=_DICT_ACCESS_MSG): @@ -293,10 +301,10 @@ def test_from_api_repr_only_etag(self): policy = klass.from_api_repr(RESOURCE) assert policy.etag == "ACAB" assert policy.version is None + assert dict(policy) == {} assert policy.owners == empty assert policy.editors == empty assert policy.viewers == empty - assert dict(policy) == {} def test_from_api_repr_complete(self): from google.api_core.iam import OWNER_ROLE, EDITOR_ROLE, VIEWER_ROLE From a6a0c9cb40eae759aefdde0b3ff042aad5cb2b9a Mon Sep 17 00:00:00 2001 From: Bu Sun Kim Date: Mon, 22 Mar 2021 23:14:50 +0000 Subject: [PATCH 2/2] chore: remove empty line --- google/api_core/iam.py | 1 - 1 file changed, 1 deletion(-) diff --git a/google/api_core/iam.py b/google/api_core/iam.py index 91e2f595..d83cbf35 100644 --- a/google/api_core/iam.py +++ b/google/api_core/iam.py @@ -141,7 +141,6 @@ def __getitem__(self, key): self._bindings.append(new_binding) return new_binding["members"] - def __setitem__(self, key, value): self.__check_version__() value = set(value)