From 2a6dbd33ddc331d4d73f25bb6315fe6d93af1979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Hells=C3=A9n?= Date: Sat, 17 May 2025 03:58:08 +0200 Subject: [PATCH] Add button for manually updating feed --- discord_rss_bot/main.py | 23 +++++++++++++++++ discord_rss_bot/templates/feed.html | 2 ++ tests/test_main.py | 38 +++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/discord_rss_bot/main.py b/discord_rss_bot/main.py index 3103fe7..4b4b631 100644 --- a/discord_rss_bot/main.py +++ b/discord_rss_bot/main.py @@ -921,6 +921,29 @@ async def remove_feed(feed_url: Annotated[str, Form()]): return RedirectResponse(url="/", status_code=303) +@app.get("/update", response_class=HTMLResponse) +async def update_feed(request: Request, feed_url: str): + """Update a feed. + + Args: + request: The request object. + feed_url: The feed URL to update. + + Raises: + HTTPException: If the feed is not found. + + Returns: + RedirectResponse: Redirect to the feed page. + """ + try: + reader.update_feed(urllib.parse.unquote(feed_url)) + except FeedNotFoundError as e: + raise HTTPException(status_code=404, detail="Feed not found") from e + + logger.info("Manually updated feed: %s", feed_url) + return RedirectResponse(url="/feed?feed_url=" + urllib.parse.quote(feed_url), status_code=303) + + @app.get("/search", response_class=HTMLResponse) async def search(request: Request, query: str): """Get entries matching a full-text search query. diff --git a/discord_rss_bot/templates/feed.html b/discord_rss_bot/templates/feed.html index ce983ff..340a8a3 100644 --- a/discord_rss_bot/templates/feed.html +++ b/discord_rss_bot/templates/feed.html @@ -28,6 +28,8 @@
+ Update +
diff --git a/tests/test_main.py b/tests/test_main.py index c86901f..094a1fc 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -229,3 +229,41 @@ def test_delete_webhook() -> None: response = client.get(url="/webhooks") assert response.status_code == 200, f"Failed to get /webhooks: {response.text}" assert webhook_name not in response.text, f"Webhook found in /webhooks: {response.text}" + + +def test_update_feed_success() -> None: + """Test updating an existing feed.""" + # Remove the feed if it already exists before we run the test + feeds: Response = client.get("/") + if feed_url in feeds.text: + client.post(url="/remove", data={"feed_url": feed_url}) + client.post(url="/remove", data={"feed_url": encoded_feed_url(feed_url)}) + + # Add the webhook + response: Response = client.post( + url="/add_webhook", + data={"webhook_name": webhook_name, "webhook_url": webhook_url}, + ) + assert response.status_code == 200, f"Failed to add webhook: {response.text}" + assert webhook_name in response.text, f"Webhook not found in /webhooks: {response.text}" + + # Add the feed + response: Response = client.post(url="/add", data={"feed_url": feed_url, "webhook_dropdown": webhook_name}) + assert response.status_code == 200, f"Failed to add feed: {response.text}" + + # Update the feed + response: Response = client.get(url="/update", params={"feed_url": encoded_feed_url(feed_url)}) + assert response.status_code == 200, f"Failed to update feed: {response.status_code}, {response.text}" + + +def test_update_feed_not_found() -> None: + """Test updating a non-existent feed.""" + # Generate a feed URL that does not exist + nonexistent_feed_url = "https://nonexistent-feed.example.com/rss.xml" + + # Try to update the non-existent feed + response: Response = client.get(url="/update", params={"feed_url": urllib.parse.quote(nonexistent_feed_url)}) + + # Check that it returns a 404 status code + assert response.status_code == 404, f"Expected 404 for non-existent feed, got: {response.status_code}" + assert "Feed not found" in response.text