diff --git a/swh/storage/in_memory.py b/swh/storage/in_memory.py --- a/swh/storage/in_memory.py +++ b/swh/storage/in_memory.py @@ -831,13 +831,15 @@ return all_visits def _origin_visit_status_add_one(self, visit_status: OriginVisitStatus) -> None: - """Add an origin visit status without checks. + """Add an origin visit status without checks. If already present, do nothing. """ self.journal_writer.origin_visit_status_add([visit_status]) visit_key = (visit_status.origin, visit_status.visit) self._origin_visit_statuses.setdefault(visit_key, []) - self._origin_visit_statuses[visit_key].append(visit_status) + visit_statuses = self._origin_visit_statuses[visit_key] + if visit_status not in visit_statuses: + visit_statuses.append(visit_status) def origin_visit_status_add( self, visit_statuses: Iterable[OriginVisitStatus], diff --git a/swh/storage/tests/test_storage.py b/swh/storage/tests/test_storage.py --- a/swh/storage/tests/test_storage.py +++ b/swh/storage/tests/test_storage.py @@ -1748,33 +1748,38 @@ with pytest.raises(StorageArgumentException, match="Unknown origin"): swh_storage.origin_visit_status_add([visit_status1]) + objects = list(swh_storage.journal_writer.journal.objects) + assert not objects + def test_origin_visit_status_add(self, swh_storage): """Correct origin visit statuses should add a new visit status """ - origin_url = swh_storage.origin_add_one(data.origin2) + origin1 = Origin.from_dict(data.origin2) + origin2 = Origin(url="new-origin") + swh_storage.origin_add([origin1, origin2]) + visit1 = OriginVisit( - origin=origin_url, + origin=origin1.url, date=data.date_visit1, type=data.type_visit1, status="ongoing", snapshot=None, ) - origin_url2 = swh_storage.origin_add_one({"url": "new-origin"}) visit2 = OriginVisit( - origin=origin_url2, + origin=origin2.url, date=data.date_visit2, type=data.type_visit2, status="ongoing", snapshot=None, ) - origin_visit1, origin_visit2 = swh_storage.origin_visit_add([visit1, visit2]) + ov1, ov2 = swh_storage.origin_visit_add([visit1, visit2]) snapshot_id = data.snapshot["id"] date_visit_now = now() visit_status1 = OriginVisitStatus( - origin=origin_visit1.origin, - visit=origin_visit1.visit, + origin=ov1.origin, + visit=ov1.visit, date=date_visit_now, status="full", snapshot=snapshot_id, @@ -1782,8 +1787,8 @@ date_visit_now = now() visit_status2 = OriginVisitStatus( - origin=origin_visit2.origin, - visit=origin_visit2.visit, + origin=ov2.origin, + visit=ov2.visit, date=date_visit_now, status="ongoing", snapshot=None, @@ -1792,21 +1797,38 @@ swh_storage.origin_visit_status_add([visit_status1, visit_status2]) origin_visit1 = swh_storage.origin_visit_get_latest( - origin_url, require_snapshot=True + origin1.url, require_snapshot=True ) assert origin_visit1 assert origin_visit1["status"] == "full" assert origin_visit1["snapshot"] == snapshot_id origin_visit2 = swh_storage.origin_visit_get_latest( - origin_url2, require_snapshot=False + origin2.url, require_snapshot=False ) - assert origin_url2 != origin_url + assert origin2.url != origin1.url assert origin_visit2 assert origin_visit2["status"] == "ongoing" assert origin_visit2["snapshot"] is None assert origin_visit2["metadata"] == {"intrinsic": "something"} + objects = list(swh_storage.journal_writer.journal.objects) + visit_status1_dict = ov1.to_dict() + visit_status1_dict.pop("type") + visit_status2_dict = ov2.to_dict() + visit_status2_dict.pop("type") + + assert objects == [ + ("origin", origin1), + ("origin", origin2), + ("origin_visit", ov1), + ("origin_visit_status", OriginVisitStatus.from_dict(visit_status1_dict)), + ("origin_visit", ov2), + ("origin_visit_status", OriginVisitStatus.from_dict(visit_status2_dict)), + ("origin_visit_status", visit_status1), + ("origin_visit_status", visit_status2), + ] + def test_origin_visit_update(self, swh_storage): # given origin_url = swh_storage.origin_add_one(data.origin)