"""Contrato de associacao de parametros por nome: 7.4 (codigo original) == 8.3 (codigo migrado)."""
import json
import subprocess
import unittest

METODOS = [
    r"app\modules\financial\controllers\BpTipoController::actionDadosOrdena",
    r"app\modules\financial\controllers\DreTipoController::actionDadosOrdena",
    r"app\modules\financial\controllers\TipoController::actionDadosOrdena",
    r"app\modules\operational\controllers\DashboardController::actionDadosLocal",
    r"app\modules\operational\controllers\DashboardController::actionDadosOrigem",
    r"app\modules\operational\controllers\DashboardController::actionDadosTipo",
    r"app\modules\api\controllers\V1Controller::actionDadosOrigem",
    r"app\modules\api\controllers\V1Controller::actionDadosTipo",
]


def _mapa(container: str, raiz: str) -> dict:
    r = subprocess.run(
        ["docker", "exec", container, "php", "/var/www/html/accia-php83/tools/migracao-php83/php/assinaturas.php", raiz]
        + METODOS, capture_output=True, text=True, encoding="utf8")
    if r.returncode != 0:
        raise AssertionError(f"{container} {raiz}: {r.stdout[-800:]} {r.stderr[-800:]}")
    return json.loads(r.stdout)


class AssinaturasTest(unittest.TestCase):
    def test_parametros_com_default_iguais_por_nome(self):
        base = _mapa("php74_val", "/var/www/html/accia")
        alvo = _mapa("php83_apache", "/var/www/html/accia-php83")
        for metodo in METODOS:
            with self.subTest(metodo=metodo):
                self.assertEqual(alvo[metodo], base[metodo])


if __name__ == "__main__":
    unittest.main()
