SDL2/GStreamer DLNA browser for R36S by Matteo Benedetto
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

120 lines
3.9 KiB

"""Tests for DIDL-Lite parsing and domain model mapping."""
from r36s_dlna_browser.dlna.models import (
ItemType,
MediaItem,
classify_upnp_class,
parse_didl_item,
)
class TestClassifyUpnpClass:
def test_container(self):
assert classify_upnp_class("object.container.storageFolder") == ItemType.CONTAINER
def test_audio(self):
assert classify_upnp_class("object.item.audioItem.musicTrack") == ItemType.AUDIO
def test_video(self):
assert classify_upnp_class("object.item.videoItem") == ItemType.VIDEO
def test_image(self):
assert classify_upnp_class("object.item.imageItem.photo") == ItemType.IMAGE
def test_unknown(self):
assert classify_upnp_class("object.item.something") == ItemType.UNKNOWN
def test_empty(self):
assert classify_upnp_class("") == ItemType.UNKNOWN
class TestParseDIDLItem:
def test_audio_item(self):
didl = {
"id": "42",
"title": "My Song",
"parent_id": "10",
"upnp_class": "object.item.audioItem.musicTrack",
"resources": [
{
"url": "http://server/song.mp3",
"protocol_info": "http-get:*:audio/mpeg:*",
"size": "5000000",
"duration": "0:03:45",
}
],
"album_art_uri": "http://server/art.jpg",
}
item = parse_didl_item(didl)
assert item.object_id == "42"
assert item.title == "My Song"
assert item.item_type == ItemType.AUDIO
assert item.resource_url == "http://server/song.mp3"
assert item.mime_type == "http-get:*:audio/mpeg:*"
assert item.size == 5000000
assert item.duration == "0:03:45"
assert item.album_art_url == "http://server/art.jpg"
assert not item.is_container
def test_container_item(self):
didl = {
"id": "5",
"title": "Music",
"parent_id": "0",
"upnp_class": "object.container.storageFolder",
"child_count": "12",
}
item = parse_didl_item(didl)
assert item.object_id == "5"
assert item.title == "Music"
assert item.item_type == ItemType.CONTAINER
assert item.child_count == 12
assert item.is_container
def test_missing_resources(self):
didl = {"id": "99", "title": "NoRes", "upnp_class": "object.item.audioItem"}
item = parse_didl_item(didl)
assert item.resource_url == ""
assert item.size == 0
def test_single_resource_dict(self):
didl = {
"id": "1",
"title": "Track",
"upnp_class": "object.item.audioItem",
"resources": {"url": "http://srv/track.flac", "size": "100"},
}
item = parse_didl_item(didl)
assert item.resource_url == "http://srv/track.flac"
assert item.size == 100
def test_resource_string(self):
didl = {
"id": "2",
"title": "Track2",
"upnp_class": "object.item.videoItem",
"resources": ["http://srv/vid.mp4"],
}
item = parse_didl_item(didl)
assert item.resource_url == "http://srv/vid.mp4"
def test_alt_key_names(self):
"""Handles alternative key formats (@id, @parentID, class, etc.)."""
didl = {
"@id": "7",
"title": "Alt",
"@parentID": "3",
"class": "object.container",
"@childCount": "5",
}
item = parse_didl_item(didl)
assert item.object_id == "7"
assert item.parent_id == "3"
assert item.item_type == ItemType.CONTAINER
assert item.child_count == 5
def test_empty_dict(self):
item = parse_didl_item({})
assert item.object_id == ""
assert item.title == ""
assert item.item_type == ItemType.UNKNOWN