mirror of https://github.com/interlegis/sapl.git
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.
168 lines
5.3 KiB
168 lines
5.3 KiB
import uuid
|
|
|
|
import pytest
|
|
from django.contrib.auth.models import Permission
|
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
from model_bakery import baker
|
|
from rest_framework.authtoken.models import Token
|
|
from rest_framework.test import APIClient
|
|
|
|
from sapl.base.models import AppConfig, Autor
|
|
from sapl.integracao_hub.models import EventoRecebido
|
|
from sapl.materia.models import Proposicao, TipoProposicao
|
|
|
|
URL = '/api/integracao/proposicoes/'
|
|
|
|
|
|
@pytest.fixture()
|
|
def app_config(db):
|
|
return AppConfig.objects.create()
|
|
|
|
|
|
@pytest.fixture()
|
|
def cliente_hub(db):
|
|
usuario = baker.make('auth.User')
|
|
permissao = Permission.objects.get(
|
|
content_type__app_label='integracao_hub', codename='pode_integrar')
|
|
usuario.user_permissions.add(permissao)
|
|
token = Token.objects.create(user=usuario)
|
|
cliente = APIClient()
|
|
cliente.credentials(HTTP_AUTHORIZATION='Token %s' % token.key)
|
|
return cliente
|
|
|
|
|
|
@pytest.fixture()
|
|
def autor(db):
|
|
return baker.make(Autor)
|
|
|
|
|
|
@pytest.fixture()
|
|
def tipo(db):
|
|
return baker.make(TipoProposicao)
|
|
|
|
|
|
def corpo(autor, tipo, **extras):
|
|
dados = {
|
|
'chave_idempotencia': str(uuid.uuid4()),
|
|
'autor': autor.pk,
|
|
'tipo': tipo.pk,
|
|
'ementa': 'Indica a revitalização da praça central',
|
|
}
|
|
dados.update(extras)
|
|
return dados
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_cria_proposicao_como_rascunho(cliente_hub, app_config, autor, tipo):
|
|
resposta = cliente_hub.post(URL, corpo(autor, tipo))
|
|
|
|
assert resposta.status_code == 201
|
|
proposicao = Proposicao.objects.get(pk=resposta.data['proposicao_id'])
|
|
assert proposicao.autor == autor
|
|
assert proposicao.tipo == tipo
|
|
assert proposicao.descricao == 'Indica a revitalização da praça central'
|
|
assert proposicao.data_envio is None # nasce rascunho — spec §3
|
|
assert proposicao.numero_proposicao == 1
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_reentrega_devolve_200_sem_duplicar(cliente_hub, app_config, autor,
|
|
tipo):
|
|
dados = corpo(autor, tipo)
|
|
|
|
primeira = cliente_hub.post(URL, dados)
|
|
segunda = cliente_hub.post(URL, dados)
|
|
|
|
assert primeira.status_code == 201
|
|
assert segunda.status_code == 200
|
|
assert segunda.data['proposicao_id'] == primeira.data['proposicao_id']
|
|
assert Proposicao.objects.count() == 1
|
|
assert EventoRecebido.objects.count() == 1
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_texto_e_justificativa_viram_observacao(cliente_hub, app_config,
|
|
autor, tipo):
|
|
resposta = cliente_hub.post(URL, corpo(
|
|
autor, tipo, texto='Texto da proposição',
|
|
justificativa='Porque sim'))
|
|
|
|
assert resposta.status_code == 201
|
|
proposicao = Proposicao.objects.get(pk=resposta.data['proposicao_id'])
|
|
assert 'Texto da proposição' in proposicao.observacao
|
|
assert 'Justificativa: Porque sim' in proposicao.observacao
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_arquivo_vira_texto_original(cliente_hub, app_config, autor, tipo):
|
|
arquivo = SimpleUploadedFile(
|
|
'proposicao.pdf', b'%PDF-1.4 conteudo', 'application/pdf')
|
|
|
|
resposta = cliente_hub.post(
|
|
URL, corpo(autor, tipo, arquivos=arquivo), format='multipart')
|
|
|
|
assert resposta.status_code == 201
|
|
proposicao = Proposicao.objects.get(pk=resposta.data['proposicao_id'])
|
|
assert proposicao.texto_original
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_mais_de_um_arquivo_e_rejeitado(cliente_hub, app_config, autor, tipo):
|
|
arquivos = [
|
|
SimpleUploadedFile('a.pdf', b'%PDF-1.4 a', 'application/pdf'),
|
|
SimpleUploadedFile('b.pdf', b'%PDF-1.4 b', 'application/pdf'),
|
|
]
|
|
|
|
resposta = cliente_hub.post(
|
|
URL, corpo(autor, tipo, arquivos=arquivos), format='multipart')
|
|
|
|
assert resposta.status_code == 422
|
|
assert Proposicao.objects.count() == 0
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_autor_inexistente_da_422(cliente_hub, app_config, tipo):
|
|
autor_fantasma = type('A', (), {'pk': 99999})()
|
|
|
|
resposta = cliente_hub.post(URL, corpo(autor_fantasma, tipo))
|
|
|
|
assert resposta.status_code == 422
|
|
assert 'autor' in resposta.data['detalhe']
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_tipo_inexistente_da_422_com_erros_do_form(cliente_hub, app_config,
|
|
autor):
|
|
tipo_fantasma = type('T', (), {'pk': 99999})()
|
|
|
|
resposta = cliente_hub.post(URL, corpo(autor, tipo_fantasma))
|
|
|
|
assert resposta.status_code == 422
|
|
assert 'erros' in resposta.data
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_chave_invalida_da_422(cliente_hub, app_config, autor, tipo):
|
|
resposta = cliente_hub.post(
|
|
URL, corpo(autor, tipo, chave_idempotencia='nao-e-uuid'))
|
|
|
|
assert resposta.status_code == 422
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_sem_permissao_da_403(db, app_config, autor, tipo):
|
|
usuario = baker.make('auth.User')
|
|
token = Token.objects.create(user=usuario)
|
|
cliente = APIClient()
|
|
cliente.credentials(HTTP_AUTHORIZATION='Token %s' % token.key)
|
|
|
|
resposta = cliente.post(URL, corpo(autor, tipo))
|
|
|
|
assert resposta.status_code == 403
|
|
|
|
|
|
@pytest.mark.django_db(transaction=False)
|
|
def test_sem_token_da_401(db, app_config, autor, tipo):
|
|
resposta = APIClient().post(URL, corpo(autor, tipo))
|
|
|
|
assert resposta.status_code == 401
|
|
|