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_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_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_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_choice_home_validador_o_nada(db, admin_user, fiscal_client): # admin es validador response = fiscal_client.get('') assert response.status_code == 302 assert response.url == reverse('siguiente-accion') # admin no es ni validador ni staff g = Group.objects.get(name='validadores') admin_user.groups.remove(g) admin_user.is_staff = False admin_user.save() response = fiscal_client.get('') assert response.status_code == 302 assert response.url == reverse('bienvenido')
def test_detalle_mesa_categoria(db, fiscal_client): opcs = OpcionFactory.create_batch(3) e1 = CategoriaFactory(opciones=opcs) e2 = CategoriaFactory(opciones=opcs) mesa = MesaFactory(categorias=[e1, e2]) c1 = CargaFactory(mesa_categoria__mesa=mesa, mesa_categoria__categoria=e1, tipo=Carga.TIPOS.parcial, origen=Carga.SOURCES.csv) mc = c1.mesa_categoria votos1 = VotoMesaReportadoFactory( opcion=opcs[0], votos=1, carga=c1, ) votos2 = VotoMesaReportadoFactory( opcion=opcs[1], votos=2, carga=c1, ) votos3 = VotoMesaReportadoFactory( opcion=opcs[2], votos=1, carga=c1, ) # a otra carga VotoMesaReportadoFactory(opcion=opcs[2], votos=1) c1.actualizar_firma() consumir_novedades_y_actualizar_objetos([mc]) assert mc.carga_testigo == c1 url = reverse('detalle-mesa-categoria', args=[e1.id, mesa.numero]) response = fiscal_client.get(url) assert list(response.context['reportados']) == [votos1, votos2, votos3]
def test_preidentificacion_con_datos_de_fiscal(fiscal_client): mesa = MesaFactory() seccion = mesa.circuito.seccion form_response = fiscal_client.get(reverse('agregar-adjuntos')) fiscal = form_response.wsgi_request.user.fiscal fiscal.seccion = seccion fiscal.save() fiscal.refresh_from_db() distrito_preset = f'<input id="id_distrito" name="distrito" type="hidden" tabindex="-1" value="{seccion.distrito.id}" />' seccion_preset = f'<input id="id_seccion" name="seccion" type="hidden" tabindex="-1" value="{seccion.id}" />' response = fiscal_client.get(reverse('agregar-adjuntos')) content = response.content.decode('utf8') assert distrito_preset in content assert seccion_preset in content
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_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_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_mesa_de_circuito__url_mesa_con_resultados(carta_marina, fiscal_client): # resultados para mesa 1 mesa1, *otras_mesas = carta_marina categoria = mesa1.categorias.get() # sólo default # Esto no debería ser necesario si configuramos correctamente las opciones prioritarias en carta_marina CategoriaOpcion.objects.filter(categoria=categoria).update(prioritaria=True) # opciones a partido o1, o2, o3, o4 = categoria.opciones.filter(partido__isnull=False) # la opción 4 pasa a ser del mismo partido que la 1 o4.partido = o1.partido o4.save() blanco = Opcion.blancos() total = Opcion.total_votos() mc1 = MesaCategoria.objects.get(mesa=mesa1, categoria=categoria) carga = CargaFactory(mesa_categoria=mc1, tipo=Carga.TIPOS.parcial) consumir_novedades_y_actualizar_objetos([mesa1]) VotoMesaReportadoFactory(carga=carga, opcion=o1, votos=20) VotoMesaReportadoFactory(carga=carga, opcion=o2, votos=30) VotoMesaReportadoFactory(carga=carga, opcion=o3, votos=40) VotoMesaReportadoFactory(carga=carga, opcion=o4, votos=5) # votaron 95/100 personas VotoMesaReportadoFactory(carga=carga, opcion=blanco, votos=5) VotoMesaReportadoFactory(carga=carga, opcion=total, votos=100) carga.actualizar_firma() assert carga.es_testigo.exists() query_string_mesa_1 = ( f'?mesa={mesa1.id}&circuito={mesa1.circuito.id}' '&tipoDeAgregacion=todas_las_cargas' f'&opcionaConsiderar={OPCIONES_A_CONSIDERAR.prioritarias}' ) url_mesa_1 = reverse('mesas-circuito', args=[categoria.id]) + query_string_mesa_1 response = fiscal_client.get(url_mesa_1) assert response.status_code == 200 content = response.content.decode('utf8') assert response.context['mensaje_no_hay_info'] not in content resultados = response.context['resultados'] assert len(resultados) == 6 # 4 opciones + blanco + total for voto_mesa_reportado in resultados: assert f'<th>{voto_mesa_reportado.opcion}</th>' in content assert f'<td>{voto_mesa_reportado.votos}</td>' in content
def test_cargar_resultados_redirige_a_identificar(db, fiscal_client, status, parcial): mesa = MesaFactory() a = AttachmentFactory(mesa=mesa) c1 = CategoriaFactory(requiere_cargas_parciales=True) m1c1 = MesaCategoriaFactory(categoria=c1, coeficiente_para_orden_de_carga=0.1, status=status, mesa=mesa) response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url.startswith('/clasificar-actas/')
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_cargar_resultados_redirige_a_parcial_si_es_necesario( db, fiscal_client, status, parcial): mesa = MesaFactory() a = AttachmentFactory(mesa=mesa) c1 = CategoriaFactory(requiere_cargas_parciales=True, sensible=True) m1c1 = MesaCategoriaFactory(categoria=c1, coeficiente_para_orden_de_carga=0.1, status=status, mesa=mesa) response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse( 'carga-parcial' if parcial else 'carga-total', args=[m1c1.id])
def test_resultados__generacion_url_ver_mesas_circuito(fiscal_client): categoria = CategoriaFactory(nombre='default') mesa1 = IdentificacionFactory(status='identificada', source=Identificacion.SOURCES.csv).mesa consumir_novedades_identificacion() url = reverse('resultados-categoria', args=[categoria.id]) response = fiscal_client.get(url) assert response.status_code == 200 texto_mesas_link = "Ver mesas del circuito" assert texto_mesas_link not in response.content.decode('utf8') response = fiscal_client.get(url, {"circuito": mesa1.circuito.id}) # como ahora en la URL hay especificado un circuito, debería aparecer el link de "Ver las mesas..." assert response.status_code == 200 assert texto_mesas_link in response.content.decode('utf8') url_mesa_distrito = reverse('mesas-circuito', args=[categoria.id]) assert url_mesa_distrito in response.content.decode('utf8')
def test_mesa_de_circuito__dispatch_primera_mesa_numero(carta_marina, fiscal_client): mesa1, mesa2, *otras_mesas = carta_marina categoria = mesa1.categorias.get() query_string_circuito = ( f'?circuito={mesa1.circuito.id}' '&tipoDeAgregacion=todas_las_cargas&opcionaConsiderar=todas' ) url_circuito = reverse('mesas-circuito', args=[categoria.id]) + query_string_circuito response = fiscal_client.get(url_circuito) assert response.status_code == 302 assert url_circuito in response.url assert f"mesa={mesa1.id}" in response.url
def test_mesa_de_circuito__url_mesa_sin_resultados(fiscal_client): categoria = CategoriaFactory(nombre='default') mesa1 = IdentificacionFactory(status='identificada', source=Identificacion.SOURCES.csv).mesa consumir_novedades_identificacion() query_string_mesa_1 = ( f'?mesa={mesa1.id}&circuito={mesa1.circuito.id}' '&tipoDeAgregacion=todas_las_cargas&opcionaConsiderar=todas' ) url_mesa_1 = reverse('mesas-circuito', args=[categoria.id]) + query_string_mesa_1 response = fiscal_client.get(url_mesa_1) assert response.status_code == 200 assert response.context['mensaje_no_hay_info'] in response.content.decode('utf-8') assert not response.context['resultados'].exists()
def test_siguiente_manda_a_parcial_si_es_requerido_con_scheduler( db, fiscal_client, 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) scheduler() response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-total', args=[mc1.id]) # mc1 fue asignada, ahora da mc2 response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-parcial', args=[mc2.id])
def test_cargar_resultados_redirige_a_parcial_si_es_necesario_con_scheduler( db, fiscal_client, status, parcial): mesa = MesaFactory() a = AttachmentFactory(mesa=mesa) c1 = CategoriaFactory(requiere_cargas_parciales=True, sensible=True) with override_config(ASIGNAR_MESA_EN_EL_MOMENTO_SI_NO_HAY_COLA=False): m1c1 = MesaCategoriaFactory(categoria=c1, coeficiente_para_orden_de_carga=0.1, status=status, mesa=mesa) scheduler() response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse( 'carga-parcial' if parcial else 'carga-total', args=[m1c1.id])
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_enviar_email_get(fiscal_client, admin_user): fiscales_ids = ','.join(str(f.id) for f in FiscalFactory.create_batch(2)) url = f"{reverse('enviar-email')}?ids={fiscales_ids}" session = fiscal_client.session session.update({ 'enviar_email_asunto': 'foo', 'enviar_email_template': '{{ foo }}', }) session.save() response = fiscal_client.get(url) assert response.status_code == 200 form = response.context['form'] assert isinstance(form, EnviarEmailForm) assert 'Enviar Email a 2 fiscales' in response.content.decode('utf8') assert form.initial['asunto'] == 'foo' assert form.initial['template'] == '{{ foo }}'
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_mesa_de_circuito__sidebar_mesas(carta_marina, fiscal_client): # el sidebar debería tener dos links a cada mesa si entro con el id del circuito mesa1, mesa2, *otras_mesas = carta_marina categoria = mesa1.categorias.get() query_string_circuito = ( f'?circuito={mesa1.circuito.id}&mesa={mesa1.id}' '&tipoDeAgregacion=todas_las_cargas&opcionaConsiderar=todas' ) url_circuito = reverse('mesas-circuito', args=[categoria.id]) + query_string_circuito response = fiscal_client.get(url_circuito) assert response.status_code == 200 content = response.content.decode('utf8') # sabemos que no hay resultados para las mesas, pero los links deben estar en el costado assert response.context['mensaje_no_hay_info'] in content assert f'<li id="mesa-{mesa1.id}" class="active">' in content assert f'<li id="mesa-{mesa2.id}" >' in content
def test_siguiente_accion_balancea_sin_scheduler(fiscal_client, cant_attachments, cant_mcs, coeficiente, expect): attachments = AttachmentFactory.create_batch(cant_attachments, status='sin_identificar') mesas = MesaFactory.create_batch(cant_mcs) for i in range(cant_mcs): attachment_identificado = AttachmentFactory(mesa=mesas[i], status='identificada') MesaCategoriaFactory(mesa=mesas[i], coeficiente_para_orden_de_carga=1, categoria__sensible=True) # Como la URL de identificación pasa un id no predictible # y no nos importa acá saber exactamente a que instancia se relaciona la acción # lo que evalúo es que redirija a una url que empiece así. beginning = reverse(expect, args=[0])[:10] with override_config(COEFICIENTE_IDENTIFICACION_VS_CARGA=coeficiente): response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url.startswith(beginning)
def test_mesa_de_circuito__navegacion_categorias(fiscal_client): categoria1 = CategoriaFactory(nombre='cat1') categoria2 = CategoriaFactory(nombre='cat2') mesa1 = MesaFactory(categorias=[categoria1, categoria2]) query_string_mesa_1 = ( f'?mesa={mesa1.id}&circuito={mesa1.circuito.id}' '&tipoDeAgregacion=todas_las_cargas&opcionaConsiderar=todas' ) url_mesa_1 = reverse('mesas-circuito', args=[categoria1.id]) + query_string_mesa_1 response = fiscal_client.get(url_mesa_1) assert response.status_code == 200 content = html.unescape(response.content.decode('utf-8')) assert response.context['mensaje_no_hay_info'] in content link_categoria_1 = f" href=\"/elecciones/resultados/mesas_circuito/{categoria1.id}{query_string_mesa_1}\"" link_categoria_2 = f" href=\"/elecciones/resultados/mesas_circuito/{categoria2.id}{query_string_mesa_1}\"" assert link_categoria_1 in content assert link_categoria_2 in content
def test_referidos_muestra_link_y_referidos(fiscal_client, admin_user): fiscal = admin_user.fiscal referidos_ids = { f.id for f in FiscalFactory.create_batch(2, referente=fiscal) } # otros fiscales no afectan FiscalFactory(referente=FiscalFactory()) assert set(fiscal.referidos.values_list('id', flat=True)) == referidos_ids response = fiscal_client.get(reverse('referidos')) assert response.status_code == 200 content = response.content.decode('utf8') form = response.context['form'] assert isinstance(form, ReferidoForm) assert form.initial['url'] == fiscal.ultimo_codigo_url() assert set(response.context['referidos'].values_list( 'id', flat=True)) == referidos_ids assert str(response.context['referidos'][0]) in content assert str(response.context['referidos'][1]) in content
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
def test_siguiente_accion_redirige_a_cargar_resultados_sin_scheduler( db, settings, client, setup_groups): c1 = CategoriaFactory() c2 = CategoriaFactory() m1 = MesaFactory(categorias=[c1]) IdentificacionFactory( mesa=m1, status='identificada', source=Identificacion.SOURCES.csv, ) m2 = MesaFactory(categorias=[c1, c2]) assert MesaCategoria.objects.count() == 3 IdentificacionFactory( mesa=m2, status='identificada', source=Identificacion.SOURCES.csv, ) # Ambas consolidadas vía csv. consumir_novedades_identificacion() # Los fiscales que voy a usar. fiscales = FiscalFactory.create_batch(20) indice_fiscal = 0 m1c1 = MesaCategoria.objects.get(mesa=m1, categoria=c1) for i in range(settings.MIN_COINCIDENCIAS_CARGAS): fiscal_client = fiscal_client_from_fiscal(client, fiscales[indice_fiscal]) indice_fiscal += 1 response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-total', args=[m1c1.id]) # Cerramos la sesión para que el client pueda reutilizarse sin que nos diga # que ya estamos logueados. fiscal_client.logout() # Como m1c1 ya fue pedida por suficientes fiscales, # se pasa a la siguiente mesacategoría. m2c1 = MesaCategoria.objects.get(mesa=m2, categoria=c1) for i in range(settings.MIN_COINCIDENCIAS_CARGAS): fiscal_client = fiscal_client_from_fiscal(client, fiscales[indice_fiscal]) indice_fiscal += 1 response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-total', args=[m2c1.id]) fiscal_client.logout() # Ahora la tercera. m2c2 = MesaCategoria.objects.get(mesa=m2, categoria=c2) for i in range(settings.MIN_COINCIDENCIAS_CARGAS): fiscal_client = fiscal_client_from_fiscal(client, fiscales[indice_fiscal]) indice_fiscal += 1 response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-total', args=[m2c2.id]) fiscal_client.logout() # Ya no hay actas nuevas, vuelta a empezar. fiscal_client = fiscal_client_from_fiscal(client, fiscales[indice_fiscal]) indice_fiscal += 1 response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-total', args=[m1c1.id]) fiscal_client.logout() # Se libera una. m2c2.desasignar_a_fiscal() fiscal_client = fiscal_client_from_fiscal(client, fiscales[indice_fiscal]) indice_fiscal += 1 response = fiscal_client.get(reverse('siguiente-accion')) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-total', args=[m2c2.id])
def test_siguiente_happy_path_parcial_y_total_con_modo_ub( db, fiscal_client, admin_user, settings): # Este test no es del todo realista porque se lo ejecuta con la cantidad de cargas/identificaciones # necesarias para consolidar en 1, pero al menos prueba que se siga el circuito con modo_ub=True. settings.MIN_COINCIDENCIAS_CARGAS = 1 settings.MIN_COINCIDENCIAS_IDENTIFICACION = 1 modo_ub_querry_string = '?modo_ub=True' mesa = MesaFactory() from adjuntos.models import PreIdentificacion from scheduling.models import ColaCargasPendientes p = PreIdentificacion(fiscal=admin_user.fiscal, distrito=mesa.circuito.seccion.distrito) p.save() a = AttachmentFactory(status='sin_identificar', pre_identificacion=p) scheduler() assert ColaCargasPendientes.largo_cola() == 1 response = fiscal_client.get( reverse('siguiente-accion') + modo_ub_querry_string) assert response.status_code == HTTPStatus.FOUND # Me manda a idenficarlas con modo_ub assert response.url == reverse('asignar-mesa', args=[a.id]) + modo_ub_querry_string assert ColaCargasPendientes.largo_cola() == 0 # La identifico. a.mesa = mesa a.status = 'identificada' a.save() mc1 = MesaCategoriaFactory(categoria__requiere_cargas_parciales=True, coeficiente_para_orden_de_carga=1, mesa=mesa) scheduler() assert ColaCargasPendientes.largo_cola() == 1 response = fiscal_client.get( reverse('siguiente-accion') + modo_ub_querry_string) assert response.status_code == HTTPStatus.FOUND assert response.url == reverse('carga-parcial', args=[mc1.id]) + modo_ub_querry_string carga = CargaFactory(mesa_categoria=mc1, tipo='parcial', origen='csv') consumir_novedades_carga() scheduler() mc1.refresh_from_db() assert mc1.status == MesaCategoria.STATUS.parcial_consolidada_dc # Porque la cant de cargas está en 1. assert mc1.carga_testigo == carga mc1.desasignar_a_fiscal() response = fiscal_client.get( reverse('siguiente-accion') + modo_ub_querry_string) assert response.url == reverse('carga-total', args=[mc1.id]) + modo_ub_querry_string carga = CargaFactory(mesa_categoria=mc1, tipo='total', origen='csv') consumir_novedades_carga() scheduler() mc1.refresh_from_db() assert mc1.status == MesaCategoria.STATUS.total_consolidada_dc # Porque la cant de cargas está en 1. assert mc1.carga_testigo == carga response = fiscal_client.get( reverse('siguiente-accion') + modo_ub_querry_string) # 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_elegir_acta_mesas_con_id_inexistente_de_mesa_desde_ub(fiscal_client): mesa_id_inexistente = 673162312 url = reverse('cargar-desde-ub', kwargs={'mesa_id': mesa_id_inexistente}) response = fiscal_client.get(url) assert response.status_code == HTTPStatus.NOT_FOUND