Fix flakey onedrive tests (#139129)

This commit is contained in:
Josef Zweck 2025-02-23 20:06:28 +01:00 committed by GitHub
parent 8f9f9bc8e7
commit d62c18c225
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 65 additions and 65 deletions

View File

@ -1,6 +1,7 @@
"""Fixtures for OneDrive tests.""" """Fixtures for OneDrive tests."""
from collections.abc import AsyncIterator, Generator from collections.abc import AsyncIterator, Generator
from html import escape
from json import dumps from json import dumps
import time import time
from unittest.mock import AsyncMock, MagicMock, patch from unittest.mock import AsyncMock, MagicMock, patch
@ -10,7 +11,9 @@ from onedrive_personal_sdk.models.items import (
AppRoot, AppRoot,
Drive, Drive,
DriveQuota, DriveQuota,
File,
Folder, Folder,
Hashes,
IdentitySet, IdentitySet,
ItemParentReference, ItemParentReference,
User, User,
@ -30,15 +33,7 @@ from homeassistant.components.onedrive.const import (
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from .const import ( from .const import BACKUP_METADATA, CLIENT_ID, CLIENT_SECRET, IDENTITY_SET, INSTANCE_ID
BACKUP_METADATA,
CLIENT_ID,
CLIENT_SECRET,
IDENTITY_SET,
INSTANCE_ID,
MOCK_BACKUP_FILE,
MOCK_METADATA_FILE,
)
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -165,20 +160,67 @@ def mock_folder() -> Folder:
) )
@pytest.fixture
def mock_backup_file() -> File:
"""Return a mocked backup file."""
return File(
id="id",
name="23e64aec.tar",
size=34519040,
parent_reference=ItemParentReference(
drive_id="mock_drive_id", id="id", path="path"
),
hashes=Hashes(
quick_xor_hash="hash",
),
mime_type="application/x-tar",
created_by=IDENTITY_SET,
)
@pytest.fixture
def mock_metadata_file() -> File:
"""Return a mocked metadata file."""
return File(
id="id",
name="23e64aec.tar",
size=34519040,
parent_reference=ItemParentReference(
drive_id="mock_drive_id", id="id", path="path"
),
hashes=Hashes(
quick_xor_hash="hash",
),
mime_type="application/x-tar",
description=escape(
dumps(
{
"metadata_version": 2,
"backup_id": "23e64aec",
"backup_file_id": "id",
}
)
),
created_by=IDENTITY_SET,
)
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
def mock_onedrive_client( def mock_onedrive_client(
mock_onedrive_client_init: MagicMock, mock_onedrive_client_init: MagicMock,
mock_approot: AppRoot, mock_approot: AppRoot,
mock_drive: Drive, mock_drive: Drive,
mock_folder: Folder, mock_folder: Folder,
mock_backup_file: File,
mock_metadata_file: File,
) -> Generator[MagicMock]: ) -> Generator[MagicMock]:
"""Return a mocked GraphServiceClient.""" """Return a mocked GraphServiceClient."""
client = mock_onedrive_client_init.return_value client = mock_onedrive_client_init.return_value
client.get_approot.return_value = mock_approot client.get_approot.return_value = mock_approot
client.create_folder.return_value = mock_folder client.create_folder.return_value = mock_folder
client.list_drive_items.return_value = [MOCK_BACKUP_FILE, MOCK_METADATA_FILE] client.list_drive_items.return_value = [mock_backup_file, mock_metadata_file]
client.get_drive_item.return_value = mock_folder client.get_drive_item.return_value = mock_folder
client.upload_file.return_value = MOCK_METADATA_FILE client.upload_file.return_value = mock_metadata_file
class MockStreamReader: class MockStreamReader:
async def iter_chunked(self, chunk_size: int) -> AsyncIterator[bytes]: async def iter_chunked(self, chunk_size: int) -> AsyncIterator[bytes]:
@ -193,12 +235,12 @@ def mock_onedrive_client(
@pytest.fixture @pytest.fixture
def mock_large_file_upload_client() -> Generator[AsyncMock]: def mock_large_file_upload_client(mock_backup_file: File) -> Generator[AsyncMock]:
"""Return a mocked LargeFileUploadClient upload.""" """Return a mocked LargeFileUploadClient upload."""
with patch( with patch(
"homeassistant.components.onedrive.backup.LargeFileUploadClient.upload" "homeassistant.components.onedrive.backup.LargeFileUploadClient.upload"
) as mock_upload: ) as mock_upload:
mock_upload.return_value = MOCK_BACKUP_FILE mock_upload.return_value = mock_backup_file
yield mock_upload yield mock_upload

View File

@ -1,15 +1,6 @@
"""Consts for OneDrive tests.""" """Consts for OneDrive tests."""
from html import escape from onedrive_personal_sdk.models.items import IdentitySet, User
from json import dumps
from onedrive_personal_sdk.models.items import (
File,
Hashes,
IdentitySet,
ItemParentReference,
User,
)
CLIENT_ID = "1234" CLIENT_ID = "1234"
CLIENT_SECRET = "5678" CLIENT_SECRET = "5678"
@ -38,40 +29,3 @@ IDENTITY_SET = IdentitySet(
email="john@doe.com", email="john@doe.com",
) )
) )
MOCK_BACKUP_FILE = File(
id="id",
name="23e64aec.tar",
size=34519040,
parent_reference=ItemParentReference(
drive_id="mock_drive_id", id="id", path="path"
),
hashes=Hashes(
quick_xor_hash="hash",
),
mime_type="application/x-tar",
created_by=IDENTITY_SET,
)
MOCK_METADATA_FILE = File(
id="id",
name="23e64aec.tar",
size=34519040,
parent_reference=ItemParentReference(
drive_id="mock_drive_id", id="id", path="path"
),
hashes=Hashes(
quick_xor_hash="hash",
),
mime_type="application/x-tar",
description=escape(
dumps(
{
"metadata_version": 2,
"backup_id": "23e64aec",
"backup_file_id": "id",
}
)
),
created_by=IDENTITY_SET,
)

View File

@ -11,6 +11,7 @@ from onedrive_personal_sdk.exceptions import (
HashMismatchError, HashMismatchError,
OneDriveException, OneDriveException,
) )
from onedrive_personal_sdk.models.items import File
import pytest import pytest
from homeassistant.components.backup import DOMAIN as BACKUP_DOMAIN, AgentBackup from homeassistant.components.backup import DOMAIN as BACKUP_DOMAIN, AgentBackup
@ -23,7 +24,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from . import setup_integration from . import setup_integration
from .const import BACKUP_METADATA, MOCK_BACKUP_FILE, MOCK_METADATA_FILE from .const import BACKUP_METADATA
from tests.common import AsyncMock, MockConfigEntry from tests.common import AsyncMock, MockConfigEntry
from tests.typing import ClientSessionGenerator, MagicMock, WebSocketGenerator from tests.typing import ClientSessionGenerator, MagicMock, WebSocketGenerator
@ -248,12 +249,14 @@ async def test_error_on_agents_download(
hass_client: ClientSessionGenerator, hass_client: ClientSessionGenerator,
mock_onedrive_client: MagicMock, mock_onedrive_client: MagicMock,
mock_config_entry: MockConfigEntry, mock_config_entry: MockConfigEntry,
mock_backup_file: File,
mock_metadata_file: File,
) -> None: ) -> None:
"""Test we get not found on an not existing backup on download.""" """Test we get not found on an not existing backup on download."""
client = await hass_client() client = await hass_client()
backup_id = BACKUP_METADATA["backup_id"] backup_id = BACKUP_METADATA["backup_id"]
mock_onedrive_client.list_drive_items.side_effect = [ mock_onedrive_client.list_drive_items.side_effect = [
[MOCK_BACKUP_FILE, MOCK_METADATA_FILE], [mock_backup_file, mock_metadata_file],
[], [],
] ]

View File

@ -11,7 +11,7 @@ from onedrive_personal_sdk.exceptions import (
NotFoundError, NotFoundError,
OneDriveException, OneDriveException,
) )
from onedrive_personal_sdk.models.items import AppRoot, Drive, Folder, ItemUpdate from onedrive_personal_sdk.models.items import AppRoot, Drive, File, Folder, ItemUpdate
import pytest import pytest
from syrupy import SnapshotAssertion from syrupy import SnapshotAssertion
@ -25,7 +25,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, issue_registry as ir from homeassistant.helpers import device_registry as dr, issue_registry as ir
from . import setup_integration from . import setup_integration
from .const import BACKUP_METADATA, INSTANCE_ID, MOCK_BACKUP_FILE from .const import BACKUP_METADATA, INSTANCE_ID
from tests.common import MockConfigEntry from tests.common import MockConfigEntry
@ -145,9 +145,10 @@ async def test_migrate_metadata_files(
hass: HomeAssistant, hass: HomeAssistant,
mock_config_entry: MockConfigEntry, mock_config_entry: MockConfigEntry,
mock_onedrive_client: MagicMock, mock_onedrive_client: MagicMock,
mock_backup_file: File,
) -> None: ) -> None:
"""Test migration of metadata files.""" """Test migration of metadata files."""
MOCK_BACKUP_FILE.description = escape( mock_backup_file.description = escape(
dumps({**BACKUP_METADATA, "metadata_version": 1}) dumps({**BACKUP_METADATA, "metadata_version": 1})
) )
await setup_integration(hass, mock_config_entry) await setup_integration(hass, mock_config_entry)