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
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
|
|
|