diff --git a/tests/unit/search/test_tasks.py b/tests/unit/search/test_tasks.py index 4a988e403588..5dffba9b0328 100644 --- a/tests/unit/search/test_tasks.py +++ b/tests/unit/search/test_tasks.py @@ -31,7 +31,7 @@ unindex_project, ) -from ...common.db.packaging import ProjectFactory, ReleaseFactory +from ...common.db.packaging import FileFactory, ProjectFactory, ReleaseFactory def test_project_docs(db_session): @@ -45,6 +45,16 @@ def test_project_docs(db_session): for p in projects } + for p in projects: + for r in releases[p]: + r.files = [ + FileFactory.create( + release=r, + filename="{}-{}.tar.gz".format(p.name, r.version), + python_version="source", + ) + ] + assert list(_project_docs(db_session)) == [ { "_id": p.normalized_name, @@ -75,6 +85,16 @@ def test_single_project_doc(db_session): for p in projects } + for p in projects: + for r in releases[p]: + r.files = [ + FileFactory.create( + release=r, + filename="{}-{}.tar.gz".format(p.name, r.version), + python_version="source", + ) + ] + assert list(_project_docs(db_session, project_name=projects[1].name)) == [ { "_id": p.normalized_name, @@ -95,6 +115,47 @@ def test_single_project_doc(db_session): ] +def test_project_docs_empty(db_session): + projects = [ProjectFactory.create() for _ in range(2)] + releases = { + p: sorted( + [ReleaseFactory.create(project=p) for _ in range(3)], + key=lambda r: packaging.version.parse(r.version), + reverse=True, + ) + for p in projects + } + + project_with_files = projects[0] + for r in releases[project_with_files]: + r.files = [ + FileFactory.create( + release=r, + filename="{}-{}.tar.gz".format(project_with_files.name, r.version), + python_version="source", + ) + ] + + assert list(_project_docs(db_session)) == [ + { + "_id": p.normalized_name, + "_type": "doc", + "_source": { + "created": p.created, + "name": p.name, + "normalized_name": p.normalized_name, + "version": [r.version for r in prs], + "latest_version": first(prs, key=lambda r: not r.is_prerelease).version, + "description": first( + prs, key=lambda r: not r.is_prerelease + ).description.raw, + }, + } + for p, prs in sorted(releases.items(), key=lambda x: x[0].id) + if p == project_with_files + ] + + class FakeESIndices: def __init__(self): self.indices = {} diff --git a/warehouse/search/tasks.py b/warehouse/search/tasks.py index c1733949386a..f092eb2104f2 100644 --- a/warehouse/search/tasks.py +++ b/warehouse/search/tasks.py @@ -41,7 +41,7 @@ def _project_docs(db, project_name=None): releases_list = ( db.query(Release.id) - .filter(Release.yanked.is_(False)) + .filter(Release.yanked.is_(False), Release.files) .order_by( Release.project_id, Release.is_prerelease.nullslast(),