import json
import xml.etree.ElementTree as ET
import pytest
import funkwhale_api
from funkwhale_api.subsonic import renderers
@pytest.mark.parametrize(
    "data,expected",
    [
        (
            {"hello": "world"},
            {
                "status": "ok",
                "version": "1.16.0",
                "type": "funkwhale",
                "funkwhaleVersion": funkwhale_api.__version__,
                "serverVersion": funkwhale_api.__version__,
                "openSubsonic": "true",
                "hello": "world",
            },
        ),
        (
            {
                "hello": "world",
                "error": {"code": 10, "message": "something went wrong"},
            },
            {
                "status": "failed",
                "version": "1.16.0",
                "type": "funkwhale",
                "funkwhaleVersion": funkwhale_api.__version__,
                "serverVersion": funkwhale_api.__version__,
                "openSubsonic": "true",
                "hello": "world",
                "error": {"code": 10, "message": "something went wrong"},
            },
        ),
        (
            {"hello": "world", "detail": "something went wrong"},
            {
                "status": "failed",
                "version": "1.16.0",
                "type": "funkwhale",
                "funkwhaleVersion": funkwhale_api.__version__,
                "serverVersion": funkwhale_api.__version__,
                "openSubsonic": "true",
                "hello": "world",
                "error": {"code": 0, "message": "something went wrong"},
            },
        ),
    ],
)
def test_structure_payload(data, expected):
    assert renderers.structure_payload(data) == expected
def test_json_renderer():
    data = {"hello": "world"}
    expected = {
        "subsonic-response": {
            "status": "ok",
            "version": "1.16.0",
            "type": "funkwhale",
            "funkwhaleVersion": funkwhale_api.__version__,
            "serverVersion": funkwhale_api.__version__,
            "openSubsonic": "true",
            "hello": "world",
        }
    }
    renderer = renderers.SubsonicJSONRenderer()
    assert json.loads(renderer.render(data)) == expected
def test_xml_renderer_dict_to_xml():
    payload = {
        "hello": "world",
        "item": [{"this": 1, "value": "text"}, {"some": "node"}],
        "list": [1, 2],
        "some-tag": renderers.TagValue("foo"),
    }
    expected = """
- text
1
2
foo"""  # noqa
    result = renderers.dict_to_xml_tree("key", payload)
    exp = ET.fromstring(expected)
    assert ET.tostring(result) == ET.tostring(exp)
def test_xml_renderer():
    payload = {"hello": "world"}
    expected = '\n'  # noqa
    version = funkwhale_api.__version__
    expected = expected.format(version, version).encode()
    renderer = renderers.SubsonicXMLRenderer()
    rendered = renderer.render(payload)
    assert rendered == expected