from django.test import SimpleTestCase

from ...utils.alimentation import BOCols as Cols


class BOColsTestCase(SimpleTestCase):
    """ tests pour BOCols """

    def test_attributes(self):
        """ vérifie que les nouveaux attributs sont renseignés correctement """

        for col in Cols:
            self.assertIsInstance(col.value, str, f"{col} : la valeur n'a pas le bon type")

    def test_columns(self):
        """ vérifie les colonnes renvoyées """
        members = list(Cols)

        col_names = [col.value for col in members]
        self.assertCountEqual(col_names, Cols.columns(), "les noms de colonnes (sans argument) ne sont pas les bons")

        col = members[0]
        col_names = [col.value]
        self.assertCountEqual(col_names, Cols.columns(col), "les noms de colonnes (un argument) ne sont pas les bons")

        col_list = members[0:2]
        col_names = [col.value for col in col_list]
        self.assertCountEqual(col_names, Cols.columns(*col_list), "les noms de colonnes (plusieurs arguments) ne sont pas les bons")

    def test_col_mapping(self):
        """ vérifie les correspondances renvoyés """

        members = list(Cols)
        std_mapping = {'a': 1, 'b': 'test'}
        enum_mapping = {members[0]: (2, 3), members[1]: members[1].name}
        mapping_before = {**enum_mapping, **std_mapping}
        mapping_after = Cols.col_mapping(mapping_before)
        self.assertTrue(all(k in mapping_after for k in std_mapping.keys()), "toutes les clés standard doivent faire partie du mapping final")
        self.assertTrue(all(v == mapping_after.get(k) for k, v in std_mapping.items()), "les valeurs de clés standard ne doivent pas changer")
        self.assertTrue(all(k.value in mapping_after for k in enum_mapping.keys()), f"tous les noms de colonnes de clés de type {Cols.__name__} doivent faire partie du mapping final")
        self.assertTrue(all(v == mapping_after.get(k.value) for k, v in enum_mapping.items()), f"les valeurs de clés de type {Cols.__name__} ne doivent pas changer")

    def test_converters(self):
        """ vérifie les convertisseurs renvoyés """
        members = list(Cols)

        col_names = [col.value for col in members if col.converter]
        self.assertCountEqual(col_names, Cols.converters().keys(), "les convertisseurs (sans argument) ne sont pas les bons")

        col = members[0]
        col_names = [col.value]
        self.assertCountEqual(col_names, Cols.converters(col).keys(), "les convertisseurs (un argument) ne sont pas les bons")

        col_list = members[0:2]
        col_names = [col.value for col in col_list]
        self.assertCountEqual(col_names, Cols.converters(*col_list).keys(), "les convertisseurs (plusieurs arguments) ne sont pas les bons")
