From c28f1695edb6d94c038363648c99768e23d7fcf5 Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Sat, 30 Oct 2021 16:22:54 -0700 Subject: [PATCH] fix(fastapi): support `by` maintainer search with no keywords In this case, package search should return orphaned packages. Signed-off-by: Kevin Morris --- aurweb/packages/search.py | 10 +++++++--- test/test_packages_routes.py | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/aurweb/packages/search.py b/aurweb/packages/search.py index e4729d89..0319a2ba 100644 --- a/aurweb/packages/search.py +++ b/aurweb/packages/search.py @@ -90,9 +90,13 @@ class PackageSearch: return self def _search_by_maintainer(self, keywords: str) -> orm.Query: - self.query = self.query.join( - models.User, models.User.ID == models.PackageBase.MaintainerUID - ).filter(models.User.Username == keywords) + if keywords: + self.query = self.query.join( + models.User, models.User.ID == models.PackageBase.MaintainerUID + ).filter(models.User.Username == keywords) + else: + self.query = self.query.filter( + models.PackageBase.MaintainerUID.is_(None)) return self def _search_by_comaintainer(self, keywords: str) -> orm.Query: diff --git a/test/test_packages_routes.py b/test/test_packages_routes.py index 207be379..c4d9ab1c 100644 --- a/test/test_packages_routes.py +++ b/test/test_packages_routes.py @@ -623,13 +623,36 @@ def test_packages_search_by_keywords(client: TestClient, def test_packages_search_by_maintainer(client: TestClient, maintainer: User, package: Package): + # We should expect that searching by `package`'s maintainer + # returns `package` in the results. with client as request: response = request.get("/packages", params={ "SeB": "m", "K": maintainer.Username }) assert response.status_code == int(HTTPStatus.OK) + root = parse_root(response.text) + rows = root.xpath('//table[@class="results"]/tbody/tr') + assert len(rows) == 1 + # Search again by maintainer with no keywords given. + # This kind of search returns all orphans instead. + # In this first case, there are no orphan packages; assert that. + with client as request: + response = request.get("/packages", params={"SeB": "m"}) + assert response.status_code == int(HTTPStatus.OK) + root = parse_root(response.text) + rows = root.xpath('//table[@class="results"]/tbody/tr') + assert len(rows) == 0 + + # Orphan `package`. + with db.begin(): + package.PackageBase.Maintainer = None + + # This time, we should get `package` returned, since it's now an orphan. + with client as request: + response = request.get("/packages", params={"SeB": "m"}) + assert response.status_code == int(HTTPStatus.OK) root = parse_root(response.text) rows = root.xpath('//table[@class="results"]/tbody/tr') assert len(rows) == 1