diff --git a/aiohasupervisor/backups.py b/aiohasupervisor/backups.py index 5dd49b7..2c28990 100644 --- a/aiohasupervisor/backups.py +++ b/aiohasupervisor/backups.py @@ -120,9 +120,12 @@ async def upload_backup( ) -> str: """Upload backup by stream and return slug.""" params = MultiDict() - if options and options.location: - for location in options.location: - params.add("location", location or "") + if options: + if options.location: + for location in options.location: + params.add("location", location or "") + if options.filename: + params.add("filename", options.filename.as_posix()) with MultipartWriter("form-data") as mp: mp.append(stream) diff --git a/aiohasupervisor/models/backups.py b/aiohasupervisor/models/backups.py index 541fa1c..0567859 100644 --- a/aiohasupervisor/models/backups.py +++ b/aiohasupervisor/models/backups.py @@ -4,8 +4,9 @@ from dataclasses import dataclass from datetime import datetime from enum import StrEnum +from pathlib import PurePath -from .base import DEFAULT, Request, ResponseData +from .base import DEFAULT, Options, Request, ResponseData # --- ENUMS ---- @@ -183,10 +184,11 @@ class PartialRestoreOptions(FullRestoreOptions, PartialBackupRestoreOptions): @dataclass(frozen=True, slots=True) -class UploadBackupOptions(Request): +class UploadBackupOptions(Options): """UploadBackupOptions model.""" location: set[str | None] = None + filename: PurePath | None = None @dataclass(frozen=True, slots=True) diff --git a/tests/test_backups.py b/tests/test_backups.py index 68b44da..47f4660 100644 --- a/tests/test_backups.py +++ b/tests/test_backups.py @@ -3,6 +3,7 @@ import asyncio from collections.abc import AsyncIterator from datetime import UTC, datetime +from pathlib import PurePath from typing import Any from aioresponses import CallbackResult, aioresponses @@ -423,29 +424,23 @@ async def test_partial_restore( assert result.job_id == "dc9dbc16f6ad4de592ffa72c807ca2bf" +@pytest.mark.parametrize( + ("options", "query"), + [ + (None, ""), + (UploadBackupOptions(location={None, "test"}), "?location=&location=test"), + (UploadBackupOptions(filename=PurePath("backup.tar")), "?filename=backup.tar"), + ], +) async def test_upload_backup( - responses: aioresponses, supervisor_client: SupervisorClient + responses: aioresponses, + supervisor_client: SupervisorClient, + options: UploadBackupOptions | None, + query: str, ) -> None: """Test upload backup API.""" responses.post( - f"{SUPERVISOR_URL}/backups/new/upload", - status=200, - body=load_fixture("backup_uploaded.json"), - ) - data = asyncio.StreamReader(loop=asyncio.get_running_loop()) - data.feed_data(b"backup test") - data.feed_eof() - - result = await supervisor_client.backups.upload_backup(data) - assert result == "7fed74c8" - - -async def test_upload_backup_to_locations( - responses: aioresponses, supervisor_client: SupervisorClient -) -> None: - """Test upload backup API with multiple locations.""" - responses.post( - f"{SUPERVISOR_URL}/backups/new/upload?location=&location=test", + f"{SUPERVISOR_URL}/backups/new/upload{query}", status=200, body=load_fixture("backup_uploaded.json"), ) @@ -453,9 +448,7 @@ async def test_upload_backup_to_locations( data.feed_data(b"backup test") data.feed_eof() - result = await supervisor_client.backups.upload_backup( - data, UploadBackupOptions(location={None, "test"}) - ) + result = await supervisor_client.backups.upload_backup(data, options) assert result == "7fed74c8"