import sys
import unittest
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))

from compara import classificar


def reg(**kw):
    base = {
        "url": "/x", "status": 200, "ms": 10, "erro_yii": False,
        "html_norm_sha": "a", "html_norm_len": 1000,
        "console_erros": [], "log_novos": [], "captura": None,
    }
    base.update(kw)
    return base


class ClassificarTest(unittest.TestCase):
    def test_igual(self):
        self.assertEqual(classificar(reg(), reg())["veredito"], "igual")

    def test_status_diferente(self):
        r = classificar(reg(status=200), reg(status=500))
        self.assertEqual(r["veredito"], "divergente")
        self.assertIn("status", r["motivos"][0])

    def test_log_novo(self):
        r = classificar(reg(), reg(log_novos=["PHP Warning: Undefined array key"]))
        self.assertEqual(r["veredito"], "divergente")

    def test_log_igual_com_caminho_e_linha_diferentes(self):
        b = reg(status=400, log_novos=["cm_log[1] yii\web\HttpException:400: BadRequest in /var/www/html/accia/vendor/yiisoft/yii2/web/Controller.php:182"])
        a = reg(status=400, log_novos=["cm_log[1] yii\web\HttpException:400: BadRequest in /var/www/html/accia-php83/vendor/yiisoft/yii2/web/Controller.php:185"])
        self.assertEqual(classificar(b, a)["veredito"], "igual")

    def test_erro_no_74_e_no_83_com_mensagem_diferente_e_preexistente(self):
        b = reg(status=500, erro_yii=True, log_novos=["cm_log[1] Error: Class X not found in a.php:10"])
        a = reg(status=500, erro_yii=True, log_novos=["cm_log[1] Undefined variable $y in b.php:5"])
        r = classificar(b, a)
        self.assertEqual(r["veredito"], "igual")
        self.assertIn("preexistente", r["motivos"][0])

    def test_400_igual_com_log_diferente_e_preexistente(self):
        r = classificar(reg(status=400, log_novos=["a"]), reg(status=400, log_novos=["b"]))
        self.assertEqual(r["veredito"], "igual")

    def test_console_novo(self):
        r = classificar(reg(), reg(console_erros=["Uncaught ReferenceError"]))
        self.assertEqual(r["veredito"], "divergente")

    def test_erro_yii_so_alvo(self):
        r = classificar(reg(), reg(erro_yii=True))
        self.assertEqual(r["veredito"], "divergente")

    def test_erro_yii_nos_dois_e_preexistente(self):
        r = classificar(reg(erro_yii=True), reg(erro_yii=True))
        self.assertEqual(r["veredito"], "igual")
        self.assertIn("preexistente", r["motivos"][0])

    def test_ruido_tamanho(self):
        r = classificar(reg(html_norm_sha="a", html_norm_len=1000), reg(html_norm_sha="b", html_norm_len=1010))
        self.assertEqual(r["veredito"], "igual")
        self.assertIn("ruido", r["motivos"][0])

    def test_conteudo_diferente(self):
        r = classificar(reg(html_norm_sha="a", html_norm_len=1000), reg(html_norm_sha="b", html_norm_len=1500))
        self.assertEqual(r["veredito"], "divergente")
        self.assertIn("conteudo", r["motivos"][0])


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