|
|
@ -1,7 +1,13 @@ |
|
|
|
|
|
from datetime import date |
|
|
|
|
|
|
|
|
import pytest |
|
|
import pytest |
|
|
|
|
|
from django.urls import reverse |
|
|
from model_bakery import baker |
|
|
from model_bakery import baker |
|
|
|
|
|
|
|
|
from sapl.base.models import CasaLegislativa |
|
|
from sapl.base.models import Autor, CasaLegislativa |
|
|
|
|
|
from sapl.materia.models import Autoria, MateriaLegislativa |
|
|
|
|
|
from sapl.norma.models import AutoriaNorma, NormaJuridica |
|
|
|
|
|
from sapl.relatorios import views as relatorios_views |
|
|
from sapl.relatorios.views import get_sessao_plenaria |
|
|
from sapl.relatorios.views import get_sessao_plenaria |
|
|
from sapl.sessao.models import ExpedienteSessao, SessaoPlenaria, TipoExpediente |
|
|
from sapl.sessao.models import ExpedienteSessao, SessaoPlenaria, TipoExpediente |
|
|
from sapl.sessao.views import get_expedientes |
|
|
from sapl.sessao.views import get_expedientes |
|
|
@ -50,3 +56,150 @@ def test_relatorio_sessao_tem_mesma_ordem_de_expedientes_do_resumo(): |
|
|
da_tela = [e['tipo'].nome for e in get_expedientes(sessao)['expedientes']] |
|
|
da_tela = [e['tipo'].nome for e in get_expedientes(sessao)['expedientes']] |
|
|
|
|
|
|
|
|
assert do_pdf == da_tela |
|
|
assert do_pdf == da_tela |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MSG_AUTOR_OU_PERIODO = 'Selecione um autor ou informe o período' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def params_materias_por_autor(autor='', inicio='', fim='', **extra): |
|
|
|
|
|
return dict(tipo='', data_apresentacao_0=inicio, |
|
|
|
|
|
data_apresentacao_1=fim, autoria__autor=autor, |
|
|
|
|
|
pesquisar='Pesquisar', **extra) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def params_normas_por_autor(autor='', inicio='', fim='', **extra): |
|
|
|
|
|
return dict(tipo='', data_0=inicio, data_1=fim, |
|
|
|
|
|
autorianorma__autor=autor, pesquisar='Pesquisar', **extra) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def cria_materia(numero, data_apresentacao, autores): |
|
|
|
|
|
materia = baker.make(MateriaLegislativa, numero=numero, |
|
|
|
|
|
ano=data_apresentacao.year, |
|
|
|
|
|
data_apresentacao=data_apresentacao, |
|
|
|
|
|
ementa='Ementa da matéria {}'.format(numero)) |
|
|
|
|
|
for i, autor in enumerate(autores): |
|
|
|
|
|
baker.make(Autoria, materia=materia, autor=autor, |
|
|
|
|
|
primeiro_autor=(i == 0)) |
|
|
|
|
|
return materia |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def cria_norma(numero, data_norma, autores): |
|
|
|
|
|
norma = baker.make(NormaJuridica, numero=numero, ano=data_norma.year, |
|
|
|
|
|
data=data_norma, |
|
|
|
|
|
ementa='Ementa da norma {}'.format(numero)) |
|
|
|
|
|
for i, autor in enumerate(autores): |
|
|
|
|
|
baker.make(AutoriaNorma, norma=norma, autor=autor, |
|
|
|
|
|
primeiro_autor=(i == 0)) |
|
|
|
|
|
return norma |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture |
|
|
|
|
|
def pdf_html(monkeypatch): |
|
|
|
|
|
"""Troca o WeasyPrint por uma captura do HTML que iria para o PDF.""" |
|
|
|
|
|
baker.make(CasaLegislativa, cep='') |
|
|
|
|
|
capturado = {} |
|
|
|
|
|
|
|
|
|
|
|
def make_pdf(base_url, main_template, header_template, **kwargs): |
|
|
|
|
|
capturado['html'] = main_template |
|
|
|
|
|
return b'%PDF-fake' |
|
|
|
|
|
|
|
|
|
|
|
monkeypatch.setattr(relatorios_views, 'make_pdf', make_pdf) |
|
|
|
|
|
return capturado |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False) |
|
|
|
|
|
def test_materias_por_autor_sem_autor_e_sem_periodo_pede_filtro(client): |
|
|
|
|
|
response = client.get(reverse('sapl.relatorios:materia_por_autor'), |
|
|
|
|
|
params_materias_por_autor()) |
|
|
|
|
|
|
|
|
|
|
|
assert MSG_AUTOR_OU_PERIODO in response.content.decode() |
|
|
|
|
|
assert not response.context.get('show_results') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False) |
|
|
|
|
|
def test_materias_por_autor_sem_autor_lista_materias_do_periodo(client): |
|
|
|
|
|
"""OSTicket #885134: sem autor, a pesquisa por período deve listar as |
|
|
|
|
|
matérias do período, uma vez cada, mesmo as de mais de um autor.""" |
|
|
|
|
|
ana = baker.make(Autor, nome='Ana') |
|
|
|
|
|
bruno = baker.make(Autor, nome='Bruno') |
|
|
|
|
|
m1 = cria_materia(1, date(2025, 3, 1), [ana, bruno]) |
|
|
|
|
|
m2 = cria_materia(2, date(2025, 6, 1), [bruno]) |
|
|
|
|
|
cria_materia(3, date(2024, 1, 1), [ana]) |
|
|
|
|
|
|
|
|
|
|
|
response = client.get( |
|
|
|
|
|
reverse('sapl.relatorios:materia_por_autor'), |
|
|
|
|
|
params_materias_por_autor(inicio='01/01/2025', fim='31/12/2025')) |
|
|
|
|
|
|
|
|
|
|
|
assert list(response.context['object_list']) == [m2, m1] |
|
|
|
|
|
content = response.content.decode() |
|
|
|
|
|
assert 'Autor: Todos' in content |
|
|
|
|
|
assert 'Autor(es)' in content |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False) |
|
|
|
|
|
def test_materias_por_autor_com_autor_dispensa_periodo(client): |
|
|
|
|
|
ana = baker.make(Autor, nome='Ana') |
|
|
|
|
|
bruno = baker.make(Autor, nome='Bruno') |
|
|
|
|
|
m1 = cria_materia(1, date(2025, 3, 1), [ana, bruno]) |
|
|
|
|
|
cria_materia(2, date(2025, 6, 1), [bruno]) |
|
|
|
|
|
m3 = cria_materia(3, date(2024, 1, 1), [ana]) |
|
|
|
|
|
|
|
|
|
|
|
response = client.get(reverse('sapl.relatorios:materia_por_autor'), |
|
|
|
|
|
params_materias_por_autor(autor=ana.pk)) |
|
|
|
|
|
|
|
|
|
|
|
assert list(response.context['object_list']) == [m1, m3] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False) |
|
|
|
|
|
def test_materias_por_autor_pdf_lista_materias(client, pdf_html): |
|
|
|
|
|
"""OSTicket #885134: o PDF saía "Nenhum documento encontrado" mesmo com |
|
|
|
|
|
a tela listando as matérias do autor.""" |
|
|
|
|
|
ana = baker.make(Autor, nome='Ana') |
|
|
|
|
|
cria_materia(1, date(2025, 3, 1), [ana]) |
|
|
|
|
|
|
|
|
|
|
|
response = client.get( |
|
|
|
|
|
reverse('sapl.relatorios:materia_por_autor'), |
|
|
|
|
|
params_materias_por_autor(autor=ana.pk, relatorio='on')) |
|
|
|
|
|
|
|
|
|
|
|
assert response['Content-Type'].startswith('application/pdf') |
|
|
|
|
|
assert 'Ementa da matéria 1' in pdf_html['html'] |
|
|
|
|
|
assert 'Nenhum documento encontrado' not in pdf_html['html'] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False) |
|
|
|
|
|
def test_materias_por_autor_pdf_sem_filtro_volta_ao_form(client, pdf_html): |
|
|
|
|
|
response = client.get( |
|
|
|
|
|
reverse('sapl.relatorios:materia_por_autor'), |
|
|
|
|
|
params_materias_por_autor(relatorio='on')) |
|
|
|
|
|
|
|
|
|
|
|
assert response['Content-Type'].startswith('text/html') |
|
|
|
|
|
assert MSG_AUTOR_OU_PERIODO in response.content.decode() |
|
|
|
|
|
assert 'html' not in pdf_html |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False) |
|
|
|
|
|
def test_normas_por_autor_sem_autor_e_sem_periodo_pede_filtro(client): |
|
|
|
|
|
response = client.get(reverse('sapl.relatorios:normas_por_autor'), |
|
|
|
|
|
params_normas_por_autor()) |
|
|
|
|
|
|
|
|
|
|
|
assert MSG_AUTOR_OU_PERIODO in response.content.decode() |
|
|
|
|
|
assert not response.context.get('show_results') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False) |
|
|
|
|
|
def test_normas_por_autor_sem_autor_agrupa_pelo_primeiro_autor(client): |
|
|
|
|
|
ana = baker.make(Autor, nome='Ana') |
|
|
|
|
|
bruno = baker.make(Autor, nome='Bruno') |
|
|
|
|
|
n1 = cria_norma('1', date(2025, 3, 1), [ana, bruno]) |
|
|
|
|
|
n2 = cria_norma('2', date(2025, 6, 1), [bruno]) |
|
|
|
|
|
cria_norma('3', date(2024, 1, 1), [ana]) |
|
|
|
|
|
|
|
|
|
|
|
response = client.get( |
|
|
|
|
|
reverse('sapl.relatorios:normas_por_autor'), |
|
|
|
|
|
params_normas_por_autor(inicio='01/01/2025', fim='31/12/2025')) |
|
|
|
|
|
|
|
|
|
|
|
assert list(response.context['object_list']) == [n1, n2] |
|
|
|
|
|
content = response.content.decode() |
|
|
|
|
|
assert 'Autor: Todos' in content |
|
|
|
|
|
assert 'Autor: Ana' in content |
|
|
|
|
|
assert 'Autor: Bruno' in content |
|
|
|