Sistema de Apoio ao Processo Legislativo
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

163 lines
5.6 KiB

from io import BytesIO
from PyPDF4 import PdfFileWriter
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.core.cache import cache
from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse
from model_bakery import baker
import pytest
from sapl.base.models import AppConfig
from sapl.protocoloadm.models import (DocumentoAcessorioAdministrativo,
DocumentoAdministrativo)
@pytest.fixture(autouse=True)
def limpa_cache_appconfig():
# o cache em arquivo sobrevive ao rollback do teste
cache.clear()
yield
cache.clear()
@pytest.fixture
def media_tmp(settings, tmp_path):
settings.MEDIA_ROOT = str(tmp_path)
return tmp_path
def _config(comportamento):
cache.clear()
AppConfig.objects.all().delete()
baker.make(AppConfig, documentos_administrativos=comportamento)
def _documento(restrito):
documento = baker.make(DocumentoAdministrativo, restrito=restrito)
documento.texto_integral = SimpleUploadedFile(
'texto.pdf', b'%PDF-1.4 conteudo', content_type='application/pdf')
documento.save()
return documento
def _client(client, perfil):
if perfil == 'anonimo':
return client
user = baker.make(get_user_model(), username=perfil)
if perfil == 'com_permissao':
ct = ContentType.objects.get_for_model(DocumentoAdministrativo)
perm, _ = Permission.objects.get_or_create(
codename='detail_documentoadministrativo', content_type=ct,
defaults={'name': 'detail'})
user.user_permissions.add(perm)
client.force_login(user)
return client
ACESSO = [
# (comportamento, restrito, perfil, pode_ver)
('O', False, 'anonimo', True),
('O', False, 'sem_permissao', True),
('O', False, 'com_permissao', True),
('O', True, 'anonimo', False),
('O', True, 'sem_permissao', True),
('O', True, 'com_permissao', True),
('R', False, 'anonimo', False),
('R', False, 'sem_permissao', False),
('R', False, 'com_permissao', True),
('R', True, 'anonimo', False),
('R', True, 'sem_permissao', False),
('R', True, 'com_permissao', True),
]
@pytest.mark.django_db(transaction=False)
@pytest.mark.parametrize('comportamento,restrito,perfil,pode_ver', ACESSO)
def test_doc_texto_integral_acesso(client, media_tmp, comportamento,
restrito, perfil, pode_ver):
_config(comportamento)
documento = _documento(restrito)
client = _client(client, perfil)
response = client.get(reverse('sapl.protocoloadm:doc_texto_integral',
kwargs={'pk': documento.pk}))
assert response.status_code == (200 if pode_ver else 404)
def _pdf():
writer = PdfFileWriter()
writer.addBlankPage(72, 72)
data = BytesIO()
writer.write(data)
return data.getvalue()
@pytest.mark.django_db(transaction=False)
@pytest.mark.parametrize('comportamento,restrito,perfil,pode_ver', ACESSO)
def test_pdf_docacessorios_acesso(client, media_tmp, monkeypatch,
comportamento, restrito, perfil, pode_ver):
# create_pdf_docacessorios usa o MEDIA_ROOT importado de sapl.settings
monkeypatch.setattr('sapl.protocoloadm.views.MEDIA_ROOT', str(media_tmp))
_config(comportamento)
documento = baker.make(DocumentoAdministrativo, restrito=restrito)
acessorio = baker.make(DocumentoAcessorioAdministrativo,
documento=documento)
acessorio.arquivo = SimpleUploadedFile(
'acessorio.pdf', _pdf(), content_type='application/pdf')
acessorio.save()
client = _client(client, perfil)
response = client.get(reverse('sapl.protocoloadm:merge_docacessorios',
kwargs={'pk': documento.pk}))
if pode_ver:
assert response.status_code == 200
assert response['Content-Type'] == 'application/pdf'
assert response.content.startswith(b'%PDF')
else:
assert response.status_code == 404
@pytest.mark.django_db(transaction=False)
def test_pdf_docacessorios_sem_acessorios_volta_para_lista(client):
_config('O')
documento = baker.make(DocumentoAdministrativo, restrito=False)
response = client.get(reverse('sapl.protocoloadm:merge_docacessorios',
kwargs={'pk': documento.pk}))
assert response.status_code == 302
assert response['Location'] == reverse(
'sapl.protocoloadm:documentoacessorioadministrativo_list',
kwargs={'pk': documento.pk})
@pytest.mark.django_db(transaction=False)
@pytest.mark.parametrize('url_name', ['doc_texto_integral',
'merge_docacessorios'])
def test_docadm_pk_inexistente(client, url_name):
_config('O')
response = client.get(reverse('sapl.protocoloadm:' + url_name,
kwargs={'pk': 999999}))
assert response.status_code == 404
@pytest.mark.django_db(transaction=False)
def test_detalhe_e_arquivo_usam_a_mesma_configuracao(client, media_tmp):
# com mais de uma linha em AppConfig, página e arquivo leem a mesma
_config('O')
baker.make(AppConfig, documentos_administrativos='R')
documento = _documento(False)
detalhe = client.get(reverse(
'sapl.protocoloadm:documentoadministrativo_detail',
kwargs={'pk': documento.pk}))
texto = client.get(reverse('sapl.protocoloadm:doc_texto_integral',
kwargs={'pk': documento.pk}))
assert detalhe.status_code == 302
assert texto.status_code == 404