diff --git a/swh/web/tests/api/views/test_metadata.py b/swh/web/tests/api/views/test_metadata.py --- a/swh/web/tests/api/views/test_metadata.py +++ b/swh/web/tests/api/views/test_metadata.py @@ -14,76 +14,90 @@ @given(raw_extrinsic_metadata()) -def test_api_raw_extrinsic_metadata(api_client, archive_data, metadata): - archive_data.metadata_authority_add([metadata.authority]) - archive_data.metadata_fetcher_add([metadata.fetcher]) - archive_data.raw_extrinsic_metadata_add([metadata]) +def test_api_raw_extrinsic_metadata(api_client, subtest, metadata): + # ensure archive_data fixture will be reset between each hypothesis + # example test run + @subtest + def test_inner(archive_data): + archive_data.metadata_authority_add([metadata.authority]) + archive_data.metadata_fetcher_add([metadata.fetcher]) + archive_data.raw_extrinsic_metadata_add([metadata]) + + authority = metadata.authority + url = reverse( + "api-1-raw-extrinsic-metadata-swhid", + url_args={"target": str(metadata.target)}, + query_params={"authority": f"{authority.type.value} {authority.url}"}, + ) + rv = check_api_get_responses(api_client, url, status_code=200) + + assert len(rv.data) == 1 + + expected_result = metadata.to_dict() + del expected_result["id"] + del expected_result["metadata"] + metadata_url = rv.data[0]["metadata_url"] + expected_result["metadata_url"] = metadata_url + expected_result["discovery_date"] = expected_result[ + "discovery_date" + ].isoformat() + assert rv.data == [expected_result] - authority = metadata.authority - url = reverse( - "api-1-raw-extrinsic-metadata-swhid", - url_args={"target": str(metadata.target)}, - query_params={"authority": f"{authority.type.value} {authority.url}"}, - ) - rv = check_api_get_responses(api_client, url, status_code=200) - - assert len(rv.data) == 1 - - expected_result = metadata.to_dict() - del expected_result["id"] - del expected_result["metadata"] - metadata_url = rv.data[0]["metadata_url"] - expected_result["metadata_url"] = metadata_url - expected_result["discovery_date"] = expected_result["discovery_date"].isoformat() - assert rv.data == [expected_result] - - rv = check_http_get_response(api_client, metadata_url, status_code=200) - assert rv["Content-Type"] == "application/octet-stream" - assert ( - rv["Content-Disposition"] - == f'attachment; filename="{metadata.target}_metadata"' - ) - assert rv.content == metadata.metadata + rv = check_http_get_response(api_client, metadata_url, status_code=200) + assert rv["Content-Type"] == "application/octet-stream" + assert ( + rv["Content-Disposition"] + == f'attachment; filename="{metadata.target}_metadata"' + ) + assert rv.content == metadata.metadata @pytest.mark.parametrize("limit", [1, 2, 10, 100]) @given(strategies.sets(raw_extrinsic_metadata(), min_size=1)) -def test_api_raw_extrinsic_metadata_scroll(api_client, archive_data, limit, metadata): - # Make all metadata objects use the same authority and target - metadata0 = next(iter(metadata)) - metadata = { - attr.evolve(m, authority=metadata0.authority, target=metadata0.target) - for m in metadata - } - authority = metadata0.authority - - archive_data.metadata_authority_add([authority]) - archive_data.metadata_fetcher_add(list({m.fetcher for m in metadata})) - archive_data.raw_extrinsic_metadata_add(metadata) +def test_api_raw_extrinsic_metadata_scroll(api_client, subtest, limit, meta): + # ensure archive_data fixture will be reset between each hypothesis + # example test run + @subtest + def test_inner(archive_data): + # Make all metadata objects use the same authority and target + metadata0 = next(iter(meta)) + metadata = { + attr.evolve(m, authority=metadata0.authority, target=metadata0.target) + for m in meta + } + # Metadata ids must also be updated as they depend on authority and target + metadata = {attr.evolve(m, id=m.compute_hash()) for m in metadata} + authority = metadata0.authority + + archive_data.metadata_authority_add([authority]) + archive_data.metadata_fetcher_add(list({m.fetcher for m in metadata})) + archive_data.raw_extrinsic_metadata_add(metadata) + + url = reverse( + "api-1-raw-extrinsic-metadata-swhid", + url_args={"target": str(metadata0.target)}, + query_params={ + "authority": f"{authority.type.value} {authority.url}", + "limit": limit, + }, + ) - url = reverse( - "api-1-raw-extrinsic-metadata-swhid", - url_args={"target": str(metadata0.target)}, - query_params={ - "authority": f"{authority.type.value} {authority.url}", - "limit": limit, - }, - ) + results = scroll_results(api_client, url) - results = scroll_results(api_client, url) + expected_results = [m.to_dict() for m in metadata] - expected_results = [m.to_dict() for m in metadata] - for expected_result in expected_results: - del expected_result["id"] - del expected_result["metadata"] - expected_result["discovery_date"] = expected_result[ - "discovery_date" - ].isoformat() + for expected_result in expected_results: + del expected_result["id"] + del expected_result["metadata"] + expected_result["discovery_date"] = expected_result[ + "discovery_date" + ].isoformat() - for result in results: - del result["metadata_url"] + assert len(results) == len(expected_results) - assert results == expected_results + for result in results: + del result["metadata_url"] + assert result in expected_results _swhid = "swh:1:dir:a2faa28028657859c16ff506924212b33f0e1307" @@ -140,31 +154,35 @@ @given(raw_extrinsic_metadata()) -def test_api_raw_extrinsic_metadata_list_authorities( - api_client, archive_data, metadata -): - archive_data.metadata_authority_add([metadata.authority]) - archive_data.metadata_fetcher_add([metadata.fetcher]) - archive_data.raw_extrinsic_metadata_add([metadata]) - - authority = metadata.authority - url = reverse( - "api-1-raw-extrinsic-metadata-swhid-authorities", - url_args={"target": str(metadata.target)}, - ) - rv = check_api_get_responses(api_client, url, status_code=200) - - expected_results = [ - { - "type": authority.type.value, - "url": authority.url, - "metadata_list_url": "http://testserver" - + reverse( - "api-1-raw-extrinsic-metadata-swhid", - url_args={"target": str(metadata.target)}, - query_params={"authority": f"{authority.type.value} {authority.url}"}, - ), - } - ] - - assert rv.data == expected_results +def test_api_raw_extrinsic_metadata_list_authorities(api_client, subtest, metadata): + # ensure archive_data fixture will be reset between each hypothesis + # example test run + @subtest + def test_inner(archive_data): + archive_data.metadata_authority_add([metadata.authority]) + archive_data.metadata_fetcher_add([metadata.fetcher]) + archive_data.raw_extrinsic_metadata_add([metadata]) + + authority = metadata.authority + url = reverse( + "api-1-raw-extrinsic-metadata-swhid-authorities", + url_args={"target": str(metadata.target)}, + ) + rv = check_api_get_responses(api_client, url, status_code=200) + + expected_results = [ + { + "type": authority.type.value, + "url": authority.url, + "metadata_list_url": "http://testserver" + + reverse( + "api-1-raw-extrinsic-metadata-swhid", + url_args={"target": str(metadata.target)}, + query_params={ + "authority": f"{authority.type.value} {authority.url}" + }, + ), + } + ] + + assert rv.data == expected_results diff --git a/swh/web/tests/api/views/test_origin.py b/swh/web/tests/api/views/test_origin.py --- a/swh/web/tests/api/views/test_origin.py +++ b/swh/web/tests/api/views/test_origin.py @@ -71,131 +71,142 @@ @given(new_origin(), visit_dates(3), new_snapshots(3)) def test_api_lookup_origin_visits( - api_client, archive_data, new_origin, visit_dates, new_snapshots + api_client, subtest, new_origin, visit_dates, new_snapshots ): + # ensure archive_data fixture will be reset between each hypothesis + # example test run + @subtest + def test_inner(archive_data): + archive_data.origin_add([new_origin]) + for i, visit_date in enumerate(visit_dates): + origin_visit = archive_data.origin_visit_add( + [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] + )[0] + archive_data.snapshot_add([new_snapshots[i]]) + visit_status = OriginVisitStatus( + origin=new_origin.url, + visit=origin_visit.visit, + date=now(), + status="full", + snapshot=new_snapshots[i].id, + ) + archive_data.origin_visit_status_add([visit_status]) - archive_data.origin_add([new_origin]) - for i, visit_date in enumerate(visit_dates): - origin_visit = archive_data.origin_visit_add( - [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] - )[0] - archive_data.snapshot_add([new_snapshots[i]]) - visit_status = OriginVisitStatus( - origin=new_origin.url, - visit=origin_visit.visit, - date=now(), - status="full", - snapshot=new_snapshots[i].id, - ) - archive_data.origin_visit_status_add([visit_status]) + all_visits = list(reversed(get_origin_visits(new_origin.to_dict()))) - all_visits = list(reversed(get_origin_visits(new_origin.to_dict()))) + for last_visit, expected_visits in ( + (None, all_visits[:2]), + (all_visits[1]["visit"], all_visits[2:]), + ): - for last_visit, expected_visits in ( - (None, all_visits[:2]), - (all_visits[1]["visit"], all_visits[2:]), - ): + url = reverse( + "api-1-origin-visits", + url_args={"origin_url": new_origin.url}, + query_params={"per_page": 2, "last_visit": last_visit}, + ) - url = reverse( - "api-1-origin-visits", - url_args={"origin_url": new_origin.url}, - query_params={"per_page": 2, "last_visit": last_visit}, - ) + rv = check_api_get_responses(api_client, url, status_code=200) - rv = check_api_get_responses(api_client, url, status_code=200) + for i in range(len(expected_visits)): + expected_visits[i] = enrich_origin_visit( + expected_visits[i], + with_origin_link=False, + with_origin_visit_link=True, + request=rv.wsgi_request, + ) - for i in range(len(expected_visits)): - expected_visits[i] = enrich_origin_visit( - expected_visits[i], - with_origin_link=False, - with_origin_visit_link=True, - request=rv.wsgi_request, - ) - - assert rv.data == expected_visits + assert rv.data == expected_visits @given(new_origin(), visit_dates(3), new_snapshots(3)) def test_api_lookup_origin_visits_by_id( - api_client, archive_data, new_origin, visit_dates, new_snapshots + api_client, subtest, new_origin, visit_dates, new_snapshots ): - archive_data.origin_add([new_origin]) - for i, visit_date in enumerate(visit_dates): - origin_visit = archive_data.origin_visit_add( - [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] - )[0] - archive_data.snapshot_add([new_snapshots[i]]) - visit_status = OriginVisitStatus( - origin=new_origin.url, - visit=origin_visit.visit, - date=now(), - status="full", - snapshot=new_snapshots[i].id, - ) - archive_data.origin_visit_status_add([visit_status]) + # ensure archive_data fixture will be reset between each hypothesis + # example test run + @subtest + def test_inner(archive_data): + archive_data.origin_add([new_origin]) + for i, visit_date in enumerate(visit_dates): + origin_visit = archive_data.origin_visit_add( + [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] + )[0] + archive_data.snapshot_add([new_snapshots[i]]) + visit_status = OriginVisitStatus( + origin=new_origin.url, + visit=origin_visit.visit, + date=now(), + status="full", + snapshot=new_snapshots[i].id, + ) + archive_data.origin_visit_status_add([visit_status]) - all_visits = list(reversed(get_origin_visits(new_origin.to_dict()))) + all_visits = list(reversed(get_origin_visits(new_origin.to_dict()))) - for last_visit, expected_visits in ( - (None, all_visits[:2]), - (all_visits[1]["visit"], all_visits[2:4]), - ): + for last_visit, expected_visits in ( + (None, all_visits[:2]), + (all_visits[1]["visit"], all_visits[2:4]), + ): - url = reverse( - "api-1-origin-visits", - url_args={"origin_url": new_origin.url}, - query_params={"per_page": 2, "last_visit": last_visit}, - ) + url = reverse( + "api-1-origin-visits", + url_args={"origin_url": new_origin.url}, + query_params={"per_page": 2, "last_visit": last_visit}, + ) - rv = check_api_get_responses(api_client, url, status_code=200) + rv = check_api_get_responses(api_client, url, status_code=200) - for i in range(len(expected_visits)): - expected_visits[i] = enrich_origin_visit( - expected_visits[i], - with_origin_link=False, - with_origin_visit_link=True, - request=rv.wsgi_request, - ) + for i in range(len(expected_visits)): + expected_visits[i] = enrich_origin_visit( + expected_visits[i], + with_origin_link=False, + with_origin_visit_link=True, + request=rv.wsgi_request, + ) - assert rv.data == expected_visits + assert rv.data == expected_visits @given(new_origin(), visit_dates(3), new_snapshots(3)) def test_api_lookup_origin_visit( - api_client, archive_data, new_origin, visit_dates, new_snapshots + api_client, subtest, new_origin, visit_dates, new_snapshots ): - archive_data.origin_add([new_origin]) - for i, visit_date in enumerate(visit_dates): - origin_visit = archive_data.origin_visit_add( - [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] - )[0] - visit_id = origin_visit.visit - archive_data.snapshot_add([new_snapshots[i]]) - visit_status = OriginVisitStatus( - origin=new_origin.url, - visit=origin_visit.visit, - date=visit_date + timedelta(minutes=5), - status="full", - snapshot=new_snapshots[i].id, - ) - archive_data.origin_visit_status_add([visit_status]) - url = reverse( - "api-1-origin-visit", - url_args={"origin_url": new_origin.url, "visit_id": visit_id}, - ) + # ensure archive_data fixture will be reset between each hypothesis + # example test run + @subtest + def test_inner(archive_data): + archive_data.origin_add([new_origin]) + for i, visit_date in enumerate(visit_dates): + origin_visit = archive_data.origin_visit_add( + [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] + )[0] + visit_id = origin_visit.visit + archive_data.snapshot_add([new_snapshots[i]]) + visit_status = OriginVisitStatus( + origin=new_origin.url, + visit=origin_visit.visit, + date=visit_date + timedelta(minutes=5), + status="full", + snapshot=new_snapshots[i].id, + ) + archive_data.origin_visit_status_add([visit_status]) + url = reverse( + "api-1-origin-visit", + url_args={"origin_url": new_origin.url, "visit_id": visit_id}, + ) - rv = check_api_get_responses(api_client, url, status_code=200) + rv = check_api_get_responses(api_client, url, status_code=200) - expected_visit = archive_data.origin_visit_get_by(new_origin.url, visit_id) + expected_visit = archive_data.origin_visit_get_by(new_origin.url, visit_id) - expected_visit = enrich_origin_visit( - expected_visit, - with_origin_link=True, - with_origin_visit_link=False, - request=rv.wsgi_request, - ) + expected_visit = enrich_origin_visit( + expected_visit, + with_origin_link=True, + with_origin_visit_link=False, + request=rv.wsgi_request, + ) - assert rv.data == expected_visit + assert rv.data == expected_visit @given(new_origin()) @@ -213,90 +224,102 @@ @given(new_origin(), visit_dates(2), new_snapshots(1)) def test_api_lookup_origin_visit_latest( - api_client, archive_data, new_origin, visit_dates, new_snapshots + api_client, subtest, new_origin, visit_dates, new_snapshots ): - archive_data.origin_add([new_origin]) - visit_dates.sort() - visit_ids = [] - for i, visit_date in enumerate(visit_dates): - origin_visit = archive_data.origin_visit_add( - [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] - )[0] - visit_ids.append(origin_visit.visit) - - archive_data.snapshot_add([new_snapshots[0]]) - - visit_status = OriginVisitStatus( - origin=new_origin.url, - visit=visit_ids[0], - date=now(), - status="full", - snapshot=new_snapshots[0].id, - ) - archive_data.origin_visit_status_add([visit_status]) + # ensure archive_data fixture will be reset between each hypothesis + # example test run + @subtest + def test_inner(archive_data): + archive_data.origin_add([new_origin]) + visit_dates.sort() + visit_ids = [] + for i, visit_date in enumerate(visit_dates): + origin_visit = archive_data.origin_visit_add( + [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] + )[0] + visit_ids.append(origin_visit.visit) + + archive_data.snapshot_add([new_snapshots[0]]) - url = reverse("api-1-origin-visit-latest", url_args={"origin_url": new_origin.url}) + visit_status = OriginVisitStatus( + origin=new_origin.url, + visit=visit_ids[0], + date=now(), + status="full", + snapshot=new_snapshots[0].id, + ) + archive_data.origin_visit_status_add([visit_status]) - rv = check_api_get_responses(api_client, url, status_code=200) + url = reverse( + "api-1-origin-visit-latest", url_args={"origin_url": new_origin.url} + ) - expected_visit = archive_data.origin_visit_get_by(new_origin.url, visit_ids[1]) + rv = check_api_get_responses(api_client, url, status_code=200) - expected_visit = enrich_origin_visit( - expected_visit, - with_origin_link=True, - with_origin_visit_link=False, - request=rv.wsgi_request, - ) + expected_visit = archive_data.origin_visit_status_get_latest( + new_origin.url, type="git" + ) + + expected_visit = enrich_origin_visit( + expected_visit, + with_origin_link=True, + with_origin_visit_link=False, + request=rv.wsgi_request, + ) - assert rv.data == expected_visit + assert rv.data == expected_visit @given(new_origin(), visit_dates(2), new_snapshots(1)) def test_api_lookup_origin_visit_latest_with_snapshot( - api_client, archive_data, new_origin, visit_dates, new_snapshots + api_client, subtest, new_origin, visit_dates, new_snapshots ): - archive_data.origin_add([new_origin]) - visit_dates.sort() - visit_ids = [] - for i, visit_date in enumerate(visit_dates): - origin_visit = archive_data.origin_visit_add( - [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] - )[0] - visit_ids.append(origin_visit.visit) - - archive_data.snapshot_add([new_snapshots[0]]) - - # Add snapshot to the latest visit - visit_id = visit_ids[-1] - visit_status = OriginVisitStatus( - origin=new_origin.url, - visit=visit_id, - date=now(), - status="full", - snapshot=new_snapshots[0].id, - ) - archive_data.origin_visit_status_add([visit_status]) + # ensure archive_data fixture will be reset between each hypothesis + # example test run + @subtest + def test_inner(archive_data): + archive_data.origin_add([new_origin]) + visit_dates.sort() + visit_ids = [] + for i, visit_date in enumerate(visit_dates): + origin_visit = archive_data.origin_visit_add( + [OriginVisit(origin=new_origin.url, date=visit_date, type="git",)] + )[0] + visit_ids.append(origin_visit.visit) + + archive_data.snapshot_add([new_snapshots[0]]) + + # Add snapshot to the latest visit + visit_id = visit_ids[-1] + visit_status = OriginVisitStatus( + origin=new_origin.url, + visit=visit_id, + date=now(), + status="full", + snapshot=new_snapshots[0].id, + ) + archive_data.origin_visit_status_add([visit_status]) - url = reverse( - "api-1-origin-visit-latest", - url_args={"origin_url": new_origin.url}, - query_params={"require_snapshot": True}, - ) + url = reverse( + "api-1-origin-visit-latest", + url_args={"origin_url": new_origin.url}, + query_params={"require_snapshot": True}, + ) - rv = check_api_get_responses(api_client, url, status_code=200) + rv = check_api_get_responses(api_client, url, status_code=200) - expected_visit = archive_data.origin_visit_status_get_latest( - new_origin.url, type="git", require_snapshot=True - ) + expected_visit = archive_data.origin_visit_status_get_latest( + new_origin.url, type="git", require_snapshot=True + ) - expected_visit = enrich_origin_visit( - expected_visit, - with_origin_link=True, - with_origin_visit_link=False, - request=rv.wsgi_request, - ) + expected_visit = enrich_origin_visit( + expected_visit, + with_origin_link=True, + with_origin_visit_link=False, + request=rv.wsgi_request, + ) - assert rv.data == expected_visit + assert rv.data == expected_visit @given(origin()) diff --git a/swh/web/tests/browse/views/test_origin.py b/swh/web/tests/browse/views/test_origin.py --- a/swh/web/tests/browse/views/test_origin.py +++ b/swh/web/tests/browse/views/test_origin.py @@ -643,7 +643,6 @@ assert re.search("snapshot.*is empty", resp.content.decode("utf-8")) assert mock_get_origin_visit_snapshot.called assert mock_snapshot_archive.lookup_origin.called - assert mock_snapshot_archive.lookup_snapshot_sizes.called @given(origin()) @@ -696,7 +695,6 @@ assert re.search("snapshot.*is empty", resp_content) assert not re.search("swh-tr-link", resp_content) assert mock_get_origin_visit_snapshot.called - assert mock_archive.lookup_snapshot_sizes.called @given(new_origin()) diff --git a/swh/web/tests/common/test_archive.py b/swh/web/tests/common/test_archive.py --- a/swh/web/tests/common/test_archive.py +++ b/swh/web/tests/common/test_archive.py @@ -204,22 +204,29 @@ @given(new_origin(), visit_dates()) -def test_lookup_origin_visits(archive_data, new_origin, visit_dates): - archive_data.origin_add([new_origin]) - - archive_data.origin_visit_add( - [OriginVisit(origin=new_origin.url, date=ts, type="git",) for ts in visit_dates] - ) +def test_lookup_origin_visits(subtest, new_origin, visit_dates): + # ensure archive_data fixture will be reset between each hypothesis + # example test run + @subtest + def test_inner(archive_data): + archive_data.origin_add([new_origin]) + + archive_data.origin_visit_add( + [ + OriginVisit(origin=new_origin.url, date=ts, type="git",) + for ts in visit_dates + ] + ) - actual_origin_visits = list( - archive.lookup_origin_visits(new_origin.url, per_page=100) - ) + actual_origin_visits = list( + archive.lookup_origin_visits(new_origin.url, per_page=100) + ) - expected_visits = archive_data.origin_visit_get(new_origin.url) - for expected_visit in expected_visits: - expected_visit["origin"] = new_origin.url + expected_visits = archive_data.origin_visit_get(new_origin.url) + for expected_visit in expected_visits: + expected_visit["origin"] = new_origin.url - assert actual_origin_visits == expected_visits + assert actual_origin_visits == expected_visits @given(new_origin(), visit_dates()) diff --git a/swh/web/tests/common/test_identifiers.py b/swh/web/tests/common/test_identifiers.py --- a/swh/web/tests/common/test_identifiers.py +++ b/swh/web/tests/common/test_identifiers.py @@ -610,10 +610,11 @@ @given(directory()) -def test_resolve_swhid_with_escaped_chars(directory): - origin = "http://example.org/?project=abc;" - origin_swhid_escaped = quote(origin, safe="/?:@&") - origin_swhid_url_escaped = quote(origin, safe="/:@;") +def test_resolve_swhid_with_escaped_chars(archive_data, directory): + origin_url = "http://example.org/?project=abc;" + archive_data.origin_add([Origin(url=origin_url)]) + origin_swhid_escaped = quote(origin_url, safe="/?:@&") + origin_swhid_url_escaped = quote(origin_url, safe="/:@;") swhid = gen_swhid(DIRECTORY, directory, metadata={"origin": origin_swhid_escaped}) resolved_swhid = resolve_swhid(swhid) assert resolved_swhid["swhid_parsed"].origin == origin_swhid_escaped diff --git a/swh/web/tests/conftest.py b/swh/web/tests/conftest.py --- a/swh/web/tests/conftest.py +++ b/swh/web/tests/conftest.py @@ -10,6 +10,7 @@ import sys from typing import Any, Dict, List, Optional +from _pytest.python import Function from hypothesis import HealthCheck, settings import pytest @@ -138,7 +139,7 @@ # Initialize tests data -@pytest.fixture(scope="session", autouse=True) +@pytest.fixture(scope="function", autouse=True) def tests_data(): data = get_tests_data(reset=True) # Update swh-web configuration to use the in-memory storages @@ -150,13 +151,13 @@ # Fixture to manipulate data from a sample archive used in the tests -@pytest.fixture(scope="session") +@pytest.fixture(scope="function") def archive_data(tests_data): return _ArchiveData(tests_data) # Fixture to manipulate indexer data from a sample archive used in the tests -@pytest.fixture(scope="session") +@pytest.fixture(scope="function") def indexer_data(tests_data): return _IndexerData(tests_data) @@ -393,3 +394,38 @@ keycloak_oidc_client.return_value = keycloak_oidc return keycloak_oidc + + +@pytest.fixture +def subtest(request): + """A hack to explicitly set up and tear down fixtures. + + This fixture allows you to set up and tear down fixtures within the test + function itself. This is useful (necessary!) for using Hypothesis inside + pytest, as hypothesis will call the test function multiple times, without + setting up or tearing down fixture state as it is normally the case. + + Copied from the pytest-subtesthack project, public domain license + (https://github.com/untitaker/pytest-subtesthack). + """ + parent_test = request.node + + def inner(func): + if hasattr(Function, "from_parent"): + item = Function.from_parent( + parent_test, + name=request.function.__name__ + "[]", + originalname=request.function.__name__, + callobj=func, + ) + else: + item = Function( + name=request.function.__name__ + "[]", parent=parent_test, callobj=func + ) + nextitem = parent_test # prevents pytest from tearing down module fixtures + + item.ihook.pytest_runtest_setup(item=item) + item.ihook.pytest_runtest_call(item=item) + item.ihook.pytest_runtest_teardown(item=item, nextitem=nextitem) + + return inner diff --git a/swh/web/tests/strategies.py b/swh/web/tests/strategies.py --- a/swh/web/tests/strategies.py +++ b/swh/web/tests/strategies.py @@ -50,14 +50,6 @@ # The following strategies exploit the hypothesis capabilities -def _filter_checksum(cs): - generated_checksums = get_tests_data()["generated_checksums"] - if not int.from_bytes(cs, byteorder="little") or cs in generated_checksums: - return False - generated_checksums.add(cs) - return True - - def _known_swh_object(object_type): return sampled_from(get_tests_data()[object_type]) @@ -66,21 +58,21 @@ """ Hypothesis strategy returning a valid hexadecimal sha1 value. """ - return binary(min_size=20, max_size=20).filter(_filter_checksum).map(hash_to_hex) + return binary(min_size=20, max_size=20).map(hash_to_hex) def invalid_sha1(): """ Hypothesis strategy returning an invalid sha1 representation. """ - return binary(min_size=50, max_size=50).filter(_filter_checksum).map(hash_to_hex) + return binary(min_size=50, max_size=50).map(hash_to_hex) def sha256(): """ Hypothesis strategy returning a valid hexadecimal sha256 value. """ - return binary(min_size=32, max_size=32).filter(_filter_checksum).map(hash_to_hex) + return binary(min_size=32, max_size=32).map(hash_to_hex) def content(): @@ -344,9 +336,7 @@ Hypothesis strategy returning a random origin not ingested into the test archive. """ - return new_origin_strategy().filter( - lambda origin: get_tests_data()["storage"].origin_get([origin.url])[0] is None - ) + return new_origin_strategy() def new_origins(nb_origins=None):