44from collections .abc import AsyncIterator
55from io import BytesIO , StringIO
66import json
7+ import re
78import tarfile
89from typing import Any
910from unittest .mock import patch
1011
1112from aiohttp import web
13+ from aiohttp .hdrs import CONTENT_DISPOSITION , CONTENT_TYPE
1214import pytest
1315
1416from homeassistant .components .backup import (
@@ -166,10 +168,19 @@ async def _test_downloading_encrypted_backup(
166168 agent_id : str ,
167169) -> None :
168170 """Test downloading an encrypted backup file."""
171+
172+ def assert_tar_download_response (resp : web .Response ) -> None :
173+ assert resp .status == 200
174+ assert resp .headers .get (CONTENT_TYPE , "" ) == "application/x-tar"
175+ assert re .match (
176+ r"attachment; filename=.*\.tar" , resp .headers .get (CONTENT_DISPOSITION , "" )
177+ )
178+
169179 # Try downloading without supplying a password
170180 client = await hass_client ()
171181 resp = await client .get (f"/api/backup/download/c0cb53bd?agent_id={ agent_id } " )
172- assert resp .status == 200
182+ assert_tar_download_response (resp )
183+
173184 backup = await resp .read ()
174185 # We expect a valid outer tar file, but the inner tar file is encrypted and
175186 # can't be read
@@ -187,7 +198,7 @@ async def _test_downloading_encrypted_backup(
187198 resp = await client .get (
188199 f"/api/backup/download/c0cb53bd?agent_id={ agent_id } &password=wrong"
189200 )
190- assert resp . status == 200
201+ assert_tar_download_response ( resp )
191202 backup = await resp .read ()
192203 # We expect a truncated outer tar file
193204 with (
@@ -200,7 +211,7 @@ async def _test_downloading_encrypted_backup(
200211 resp = await client .get (
201212 f"/api/backup/download/c0cb53bd?agent_id={ agent_id } &password=hunter2"
202213 )
203- assert resp . status == 200
214+ assert_tar_download_response ( resp )
204215 backup = await resp .read ()
205216 # We expect a valid outer tar file, the inner tar file is decrypted and can be read
206217 with (
0 commit comments