diff --git a/l4d2web/tests/test_pages.py b/l4d2web/tests/test_pages.py
index 15a6803..eebc6c4 100644
--- a/l4d2web/tests/test_pages.py
+++ b/l4d2web/tests/test_pages.py
@@ -742,3 +742,32 @@ def test_overlay_detail_no_global_source_block(auth_client_with_server) -> None:
assert "Global source" not in text
assert "source_url" not in text
+
+
+def test_workshop_overlay_detail_renders_refresh_button(auth_client_with_server) -> None:
+ """The owner sees a 'Refresh from Steam' button on their workshop overlay."""
+ with session_scope() as s:
+ user_id = s.query(User).filter_by(username="alice").one().id
+ overlay_id = _seed_overlay("ws-refresh-button", "workshop", user_id)
+
+ response = auth_client_with_server.get(f"/overlays/{overlay_id}")
+ text = response.get_data(as_text=True)
+
+ assert response.status_code == 200
+ assert "Refresh from Steam" in text
+ assert f'action="/overlays/{overlay_id}/refresh"' in text
+
+
+def test_workshop_overlay_refresh_button_hidden_during_build(auth_client_with_server) -> None:
+ """While a build is in flight the Refresh button hides, matching the Add form."""
+ with session_scope() as s:
+ user_id = s.query(User).filter_by(username="alice").one().id
+ overlay_id = _seed_overlay("ws-refresh-hidden", "workshop", user_id)
+ with session_scope() as s:
+ s.add(Job(user_id=user_id, overlay_id=overlay_id, operation="build_overlay", state="running"))
+
+ response = auth_client_with_server.get(f"/overlays/{overlay_id}")
+ text = response.get_data(as_text=True)
+
+ assert response.status_code == 200
+ assert "Refresh from Steam" not in text