Changeset View
Changeset View
Standalone View
Standalone View
swh/model/tests/test_model.py
# Copyright (C) 2019-2020 The Software Heritage developers | # Copyright (C) 2019-2020 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import collections | import collections | ||||
import copy | import copy | ||||
import datetime | import datetime | ||||
import hashlib | import hashlib | ||||
from typing import Any, List, Optional, Tuple, Union | from typing import Any, List, Optional, Tuple, Union | ||||
import attr | import attr | ||||
from attrs_strict import AttributeTypeError | from attrs_strict import AttributeTypeError | ||||
import dateutil | import dateutil | ||||
from hypothesis import given | from hypothesis import given | ||||
from hypothesis.strategies import binary | from hypothesis.strategies import binary, none | ||||
import pytest | import pytest | ||||
from swh.model.collections import ImmutableDict | from swh.model.collections import ImmutableDict | ||||
from swh.model.from_disk import DentryPerms | from swh.model.from_disk import DentryPerms | ||||
import swh.model.git_objects | import swh.model.git_objects | ||||
from swh.model.hashutil import MultiHash, hash_to_bytes | from swh.model.hashutil import MultiHash, hash_to_bytes | ||||
import swh.model.hypothesis_strategies as strategies | import swh.model.hypothesis_strategies as strategies | ||||
import swh.model.model | import swh.model.model | ||||
▲ Show 20 Lines • Show All 811 Lines • ▼ Show 20 Lines | def test_content_naive_datetime(): | ||||
c = Content.from_data(b"foo") | c = Content.from_data(b"foo") | ||||
with pytest.raises(ValueError, match="must be a timezone-aware datetime"): | with pytest.raises(ValueError, match="must be a timezone-aware datetime"): | ||||
Content( | Content( | ||||
**c.to_dict(), | **c.to_dict(), | ||||
ctime=datetime.datetime.now(), | ctime=datetime.datetime.now(), | ||||
) | ) | ||||
@given(strategies.present_contents().filter(lambda cnt: cnt.data is not None)) | @given(strategies.present_contents()) | ||||
def test_content_git_roundtrip(content): | def test_content_git_roundtrip(content): | ||||
assert content.data is not None | assert content.data is not None | ||||
raw = swh.model.git_objects.content_git_object(content) | raw = swh.model.git_objects.content_git_object(content) | ||||
sha1_git = hashlib.new("sha1", raw).digest() | sha1_git = hashlib.new("sha1", raw).digest() | ||||
assert content.sha1_git == sha1_git | assert content.sha1_git == sha1_git | ||||
# SkippedContent | # SkippedContent | ||||
Show All 28 Lines | with pytest.raises(ValueError, match="must be a timezone-aware datetime"): | ||||
**c.to_dict(), | **c.to_dict(), | ||||
ctime=datetime.datetime.now(), | ctime=datetime.datetime.now(), | ||||
) | ) | ||||
# Directory | # Directory | ||||
@given(strategies.directories().filter(lambda d: d.raw_manifest is None)) | @given(strategies.directories(raw_manifest=none())) | ||||
def test_directory_check(directory): | def test_directory_check(directory): | ||||
directory.check() | directory.check() | ||||
directory2 = attr.evolve(directory, id=b"\x00" * 20) | directory2 = attr.evolve(directory, id=b"\x00" * 20) | ||||
with pytest.raises(ValueError, match="does not match recomputed hash"): | with pytest.raises(ValueError, match="does not match recomputed hash"): | ||||
directory2.check() | directory2.check() | ||||
directory2 = attr.evolve( | directory2 = attr.evolve( | ||||
directory, raw_manifest=swh.model.git_objects.directory_git_object(directory) | directory, raw_manifest=swh.model.git_objects.directory_git_object(directory) | ||||
) | ) | ||||
with pytest.raises( | with pytest.raises( | ||||
ValueError, match="non-none raw_manifest attribute, but does not need it." | ValueError, match="non-none raw_manifest attribute, but does not need it." | ||||
): | ): | ||||
directory2.check() | directory2.check() | ||||
@given(strategies.directories().filter(lambda d: d.raw_manifest is None)) | @given(strategies.directories(raw_manifest=none())) | ||||
def test_directory_raw_manifest(directory): | def test_directory_raw_manifest(directory): | ||||
assert "raw_manifest" not in directory.to_dict() | assert "raw_manifest" not in directory.to_dict() | ||||
raw_manifest = b"foo" | raw_manifest = b"foo" | ||||
id_ = hashlib.new("sha1", raw_manifest).digest() | id_ = hashlib.new("sha1", raw_manifest).digest() | ||||
directory2 = attr.evolve(directory, raw_manifest=raw_manifest) | directory2 = attr.evolve(directory, raw_manifest=raw_manifest) | ||||
assert directory2.to_dict()["raw_manifest"] == raw_manifest | assert directory2.to_dict()["raw_manifest"] == raw_manifest | ||||
▲ Show 20 Lines • Show All 163 Lines • ▼ Show 20 Lines | def test_directory_from_possibly_duplicated_entries__preserve_manifest(): | ||||
) | ) | ||||
assert dir_.raw_manifest == b"blah" | assert dir_.raw_manifest == b"blah" | ||||
# Release | # Release | ||||
@given(strategies.releases().filter(lambda rel: rel.raw_manifest is None)) | @given(strategies.releases(raw_manifest=none())) | ||||
def test_release_check(release): | def test_release_check(release): | ||||
release.check() | release.check() | ||||
release2 = attr.evolve(release, id=b"\x00" * 20) | release2 = attr.evolve(release, id=b"\x00" * 20) | ||||
with pytest.raises(ValueError, match="does not match recomputed hash"): | with pytest.raises(ValueError, match="does not match recomputed hash"): | ||||
release2.check() | release2.check() | ||||
release2 = attr.evolve( | release2 = attr.evolve( | ||||
release, raw_manifest=swh.model.git_objects.release_git_object(release) | release, raw_manifest=swh.model.git_objects.release_git_object(release) | ||||
) | ) | ||||
with pytest.raises( | with pytest.raises( | ||||
ValueError, match="non-none raw_manifest attribute, but does not need it." | ValueError, match="non-none raw_manifest attribute, but does not need it." | ||||
): | ): | ||||
release2.check() | release2.check() | ||||
@given(strategies.releases().filter(lambda rev: rev.raw_manifest is None)) | @given(strategies.releases(raw_manifest=none())) | ||||
def test_release_raw_manifest(release): | def test_release_raw_manifest(release): | ||||
raw_manifest = b"foo" | raw_manifest = b"foo" | ||||
id_ = hashlib.new("sha1", raw_manifest).digest() | id_ = hashlib.new("sha1", raw_manifest).digest() | ||||
release2 = attr.evolve(release, raw_manifest=raw_manifest) | release2 = attr.evolve(release, raw_manifest=raw_manifest) | ||||
assert release2.to_dict()["raw_manifest"] == raw_manifest | assert release2.to_dict()["raw_manifest"] == raw_manifest | ||||
with pytest.raises(ValueError, match="does not match recomputed hash"): | with pytest.raises(ValueError, match="does not match recomputed hash"): | ||||
release2.check() | release2.check() | ||||
release2 = attr.evolve(release, raw_manifest=raw_manifest, id=id_) | release2 = attr.evolve(release, raw_manifest=raw_manifest, id=id_) | ||||
assert release2.id is not None | assert release2.id is not None | ||||
assert release2.id == id_ != release.id | assert release2.id == id_ != release.id | ||||
assert release2.to_dict()["raw_manifest"] == raw_manifest | assert release2.to_dict()["raw_manifest"] == raw_manifest | ||||
release2.check() | release2.check() | ||||
# Revision | # Revision | ||||
@given(strategies.revisions().filter(lambda rev: rev.raw_manifest is None)) | @given(strategies.revisions(raw_manifest=none())) | ||||
def test_revision_check(revision): | def test_revision_check(revision): | ||||
revision.check() | revision.check() | ||||
revision2 = attr.evolve(revision, id=b"\x00" * 20) | revision2 = attr.evolve(revision, id=b"\x00" * 20) | ||||
with pytest.raises(ValueError, match="does not match recomputed hash"): | with pytest.raises(ValueError, match="does not match recomputed hash"): | ||||
revision2.check() | revision2.check() | ||||
revision2 = attr.evolve( | revision2 = attr.evolve( | ||||
revision, raw_manifest=swh.model.git_objects.revision_git_object(revision) | revision, raw_manifest=swh.model.git_objects.revision_git_object(revision) | ||||
) | ) | ||||
with pytest.raises( | with pytest.raises( | ||||
ValueError, match="non-none raw_manifest attribute, but does not need it." | ValueError, match="non-none raw_manifest attribute, but does not need it." | ||||
): | ): | ||||
revision2.check() | revision2.check() | ||||
@given(strategies.revisions().filter(lambda rev: rev.raw_manifest is None)) | @given(strategies.revisions(raw_manifest=none())) | ||||
def test_revision_raw_manifest(revision): | def test_revision_raw_manifest(revision): | ||||
raw_manifest = b"foo" | raw_manifest = b"foo" | ||||
id_ = hashlib.new("sha1", raw_manifest).digest() | id_ = hashlib.new("sha1", raw_manifest).digest() | ||||
revision2 = attr.evolve(revision, raw_manifest=raw_manifest) | revision2 = attr.evolve(revision, raw_manifest=raw_manifest) | ||||
assert revision2.to_dict()["raw_manifest"] == raw_manifest | assert revision2.to_dict()["raw_manifest"] == raw_manifest | ||||
with pytest.raises(ValueError, match="does not match recomputed hash"): | with pytest.raises(ValueError, match="does not match recomputed hash"): | ||||
▲ Show 20 Lines • Show All 638 Lines • Show Last 20 Lines |