import logging
import unittest
from datetime import datetime
from unittest.mock import patch
from legislei.exceptions import ModelError
from legislei.houses.alesp import ALESPHandler
from legislei.models.relatorio import Parlamentar
from legislei.SDKs.AssembleiaLegislativaSP.exceptions import (
ALESPConnectionError, ALESPError)
from legislei.SDKs.AssembleiaLegislativaSP.mock import Mocker
[documentos]class TestALESPHandler(unittest.TestCase):
[documentos] def setUp(self):
self.dep = ALESPHandler()
logging.disable(logging.CRITICAL)
[documentos] def tearDown(self):
logging.disable(logging.NOTSET)
[documentos] def test_obterDeputado(self):
mock = Mocker(self.dep.dep)
mock.add_response(
"obterTodosDeputados",
[
{'id': '12'},
{'id': '11'},
{'id': '14', 'nome': 'Teste', 'siglaPartido': 'PPP', 'urlFoto': 'foto'},
]
)
expected_response = {
'id': '14',
'nome': 'Teste',
'partido': 'PPP',
'uf': 'SP',
'cargo': 'SP',
'foto': 'foto'
}
actual_response = self.dep.obter_parlamentar('14')
self.assertEqual(expected_response, actual_response.to_dict())
mock.assert_no_pending_responses()
[documentos] def test_obterDeputado_invalid_id(self):
mock = Mocker(self.dep.dep)
mock.add_response(
"obterTodosDeputados",
[
{'id': '12'},
{'id': '11'},
{'id': '14', 'nome': 'Teste', 'siglaPartido': 'PPP', 'urlFoto': 'foto'},
]
)
actual_response = self.dep.obter_parlamentar('28')
self.assertIsNone(actual_response)
mock.assert_no_pending_responses()
[documentos] def test_obterParlamentares(self):
mock = Mocker(self.dep.dep)
mock_response = [
{'id': '12', 'nome': 'Teste2', 'siglaPartido': 'P1'},
{'id': '11', 'nome': 'Teste1', 'siglaPartido': 'P2'},
{'id': '14', 'nome': 'Teste4', 'siglaPartido': 'P1'},
]
expected_response = [
Parlamentar(
id='12',
nome='Teste2',
partido='P1',
cargo='SP',
uf='SP',
foto=None
),
Parlamentar(
id='11',
nome='Teste1',
partido='P2',
cargo='SP',
uf='SP',
foto=None
),
Parlamentar(
id='14',
nome='Teste4',
partido='P1',
cargo='SP',
uf='SP',
foto=None
)
]
mock.add_response("obterTodosDeputados", mock_response)
actual_response = self.dep.obter_parlamentares()
self.assertEqual(expected_response, actual_response)
mock.assert_no_pending_responses()
[documentos] def test_obterParlamentares_fail_case(self):
mock = Mocker(self.dep.dep)
mock.add_exception("obterTodosDeputados", ALESPError)
with self.assertRaises(ModelError):
self.dep.obter_parlamentares()
mock.assert_no_pending_responses()
[documentos] def test_obterComissoesPorId(self):
mock = Mocker(self.dep.com)
mock.add_response(
"obterComissoes",
[
{'id': '1', 'nome': 'Comissão1'},
{'id': '2', 'nome': 'Comissão2'},
{'id': '3', 'nome': 'Comissão3'},
]
)
actual_response = self.dep.obterComissoesPorId()
self.assertEqual({
'1': {'id': '1', 'nome': 'Comissão1'},
'2': {'id': '2', 'nome': 'Comissão2'},
'3': {'id': '3', 'nome': 'Comissão3'}
}, actual_response)
mock.assert_no_pending_responses()
[documentos] def test_obterVotacoesPorReuniao(self):
mock = Mocker(self.dep.com)
mock.add_response(
"obterVotacoesComissoes",
[
{'idDeputado': '1', 'idReuniao': '1', 'voto': 'F'},
{'idDeputado': '1', 'idReuniao': '2', 'voto': 'F'},
{'idDeputado': '2', 'idReuniao': '3', 'voto': 'S'},
{'idDeputado': '3', 'idReuniao': '4', 'voto': 'F'},
{'idDeputado': '1', 'idReuniao': '1', 'voto': 'C'},
{'idDeputado': '4', 'idReuniao': '5', 'voto': 'C'},
]
)
actual_response = self.dep.obterVotacoesPorReuniao('1')
self.assertEqual({
'1': [
{'idDeputado': '1', 'idReuniao': '1', 'voto': 'F'},
{'idDeputado': '1', 'idReuniao': '1', 'voto': 'C'},
],
'2': [{'idDeputado': '1', 'idReuniao': '2', 'voto': 'F'}]
}, actual_response)
mock.assert_no_pending_responses()
[documentos] def test_obterVotoDescritivo(self):
self.assertEqual(self.dep.obterVotoDescritivo("F"), "Favorável")
self.assertEqual(self.dep.obterVotoDescritivo("C"), "Contrário")
self.assertEqual(self.dep.obterVotoDescritivo("S"), "Com o voto em separado")
self.assertEqual(self.dep.obterVotoDescritivo("WTF"), "WTF")
[documentos] @patch("legislei.houses.alesp.ALESPHandler.obterDatetimeDeStr")
def test_obterComissoesDeputado(
self,
mock_obterDatetimeDeStr
):
def fakeObterDatetimeDeStr(txt):
return txt
mock_obterDatetimeDeStr.side_effect = fakeObterDatetimeDeStr
mock = Mocker(self.dep.com)
mock.add_response(
"obterMembrosComissoes",
[
{
'idDeputado': '1',
'idComissao': '1',
'dataInicio': datetime(2018, 12, 1),
'dataFim': datetime(2018, 12, 30),
'efetivo': True
},
{
'idDeputado': '1',
'idComissao': '2',
'dataInicio': datetime(2018, 12, 1),
'dataFim': None,
'efetivo': True
},
{
'idDeputado': '1',
'idComissao': '3',
'dataInicio': datetime(2018, 12, 1),
'dataFim': datetime(2018, 12, 30),
'efetivo': False
},
{
'idDeputado': '2',
'idComissao': '4',
'dataFim': datetime(2018, 11, 30),
'dataInicio': datetime(2018, 11, 1),
'efetivo': True
}
]
)
comissoes = {
'1': {'nome': 'Comissão1', 'sigla': 'C1'},
'2': {'nome': 'Comissão2', 'sigla': 'C2'},
'3': {'nome': 'Comissão3', 'sigla': 'C3'},
'4': {'nome': 'Comissão3', 'sigla': 'C4'},
}
actual_response = self.dep.obterComissoesDeputado(
comissoes, '1', datetime(2018, 12, 10), datetime(2018, 12, 14)
)
self.assertEqual(['C1', 'C2', 'C3'], actual_response)
self.assertEqual(
len(self.dep.relatorio.orgaos), 3
)
self.assertTrue(mock_obterDatetimeDeStr.called)
mock.assert_no_pending_responses()
[documentos] @patch("legislei.houses.alesp.ALESPHandler.obterDatetimeDeStr")
def test_obterEventosPresentes(
self,
mock_obterDatetimeDeStr
):
def fakeObterDatetimeDeStr(txt):
return txt
mock_obterDatetimeDeStr.side_effect = fakeObterDatetimeDeStr
mock = Mocker(self.dep.com)
mock.add_response(
"obterReunioesComissoes",
[
{
'id': '1',
'idComissao': '1',
'convocacao': 'Reunião1',
'situacao': 'Realizada',
'data': datetime(2018, 12, 15),
},
{
'id': '2',
'idComissao': '1',
'convocacao': 'Reunião2',
'situacao': 'Realizada',
'data': datetime(2018, 12, 1),
},
{
'id': '3',
'idComissao': '1',
'convocacao': 'Reunião3',
'situacao': 'Em preparação',
'data': datetime(2018, 12, 30),
},
{
'id': '4',
'idComissao': '1',
'convocacao': 'Reunião4',
'situacao': 'Cancelada',
'data': datetime(2018, 12, 15),
},
{
'id': '5',
'idComissao': '2',
'convocacao': 'Reunião1',
'situacao': 'Realizada',
'data': datetime(2018, 12, 15),
},
{
'id': '6',
'idComissao': '2',
'convocacao': 'Reunião2',
'situacao': 'Realizada',
'data': datetime(2018, 12, 15),
},
{
'id': '7',
'idComissao': '1',
'convocacao': 'Reunião5',
'situacao': 'Realizada',
'data': datetime(2018, 12, 15),
},
]
)
mock.add_response(
"obterPresencaReunioesComissoes",
[
{'idDeputado': '1', 'idReuniao': '1'},
{'idDeputado': '1', 'idReuniao': '2'},
{'idDeputado': '1', 'idReuniao': '3'},
{'idDeputado': '2', 'idReuniao': '6'},
]
)
reunioes = {
'1': [{'idDocumento': '1', 'voto': 'F'}],
}
comissoes = {
'1': {'nome': 'Comissão1', 'sigla': 'C1'},
'2': {'nome': 'Comissão2', 'sigla': 'C2'},
}
self.dep.obterEventosPresentes(
'1',
datetime(2018, 12, 10),
datetime(2018, 12, 16),
reunioes,
comissoes,
['C1']
)
self.assertEqual(len(self.dep.relatorio.eventos_presentes), 1)
self.assertEqual(len(self.dep.relatorio.eventos_ausentes), 4)
self.assertEqual(len(self.dep.relatorio.eventos_previstos), 1)
mock.assert_no_pending_responses()
[documentos] @patch("legislei.houses.alesp.ALESPHandler.obterDatetimeDeStr")
@patch("legislei.SDKs.AssembleiaLegislativaSP.proposicoes.Proposicoes.obterTodasProposicoes")
@patch("legislei.SDKs.AssembleiaLegislativaSP.proposicoes.Proposicoes.obterTodosAutoresProposicoes")
@patch("legislei.SDKs.AssembleiaLegislativaSP.proposicoes.Proposicoes.obterNaturezaDocumentos")
def test_obterProposicoesDeputado(
self,
mock_obterNaturezaDocumentos,
mock_obterTodosAutoresProposicoes,
mock_obterTodasProposicoes,
mock_obterDatetimeDeStr
):
def fakeObterDatetimeDeStr(txt):
return txt
mock_obterDatetimeDeStr.side_effect = fakeObterDatetimeDeStr
mock = Mocker(self.dep.prop)
mock.add_response(
"obterNaturezaDocumentos",
[
{'id': '1', 'sigla': 'PL'},
{'id': '2', 'sigla': 'PEC'},
{'id': '3', 'sigla': 'REQ'},
]
)
mock.add_response(
"obterTodosAutoresProposicoes",
[
{'idAutor': '1', 'idDocumento': '1'},
{'idAutor': '2', 'idDocumento': '2'},
{'idAutor': '1', 'idDocumento': '3'},
{'idAutor': '1', 'idDocumento': '4'},
{'idAutor': '1', 'idDocumento': '5'},
]
)
mock.add_response(
"obterTodasProposicoes",
[
{
'id': '1',
'ementa': 'Faz coisas boas',
'numero': '001',
'dataEntrada': datetime(2018, 12, 15),
'idNatureza': '1'
},
{
'id': '2',
'ementa': 'Faz outras coisas boas',
'numero': '002',
'dataEntrada': datetime(2018, 12, 15),
'idNatureza': '1'
},
{
'id': '3',
'ementa': 'Não tenho data de entrada',
'numero': '002',
'dataEntrada': None,
'idNatureza': '1'
},
{
'id': '4',
'ementa': 'Não tenho natureza',
'numero': '003',
'dataEntrada': datetime(2018, 12, 15),
'idNatureza': None
},
{
'id': '5',
'ementa': 'Não faço parte do perído do relatório',
'numero': '005',
'dataEntrada': datetime(2018, 12, 1),
'idNatureza': '1'
},
]
)
self.dep.obterProposicoesDeputado(
'1', datetime(2018, 12, 10), datetime(2018, 12, 16)
)
self.assertEqual(len(self.dep.relatorio.proposicoes), 2)
mock.assert_no_pending_responses()
[documentos] def test_obterDatetimeDeStr(self):
actual_response = self.dep.obterDatetimeDeStr('2018-12-15T00:00:00')
self.assertEqual(datetime(2018, 12, 15), actual_response)
[documentos] def test_alesp_unavailable(self):
class FakeHTTPResponse():
status = 503
def geturl():
return 'teste'
mock = Mocker(self.dep.dep)
mock.add_exception('obterTodosDeputados', ALESPConnectionError(FakeHTTPResponse))
with self.assertRaises(ModelError) as cm:
self.dep.obter_relatorio('123', data_final='2019-09-21')
[documentos] def test_obter_relatorio_deputado_unavailable(self):
mock = Mocker(self.dep.dep)
mock.add_response('obterTodosDeputados', [])
mock.add_response('obterTodosDeputados', [])
with self.assertRaises(ModelError) as cm:
self.dep.obter_relatorio('123', data_final='2019-09-21')
self.assertEqual('Parlamentar não encontrado', str(cm.exception))