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