import pandas as pd from app.domain.contas.parsers.bill_processor import PDFBillingProcessor def test_danfe_payload_preserva_ordem_do_parser_nos_itens_do_plano() -> None: processor = PDFBillingProcessor(include_danfe=True) danfe_df = pd.DataFrame( [ {"desc": "TIM CTRL Redes Sociais 8 0", "value": 35.96}, {"desc": "Serviços de Valor Adicionado Conteúdo", "value": 99.99}, {"desc": "Aya Books Premium", "value": 19.44}, ] ) raw = { "DANFE-COM": danfe_df, "Plano": pd.DataFrame( [ { "desc": "TIM CTRL Redes Sociais 8 0 (096/POS/SMP)", "value": 35.96, } ] ), } payload = processor._build_danfe_payload(danfe_df, raw) item_names = [ item["desc"] for item in payload["Planos"]["TIM CTRL Redes Sociais 8 0"] ] assert item_names == [ "TIM CTRL Redes Sociais 8 0", "Serviços de Valor Adicionado Conteúdo", "Aya Books Premium", ] def test_max_mensal_em_itens_eventuais_e_estrategico() -> None: """Max Mensal (streaming) em "Itens Eventuais" recebe estrategico=True e classe=estrategico; o avulso comum mantém classe=avulso.""" processor = PDFBillingProcessor() df = pd.DataFrame( [ {"desc": "Serviço Avulso X", "value": 9.90}, {"desc": "Max Mensal", "value": 34.90}, ] ) regular, strategic = processor._split_strategic_records(df, "Itens Eventuais") assert [r["desc"] for r in strategic] == ["Max Mensal"] assert strategic[0]["estrategico"] is True assert [r["desc"] for r in regular] == ["Serviço Avulso X"] processor._annotate_class(strategic, "Itens Eventuais") processor._annotate_class(regular, "Itens Eventuais") assert strategic[0]["classe"] == "estrategico" assert strategic[0]["verb"] == "falar sobre" assert regular[0]["classe"] == "avulso"