mirror of
https://github.com/Matysh/houseplan-card
synced 2026-07-31 16:38:31 +00:00
test: match the new upload url shape; keep the config cap under the WS frame limit
test_upload_ok still asserted the old '<name>?v=<mtime>' url — uploads take a free name now, so the name itself is the cache key and the query is gone. MAX_CONFIG_BYTES was 12 MB, above the WebSocket frame limit: a payload that big never reaches the handler, the socket just closes with 1009 and the user sees a dropped connection instead of an actionable error. 4 MB is far above any real configuration and comfortably inside the frame. test_upload_never_overwrites listed the whole shared test config folder.
This commit is contained in:
@@ -81,7 +81,10 @@ MAX_KNOWN_DEVICES = 20000
|
||||
MAX_TEXT = 500 # names, models, ids
|
||||
MAX_DESCRIPTION = 4000
|
||||
MAX_URL = 2000
|
||||
MAX_CONFIG_BYTES = 12 * 1024 * 1024
|
||||
# Below the WebSocket frame limit on purpose: a payload larger than that never
|
||||
# reaches the handler at all — the socket closes with 1009 and the user sees a
|
||||
# dropped connection instead of an error they can act on.
|
||||
MAX_CONFIG_BYTES = 4 * 1024 * 1024
|
||||
|
||||
_TEXT = vol.All(str, vol.Length(max=MAX_TEXT))
|
||||
_TEXT_OR_NONE = vol.Any(None, _TEXT)
|
||||
|
||||
@@ -32,7 +32,10 @@ async def test_upload_ok(hass: HomeAssistant, hass_client: ClientSessionGenerato
|
||||
assert resp.status == 200
|
||||
body = await resp.json()
|
||||
# audit B1: uploads now return the AUTHENTICATED content URL
|
||||
assert body["ok"] and body["url"].startswith("/api/houseplan/content/files/m1/manual.pdf?v=")
|
||||
# HP-1454-02: uploads take a FREE name and never overwrite, so the url is
|
||||
# the name that was actually used — no cache-busting query needed any more
|
||||
assert body["ok"] and body["url"].startswith("/api/houseplan/content/files/m1/manual")
|
||||
assert body["url"].endswith(".pdf") and "?" not in body["url"]
|
||||
|
||||
|
||||
async def test_upload_bad_ext(hass: HomeAssistant, hass_client: ClientSessionGenerator) -> None:
|
||||
|
||||
@@ -558,7 +558,7 @@ async def test_config_write_is_capped_by_total_size(
|
||||
cfg = await _cfg([{"id": "f1", "plan_url": None}])
|
||||
# every field inside the caps, the whole thing far past them
|
||||
blob = "d" * MAX_TEXT
|
||||
cfg["settings"] = {"known_devices": [blob] * (MAX_CONFIG_BYTES // MAX_TEXT + 10)}
|
||||
cfg["settings"] = {"known_devices": [blob] * (MAX_CONFIG_BYTES // MAX_TEXT + 100)}
|
||||
resp = await _save(client, cfg, 0)
|
||||
assert not resp["success"] and resp["error"]["code"] == "too_large"
|
||||
|
||||
@@ -686,7 +686,10 @@ async def test_upload_never_overwrites_an_existing_attachment(
|
||||
assert first != second, "the second upload must not take the first name"
|
||||
|
||||
folder = os.path.join(hass.config.path(FILES_DIR), "m1")
|
||||
names = sorted(await hass.async_add_executor_job(os.listdir, folder))
|
||||
# the HA test config dir is shared across the module — look only at ours
|
||||
names = sorted(
|
||||
n for n in await hass.async_add_executor_job(os.listdir, folder) if n.startswith("manual")
|
||||
)
|
||||
assert names == ["manual (2).pdf", "manual.pdf"]
|
||||
|
||||
got = await http.get(first.replace(CONTENT_URL, CONTENT_URL))
|
||||
|
||||
Reference in New Issue
Block a user