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_chequear_resultado_eleccion_desactivada(db, fiscal_client):
    opcs = OpcionFactory.create_batch(3, es_contable=True)
    e1 = EleccionFactory(opciones=opcs)
    assert e1.activa is True
    mesa = MesaFactory(eleccion=[e1])
    url = reverse('chequear-resultado-mesa', args=[e1.id, mesa.numero])
    response = fiscal_client.get(url)
    assert response.status_code == 200
    e1.activa = False
    e1.save()
    response = fiscal_client.get(url)
    assert response.status_code == 404
def test_carga_mesa_redirige_a_siguiente(db, fiscal_client):
    o = OpcionFactory(es_contable=True)
    o2 = OpcionFactory(es_contable=False)
    e1 = CategoriaFactory(opciones=[o, o2])
    e2 = CategoriaFactory(opciones=[o])
    m1 = AttachmentFactory(mesa__categoria=[e1, e2]).mesa

    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert response.url == reverse('mesa-cargar-resultados', args=[e1.id, m1.numero])

    # formset para categoria e1 arranca en blanco
    url = response.url
    response = fiscal_client.get(response.url)
    formset = response.context['formset']
    assert len(formset) == 2
    assert formset[0].initial == {'opcion': o}
    assert formset[1].initial == {'opcion': o2}

    # response = fiscal_client.get(url)
    response = fiscal_client.post(url, {
        'form-0-opcion': str(o.id),
        'form-0-votos': str(m1.electores // 2),
        'form-1-opcion': str(o2.id),
        'form-1-votos': str(m1.electores // 2),
        'form-TOTAL_FORMS': '2',
        'form-INITIAL_FORMS': '0',
        'form-MIN_NUM_FORMS': '2',
        'form-MAX_NUM_FORMS': '1000',
    })
    assert response.status_code == 302
    assert response.url == reverse('mesa-cargar-resultados', args=[e2.id, m1.numero])

    # el form de la nueva categoria e2 está en blanco
    url = response.url
    response = fiscal_client.get(response.url)
    formset = response.context['formset']
    assert len(formset) == 1
    assert formset[0].initial == {'opcion': o}

    # si completamos y es valido, no quedan
    # categorias por cargar y pide otra acta
    response = fiscal_client.post(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_chequear_resultado_categoria_desactivada(db, fiscal_client):
    opcs = OpcionFactory.create_batch(3, es_contable=True)
    e1 = CategoriaFactory(opciones=opcs)
    assert e1.activa is True
    mesa = MesaFactory(categoria=[e1])
    # existe una carga para esa categoria / mesa
    CargaFactory(mesa=mesa, categoria=e1)
    url = reverse('chequear-resultado-mesa', args=[e1.id, mesa.numero])
    response = fiscal_client.get(url)
    assert response.status_code == 200
    e1.activa = False
    e1.save()
    response = fiscal_client.get(url)
    assert response.status_code == 404
def test_chequear_resultado(db, fiscal_client):
    o = OpcionFactory(es_contable=True)
    e1 = CategoriaFactory(opciones=[o])
    mesa = MesaFactory(categoria=[e1])
    me = MesaCategoria.objects.get(categoria=e1, mesa=mesa)
    assert me.confirmada is False

    VotoMesaReportadoFactory(opcion=o, carga__mesa=mesa, carga__categoria=e1, votos=1)
    response = fiscal_client.get(reverse('chequear-resultado'))
    assert response.status_code == 302
    assert response.url == reverse('chequear-resultado-mesa', args=[e1.id, mesa.numero])
    me.confirmada = True
    me.save()
    response = fiscal_client.get(reverse('chequear-resultado'))
    assert response.status_code == 200
    assert 'No hay actas cargadas para verificar por el momento' in response.content.decode('utf8')
def test_chequear_resultado_mesa(db, fiscal_client):
    opcs = OpcionFactory.create_batch(3, es_contable=True)
    e1 = EleccionFactory(opciones=opcs)
    e2 = EleccionFactory(opciones=opcs)
    mesa = MesaFactory(eleccion=[e1, e2])
    me = MesaEleccion.objects.get(eleccion=e1, mesa=mesa)
    assert me.confirmada is False
    votos1 = VotoMesaReportadoFactory(opcion=opcs[0],
                                      mesa=mesa,
                                      eleccion=e1,
                                      votos=1)
    votos2 = VotoMesaReportadoFactory(opcion=opcs[1],
                                      mesa=mesa,
                                      eleccion=e1,
                                      votos=2)
    votos3 = VotoMesaReportadoFactory(opcion=opcs[2],
                                      mesa=mesa,
                                      eleccion=e1,
                                      votos=1)

    # a otra eleccion
    VotoMesaReportadoFactory(opcion=opcs[2], mesa=mesa, eleccion=e2, votos=1)

    url = reverse('chequear-resultado-mesa', args=[e1.id, mesa.numero])
    response = fiscal_client.get(url)

    assert list(response.context['reportados']) == [votos1, votos2, votos3]

    response = fiscal_client.post(url, {'confirmar': 'confirmar'})
    assert response.status_code == 302
    assert response.url == reverse('chequear-resultado')
    me.refresh_from_db()
    assert me.confirmada is True
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_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_elegir_acta_sin_mesas(fiscal_client):
    response = fiscal_client.get(reverse('elegir-acta-a-cargar'))
    assert 'No hay actas para cargar por el momento' in response.content.decode('utf8')