diff --git a/assets/src/bundles/browse/origin-search.js b/assets/src/bundles/browse/origin-search.js --- a/assets/src/bundles/browse/origin-search.js +++ b/assets/src/bundles/browse/origin-search.js @@ -248,14 +248,15 @@ event.preventDefault(); }); - const urlParams = new URLSearchParams(window.location.search); - const query = urlParams.get('q'); - const withVisit = urlParams.has('with_visit'); - const useSearchQL = urlParams.has('use_ql'); - const withContent = urlParams.has('with_content'); - const searchMetadata = urlParams.has('search_metadata'); - const visitType = urlParams.get('visit_type'); - if (query) { + if (window.location.search) { + const urlParams = new URLSearchParams(window.location.search); + const query = urlParams.get('q'); + const withVisit = urlParams.has('with_visit'); + const useSearchQL = urlParams.has('use_ql'); + const withContent = urlParams.has('with_content'); + const searchMetadata = urlParams.has('search_metadata'); + const visitType = urlParams.get('visit_type'); + $('#swh-origins-url-patterns').val(query); $('#swh-search-origins-with-visit').prop('checked', withVisit); $('#swh-search-use-ql').prop('checked', useSearchQL ?? false); diff --git a/cypress/integration/origin-search.spec.js b/cypress/integration/origin-search.spec.js --- a/cypress/integration/origin-search.spec.js +++ b/cypress/integration/origin-search.spec.js @@ -266,6 +266,51 @@ }); + function checkSearchHasResults() { + cy.get('.swh-search-icon') + .click(); + + cy.wait('@checkOriginVisits'); + + cy.get('#origin-search-results') + .should('be.visible'); + + cy.get('tbody tr td.swh-origin-visit-type') + .should('exist'); + } + + it('should search all origins when no pattern is provided', function() { + cy.intercept('**/visit/latest/**').as('checkOriginVisits'); + + // with default filters + checkSearchHasResults(); + + // remove filters + cy.get('#swh-search-origins-with-visit') + .uncheck({force: true}) + .get('#swh-filter-empty-visits') + .uncheck({force: true}); + checkSearchHasResults(); + + }); + + it('should search all origins for a visit type', function() { + cy.intercept('**/visit/latest/**').as('checkOriginVisits'); + + for (const visitType of ['git', 'tar']) { + cy.get('#swh-search-visit-type') + .select(visitType); + + checkSearchHasResults(); + + cy.get('tbody tr td.swh-origin-visit-type').then(elts => { + for (const elt of elts) { + cy.get(elt).should('have.text', visitType); + } + }); + } + }); + context('Test pagination', function() { it('should not paginate if there are not many results', function() { // Setup search diff --git a/swh/web/api/views/origin.py b/swh/web/api/views/origin.py --- a/swh/web/api/views/origin.py +++ b/swh/web/api/views/origin.py @@ -161,7 +161,7 @@ @api_route( - r"/origin/search/(?P.+)/", + r"/origin/search/(?P.*)/", "api-1-origin-search", throttle_scope="swh_api_origin_search", ) diff --git a/swh/web/templates/includes/origin-search-form.html b/swh/web/templates/includes/origin-search-form.html --- a/swh/web/templates/includes/origin-search-form.html +++ b/swh/web/templates/includes/origin-search-form.html @@ -10,7 +10,7 @@ + oninput="swh.webapp.validateSWHIDInput(this)" autofocus>
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 @@ -793,3 +793,46 @@ for obj in ["content", "origin", "release", "directory", "revision"]: assert counts.get(obj, 0) > 0 + + +@pytest.fixture +def archived_origins(archive_data): + page_result = archive_data.origin_list(page_token=None, limit=10000) + origins = [origin.to_dict() for origin in page_result.results] + for origin in origins: + ovs = archive_data.origin_visit_get_with_statuses(origin["url"]).results + del origin["id"] + origin["type"] = ovs[0].visit.type + + return origins + + +def test_api_origin_search_empty_pattern(api_client, archived_origins): + url = reverse( + "api-1-origin-search", + url_args={"url_pattern": ""}, + query_params={"limit": 10000}, + ) + + rv = check_api_get_responses(api_client, url, status_code=200) + + assert {o["url"] for o in rv.data} == {o["url"] for o in archived_origins} + + +def test_api_origin_search_empty_pattern_and_visit_type(api_client, archived_origins): + + visit_types = {o["type"] for o in archived_origins} + + for visit_type in visit_types: + + url = reverse( + "api-1-origin-search", + url_args={"url_pattern": ""}, + query_params={"visit_type": visit_type, "limit": 10000}, + ) + + rv = check_api_get_responses(api_client, url, status_code=200) + + assert {o["url"] for o in rv.data} == { + o["url"] for o in archived_origins if o["type"] == visit_type + }