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_carga_envia_datos_previos_al_formset(db, fiscal_client, admin_user, mocker): sentinela = mocker.MagicMock() mocker.patch('elecciones.models.MesaCategoria.datos_previos', return_value=sentinela) mc = MesaCategoriaFactory() mc.asignar_a_fiscal() admin_user.fiscal.asignar_mesa_categoria(mc) response = fiscal_client.get(reverse('carga-total', args=[mc.id])) assert response.context['formset'].datos_previos is sentinela
def test_carga_sin_permiso(fiscal_client, admin_user, mocker): fiscal = admin_user.fiscal capture = mocker.patch('fiscales.views.capture_message') mc = MesaCategoriaFactory(coeficiente_para_orden_de_carga=1) response = fiscal_client.get(reverse('carga-total', args=[mc.id])) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse( 'siguiente-accion') # Manda a asignar una nueva. mc.asignar_a_fiscal() fiscal.asignar_mesa_categoria(mc) response = fiscal_client.get(reverse('carga-total', args=[mc.id])) assert response.status_code == HTTPStatus.OK
def test_formset_en_carga_total_reusa_parcial_confirmada( db, fiscal_client, admin_user, settings): # Solo una carga, para simplificar el setup settings.MIN_COINCIDENCIAS_CARGAS = 1 c = CategoriaFactory(id=25000, opciones=[]) # Notar que el orden no coincide con el id o1 = CategoriaOpcionFactory(categoria=c, orden=3, prioritaria=True).opcion o2 = CategoriaOpcionFactory(categoria=c, orden=1, prioritaria=False).opcion o3 = CategoriaOpcionFactory(categoria=c, orden=2, prioritaria=False).opcion o4 = CategoriaOpcionFactory(categoria=c, orden=4, prioritaria=True).opcion mc = MesaCategoriaFactory(categoria=c) mc.asignar_a_fiscal() admin_user.fiscal.asignar_mesa_categoria(mc) # Se carga parcialente, la opcion prioritaira "o" carga = CargaFactory(mesa_categoria=mc, tipo='parcial') VotoMesaReportadoFactory(carga=carga, opcion=o1, votos=10) VotoMesaReportadoFactory(carga=carga, opcion=o4, votos=3) # Consolidamos. consumir_novedades_carga() mc.refresh_from_db() assert mc.status == MesaCategoria.STATUS.parcial_consolidada_dc assert mc.carga_testigo == carga assert set(carga.opcion_votos()) == {(o1.id, 10), (o4.id, 3)} # Ahora pedimos la carga total totales = reverse('carga-total', args=[mc.id]) response = fiscal_client.get(totales) # Tenemos las tres opciones en orden assert len(response.context['formset']) == 4 + len( Opcion.opciones_no_partidarias_obligatorias()) assert response.context['formset'][0].initial['opcion'] == o2 assert response.context['formset'][1].initial['opcion'] == o3 assert response.context['formset'][2].initial['opcion'] == o1 assert response.context['formset'][3].initial['opcion'] == o4 # y los valores de los votos assert response.context['formset'][0].initial['votos'] is None assert response.context['formset'][1].initial['votos'] is None assert response.context['formset'][2].initial['votos'] == 10 assert response.context['formset'][3].initial['votos'] == 3 # el valor previo es readonly assert response.context['formset'][2].fields['votos'].widget.attrs[ 'readonly'] is True assert response.context['formset'][3].fields['votos'].widget.attrs[ 'readonly'] is True
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_formset_en_carga_total_muestra_todos(db, fiscal_client, admin_user): c = CategoriaFactory(id=100, opciones=[]) o = CategoriaOpcionFactory(categoria=c, orden=3, prioritaria=True).opcion o2 = CategoriaOpcionFactory(categoria=c, orden=1, prioritaria=False).opcion mc = MesaCategoriaFactory(categoria=c) mc.asignar_a_fiscal() admin_user.fiscal.asignar_mesa_categoria( mc) # Para que no lo mande a otra por falta de permisos. totales = reverse('carga-total', args=[mc.id]) response = fiscal_client.get(totales) assert len(response.context['formset']) == 2 + len( Opcion.opciones_no_partidarias_obligatorias()) assert response.context['formset'][0].fields['opcion'].choices == [(o2.id, o2)] assert response.context['formset'][1].fields['opcion'].choices == [(o.id, o)]
def test_formset_en_carga_parcial_solo_muestra_prioritarias( db, fiscal_client, admin_user): c = CategoriaFactory() o = CategoriaOpcionFactory(categoria=c, prioritaria=True).opcion # La opción 2 no se muestra CategoriaOpcionFactory(categoria=c, prioritaria=False).opcion mc = MesaCategoriaFactory(categoria=c) mc.asignar_a_fiscal() admin_user.fiscal.asignar_mesa_categoria( mc) # Para que no lo mande a otra por falta de permisos. parciales = reverse('carga-parcial', args=[mc.id]) response = fiscal_client.get(parciales) # Sólo hay un formulario (e de o) assert len(response.context['formset']) == 1 assert response.context['formset'][0].fields['opcion'].choices == [(o.id, o)]
def test_liberacion_vuelve_al_ruedo(db, settings): """ Este test verifica que la acción del consolidador libera mesas que nunca recibieron resultados. """ 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 ) m3 = MesaFactory() AttachmentFactory(mesa=m3) mc3 = MesaCategoriaFactory( categoria=c, status=MesaCategoria.STATUS.total_en_conflicto, coeficiente_para_orden_de_carga=2.0, mesa=m3 ) assert MesaCategoria.objects.siguiente() == mc1 for i in range(settings.MIN_COINCIDENCIAS_CARGAS): mc1.asignar_a_fiscal() cant_asignaciones = mc1.cant_fiscales_asignados # Es como si de las varias asignaciones de la mc la última sea para el fiscal f f.asignar_mesa_categoria(mc1) # Como mc1 está muy asignada, ahora me propone mc3. assert MesaCategoria.objects.siguiente() == mc3 settings.TIMEOUT_TAREAS = 0 liberar_mesacategorias_y_attachments() # mc1 volvió al ruedo. assert MesaCategoria.objects.siguiente() == mc1 mc1.refresh_from_db() assert mc1.cant_fiscales_asignados == cant_asignaciones - 1
def test_siguiente_prioriza_seccion(db, settings): f = FiscalFactory() c = CategoriaFactory() # Si se pone # m1 = MesaFactory(circuito__seccion__prioridad_hasta_2=10000) # no funciona. # Intuyo que es porque en MesaFactory, el circuito se setea mediante un LazyAttribute, # y los seteos que van como argumentos de la Factory se estarían ejecutando antes de # que se apliquen los LazyAttribute. # Lo único que hice fue la prueba empírica de agregar "lugar_votacion__" antes, y ver que sí setea # la prioridad de la sección. No llegué a entender la documentación de factory boy en la medida necesaria. m1 = MesaFactory(lugar_votacion__circuito__seccion__prioridad_hasta_2=10000) AttachmentFactory(mesa=m1) mc1 = MesaCategoriaFactory( status=MesaCategoria.STATUS.parcial_sin_consolidar, categoria=c, mesa=m1, ) mc1.actualizar_coeficiente_para_orden_de_carga() m2 = MesaFactory(lugar_votacion__circuito__seccion__prioridad_hasta_2=42) AttachmentFactory(mesa=m2) mc2 = MesaCategoriaFactory( categoria=c, status=MesaCategoria.STATUS.parcial_sin_consolidar, mesa=m2, ) mc2.actualizar_coeficiente_para_orden_de_carga() assert mc1.percentil == 1 assert mc1.mesa.circuito.seccion.prioridad_hasta_2 == 10000 assert mc2.percentil == 1 assert mc2.mesa.circuito.seccion.prioridad_hasta_2 == 42 # Se recibe la mc de la sección más prioritaria. assert MesaCategoria.objects.siguiente() == mc2 for i in range(settings.MIN_COINCIDENCIAS_CARGAS): mc2.asignar_a_fiscal() # Luego la de la sección con prioridad menos prioritaria. assert MesaCategoria.objects.siguiente() == mc1
def test_formset_reusa_metadata(db, fiscal_client, admin_user): # Hay una categoria con una opcion metadata ya consolidada. o1 = OpcionFactory(tipo=Opcion.TIPOS.metadata) cat1 = CategoriaFactory(opciones=[o1]) from elecciones.models import CategoriaOpcion # Me aseguro de que no estuviese asociada con otro orden. CategoriaOpcion.objects.filter(categoria=cat1, opcion=o1).delete() cat1op1 = CategoriaOpcionFactory(categoria=cat1, opcion=o1, orden=1) mc = MesaCategoriaFactory(categoria=cat1, status=MesaCategoria.STATUS.total_consolidada_dc) carga = CargaFactory(mesa_categoria=mc, tipo='total') VotoMesaReportadoFactory(carga=carga, opcion=o1, votos=10) # Otra categoría incluye la misma metadata. o2 = OpcionFactory() cat2 = CategoriaFactory(opciones=[o1, o2]) # Me aseguro de que no estuviesen asociadas con otro orden. CategoriaOpcion.objects.filter(categoria=cat2, opcion=o1).delete() CategoriaOpcion.objects.filter(categoria=cat2, opcion=o2).delete() cat2op1 = CategoriaOpcionFactory(categoria=cat2, opcion=o1, orden=1) cat2op1 = CategoriaOpcionFactory(categoria=cat2, opcion=o2, orden=2) mc2 = MesaCategoriaFactory(categoria=cat2, mesa=mc.mesa) mc2.asignar_a_fiscal() admin_user.fiscal.asignar_mesa_categoria(mc2) response = fiscal_client.get(reverse('carga-total', args=[mc2.id])) assert len(response.context['formset']) == 2 + len( Opcion.opciones_no_partidarias_obligatorias()) assert response.context['formset'][0].initial['opcion'] == o1 assert response.context['formset'][1].initial['opcion'] == o2 # y los valores de los votos assert response.context['formset'][0].initial['votos'] == 10 assert response.context['formset'][0].fields['votos'].widget.attrs[ 'readonly'] is True assert response.context['formset'][1].initial['votos'] is None