mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 07:07:28 +00:00
add extra tests for media source URI parsing (#148114)
This commit is contained in:
parent
83ae5f52da
commit
cde17fc0ca
@ -45,6 +45,16 @@ class MediaSourceItem:
|
|||||||
identifier: str
|
identifier: str
|
||||||
target_media_player: str | None
|
target_media_player: str | None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def media_source_id(self) -> str:
|
||||||
|
"""Return the media source ID."""
|
||||||
|
uri = URI_SCHEME
|
||||||
|
if self.domain:
|
||||||
|
uri += self.domain
|
||||||
|
if self.identifier:
|
||||||
|
uri += f"/{self.identifier}"
|
||||||
|
return uri
|
||||||
|
|
||||||
async def async_browse(self) -> BrowseMediaSource:
|
async def async_browse(self) -> BrowseMediaSource:
|
||||||
"""Browse this item."""
|
"""Browse this item."""
|
||||||
if self.domain is None:
|
if self.domain is None:
|
||||||
|
80
tests/components/media_source/test_const.py
Normal file
80
tests/components/media_source/test_const.py
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
"""Test constants for the media source component."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from homeassistant.components.media_source.const import URI_SCHEME_REGEX
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("uri", "expected_domain", "expected_identifier"),
|
||||||
|
[
|
||||||
|
("media-source://", None, None),
|
||||||
|
("media-source://local_media", "local_media", None),
|
||||||
|
(
|
||||||
|
"media-source://local_media/some/path/file.mp3",
|
||||||
|
"local_media",
|
||||||
|
"some/path/file.mp3",
|
||||||
|
),
|
||||||
|
("media-source://a/b", "a", "b"),
|
||||||
|
(
|
||||||
|
"media-source://domain/file with spaces.mp4",
|
||||||
|
"domain",
|
||||||
|
"file with spaces.mp4",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"media-source://domain/file-with-dashes.mp3",
|
||||||
|
"domain",
|
||||||
|
"file-with-dashes.mp3",
|
||||||
|
),
|
||||||
|
("media-source://domain/file.with.dots.mp3", "domain", "file.with.dots.mp3"),
|
||||||
|
(
|
||||||
|
"media-source://domain/special!@#$%^&*()chars",
|
||||||
|
"domain",
|
||||||
|
"special!@#$%^&*()chars",
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_valid_uri_patterns(
|
||||||
|
uri: str, expected_domain: str | None, expected_identifier: str | None
|
||||||
|
) -> None:
|
||||||
|
"""Test various valid URI patterns."""
|
||||||
|
match = URI_SCHEME_REGEX.match(uri)
|
||||||
|
assert match is not None
|
||||||
|
assert match.group("domain") == expected_domain
|
||||||
|
assert match.group("identifier") == expected_identifier
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"uri",
|
||||||
|
[
|
||||||
|
"media-source:", # missing //
|
||||||
|
"media-source:/", # missing second /
|
||||||
|
"media-source:///", # extra /
|
||||||
|
"media-source://domain/", # trailing slash after domain
|
||||||
|
"invalid-scheme://domain", # wrong scheme
|
||||||
|
"media-source//domain", # missing :
|
||||||
|
"MEDIA-SOURCE://domain", # uppercase scheme
|
||||||
|
"media_source://domain", # underscore in scheme
|
||||||
|
"", # empty string
|
||||||
|
"media-source", # scheme only
|
||||||
|
"media-source://domain extra", # extra content
|
||||||
|
"prefix media-source://domain", # prefix content
|
||||||
|
"media-source://domain suffix", # suffix content
|
||||||
|
# Invalid domain names
|
||||||
|
"media-source://_test", # starts with underscore
|
||||||
|
"media-source://test_", # ends with underscore
|
||||||
|
"media-source://_test_", # starts and ends with underscore
|
||||||
|
"media-source://_", # single underscore
|
||||||
|
"media-source://test-123", # contains hyphen
|
||||||
|
"media-source://test.123", # contains dot
|
||||||
|
"media-source://test 123", # contains space
|
||||||
|
"media-source://TEST", # uppercase letters
|
||||||
|
"media-source://Test", # mixed case
|
||||||
|
# Identifier cannot start with slash
|
||||||
|
"media-source://domain//invalid", # identifier starts with slash
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_invalid_uris(uri: str) -> None:
|
||||||
|
"""Test invalid URI formats."""
|
||||||
|
match = URI_SCHEME_REGEX.match(uri)
|
||||||
|
assert match is None, f"URI '{uri}' should be invalid"
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
from homeassistant.components.media_player import MediaClass, MediaType
|
from homeassistant.components.media_player import MediaClass, MediaType
|
||||||
from homeassistant.components.media_source import const, models
|
from homeassistant.components.media_source import const, models
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
|
|
||||||
async def test_browse_media_as_dict() -> None:
|
async def test_browse_media_as_dict() -> None:
|
||||||
@ -68,3 +69,18 @@ async def test_media_source_default_name() -> None:
|
|||||||
"""Test MediaSource uses domain as default name."""
|
"""Test MediaSource uses domain as default name."""
|
||||||
source = models.MediaSource(const.DOMAIN)
|
source = models.MediaSource(const.DOMAIN)
|
||||||
assert source.name == const.DOMAIN
|
assert source.name == const.DOMAIN
|
||||||
|
|
||||||
|
|
||||||
|
async def test_media_source_item_media_source_id(hass: HomeAssistant) -> None:
|
||||||
|
"""Test MediaSourceItem media_source_id property."""
|
||||||
|
# Test with domain and identifier
|
||||||
|
item = models.MediaSourceItem(hass, "test_domain", "test/identifier", None)
|
||||||
|
assert item.media_source_id == "media-source://test_domain/test/identifier"
|
||||||
|
|
||||||
|
# Test with domain only
|
||||||
|
item = models.MediaSourceItem(hass, "test_domain", "", None)
|
||||||
|
assert item.media_source_id == "media-source://test_domain"
|
||||||
|
|
||||||
|
# Test with no domain (root)
|
||||||
|
item = models.MediaSourceItem(hass, None, "", None)
|
||||||
|
assert item.media_source_id == "media-source://"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user