def test_get_expected_events( self, mock_obterDataInicialEFinal, ): events = [{ 'id': 1, 'descricao': 'Evento 1' }, { 'id': 2, 'descricao': 'Evento 2' }, { 'id': 3, 'descricao': 'Evento 3' }] dep_id = '12345' mock = Mocker(self.dep.dep) mock.add_response("obterEventosDeputado", [events], dep_id, dataInicio='2018-10-21', dataFim='2018-10-28') mock_obterDataInicialEFinal.return_value = ('2018-10-21', '2018-10-28') actual_response = self.dep.get_expected_events(dep_id, datetime(2018, 10, 28)) self.assertEqual(actual_response, [ Evento(id='1', nome='Evento 1'), Evento(id='2', nome='Evento 2'), Evento(id='3', nome='Evento 3'), ]) mock_obterDataInicialEFinal.assert_called_once_with( datetime(2018, 10, 28)) mock.assert_no_pending_responses()
def test_send_push_notification_message_too_big_sucess(self, mock_urllib3): def assert_equal(actual, expected): self.assertEqual(actual, expected) class FakePoolManager: def __init__(self, *args, **kwargs): FakePoolManager.call_count = 0 def request(self, method, url, headers, body): class responseFail(): status = 200 data = json.dumps({ 'results': [{ 'error': 'MessageTooBig' }] }).encode('utf-8') class responseSucess(): status = 200 data = json.dumps({ 'results': [{ 'id': '123' }] }).encode('utf-8') FakePoolManager.call_count += 1 assert_equal(method, "POST") assert_equal(url, "https://fcm.googleapis.com/fcm/send") if 'reportsIds' in body.decode('utf-8'): return responseSucess() return responseFail() data_inicial = datetime(2019, 10, 12) data_final = datetime(2019, 10, 19) parlamentar1 = Parlamentar(id='1', cargo='BR1', nome='AMANDA') relatorio1 = Relatorio( id="123", parlamentar=parlamentar1, data_final=data_final, data_inicial=data_inicial, proposicoes=[ Proposicao(id="1"), Proposicao(id="2"), Proposicao(id="3"), Proposicao(id="4") ], eventos_presentes=[Evento(id="1"), Evento(id="2")], eventos_previstos=None, eventos_ausentes=[Evento(id="4"), Evento(id="5"), Evento(id="6")]) mock_urllib3.side_effect = FakePoolManager result = send_push_notification("token", [relatorio1.to_dict()]) self.assertTrue(mock_urllib3.called) self.assertEqual(2, mock_urllib3.side_effect.call_count) self.assertTrue(result)
def test_build_event(self): event = { 'id': '123', 'dataHoraInicio': '2019-08-10T10:00', 'dataHoraFim': '2019-08-10T12:00', 'situacao': 'Encerrada', 'descricao': 'Sessão Ordinária', 'uri': 'uri', 'orgaos': [{ 'nome': 'Plenário', 'apelido': 'PLEN' }] } expected = Evento( id='123', data_inicial=self.dep.get_brt(datetime(2019, 8, 10, 10)), data_final=self.dep.get_brt(datetime(2019, 8, 10, 12)), situacao='Encerrada', nome='Sessão Ordinária', url='uri', orgaos=[Orgao(nome='Plenário', apelido='PLEN')]) actual = self.dep.build_event(event) self.assertEqual(expected, actual)
def test_send_push_notification_invalid_json_response(self, mock_urllib3): def assert_equal(actual, expected): self.assertEqual(actual, expected) class FakePoolManager: def __init__(self, *args, **kwargs): FakePoolManager.call_count = 0 def request(self, method, url, headers, body): class response(): status = 401 data = '<HTML><HEAD><TITLE>Invalid (legacy) Server-key delivered or Sender is not authorized to perform request.</TITLE></HEAD><BODY BGCOLOR="#FFFFFF" TEXT="#000000"><H1>Invalid (legacy) Server-key delivered or Sender is not authorized to perform request.</H1><H2>Error 401</H2></BODY></HTML>'.encode( 'utf-8') FakePoolManager.call_count += 1 assert_equal(method, "POST") assert_equal(url, "https://fcm.googleapis.com/fcm/send") return response() data_inicial = datetime(2019, 10, 12) data_final = datetime(2019, 10, 19) parlamentar1 = Parlamentar(id='1', cargo='BR1', nome='AMANDA') relatorio1 = Relatorio( id="123", parlamentar=parlamentar1, data_final=data_final, data_inicial=data_inicial, proposicoes=[ Proposicao(id="1"), Proposicao(id="2"), Proposicao(id="3"), Proposicao(id="4") ], eventos_presentes=[Evento(id="1"), Evento(id="2")], eventos_previstos=None, eventos_ausentes=[Evento(id="4"), Evento(id="5"), Evento(id="6")]) mock_urllib3.side_effect = FakePoolManager result = send_push_notification("token", [relatorio1.to_dict()]) self.assertTrue(mock_urllib3.called) self.assertEqual(1, mock_urllib3.side_effect.call_count) self.assertFalse(result)
def test_add_absent_events(self): absent_events = [ Evento(id='1', presenca=2, orgaos=[Orgao(nome='Órgão 1', apelido='')]), Evento(id='2', presenca=3, orgaos=[Orgao(nome='Órgão 1', apelido='')]), Evento(id='5', presenca=1, orgaos=[Orgao(nome='Órgão 4', apelido='')]), Evento(id='6', presenca=2, orgaos=[Orgao(nome='Órgão 4', apelido='PLEN')]), ] self.dep.relatorio = Relatorio() self.dep._add_absent_events(absent_events) self.assertEqual(self.dep.relatorio.eventos_ausentes, absent_events) absent_events.pop(2) self.assertEqual(self.dep.relatorio.eventos_previstos, absent_events) self.assertEqual(self.dep.relatorio.eventos_ausentes_esperados_total, 3)
def build_event(self, event_info): """ Builds an Event object with given event data :param event_info: Event dict :type event_info: Dict :return: Event object :rtype: Evento """ event = Evento() event.id = str(event_info['id']) event.data_inicial = self.get_brt( self._parse_datetime(event_info.get('dataHoraInicio'))) event.data_final = self.get_brt( self._parse_datetime(event_info.get('dataHoraFim'))) event.situacao = event_info.get('situacao') event.nome = event_info.get('descricao') event.url = event_info.get('uri') event.orgaos = [ Orgao(nome=o.get('nome'), apelido=o.get('apelido')) for o in event_info.get('orgaos', []) ] return event
def test_avaliar_sucesso(self): parlamentar = Parlamentar(id='id', cargo='BR1') evento = Evento(id='123', nome='Evento') relatorio = Relatorio( parlamentar=parlamentar, data_inicial='2019-01-01', eventos_presentes=[evento] ) relatorio.save() Avaliacao().avaliar('123', '1', '*****@*****.**', relatorio.pk) actual = Avaliacoes.objects().first() self.assertEqual(actual.email, '*****@*****.**') self.assertEqual(actual.relatorioId, relatorio.pk) self.assertEqual(actual.parlamentar.id, 'id') self.assertEqual(actual.parlamentar.cargo, 'BR1') self.assertEqual(actual.avaliado['id'], '123')
def test_add_attended_events(self): events_attended = [ Evento(id='3', data_inicial=self.dep.helper.get_brt(datetime(2019, 12, 10)), data_final=self.dep.helper.get_brt(datetime(2019, 12, 17))), Evento(id='4', data_inicial=self.dep.helper.get_brt(datetime(2019, 12, 10)), data_final=self.dep.helper.get_brt(datetime(2019, 12, 17))) ] mock_ev = Mocker(self.dep.helper.ev) mock_prop = Mocker(self.dep.helper.prop) mock_ev.add_response("obterPautaEvento", [ { 'codRegime': '123', 'proposicao_': { 'id': '11' } }, { 'codRegime': '123', 'proposicao_': { 'id': '12' } }, ]) mock_ev.add_exception("obterPautaEvento", CamaraDeputadosError) mock_prop.add_response( "obterProposicao", { 'id': '11', 'nome': 'Proposição I', 'ementa': 'Proposição I', 'numero': '11', 'ano': 2019 }) mock_prop.add_exception("obterProposicao", CamaraDeputadosError) mock_prop.add_response("obterVotacoesProposicao", [{ 'data': '15/12/2019', 'hora': '12:00', 'resumo': 'Votação 1', 'votos': [ { 'id': '23456', 'voto': 'Não' }, { 'id': '12345', 'voto': 'Sim' }, { 'id': '34567', 'voto': 'Abstenção' }, ] }]) mock_prop.add_response("obterVotacoesProposicao", [{ 'data': '16/12/2019', 'hora': '12:00', 'resumo': 'Votação 2', 'votos': [ { 'id': '23456', 'voto': 'Sim' }, { 'id': '12345', 'voto': 'Não' }, { 'id': '34567', 'voto': 'Abstenção' }, ] }]) self.dep.relatorio = Relatorio(parlamentar=Parlamentar(id='12345')) self.dep._add_attended_events(events_attended) self.assertEqual(self.dep.relatorio.eventos_presentes, [ Evento(id='3', data_inicial=self.dep.helper.get_brt(datetime(2019, 12, 10)), data_final=self.dep.helper.get_brt(datetime(2019, 12, 17)), presenca=0, pautas=[ Proposicao(id='11', numero='11', ementa='Proposição I', pauta='Votação 1 de Proposição I', voto='Sim') ]), Evento(id='4', data_inicial=self.dep.helper.get_brt(datetime(2019, 12, 10)), data_final=self.dep.helper.get_brt(datetime(2019, 12, 17)), presenca=0, pautas=[]) ])
def test_get_all_events(self, mock_obterDataInicialEFinal): mock = Mocker(self.dep.ev) mock.add_response( "obterTodosEventos", [[{ 'id': '123', 'dataHoraInicio': '2018-10-24T10:00', 'dataHoraFim': '2018-10-24T12:00', 'situacao': 'Encerrada', 'descricao': 'Sessão Ordinária', 'uri': 'uri', 'orgaos': [{ 'nome': 'Plenário', 'apelido': 'PLEN' }] }, { 'id': '1234', 'dataHoraInicio': '2018-10-24T14:00', 'dataHoraFim': '2018-10-24T18:45', 'situacao': 'Encerrada', 'descricao': 'Sessão Extraordinária', 'uri': 'uri', 'orgaos': [{ 'nome': 'Plenário', 'apelido': 'PLEN' }] }], [{ 'id': '12345', 'dataHoraInicio': '2018-10-25T10:00', 'dataHoraFim': None, 'situacao': 'Cancelada', 'descricao': 'Sessão Ordinária', 'uri': 'uri', 'orgaos': [{ 'nome': 'Comissão de Constituição e Justiça', 'apelido': 'CCJ' }] }]], dataInicio='2018-10-21', dataFim='2018-10-28') mock_obterDataInicialEFinal.return_value = ('2018-10-21', '2018-10-28') actual_response = self.dep.get_all_events(datetime(2018, 10, 28)) self.assertEqual([ Evento(id='123', data_inicial=self.dep.get_brt(datetime(2018, 10, 24, 10, 0)), data_final=self.dep.get_brt(datetime(2018, 10, 24, 12, 0)), situacao='Encerrada', nome='Sessão Ordinária', url='uri', orgaos=[Orgao(nome='Plenário', apelido='PLEN')]), Evento(id='1234', data_inicial=self.dep.get_brt(datetime(2018, 10, 24, 14, 0)), data_final=self.dep.get_brt(datetime(2018, 10, 24, 18, 45)), situacao='Encerrada', nome='Sessão Extraordinária', url='uri', orgaos=[Orgao(nome='Plenário', apelido='PLEN')]), Evento(id='12345', data_inicial=self.dep.get_brt(datetime(2018, 10, 25, 10, 0)), data_final=None, situacao='Cancelada', nome='Sessão Ordinária', url='uri', orgaos=[ Orgao(nome='Comissão de Constituição e Justiça', apelido='CCJ') ]), ], actual_response) mock_obterDataInicialEFinal.assert_called_once_with( datetime(2018, 10, 28)) mock.assert_no_pending_responses()
def test_get_absent_events(self): expected_events = [ self.dep.build_event(e) for e in [ { 'id': '2' }, { 'id': '3' }, { 'id': '4' }, ] ] events = [ self.dep.build_event(e) for e in [ { 'id': '1', 'orgaos': [{ 'nome': 'Órgão 1', 'apelido': '' }] }, { 'id': '2', 'orgaos': [{ 'nome': 'Órgão 1', 'apelido': '' }] }, { 'id': '3', 'orgaos': [{ 'nome': 'Órgão 2', 'apelido': '' }] }, { 'id': '4', 'orgaos': [{ 'nome': 'Órgão 2', 'apelido': '' }] }, { 'id': '5', 'orgaos': [{ 'nome': 'Órgão 4', 'apelido': '' }] }, { 'id': '6', 'orgaos': [{ 'nome': 'Órgão 4', 'apelido': 'PLEN' }] }, ] ] events_attended = [ self.dep.build_event(e) for e in [ { 'id': '3', 'orgaos': [{ 'nome': 'Órgão 2', 'apelido': '' }] }, { 'id': '4', 'orgaos': [{ 'nome': 'Órgão 2', 'apelido': '' }] }, ] ] commissions = [ Orgao(nome='Órgão 1'), Orgao(nome='Órgão 2'), Orgao(nome='Órgão 3'), ] actual_response = self.dep.get_absent_events( events, events_attended, expected_events, commissions, ) self.assertEqual([ Evento(id='1', presenca=2, orgaos=[Orgao(nome='Órgão 1', apelido='')]), Evento(id='2', presenca=3, orgaos=[Orgao(nome='Órgão 1', apelido='')]), Evento(id='5', presenca=1, orgaos=[Orgao(nome='Órgão 4', apelido='')]), Evento(id='6', presenca=2, orgaos=[Orgao(nome='Órgão 4', apelido='PLEN')]), ], actual_response)
def test_send_push_notification_success(self, mock_urllib3): def assert_equal(actual, expected): self.assertEqual(actual, expected) data_inicial = datetime(2019, 10, 12) data_final = datetime(2019, 10, 19) parlamentar1 = Parlamentar(id='1', cargo='BR1', nome='AMANDA') relatorio1 = Relatorio( id="123", parlamentar=parlamentar1, data_final=data_final, data_inicial=data_inicial, proposicoes=[ Proposicao(id="1"), Proposicao(id="2"), Proposicao(id="3"), Proposicao(id="4") ], eventos_presentes=[Evento(id="1"), Evento(id="2")], eventos_previstos=None, eventos_ausentes=[Evento(id="4"), Evento(id="5"), Evento(id="6")]) expected_reports = [{ "_id": "123", "parlamentar": parlamentar1.to_dict(), "mensagem": None, "dataInicial": str(data_inicial), "dataFinal": str(data_final), "orgaos": 0, "proposicoes": 4, "eventosPresentes": 2, "eventosAusentes": 3, "eventosPrevistos": 0, "presencaRelativa": "100.00%", "presencaTotal": "40.00%", "eventosAusentesEsperadosTotal": 0 }] class FakePoolManager: def __init__(self, *args, **kwargs): pass def request(self, method, url, headers, body): class response(): status = 200 data = json.dumps({ 'results': [{ 'id': '123' }] }).encode('utf-8') assert_equal(method, "POST") assert_equal(url, "https://fcm.googleapis.com/fcm/send") assert_equal( json.loads(body.decode('utf-8'))["data"]["reports"], expected_reports) return response() mock_urllib3.side_effect = FakePoolManager reports = [relatorio1.to_dict()] result = send_push_notification("token", reports) self.assertTrue(mock_urllib3.called) self.assertTrue(result) self.assertEqual([relatorio1.to_dict()], reports)
def obter_relatorio(self, parlamentar_id, data_final=datetime.now(), periodo_dias=7): try: start_time = time() self.relatorio = Relatorio() self.relatorio.aviso_dados = u'Dados de sessões de comissões não disponível.' self.set_period(periodo_dias) data_final = datetime.strptime(data_final, '%Y-%m-%d') data_inicial = self.obterDataInicial(data_final, **self.periodo) logging.info('[SAO PAULO] Parlamentar: {}'.format(parlamentar_id)) logging.info('[SAO PAULO] Data final: {}'.format(data_final)) logging.info('[SAO PAULO] Intervalo: {}'.format(periodo_dias)) vereador = self.obter_parlamentar(parlamentar_id) logging.info( '[SAO PAULO] Vereador obtido em {0:.5f}s'.format(time() - start_time)) self.relatorio.data_inicial = self.brasilia_tz.localize( data_inicial) self.relatorio.data_final = self.brasilia_tz.localize(data_final) presenca = [] sessao_total = 0 presenca_total = 0 for dia in self.ver.obterPresenca(data_inicial, data_final): if dia: for v in dia['vereadores']: if str(v['chave']) == vereador.id: for s in v['sessoes']: if s['presenca'] == 'Presente': presenca.append(s['nome']) sessao_total += int(dia['totalOrd']) + int( dia['totalExtra']) presenca_total += sum([ int(v['presenteOrd']), int(v['presenteExtra']) ]) for key, value in dia['sessoes'].items(): evento = Evento() orgao = Orgao() orgao.nome = 'Plenário' orgao.apelido = 'PLENÁRIO' evento.orgaos.append(orgao) evento.nome = key evento.id = str(uuid4()) if value['data']: try: evento.data_inicial = self.brasilia_tz.localize( datetime.strptime(value['data'], "%d/%m/%Y")) evento.data_final = self.brasilia_tz.localize( datetime.strptime(value['data'], "%d/%m/%Y")) except ValueError: pass for prop in value['pautas']: proposicao = Proposicao() proposicao.pauta = prop['projeto'] proposicao.tipo = prop['pauta'] for v in prop['votos']: if str(v['chave']) == parlamentar_id: proposicao.voto = v['voto'] evento.pautas.append(proposicao) if key in presenca: evento.set_presente() self.relatorio.eventos_presentes.append(evento) else: evento.set_ausencia_evento_esperado() self.relatorio.eventos_ausentes.append(evento) logging.info( '[SAO PAULO] Eventos obtidos em {0:.5f}s'.format(time() - start_time)) self.relatorio.eventos_ausentes_esperados_total = sessao_total - presenca_total self.obter_proposicoes_parlamentar(vereador.id, data_inicial, data_final) logging.info('[SAO PAULO] Proposicoes obtidas em {0:.5f}s'.format( time() - start_time)) logging.info( '[SAO PAULO] Relatorio obtido em {0:.5f}s'.format(time() - start_time)) return self.relatorio except Exception as e: logging.error(e) raise ModelError(str(e))
def set_up_db(db): parlamentar_test = set_up_parlamentar() brasilia_tz = pytz.timezone('America/Sao_Paulo') orgaos_evento = [ Orgao(nome="ÓrgãoTeste", sigla="OT", cargo="None", apelido="OhTe") ] eventos_presentes = [ Evento(id="12345", nome="Evento teste", data_inicial=brasilia_tz.localize(datetime(2019, 1, 1)), data_final=brasilia_tz.localize(datetime(2019, 1, 1)), url="http://url.com", situacao="Encerrada", presenca=0, orgaos=orgaos_evento) ] eventos_ausentes = [ Evento(id="123", nome="Evento teste", data_inicial=brasilia_tz.localize(datetime(2019, 1, 1)), data_final=brasilia_tz.localize(datetime(2019, 1, 1)), url="http://url.com", situacao="Cancelada", presenca=1, orgaos=orgaos_evento) ] Relatorio( pk=ObjectId("5c264b5e3a5efd576ecaf48e"), parlamentar=parlamentar_test, proposicoes=[], data_inicial=brasilia_tz.localize(datetime(2018, 12, 31)), data_final=brasilia_tz.localize(datetime(2019, 1, 7)), orgaos=[], eventos_presentes=eventos_presentes, eventos_ausentes=eventos_ausentes, eventos_previstos=[], ).save() Avaliacoes( pk=ObjectId("5c5116f5c3acc80004eada0a"), email="*****@*****.**", parlamentar=parlamentar_test, avaliacao="1", avaliado={ "url": "url", "situacao": "Cancelada", "dataFinal": brasilia_tz.localize(datetime(2019, 1, 1)), "orgaos": [{ "sigla": "OT", "nome": "ÓrgãoTeste", "apelido": "OhTe", "cargo": None }], "dataInicial": brasilia_tz.localize(datetime(2019, 1, 1)), "presenca": 1, "nome": "Evento teste", "id": "123" }, relatorioId=ObjectId("5c264b5e3a5efd576ecaf48e"), ).save() inscricoes = Inscricoes(parlamentares=[parlamentar_test], intervalo=7) User.drop_collection() User( username="******", email="*****@*****.**", password= "******", inscricoes=inscricoes, devices=[ UserDevice(id="14", name="dispositivo", token="---token---", active=True, os="Android") ]).save()
def obterEventosPresentes(self, dep_id, data_inicial, data_final, reunioes, comissoes, orgaos_nomes): eventos_todos = self.com.obterReunioesComissoes() presencas = self.com.obterPresencaReunioesComissoes() presencas = [x for x in presencas if x["idDeputado"] == dep_id] presencas_reunioes_id = [x["idReuniao"] for x in presencas] for e in eventos_todos: if (self.obterDatetimeDeStr(e["data"]) > data_inicial and self.obterDatetimeDeStr(e["data"]) < data_final): evento = Evento() evento.id = e['id'] evento.data_inicial = self.brasilia_tz.localize( self.obterDatetimeDeStr(e["data"])) evento.nome = e['convocacao'] evento.situacao = e['situacao'] if e['id'] in reunioes: for r in reunioes[e['id']]: proposicao = Proposicao() proposicao.id = r['idDocumento'] proposicao.pauta = r['idDocumento'] proposicao.url_documento = \ 'https://www.al.sp.gov.br/propositura/?id={}'.format(r['idDocumento']) proposicao.voto = self.obterVotoDescritivo(r['voto']) proposicao.tipo = r['idDocumento'] evento.pautas.append(proposicao) orgao = Orgao() orgao.nome = comissoes[e['idComissao']]['nome'] orgao.apelido = comissoes[e['idComissao']]['sigla'] evento.orgaos.append(orgao) if e["id"] in presencas_reunioes_id: evento.set_presente() self.relatorio.eventos_presentes.append(evento) else: evento.set_ausencia_evento_nao_esperado() if (comissoes[e["idComissao"]]["sigla"] in orgaos_nomes and e['situacao'].lower() in [ 'em preparação', 'em preparacao', 'realizada', 'encerrada' ]): evento.set_ausente_evento_previsto() self.relatorio.eventos_previstos.append(evento) self.relatorio.eventos_ausentes.append(evento)