def test_siguiente_manda_a_parcial_si_es_requerido_sin_scheduler( db, client, setup_groups, settings): settings.MIN_COINCIDENCIAS_CARGAS = 1 m1 = MesaFactory() a1 = AttachmentFactory(mesa=m1, status=Identificacion.STATUS.identificada) m2 = MesaFactory() a2 = AttachmentFactory(mesa=m2, status=Identificacion.STATUS.identificada) mc1 = MesaCategoriaFactory(categoria__requiere_cargas_parciales=False, coeficiente_para_orden_de_carga=1, mesa=m1) mc2 = MesaCategoriaFactory(categoria__requiere_cargas_parciales=True, coeficiente_para_orden_de_carga=2, mesa=m2) fiscales = FiscalFactory.create_batch(2) # Da mc1 porque es más prioritaria. fiscal_client = fiscal_client_from_fiscal(client, fiscales[0]) response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-total', args=[mc1.id]) # Cerramos la sesión para que el client pueda reutilizarse sin que nos diga # que ya estamos logueados. fiscal_client.logout() # mc1 fue asignada, ahora da mc2 fiscal_client = fiscal_client_from_fiscal(client, fiscales[1]) response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-parcial', args=[mc2.id])
def test_siguiente_prioriza_categoria(db, settings): f = FiscalFactory() c = CategoriaFactory(prioridad=2) c2 = CategoriaFactory(prioridad=1) m1 = MesaFactory() AttachmentFactory(mesa=m1) mc1 = MesaCategoriaFactory( status=MesaCategoria.STATUS.parcial_sin_consolidar, categoria=c, mesa=m1, ) mc1.actualizar_coeficiente_para_orden_de_carga() m2 = MesaFactory() AttachmentFactory(mesa=m2) mc2 = MesaCategoriaFactory( categoria=c2, status=MesaCategoria.STATUS.parcial_sin_consolidar, mesa=m2, ) mc2.actualizar_coeficiente_para_orden_de_carga() # Se recibe la mc con categoria más prioritaria. assert MesaCategoria.objects.siguiente() == mc2 for i in range(settings.MIN_COINCIDENCIAS_CARGAS): mc2.asignar_a_fiscal() # Luego la de la categoría menos prioritaria. assert MesaCategoria.objects.siguiente() == mc1
def test_aumentar_scrolling(db, settings): """ Se comprueba que al disparar eventos de aumento de scoring, el efecto sea el esperado """ with override_config( SCORING_MINIMO_PARA_CONSIDERAR_QUE_FISCAL_ES_TROLL=400): fiscal1 = nuevo_fiscal() fiscal2 = nuevo_fiscal() assert fiscal1.scoring_troll() == 0 assert fiscal2.scoring_troll() == 0 mesa1 = MesaFactory() attach1 = AttachmentFactory() attach2 = AttachmentFactory() identi1 = identificar(attach1, mesa1, fiscal1) identi2 = identificar(attach1, mesa1, fiscal2) identi3 = identificar(attach2, mesa1, fiscal1) aumentar_scoring_troll_identificacion(100, identi1) aumentar_scoring_troll_identificacion(150, identi2) aumentar_scoring_troll_identificacion(250, identi3) assert fiscal1.scoring_troll() == 350 assert fiscal2.scoring_troll() == 150 assert not fiscal1.troll assert not fiscal2.troll attach3 = AttachmentFactory() identi4 = reportar_problema_attachment(attach3, fiscal1) aumentar_scoring_troll_identificacion(80, identi4) assert fiscal1.scoring_troll() == 430 assert fiscal2.scoring_troll() == 150 assert fiscal1.troll assert not fiscal2.troll
def test_priorizadas_ordena_por_cant_asignaciones_realizadas(db, settings): a1 = AttachmentFactory() a2 = AttachmentFactory() a3 = AttachmentFactory() assert a1.id < a2.id assert a2.id < a3.id assert set(Attachment.objects.sin_identificar()) == {a1, a2, a3} for i in range(settings.MIN_COINCIDENCIAS_IDENTIFICACION): a1.asignar_a_fiscal() a2.asignar_a_fiscal() a3.asignar_a_fiscal() # Prima el orden por id. assert list( Attachment.objects.sin_identificar().priorizadas()) == [a1, a2, a3] # Ahora a2 es devuelto. for i in range(settings.MIN_COINCIDENCIAS_IDENTIFICACION): a2.desasignar_a_fiscal() assert list( Attachment.objects.sin_identificar().priorizadas()) == [a2, a1, a3] # a2 es asignado nuevamente. for i in range(settings.MIN_COINCIDENCIAS_IDENTIFICACION): a2.asignar_a_fiscal() # Si bien a3 y a2 tienen la misma cantidad de asignaciones # vigentes, a2 fue asignado más veces. a1 y a3 empatan, salvo por id. assert list( Attachment.objects.sin_identificar().priorizadas()) == [a1, a3, a2] assert a1.cant_fiscales_asignados == a3.cant_fiscales_asignados assert a3.cant_fiscales_asignados == a2.cant_fiscales_asignados assert a3.cant_asignaciones_realizadas < a2.cant_asignaciones_realizadas
def test_registro_cambio_estado_troll(db, settings): """ Se comprueba que un CambioEstadoTroll se genere con los valores correctos. """ with override_config( SCORING_MINIMO_PARA_CONSIDERAR_QUE_FISCAL_ES_TROLL=320): fiscal = nuevo_fiscal() attach1 = AttachmentFactory() attach2 = AttachmentFactory() identi1 = reportar_problema_attachment(attach1, fiscal) identi2 = reportar_problema_attachment(attach2, fiscal) cantidad_cambios_estado_antes = CambioEstadoTroll.objects.count() aumentar_scoring_troll_identificacion(200, identi1) assert CambioEstadoTroll.objects.count( ) == cantidad_cambios_estado_antes assert CambioEstadoTroll.objects.filter( fiscal_afectado=fiscal).count() == 0 aumentar_scoring_troll_identificacion(200, identi2) assert CambioEstadoTroll.objects.count( ) == cantidad_cambios_estado_antes + 1 cambioEstado = CambioEstadoTroll.objects.filter( fiscal_afectado=fiscal).first() assert cambioEstado.automatico assert cambioEstado.actor is None assert cambioEstado.evento_disparador == fiscal.eventos_scoring_troll.order_by( 'created').last() assert cambioEstado.troll
def test_elegir_acta_prioriza_por_tamaño_circuito(db, fiscal_client): e1 = EleccionFactory() m1 = AttachmentFactory(mesa__eleccion=[e1]).mesa m2 = AttachmentFactory(mesa__eleccion=[e1]).mesa m3 = AttachmentFactory(mesa__eleccion=[e1]).mesa # creo otras mesas asociadas a los circuitos c1 = m1.lugar_votacion.circuito c2 = m2.lugar_votacion.circuito c3 = m3.lugar_votacion.circuito MesaFactory.create_batch(3, eleccion=[e1], lugar_votacion__circuito=c1) MesaFactory.create_batch(10, eleccion=[e1], lugar_votacion__circuito=c2) MesaFactory.create_batch(5, eleccion=[e1], lugar_votacion__circuito=c3) assert c1.electores == 400 assert c2.electores == 1100 assert c3.electores == 600 assert m1.orden_de_carga == m2.orden_de_carga == m3.orden_de_carga == 1 response = fiscal_client.get(reverse('elegir-acta-a-cargar')) assert response.status_code == 302 assert response.url == reverse('mesa-cargar-resultados', args=[e1.id, m2.numero]) response = fiscal_client.get(reverse('elegir-acta-a-cargar')) assert response.status_code == 302 assert response.url == reverse('mesa-cargar-resultados', args=[e1.id, m3.numero]) response = fiscal_client.get(reverse('elegir-acta-a-cargar')) assert response.status_code == 302 assert response.url == reverse('mesa-cargar-resultados', args=[e1.id, m1.numero])
def test_identificacion_consolidada_tres_ok_dos_error(db): # En esta variable se almacena el comportamiento que tendrá cada llamado a # la función consolidar_identificaciones para cada identicacion de un attachment # a procesar. # Los attachments a, c y e se procesarán con normalidad y su identificación # quedará maracada como procesadas=True. # Para los attachments b y d se lanzará una Exception y su identicación # quedará como procesada=False. side_effects = [ mock.DEFAULT, #comportamiento para a Exception('error'), #comportamiento para b mock.DEFAULT, #comportamiento para c Exception('error'), #comportamiento para d mock.DEFAULT #comportamiento para e ] with mock.patch('adjuntos.consolidacion.consolidar_identificaciones', side_effect=side_effects): m1 = MesaFactory() a = AttachmentFactory() b = AttachmentFactory() c = AttachmentFactory() d = AttachmentFactory() e = AttachmentFactory() i1 = IdentificacionFactory(attachment=a, status='identificada', mesa=m1) i2 = IdentificacionFactory(attachment=b, status='identificada', mesa=m1) i3 = IdentificacionFactory(attachment=c, status='identificada', mesa=m1) i4 = IdentificacionFactory(attachment=d, status='identificada', mesa=m1) i5 = IdentificacionFactory(attachment=e, status='identificada', mesa=m1) cant_novedades = Identificacion.objects.filter(procesada=False).count() assert cant_novedades == 5 consumir_novedades_identificacion() # Chequeamos que las no procesadas son 2 no_procesadas = Identificacion.objects.filter(procesada=False) assert no_procesadas.count() == 2 # Chequeamos que las no procesadas son i2 e i4 no_procesadas_ids = map(lambda x: x.id, no_procesadas) assert set([i2.id, i4.id]) == set(no_procesadas_ids) # Chequeamos que las procesadas son 3 procesadas = Identificacion.objects.filter(procesada=True) assert procesadas.count() == 3 # Chequeamos que las procesadas son i1, i3 e i5 procesadas_ids = map(lambda x: x.id, procesadas) assert set([i1.id, i3.id, i5.id]) == set(procesadas_ids)
def test_identificadas_excluye_sin_orden(db): m1 = MesaFactory() AttachmentFactory(mesa=m1) mc1 = MesaCategoriaFactory(mesa=m1) m2 = MesaFactory() AttachmentFactory(mesa=m2) mc2 = MesaCategoriaFactory(coeficiente_para_orden_de_carga=0.1, mesa=m2) assert mc1.coeficiente_para_orden_de_carga is None assert mc1 not in MesaCategoria.objects.identificadas() assert mc2 in MesaCategoria.objects.identificadas()
def test_siguiente_prioriza_estado_y_luego_coeficiente(db, settings, setup_constance, django_assert_num_queries): f = FiscalFactory() c = CategoriaFactory(prioridad=1) m1 = MesaFactory() AttachmentFactory(mesa=m1) mc1 = MesaCategoriaFactory( status=MesaCategoria.STATUS.parcial_sin_consolidar, categoria=c, coeficiente_para_orden_de_carga=1.0, mesa=m1 ) m2 = MesaFactory() AttachmentFactory(mesa=m2) mc2 = MesaCategoriaFactory( categoria=c, status=MesaCategoria.STATUS.total_en_conflicto, coeficiente_para_orden_de_carga=99.0, mesa=m2 ) m3 = MesaFactory() AttachmentFactory(mesa=m3) mc3 = MesaCategoriaFactory( categoria=c, status=MesaCategoria.STATUS.total_en_conflicto, coeficiente_para_orden_de_carga=2.0, mesa=m3 ) with django_assert_num_queries(17): assert MesaCategoria.objects.siguiente() == mc1 for i in range(settings.MIN_COINCIDENCIAS_CARGAS): mc1.asignar_a_fiscal() assert MesaCategoria.objects.siguiente() == mc3 for i in range(settings.MIN_COINCIDENCIAS_CARGAS): mc3.asignar_a_fiscal() assert MesaCategoria.objects.siguiente() == mc2 for i in range(settings.MIN_COINCIDENCIAS_CARGAS): mc2.asignar_a_fiscal() # A igualdad de asignaciones, se vuelven a repetir. assert MesaCategoria.objects.siguiente() == mc1 for i in range(settings.MIN_COINCIDENCIAS_CARGAS): mc1.asignar_a_fiscal() assert MesaCategoria.objects.siguiente() == mc3 for i in range(settings.MIN_COINCIDENCIAS_CARGAS): mc3.asignar_a_fiscal() assert MesaCategoria.objects.siguiente() == mc2
def test_troll_parcial_dc_a_sin_consolidar(db, settings): with override_config( SCORING_MINIMO_PARA_CONSIDERAR_QUE_FISCAL_ES_TROLL=20): fiscal_1 = nuevo_fiscal() fiscal_2 = nuevo_fiscal() presi = CategoriaFactory() mesa_1 = MesaFactory(categorias=[presi]) mesa_categoria_1 = MesaCategoria.objects.filter( mesa=mesa_1, categoria=presi).first() attach_1 = AttachmentFactory() identificar(attach_1, mesa_1, fiscal_1) identificar(attach_1, mesa_1, fiscal_2) refrescar_data( [presi, fiscal_1, fiscal_2, mesa_1, mesa_categoria_1, attach_1]) assert not fiscal_1.troll assert not fiscal_2.troll nueva_carga(mesa_categoria_1, fiscal_1, [20, 35], Carga.TIPOS.parcial) nueva_carga(mesa_categoria_1, fiscal_2, [20, 35], Carga.TIPOS.parcial) consumir_novedades_carga() refrescar_data([mesa_categoria_1]) assert mesa_categoria_1.status == MesaCategoria.STATUS.parcial_consolidada_dc assert Carga.objects.filter(invalidada=True).count() == 0 aplicar_marca_troll(fiscal_2) consumir_novedades_carga() refrescar_data([mesa_categoria_1, fiscal_2]) assert mesa_categoria_1.status == MesaCategoria.STATUS.parcial_sin_consolidar assert Carga.objects.filter(invalidada=True).count() == 1
def test_datos_fotos_distrital(db, settings): settings.MIN_COINCIDENCIAS_IDENTIFICACION = 2 settings.DISTRITO_PBA = '2' # 50 mesas: 20 pba, 15 caba, 15 catamarca data = DataTresDistritos(settings.DISTRITO_PBA) # 40 fotos: # - 14 / 5 / 2 identificadas a mesas pba / caba / catamarca # - 3 con problemas # - 6 en proceso de identificación # - 10 sin acciones for ix in range(40): foto = AttachmentFactory() if (ix < 14): identificar(foto, data.mesas_pba[ix], data.fiscales[0]) identificar(foto, data.mesas_pba[ix], data.fiscales[1]) elif (ix < 19): identificar(foto, data.mesas_caba[ix-14], data.fiscales[2]) identificar(foto, data.mesas_caba[ix-14], data.fiscales[3]) elif (ix < 21): identificar(foto, data.mesas_cat[ix-19], data.fiscales[4]) identificar(foto, data.mesas_cat[ix-19], data.fiscales[5]) elif (ix < 24): reportar_problema_attachment(foto, data.fiscales[6]) reportar_problema_attachment(foto, data.fiscales[7]) elif (ix < 30): identificar(foto, data.mesas_pba[ix-10], data.fiscales[8]) consumir_novedades() generador = GeneradorDatosFotosDistrital(settings.DISTRITO_PBA) generador.calcular() assert generador.cantidad_mesas == 20 assert generador.mesas_con_foto_identificada == 14
def test_carga_mesa_redirige_a_siguiente(db, fiscal_client): o = OpcionFactory(es_contable=True) e1 = EleccionFactory(opciones=[o]) e2 = EleccionFactory(opciones=[o]) m1 = AttachmentFactory(mesa__eleccion=[e1, e2]).mesa response = fiscal_client.get(reverse('elegir-acta-a-cargar')) assert response.url == reverse('mesa-cargar-resultados', args=[e1.id, m1.numero]) # response = fiscal_client.get(url) response = fiscal_client.post( response.url, { 'form-0-opcion': str(o.id), 'form-0-votos': str(m1.electores), 'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MIN_NUM_FORMS': '1', 'form-MAX_NUM_FORMS': '1000', }) assert response.status_code == 302 assert response.url == reverse('mesa-cargar-resultados', args=[e2.id, m1.numero]) response = fiscal_client.post( response.url, { 'form-0-opcion': str(o.id), 'form-0-votos': str(m1.electores), 'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MIN_NUM_FORMS': '1', 'form-MAX_NUM_FORMS': '1000', }) assert response.status_code == 302 assert response.url == reverse('elegir-acta-a-cargar')
def test_troll_total_consolidada_dc_a_parcial_sin_consolidar(db, settings): fiscal_1 = nuevo_fiscal() fiscal_2 = nuevo_fiscal() presi = CategoriaFactory() mesa_1 = MesaFactory(categorias=[presi]) mesa_categoria_1 = MesaCategoria.objects.filter(mesa=mesa_1, categoria=presi).first() attach_1 = AttachmentFactory() identificar(attach_1, mesa_1, fiscal_1) identificar(attach_1, mesa_1, fiscal_2) refrescar_data( [presi, fiscal_1, fiscal_2, mesa_1, mesa_categoria_1, attach_1]) nueva_carga(mesa_categoria_1, fiscal_1, [20, 35], Carga.TIPOS.parcial) nueva_carga(mesa_categoria_1, fiscal_2, [20, 35], Carga.TIPOS.parcial) consumir_novedades_carga() refrescar_data([mesa_categoria_1]) nueva_carga(mesa_categoria_1, fiscal_2, [20, 35], Carga.TIPOS.total) nueva_carga(mesa_categoria_1, fiscal_1, [20, 35], Carga.TIPOS.total) consumir_novedades_carga() refrescar_data([mesa_categoria_1]) assert mesa_categoria_1.status == MesaCategoria.STATUS.total_consolidada_dc assert Carga.objects.filter(invalidada=True).count() == 0 aplicar_marca_troll(fiscal_2) consumir_novedades_carga() refrescar_data([mesa_categoria_1, fiscal_2]) assert mesa_categoria_1.status == MesaCategoria.STATUS.parcial_sin_consolidar assert Carga.objects.filter(invalidada=True).count() == 3
def test_identificacion_problema_create_view_post_ajax(fiscal_client, admin_user): a = AttachmentFactory() data = { 'status': 'problema', 'tipo_de_problema': 'falta_lista', 'descripcion': 'Un problema' } # ajax post url = reverse('asignar-problema', args=[a.id]) response = fiscal_client.post(url, data, HTTP_X_REQUESTED_WITH='XMLHttpRequest') assert response.status_code == 200 # hack assert response.json() == {'status': 'hack'} assert a.identificaciones.count() == 1 i = a.identificaciones.first() assert i.status == 'problema' assert i.fiscal == admin_user.fiscal assert i.mesa is None # mesa no tiene attach aun a.refresh_from_db() assert a.identificacion_testigo is None # hay un problema asociado al attach con un reporte asociado problema = a.problemas.get() # demuestra que es 1 solo assert problema.estado == 'potencial' reporte = problema.reportes.get() # idem, es 1 solo assert reporte.tipo_de_problema == 'falta_lista' assert reporte.reportado_por == admin_user.fiscal assert reporte.descripcion == 'Un problema'
def test_identificacion_create_view_post__desde_unidad_basica( fiscal_client, admin_user): mesa_1 = MesaFactory() attachment = AttachmentFactory() admin_user.fiscal.asignar_attachment(attachment) attachment.asignar_a_fiscal() data = { 'mesa': mesa_1.numero, 'circuito': mesa_1.circuito.numero, 'seccion': mesa_1.circuito.seccion.numero, 'distrito': mesa_1.circuito.seccion.distrito.id, } response = fiscal_client.post( reverse('asignar-mesa-ub', args=[attachment.id]), data) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('cargar-desde-ub', kwargs={'mesa_id': mesa_1.id}) # Refrescamos el attachment desde la base. attachment.refresh_from_db() assert attachment.identificaciones.count() == 1 assert attachment.status == Attachment.STATUS.identificada identificacion = attachment.identificaciones.first() assert attachment.identificacion_testigo == identificacion assert identificacion.status == Identificacion.STATUS.identificada assert identificacion.source == Identificacion.SOURCES.csv assert identificacion.mesa == mesa_1 # La identificación está consolidada, por lo tanto ya existe en la mesa assert mesa_1.attachments.exists()
def test_consolidador_honra_timeout(db, settings): settings.MIN_COINCIDENCIAS_IDENTIFICACION = 1 a = AttachmentFactory() m1 = MesaFactory() i1 = IdentificacionFactory( attachment=a, status='identificada', mesa=m1, tomada_por_consolidador=timezone.now() - timedelta(minutes=settings.TIMEOUT_CONSOLIDACION - 1)) consumir_novedades_identificacion() a.refresh_from_db() i1.refresh_from_db() # No la tomó aún. assert i1.procesada is False assert a.status == Attachment.STATUS.sin_identificar i1.tomada_por_consolidador = timezone.now() - timedelta( minutes=settings.TIMEOUT_CONSOLIDACION + 1) i1.save() consumir_novedades_identificacion() a.refresh_from_db() i1.refresh_from_db() # Ahora sí assert i1.procesada is True assert a.identificacion_testigo == i1 assert a.mesa == m1 assert a.status == Attachment.STATUS.identificada
def test_siguiente_happy_path_parcial_y_total_con_scheduler( db, fiscal_client, settings): settings.MIN_COINCIDENCIAS_CARGAS = 1 mesa = MesaFactory() a = AttachmentFactory(mesa=mesa, status='identificada') mc1 = MesaCategoriaFactory(categoria__requiere_cargas_parciales=True, coeficiente_para_orden_de_carga=1, mesa=mesa) scheduler() response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-parcial', args=[mc1.id]) carga = CargaFactory(mesa_categoria=mc1, tipo='parcial') consumir_novedades_carga() scheduler() mc1.refresh_from_db() assert mc1.status == MesaCategoria.STATUS.parcial_consolidada_dc assert mc1.carga_testigo == carga mc1.desasignar_a_fiscal() response = fiscal_client.get(reverse('siguiente-accion')) assert response.url == reverse('carga-total', args=[mc1.id]) carga = CargaFactory(mesa_categoria=mc1, tipo='total') consumir_novedades_carga() scheduler() mc1.refresh_from_db() assert mc1.status == MesaCategoria.STATUS.total_consolidada_dc assert mc1.carga_testigo == carga response = fiscal_client.get(reverse('siguiente-accion')) # No hay actas para cargar, vuelta a empezar. assert response.status_code == HTTPStatus.OK assert 'No hay actas para cargar' in str(response.content)
def test_identificacion_consolidada_alguna(db): a = AttachmentFactory() m1 = MesaFactory() i1 = IdentificacionFactory(attachment=a, status='identificada', mesa=m1) IdentificacionFactory(attachment=a, status='problema', mesa=None) i2 = IdentificacionFactory(attachment=a, status='problema', mesa=None) Problema.reportar_problema(FiscalFactory(), 'reporte 1', ReporteDeProblema.TIPOS_DE_PROBLEMA.ilegible, identificacion=i2) IdentificacionFactory(attachment=a, status='identificada', mesa=m1) assert a.identificacion_testigo is None cant_novedades = Identificacion.objects.filter(procesada=False).count() assert cant_novedades == 4 consumir_novedades_identificacion() # No se consolidó el problema. assert i2.problemas.first().problema.estado == Problema.ESTADOS.potencial cant_novedades = Identificacion.objects.filter(procesada=False).count() assert cant_novedades == 0 a.refresh_from_db() assert a.identificacion_testigo == i1 assert a.mesa == m1 assert a.status == Attachment.STATUS.identificada
def test_identificacion_consolidada_ninguno(db): a = AttachmentFactory() m1 = MesaFactory() IdentificacionFactory(attachment=a, status='identificada', mesa=m1) i1 = IdentificacionFactory(attachment=a, status='problema', mesa=None) f = FiscalFactory() Problema.reportar_problema(f, 'reporte 1', ReporteDeProblema.TIPOS_DE_PROBLEMA.spam, identificacion=i1) assert i1.problemas.first().problema.estado == Problema.ESTADOS.potencial i2 = IdentificacionFactory(attachment=a, status='problema', mesa=None) Problema.reportar_problema(f, 'reporte 2', ReporteDeProblema.TIPOS_DE_PROBLEMA.ilegible, identificacion=i2) assert a.identificacion_testigo is None cant_novedades = Identificacion.objects.filter(procesada=False).count() assert cant_novedades == 3 consumir_novedades_identificacion() # Se consolidó un problema. assert i1.problemas.first().problema.estado == Problema.ESTADOS.pendiente cant_novedades = Identificacion.objects.filter(procesada=False).count() assert cant_novedades == 0 assert a.identificacion_testigo is None
def test_datos_fotos_nacional(db, settings): settings.MIN_COINCIDENCIAS_IDENTIFICACION = 2 fiscales = [nuevo_fiscal() for ix in range(10)] mesas = [MesaFactory() for ix in range(30)] # 25 fotos: # - 9 identificadas # - 1 con problemas # - 8 en proceso de identificación # - 7 sin acciones for ix in range(25): foto = AttachmentFactory() if (ix < 9): identificar(foto, mesas[ix], fiscales[0]) identificar(foto, mesas[ix], fiscales[1]) elif (ix < 10): reportar_problema_attachment(foto, fiscales[2]) reportar_problema_attachment(foto, fiscales[3]) elif (ix < 18): identificar(foto, mesas[ix], fiscales[4]) consumir_novedades() generador = GeneradorDatosFotosNacional() generador.calcular() assert generador.cantidad_mesas == 30 assert generador.mesas_con_foto_identificada == 9 assert generador.fotos_con_problema_confirmado == 1 assert generador.fotos_en_proceso == 8 assert generador.fotos_sin_acciones == 7 assert generador.mesas_sin_foto == 5
def test_identificacion_problema_troll(db): fiscal_troll = nuevo_fiscal() fiscal_troll.troll = True fiscal_troll.save(update_fields=['troll']) fiscal_ok = nuevo_fiscal() attach = AttachmentFactory() ident_troll = reportar_problema_attachment(attach, fiscal_troll) Problema.reportar_problema(fiscal_troll, "foto fea", ReporteDeProblema.TIPOS_DE_PROBLEMA.ilegible, identificacion=ident_troll) ident_ok = reportar_problema_attachment(attach, fiscal_ok) Problema.reportar_problema(fiscal_ok, "no me gusta", ReporteDeProblema.TIPOS_DE_PROBLEMA.falta_lista, identificacion=ident_ok) assert 2 == Problema.objects.count() assert 1 == ReporteDeProblema.objects.filter( reportado_por=fiscal_troll).count() assert 1 == ReporteDeProblema.objects.filter( reportado_por=fiscal_ok).count() problema_troll = ReporteDeProblema.objects.filter( reportado_por=fiscal_troll).first().problema assert Problema.ESTADOS.descartado == problema_troll.estado problema_ok = ReporteDeProblema.objects.filter( reportado_por=fiscal_ok).first().problema assert Problema.ESTADOS.potencial == problema_ok.estado
def test_elegir_acta_mesas_redirige(db, fiscal_client): assert Mesa.objects.count() == 0 assert VotoMesaReportado.objects.count() == 0 c = CircuitoFactory() e1 = EleccionFactory() e2 = EleccionFactory() m1 = AttachmentFactory(mesa__eleccion=[e1], mesa__lugar_votacion__circuito=c).mesa e2 = EleccionFactory() m2 = AttachmentFactory(mesa__eleccion=[e1, e2], mesa__lugar_votacion__circuito=c).mesa assert m1.orden_de_carga == 1 assert m2.orden_de_carga == 2 response = fiscal_client.get(reverse('elegir-acta-a-cargar')) assert response.status_code == 302 assert response.url == reverse('mesa-cargar-resultados', args=[e1.id, m1.numero]) # como m1 queda en periodo de "taken" (aunque no se haya ocupado aun) # se pasa a la siguiente mesa response = fiscal_client.get(reverse('elegir-acta-a-cargar')) assert response.status_code == 302 assert response.url == reverse('mesa-cargar-resultados', args=[e1.id, m2.numero]) # se carga esa eleccion VotoMesaReportadoFactory(mesa=m2, eleccion=e1, opcion=e1.opciones.first(), votos=1) # FIX ME . El periodo de taken deberia ser *por eleccion*. # en este escenario donde esta lockeado la mesa para la eleccion 1, pero no se está # cargando la mesa 2, un dataentry queda idle response = fiscal_client.get(reverse('elegir-acta-a-cargar')) assert response.status_code == 200 # no hay actas m2.taken = None m2.save() response = fiscal_client.get(reverse('elegir-acta-a-cargar')) assert response.status_code == 302 assert response.url == reverse('mesa-cargar-resultados', args=[e2.id, m2.numero])
def test_desmarca_masiva(db, settings): fiscal_1 = nuevo_fiscal() fiscal_2 = nuevo_fiscal() fiscal_3 = nuevo_fiscal() fiscal_4 = nuevo_fiscal() fiscal_5 = nuevo_fiscal() fiscal_6 = nuevo_fiscal() fiscal_7 = nuevo_fiscal() attach = AttachmentFactory() mesa_1 = MesaFactory() mesa_2 = MesaFactory() mesa_3 = MesaFactory() mesa_4 = MesaFactory() mesa_5 = MesaFactory() with override_config( SCORING_MINIMO_PARA_CONSIDERAR_QUE_FISCAL_ES_TROLL=200): identi_1 = reportar_problema_attachment(attach, fiscal_1) identi_2 = identificar(attach, mesa_1, fiscal_2) identi_3 = identificar(attach, mesa_2, fiscal_3) identi_4 = identificar(attach, mesa_3, fiscal_4) identi_5 = identificar(attach, mesa_4, fiscal_5) identi_6 = identificar(attach, mesa_5, fiscal_6) aumentar_scoring_troll_identificacion(300, identi_1) aumentar_scoring_troll_identificacion(400, identi_2) aumentar_scoring_troll_identificacion(500, identi_3) aumentar_scoring_troll_identificacion(100, identi_4) aumentar_scoring_troll_identificacion(50, identi_5) assert fiscal_1.troll assert fiscal_2.troll assert fiscal_3.troll assert not fiscal_4.troll assert not fiscal_5.troll assert not fiscal_6.troll Fiscal.destrolleo_masivo(fiscal_7, 450, 80) for fiscal in [ fiscal_1, fiscal_2, fiscal_3, fiscal_4, fiscal_5, fiscal_6 ]: fiscal.refresh_from_db() assert not fiscal_1.troll assert fiscal_1.scoring_troll() == 80 assert not fiscal_2.troll assert fiscal_2.scoring_troll() == 80 eventos = list( fiscal_2.eventos_scoring_troll.order_by('created').all()) assert len(eventos) == 2 assert eventos[1].variacion == -320 assert fiscal_3.troll assert not fiscal_4.troll assert fiscal_4.scoring_troll() == 100 assert not fiscal_5.troll assert fiscal_5.scoring_troll() == 50 assert not fiscal_6.troll
def test_consolidador_desmarca_timeout(db, settings): a = AttachmentFactory() m1 = MesaFactory() i1 = IdentificacionFactory(attachment=a, status='identificada', mesa=m1) assert i1.tomada_por_consolidador is None consumir_novedades_identificacion() i1.refresh_from_db() assert i1.tomada_por_consolidador is None assert i1.procesada is True
def test_identificacion_create_view_get(fiscal_client, admin_user): a = AttachmentFactory() # Se la asigno al fiscal admin_user.fiscal.asignar_attachment(a) response = fiscal_client.get(reverse('asignar-mesa', args=[a.id])) foto_url = a.foto.thumbnail['960x'].url assert response.status_code == HTTPStatus.OK assert foto_url in response.content.decode('utf8')
def test_identificacion_consolidada_con_minimo_1(db, settings): settings.MIN_COINCIDENCIAS_IDENTIFICACION = 1 a = AttachmentFactory() m1 = MesaFactory() i1 = IdentificacionFactory(attachment=a, status='identificada', mesa=m1) consumir_novedades_identificacion() a.refresh_from_db() assert a.identificacion_testigo == i1 assert a.mesa == m1 assert a.status == Attachment.STATUS.identificada
def test_identificacion_create_view_get__desde_unidad_basica( fiscal_client, admin_user): a = AttachmentFactory() admin_user.fiscal.asignar_attachment(a) a.asignar_a_fiscal() response = fiscal_client.get(reverse('asignar-mesa-ub', args=[a.id])) assert response.status_code == HTTPStatus.OK foto_url = a.foto.thumbnail['960x'].url assert foto_url in response.content.decode('utf8')
def test_ciclo_de_vida_problemas_resolver(db): a = AttachmentFactory() m1 = MesaFactory() IdentificacionFactory(attachment=a, status='identificada', mesa=m1) # Está pendiente. assert a in Attachment.objects.sin_identificar() i1 = IdentificacionFactory(attachment=a, status='problema', mesa=None) f = FiscalFactory() Problema.reportar_problema(f, 'reporte 1', ReporteDeProblema.TIPOS_DE_PROBLEMA.spam, identificacion=i1) assert i1.problemas.first().problema.estado == Problema.ESTADOS.potencial i2 = IdentificacionFactory(attachment=a, status='problema', mesa=None) Problema.reportar_problema(f, 'reporte 2', ReporteDeProblema.TIPOS_DE_PROBLEMA.ilegible, identificacion=i2) assert i1.invalidada == False assert i2.invalidada == False consumir_novedades_identificacion() # Se consolidó un problema. a.refresh_from_db() assert a.status == Attachment.STATUS.problema problema = i1.problemas.first().problema assert problema.estado == Problema.ESTADOS.pendiente # El attach no está entre los pendientes. assert a not in Attachment.objects.sin_identificar() problema.resolver(FiscalFactory().user) assert problema.estado == Problema.ESTADOS.resuelto i1.refresh_from_db() i2.refresh_from_db() # Las identificaciones están invalidadas. assert i1.invalidada == True assert i2.invalidada == True consumir_novedades_identificacion() # Se agrega una nueva identificación y se consolida. IdentificacionFactory(attachment=a, status='identificada', mesa=m1) consumir_novedades_identificacion() a.refresh_from_db() assert a.status == Attachment.STATUS.identificada assert a.mesa == m1
def test_identificacion_sin_permiso(fiscal_client, admin_user, mocker): fiscal = admin_user.fiscal capture = mocker.patch( 'adjuntos.views.identificacion_create.capture_message') a = AttachmentFactory() response = fiscal_client.get(reverse('asignar-mesa', args=[a.id])) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('siguiente-accion') fiscal.asignar_attachment(a) response = fiscal_client.get(reverse('asignar-mesa', args=[a.id])) assert response.status_code == 200
def test_efecto_de_ser_troll(db): """ Se comprueba que las cargas e identificaciones que realiza un fiscal luego de ser detectado como troll, nacen invalidadas y procesadas. """ # escenario fiscal_1 = nuevo_fiscal() fiscal_2 = nuevo_fiscal() categoria = nueva_categoria(["o1", "o2", "o3"]) mesa = MesaFactory(categorias=[categoria]) mesa_categoria = MesaCategoria.objects.filter(mesa=mesa).first() attach_1 = AttachmentFactory() attach_2 = AttachmentFactory() # marco al fiscal_1 como troll fiscal_1.marcar_como_troll(fiscal_2) # despues, una carga, una identificacion y un reporte de problema cada uno ident_1 = identificar(attach_1, mesa, fiscal_1) ident_2 = identificar(attach_1, mesa, fiscal_2) problema_1 = reportar_problema_attachment(attach_2, fiscal_1) problema_2 = reportar_problema_attachment(attach_2, fiscal_2) carga_1 = nueva_carga(mesa_categoria, fiscal_1, [30, 20, 10]) carga_2 = nueva_carga(mesa_categoria, fiscal_2, [30, 20, 10]) # las cargas e identificaciones que hizo el fiscal 1 estan invalidadas y procesadas, # las que hizo el fiscal 2 no for accion in [ident_1, problema_1, carga_1]: assert accion.invalidada assert accion.procesada for accion in [ident_2, problema_2, carga_2]: assert not accion.invalidada assert not accion.procesada # consolido cargas e identificaciones. Ni el attachment ni la mesa_categoria deberian estar consolidados. consumir_novedades() for db_object in [mesa_categoria, attach_1, attach_2]: db_object.refresh_from_db() assert mesa_categoria.status == MesaCategoria.STATUS.total_sin_consolidar assert attach_1.status == Attachment.STATUS.sin_identificar assert attach_2.status == Attachment.STATUS.sin_identificar