aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--google/api_core/iam.py5
-rw-r--r--tests/unit/test_iam.py18
2 files changed, 17 insertions, 6 deletions
diff --git a/google/api_core/iam.py b/google/api_core/iam.py
index f130936..d83cbf3 100644
--- a/google/api_core/iam.py
+++ b/google/api_core/iam.py
@@ -136,7 +136,10 @@ class Policy(collections_abc.MutableMapping):
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 896e10d..f9771f0 100644
--- a/tests/unit/test_iam.py
+++ b/tests/unit/test_iam.py
@@ -32,11 +32,11 @@ class TestPolicy:
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 @@ class TestPolicy:
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 @@ class TestPolicy:
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