# -*- coding: UTF-8 -*

"""Unit tests for XML exports

Usage: python -m unittest tests.test_export_xml
"""

# ScoDoc7 utilisait jaxml, obsolete et non portée en python3
# On teste ici les fionctions de remplacement, fournies par
# notre nouveau module sco_xml.py

from __future__ import print_function
import os
import re
import sys
import unittest

sys.path.append("/mac/ScoDoc")

from app.scodoc import sco_xml
from app.scodoc.gen_tables import GenTable

# Legacy function
# import jaxml
# from app.scodoc import sco_utils as scu

# r = scu.simple_dictlist2xml([{"id": 1, "ues": [{"note": 10}, {}]}], tagname="infos")


def xml_normalize(x):
    "supprime espaces inutiles"
    x = re.sub(r"\s+", " ", str(x)).strip().replace("> <", "><")


def xmls_compare(x, y):
    return xml_normalize(x) == xml_normalize(y)


# expected_result est le résultat de l'ancienne fonction ScoDoc7:
for (data, expected_result) in (
    (
        [{"id": 1, "ues": [{"note": 10}, {}, {"valeur": 25}]}, {"bis": 2}],
        """<?xml version="1.0" encoding="utf-8"?>
<infos id="1">
    <ues note="10" />
    <ues />
    <ues valeur="25" />
</infos>
<infos bis="2" />
""",
    ),
    ([], """"""),
    (
        ["allo"],
        """<?xml version="1.0" encoding="utf-8"?>
<infos code="allo" />
""",
    ),
    (
        [{}],
        """<?xml version="1.0" encoding="utf-8"?>
<infos />
""",
    ),
    (
        [{"x": 1}],
        """<?xml version="1.0" encoding="utf-8"?>
<infos x="1" />
""",
    ),
    (
        [{"y": [1, 2, 3], "x": 1}],
        """<?xml version="1.0" encoding="utf-8"?>
<infos x="1">
    <y code="1" />
    <y code="2" />
    <y code="3" />
</infos>
""",
    ),
    (
        [{"y": [{"x": 1}, {"y": [1, 2, 3]}], "x": 1}],
        """<?xml version="1.0" encoding="utf-8"?>
<infos x="1">
    <y x="1" />
    <y>
        <y code="1" />
        <y code="2" />
        <y code="3" />
    </y>
</infos>
""",
    ),
):
    # x = scu.simple_dictlist2xml(data, tagname="infos")
    y = sco_xml.simple_dictlist2xml(data, tagname="infos")
    assert xmls_compare(expected_result, y)
    # print("""({}, '''{}'''),""".format(data, str(x)))

# test du sendXML compatible ScoDoc7
etuds = [{"x": 1, "etuds": ["allo", "mama"]}, {"x": 2, "etuds": ["un", "deux"]}]
# Le résultat de l'ancien print(sendXML(None, etuds, tagname="etudiants"))
expected_result = """
<?xml version="1.0" encoding="utf-8"?>
<etudiants_list>
    <etudiants x="1">
        <etuds code="allo" />
        <etuds code="mama" />
    </etudiants>
    <etudiants x="2">
        <etuds code="un" />
        <etuds code="deux" />
    </etudiants>
</etudiants_list>
"""

assert xmls_compare(
    expected_result,
    sco_xml.simple_dictlist2xml([{"etudiant": etuds}], tagname="etudiant_list"),
)

# ---- Tables
T = GenTable(
    rows=[{"nom": "Toto", "age": 26}, {"nom": "Titi", "age": 21}],
    columns_ids=("nom", "age"),
)
print(T.xml())

expected_result = """
<?xml version="1.0" encoding="utf-8"?>
<table origin="" caption="" id="gt_806883">
    <row>
        <nom value="Toto" />
        <age value="26" />
    </row>
    <row>
        <nom value="Titi" />
        <age value="21" />
    </row>
</table>
"""