Skip to content

Commit 6dc98c8

Browse files
author
Kairo de Araujo
committed
fixed typing and tests improvement
As ``warehouse.tuf.repository`` is using typing, the mypy found some issues and it was fixed. Some tests improvements, added some monkeypatch and new asserts for call recorded using pretend. Signed-off-by: Kairo de Araujo <[email protected]>
1 parent 5ae58c6 commit 6dc98c8

File tree

6 files changed

+70
-28
lines changed

6 files changed

+70
-28
lines changed

tests/unit/tuf/test_repository.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,8 @@ def test__create_delegated_targets_roles_raises_storageerror(
248248
]
249249
assert tuf_repository._store.calls[0].args[0] == "test_bin"
250250

251-
def test__create_delegated_targets_roles_raise_fileexists(
252-
self, tuf_repository, monkeypatch
251+
def test__create_delegated_targets_roles_missing_delegated_role(
252+
self, tuf_repository
253253
):
254254
fake_time = datetime.datetime(2019, 6, 16, 9, 5, 1)
255255
fake_targets_md = pretend.stub(
@@ -259,6 +259,33 @@ def test__create_delegated_targets_roles_raise_fileexists(
259259
)
260260
fake_snapshot_md = pretend.stub(signed=pretend.stub(meta={}))
261261

262+
test_delegate_roles_parameters = [
263+
repository.RolesPayload(
264+
expiration=fake_time,
265+
threshold=1,
266+
keys=[{"keyid": "key1"}, {"keyid": "key2"}],
267+
paths=["*/*"],
268+
)
269+
]
270+
271+
with pytest.raises(ValueError) as err:
272+
tuf_repository._create_delegated_targets_roles(
273+
delegator_metadata=fake_targets_md,
274+
delegate_role_parameters=test_delegate_roles_parameters,
275+
snapshot_metadata=fake_snapshot_md,
276+
)
277+
278+
assert "A delegation role name is required." in str(err.value)
279+
280+
def test__create_delegated_targets_roles_raise_fileexists(self, tuf_repository):
281+
fake_time = datetime.datetime(2019, 6, 16, 9, 5, 1)
282+
fake_targets_md = pretend.stub(
283+
signed=pretend.stub(
284+
delegations=None, add_key=pretend.call_recorder(lambda *a, **kw: None)
285+
)
286+
)
287+
fake_snapshot_md = pretend.stub(signed=pretend.stub(meta={}))
288+
262289
tuf_repository.load_role = pretend.call_recorder(
263290
lambda role: fake_snapshot_md if role == Snapshot.type else True
264291
)

tests/unit/tuf/test_services.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def test_get(self, db_request, monkeypatch):
5454
"keyid_hash_algorithms": ["sha256", "sha512"],
5555
}
5656
db_request.registry.settings["tuf.root.secret"] = "tuf.root.secret"
57+
monkeypatch.setattr(glob, "glob", lambda privkey_path: ["fake_root.key"])
5758
monkeypatch.setattr(
5859
"warehouse.tuf.services.import_ed25519_privatekey_from_file",
5960
lambda *a, **kw: expected_priv_key_dict,
@@ -84,8 +85,6 @@ def test_get(self, monkeypatch):
8485
monkeypatch.setattr(glob, "glob", lambda *a, **kw: ["1.root.json"])
8586

8687
fake_file_object = pretend.stub(
87-
__enter__=None,
88-
__exit__=None,
8988
close=pretend.call_recorder(lambda: None),
9089
read=pretend.call_recorder(lambda: b"fake_root_data"),
9190
)
@@ -96,7 +95,7 @@ def test_get(self, monkeypatch):
9695
with service.get("root") as r:
9796
result = r.read()
9897

99-
assert result == b"fake_root_data"
98+
assert result == fake_file_object.read()
10099
assert fake_file_object.close.calls == [pretend.call()]
101100

102101
def test_get_max_version_raises_valueerror(self, monkeypatch):
@@ -105,8 +104,6 @@ def test_get_max_version_raises_valueerror(self, monkeypatch):
105104
monkeypatch.setattr(glob, "glob", lambda *a, **kw: [])
106105

107106
fake_file_object = pretend.stub(
108-
__enter__=None,
109-
__exit__=None,
110107
close=pretend.call_recorder(lambda: None),
111108
read=pretend.call_recorder(lambda: b"fake_root_data"),
112109
)
@@ -117,7 +114,7 @@ def test_get_max_version_raises_valueerror(self, monkeypatch):
117114
with service.get("root") as r:
118115
result = r.read()
119116

120-
assert result == b"fake_root_data"
117+
assert result == fake_file_object.read()
121118
assert fake_file_object.close.calls == [pretend.call()]
122119

123120
def test_get_oserror(self, monkeypatch):
@@ -144,8 +141,6 @@ def test_get_specific_version(self, monkeypatch):
144141
)
145142

146143
fake_file_object = pretend.stub(
147-
__enter__=None,
148-
__exit__=None,
149144
close=pretend.call_recorder(lambda: None),
150145
read=pretend.call_recorder(lambda: b"fake_data"),
151146
)
@@ -156,7 +151,7 @@ def test_get_specific_version(self, monkeypatch):
156151
with service.get("root", version=2) as r:
157152
result = r.read()
158153

159-
assert result == b"fake_data"
154+
assert result == fake_file_object.read()
160155
assert fake_file_object.close.calls == [pretend.call()]
161156

162157
def test_get_timestamp_specific(self, monkeypatch):
@@ -165,8 +160,6 @@ def test_get_timestamp_specific(self, monkeypatch):
165160
monkeypatch.setattr(glob, "glob", lambda *a, **kw: ["timestamp.json"])
166161

167162
fake_file_object = pretend.stub(
168-
__enter__=None,
169-
__exit__=None,
170163
close=pretend.call_recorder(lambda: None),
171164
read=pretend.call_recorder(lambda: b"fake_data"),
172165
)
@@ -177,7 +170,7 @@ def test_get_timestamp_specific(self, monkeypatch):
177170
with service.get("timestamp") as r:
178171
result = r.read()
179172

180-
assert result == b"fake_data"
173+
assert result == fake_file_object.read()
181174

182175
def test_put(self, monkeypatch):
183176
service = services.LocalStorageService("/opt/warehouse/src/dev/metadata")
@@ -312,6 +305,10 @@ def test_create_service(self):
312305
assert service._storage_backend == fake_service
313306
assert service._key_storage_backend == fake_service
314307
assert service._request == request
308+
assert request.find_service.calls == [
309+
pretend.call(IStorageService),
310+
pretend.call(IKeyService),
311+
]
315312

316313
def test_basic_init(self):
317314
service = services.RepositoryService(
@@ -451,8 +448,15 @@ def test_init_repository(self, db_request, monkeypatch):
451448
service = services.RepositoryService(fake_storage, fake_key_storage, db_request)
452449
result = service.init_repository()
453450

454-
call_args = fake_metadata_repository.initialize.calls[0].args[0]
455451
assert result is None
452+
# one call for role (4)
453+
assert fake_datetime.now.calls == [
454+
pretend.call(),
455+
pretend.call(),
456+
pretend.call(),
457+
pretend.call(),
458+
]
459+
call_args = fake_metadata_repository.initialize.calls[0].args[0]
456460
assert str(call_args["snapshot"].expiration) == "2019-06-17 09:05:01"
457461
assert str(call_args["timestamp"].expiration) == "2019-06-17 09:05:01"
458462
assert str(call_args["root"].expiration) == "2020-06-15 09:05:01"
@@ -549,9 +553,9 @@ def test_init_targets_delegation(self, db_request, monkeypatch):
549553
service = services.RepositoryService(fake_storage, fake_key_storage, db_request)
550554
service.bump_snapshot = pretend.call_recorder(lambda snapshot_metadata: None)
551555
result = service.init_targets_delegation()
552-
call_args = fake_metadata_repository.delegate_targets_roles.calls[0].args[0]
553556

554557
assert result is None
558+
call_args = fake_metadata_repository.delegate_targets_roles.calls[0].args[0]
555559
assert sorted(["targets", "bins"]) == sorted(list(call_args.keys()))
556560
assert len(call_args["targets"]) == 1
557561
assert call_args["targets"][0].paths == ["*/*", "*/*/*/*"]

tests/unit/tuf/test_tasks.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def __exit__(self, type, value, traceback):
4848
tasks.bump_snapshot(task, db_request)
4949

5050
assert db_request.find_service.calls == [pretend.call(IRepositoryService)]
51+
assert fake_irepository.bump_snapshot.calls == [pretend.call()]
5152

5253

5354
class TestBumpBinNRoles:
@@ -81,6 +82,7 @@ def __exit__(self, type, value, traceback):
8182
tasks.bump_bin_n_roles(task, db_request)
8283

8384
assert db_request.find_service.calls == [pretend.call(IRepositoryService)]
85+
assert fake_irepository.bump_bin_n_roles.calls == [pretend.call()]
8486

8587

8688
class TestInitRepository:
@@ -97,6 +99,7 @@ def test_success(self, db_request):
9799
task = pretend.stub()
98100
tasks.init_repository(task, db_request)
99101

102+
assert fake_irepository.init_repository.calls == [pretend.call()]
100103
assert db_request.find_service.calls == [pretend.call(IRepositoryService)]
101104

102105

@@ -130,6 +133,7 @@ def __exit__(self, type, value, traceback):
130133
task = pretend.stub()
131134
tasks.init_targets_delegation(task, db_request)
132135

136+
assert fake_irepository.init_targets_delegation.calls == [pretend.call()]
133137
assert db_request.find_service.calls == [pretend.call(IRepositoryService)]
134138

135139

@@ -167,4 +171,5 @@ def __exit__(self, type, value, traceback):
167171
task = pretend.stub()
168172
tasks.add_hashed_targets(task, db_request, targets)
169173

174+
fake_irepository.add_hashed_targets.calls == [pretend.call()]
170175
assert db_request.find_service.calls == [pretend.call(IRepositoryService)]

warehouse/cli/tuf.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212

1313
import click
1414

15-
from securesystemslib.exceptions import StorageError
16-
from securesystemslib.interface import generate_and_write_ed25519_keypair
15+
from securesystemslib.exceptions import StorageError # type: ignore
16+
from securesystemslib.interface import ( # type: ignore
17+
generate_and_write_ed25519_keypair,
18+
)
1719

1820
from warehouse.cli import warehouse
1921
from warehouse.packaging.utils import render_simple_detail

warehouse/tuf/repository.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
from datetime import datetime
1515
from typing import Any, Dict, List, Optional
1616

17-
from securesystemslib.exceptions import StorageError
18-
from securesystemslib.signer import SSlibSigner
17+
from securesystemslib.exceptions import StorageError # type: ignore
18+
from securesystemslib.signer import SSlibSigner # type: ignore
1919
from tuf.api.metadata import (
2020
SPECIFICATION_VERSION,
2121
TOP_LEVEL_ROLE_NAMES,
@@ -55,9 +55,9 @@ class RolesPayload:
5555
expiration: datetime
5656
threshold: int
5757
keys: List[Dict[str, Any]]
58-
delegation_role: str = None
59-
paths: List[str] = None
60-
path_hash_prefixes: List[str] = None
58+
delegation_role: Optional[str] = None
59+
paths: Optional[List[str]] = None
60+
path_hash_prefixes: Optional[List[str]] = None
6161

6262

6363
@dataclass
@@ -66,7 +66,7 @@ class TargetsPayload:
6666
Container for target files info, suitable for targets metadata.
6767
"""
6868

69-
fileinfo: str
69+
fileinfo: Dict[str, Any]
7070
path: str
7171

7272

@@ -110,6 +110,8 @@ def _create_delegated_targets_roles(
110110

111111
for role_parameter in delegate_role_parameters:
112112
rolename = role_parameter.delegation_role
113+
if rolename is None:
114+
raise ValueError("A delegation role name is required.")
113115
try:
114116
if self.load_role(rolename):
115117
raise FileExistsError(f"Role {rolename} already exists.")
@@ -120,7 +122,7 @@ def _create_delegated_targets_roles(
120122
name=rolename,
121123
keyids=[key["keyid"] for key in role_parameter.keys],
122124
threshold=role_parameter.threshold,
123-
terminating=None,
125+
terminating=False,
124126
paths=role_parameter.paths,
125127
path_hash_prefixes=role_parameter.path_hash_prefixes,
126128
)
@@ -196,7 +198,7 @@ def initialize(
196198
Dictionary of role names as keys and metadata objects as values.
197199
``Dict[str, Metadata]``
198200
"""
199-
top_level_roles_metadata = dict()
201+
top_level_roles_metadata: Dict[str, Any] = dict()
200202
if self.is_initialized:
201203
raise FileExistsError("Metadata already exists in the Storage Service")
202204

warehouse/tuf/services.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919

2020
from contextlib import contextmanager
2121

22-
from securesystemslib.exceptions import StorageError
23-
from securesystemslib.interface import import_ed25519_privatekey_from_file
22+
from securesystemslib.exceptions import StorageError # type: ignore
23+
from securesystemslib.interface import ( # type: ignore
24+
import_ed25519_privatekey_from_file,
25+
)
2426
from zope.interface import implementer
2527

2628
from warehouse.config import Environment

0 commit comments

Comments
 (0)