From 1d6335363c028591d72eac40c85109d435e469cb Mon Sep 17 00:00:00 2001 From: Leonidas Spyropoulos Date: Mon, 1 Aug 2022 19:02:17 +0300 Subject: [PATCH] fix: strip whitespace when parsing package keywords Remove all extra whitespace when parsing Keywords to ensure we don't add empty keywords in the DB. Closes: #332 Signed-off-by: Leonidas Spyropoulos --- aurweb/routers/pkgbase.py | 2 +- test/test_pkgbase_routes.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/aurweb/routers/pkgbase.py b/aurweb/routers/pkgbase.py index 2cef5436..6cd4199d 100644 --- a/aurweb/routers/pkgbase.py +++ b/aurweb/routers/pkgbase.py @@ -98,7 +98,7 @@ async def pkgbase_keywords(request: Request, name: str, # Lowercase all keywords. Our database table is case insensitive, # and providing CI duplicates of keywords is erroneous. - keywords = set(k.lower() for k in keywords.split(" ")) + keywords = set(k.lower() for k in keywords.split()) # Delete all keywords which are not supplied by the user. with db.begin(): diff --git a/test/test_pkgbase_routes.py b/test/test_pkgbase_routes.py index 3468656e..a152c590 100644 --- a/test/test_pkgbase_routes.py +++ b/test/test_pkgbase_routes.py @@ -1396,3 +1396,33 @@ def test_pkgbase_keywords(client: TestClient, user: User, package: Package): expected = ["abc", "test"] for i, keyword in enumerate(keywords): assert keyword.text.strip() == expected[i] + + +def test_pkgbase_empty_keywords(client: TestClient, user: User, package: Package): + endpoint = f"/pkgbase/{package.PackageBase.Name}" + with client as request: + resp = request.get(endpoint) + assert resp.status_code == int(HTTPStatus.OK) + + root = parse_root(resp.text) + keywords = root.xpath('//a[@class="keyword"]') + assert len(keywords) == 0 + + cookies = {"AURSID": user.login(Request(), "testPassword")} + post_endpoint = f"{endpoint}/keywords" + with client as request: + resp = request.post(post_endpoint, data={ + "keywords": "abc test foo bar " + }, cookies=cookies) + assert resp.status_code == int(HTTPStatus.SEE_OTHER) + + with client as request: + resp = request.get(resp.headers.get("location")) + assert resp.status_code == int(HTTPStatus.OK) + + root = parse_root(resp.text) + keywords = root.xpath('//a[@class="keyword"]') + assert len(keywords) == 4 + expected = ["abc", "bar", "foo", "test"] + for i, keyword in enumerate(keywords): + assert keyword.text.strip() == expected[i]