Código fonte de tests.unit.test_cron

import json
import logging
import unittest
from datetime import datetime, timedelta
from unittest.mock import ANY, call, patch

import pytz
from flask import render_template
from mongoengine import connect

logging.disable(logging.CRITICAL)

from legislei.cron import generate_reports
from legislei.exceptions import ModelError
from legislei.house_selector import obter_relatorio
from legislei.models.inscricoes import Inscricoes
from legislei.models.relatorio import Parlamentar, Relatorio
from legislei.models.user import User, UserDevice
from legislei.send_reports import send_email


customAssertionMsg = '{} differs from expected {}'


[documentos]class TestCron(unittest.TestCase):
[documentos] def setUp(self): connect('mongoenginetest', host='mongomock://localhost') logging.disable(logging.CRITICAL)
[documentos] def tearDown(self): Relatorio.drop_collection() logging.disable(logging.NOTSET)
[documentos] @patch("legislei.cron.send_email") def test_generate_reports_multiplos_parlamentares( self, mock_send_email ): brasilia_tz = pytz.timezone('America/Sao_Paulo') agora = datetime.now() data_final = datetime(agora.year, agora.month, agora.day) data_final = brasilia_tz.localize(data_final) data_inicial = data_final - timedelta(days=7) parlamentar1 = Parlamentar(id='1', cargo='BR1') parlamentar2 = Parlamentar(id='2', cargo='BR2') parlamentar3 = Parlamentar(id='3', cargo='BR1') relatorio1 = Relatorio( parlamentar=parlamentar1, data_final=data_final, data_inicial=data_inicial ).save().reload() relatorio2 = Relatorio( parlamentar=parlamentar2, data_final=data_final, data_inicial=data_inicial ).save().reload() relatorio3 = Relatorio( parlamentar=parlamentar3, data_final=data_final, data_inicial=data_inicial ).save().reload() mock_send_email.return_value = True user = [User( username='user', password='pwd', email='test@test.com', inscricoes=Inscricoes( parlamentares=[parlamentar1, parlamentar2, parlamentar3], intervalo=7 ) )] generate_reports(user, data_final=agora) mock_send_email.assert_called_once_with( "test@test.com", [relatorio1.to_dict(), relatorio2.to_dict(), relatorio3.to_dict()], dates=ANY )
[documentos] @patch("legislei.cron.send_email") def test_generate_reports_multiplos_intervalos( self, mock_send_email ): brasilia_tz = pytz.timezone('America/Sao_Paulo') agora = datetime(2019, 6, 29) data_final = datetime(agora.year, agora.month, agora.day) data_final = brasilia_tz.localize(data_final) parlamentar1 = Parlamentar(id='1', cargo='BR1') relatorio1 = Relatorio( parlamentar=parlamentar1, data_final=data_final, data_inicial=data_final - timedelta(days=7) ).save().reload() relatorio2 = Relatorio( parlamentar=parlamentar1, data_final=data_final, data_inicial=data_final - timedelta(days=14) ).save().reload() relatorio3 = Relatorio( parlamentar=parlamentar1, data_final=data_final, data_inicial=data_final - timedelta(days=28) ).save().reload() mock_send_email.return_value = True users = [ User( username='user1', password='pwd', email='test1@test.com', inscricoes=Inscricoes( parlamentares=[parlamentar1], intervalo=7 ) ), User( username='user2', password='pwd', email='test2@test.com', inscricoes=Inscricoes( parlamentares=[parlamentar1], intervalo=14 ) ), User( username='user4', password='pwd', email='test4@test.com', inscricoes=Inscricoes( parlamentares=[parlamentar1], intervalo=28 ) ) ] generate_reports(users, data_final=agora) self.assertEqual(mock_send_email.call_count, 3) mock_send_email.assert_has_calls( [ call("test1@test.com", [relatorio1.to_dict()], dates=ANY), call("test2@test.com", [relatorio2.to_dict()], dates=ANY), call("test4@test.com", [relatorio3.to_dict()], dates=ANY) ] )
[documentos] @patch("legislei.cron.send_email") @patch("legislei.cron.Relatorios") def test_generate_reports_one_obter_relatorio_fails( self, mock_Relatorios, mock_send_email ): class FakeRelatorios(): def obter_relatorio(self, parlamentar, *args, **kwargs): if parlamentar == '2': raise ModelError('msg') return {"nice": "JSON"} mock_Relatorios.side_effect = FakeRelatorios mock_send_email.return_value = True parlamentar1 = Parlamentar(id='1', cargo='BR1') parlamentar2 = Parlamentar(id='2', cargo='BR2') parlamentar3 = Parlamentar(id='3', cargo='BR1') user = [User( username='user', password='pwd', email='test@test.com', inscricoes=Inscricoes( parlamentares=[parlamentar1, parlamentar2, parlamentar3], intervalo=7 ) )] generate_reports(user) self.assertEqual(mock_Relatorios.call_count, 3) mock_send_email.assert_called_once_with( "test@test.com", [ {"nice": "JSON"}, { 'parlamentar': parlamentar2.to_dict(), 'orgaos': [], 'eventosPresentes': [], 'eventosPrevistos': [], 'eventosAusentes': [], 'proposicoes': [], '_id': None }, {"nice": "JSON"}, ], dates=ANY)
[documentos] @patch("legislei.cron.send_push_notification") @patch("legislei.cron.send_email") def test_generate_reports_send_to_active_devices_only( self, mock_send_email, mock_send_push_notification ): brasilia_tz = pytz.timezone('America/Sao_Paulo') agora = datetime(2019, 6, 29) data_final = datetime(agora.year, agora.month, agora.day) data_final = brasilia_tz.localize(data_final) parlamentar = Parlamentar(id='1', cargo='BR1') relatorio = Relatorio( parlamentar=parlamentar, data_final=data_final, data_inicial=data_final - timedelta(days=7) ).save().reload() mock_send_email.return_value = True users = [ User( username='user1', password='pwd', email='test1@test.com', inscricoes=Inscricoes( parlamentares=[parlamentar], intervalo=7 ), devices=[ UserDevice(id="device1", token="token1", name="name1", active=True), UserDevice(id="device2", token="token2", name="name2", active=False), UserDevice(id="device3", token="token3", name="name3", active=True), UserDevice(id="device4", token="token4", name="name4", active=False), ] ), ] generate_reports(users, data_final=agora) self.assertEqual(mock_send_push_notification.call_count, 2) mock_send_push_notification.assert_has_calls( [ call("token1", [relatorio.to_dict()]), call("token3", [relatorio.to_dict()]) ] )