import pytest
from django.core.urlresolvers import reverse
from model_mommy import mommy

from .models import (Dependente, Filiacao, Legislatura, Mandato, Parlamentar,
                     Partido, TipoDependente)


@pytest.mark.django_db(transaction=False)
def test_cadastro_parlamentar(client):
    legislatura = mommy.make(Legislatura)

    url = reverse('parlamentares:parlamentar_create')
    response = client.get(url)
    assert response.status_code == 200

    response = client.post(url, {'nome_completo': 'Teresa Barbosa',
                                 'nome_parlamentar': 'Terezinha',
                                 'sexo': 'F',
                                 'ativo': 'True',
                                 'legislatura': legislatura.id,
                                 'data_expedicao_diploma': '2001-01-01'},
                           follow=True)

    [parlamentar] = Parlamentar.objects.all()
    assert parlamentar.nome_parlamentar == 'Terezinha'
    assert parlamentar.sexo == 'F'
    assert parlamentar.ativo is True
    # o primeiro mandato é criado
    [mandato] = Mandato.objects.all()
    assert mandato.parlamentar == parlamentar
    assert str(mandato.data_expedicao_diploma) == '2001-01-01'
    assert mandato.legislatura == legislatura
    assert mandato.data_fim_mandato == legislatura.data_fim


@pytest.mark.django_db(transaction=False)
def test_incluir_parlamentar_errors(client):
    url = reverse('parlamentares:parlamentar_create')
    response = client.post(url)
    erros_esperados = {campo: ['Este campo é obrigatório.']
                       for campo in ['legislatura',
                                     'data_expedicao_diploma',
                                     'nome_parlamentar',
                                     'nome_completo',
                                     'sexo',
                                     ]}
    assert response.context_data['form'].errors == erros_esperados


@pytest.mark.django_db(transaction=False)
def test_filiacao_submit(client):
    mommy.make(Parlamentar, pk=14)
    mommy.make(Partido, pk=32)

    client.post(reverse('parlamentares:parlamentar_filiacao',
                        kwargs={'pk': 14}),
                {'partido': 32,
                 'data': '2016-03-22',
                 'salvar': 'salvar'},
                follow=True)

    filiacao = Filiacao.objects.first()
    assert 32 == filiacao.partido.pk


@pytest.mark.django_db(transaction=False)
def test_dependente_submit(client):
    mommy.make(Parlamentar, pk=14)
    mommy.make(Partido, pk=32)
    mommy.make(TipoDependente, pk=3)

    client.post(reverse('parlamentares:parlamentar_dependente',
                        kwargs={'pk': 14}),
                {'nome': 'Eduardo',
                 'tipo': 3,
                 'sexo': 'M',
                 'salvar': 'salvar'},
                follow=True)

    dependente = Dependente.objects.first()
    assert 3 == dependente.tipo.pk
    assert 'Eduardo' == dependente.nome


@pytest.mark.django_db(transaction=False)
def test_form_errors_dependente(client):
    mommy.make(Parlamentar, pk=14)
    response = client.post(reverse('parlamentares:parlamentar_dependente',
                                   kwargs={'pk': 14}),
                           {'salvar': 'salvar'},
                           follow=True)

    assert (response.context_data['form'].errors['nome'] ==
            ['Este campo é obrigatório.'])
    assert (response.context_data['form'].errors['tipo'] ==
            ['Este campo é obrigatório.'])
    assert (response.context_data['form'].errors['sexo'] ==
            ['Este campo é obrigatório.'])


@pytest.mark.django_db(transaction=False)
def test_form_errors_filiacao(client):
    mommy.make(Parlamentar, pk=14)

    response = client.post(reverse('parlamentares:parlamentar_filiacao',
                                   kwargs={'pk': 14}),
                           {'partido': '',
                            'salvar': 'salvar'},
                           follow=True)

    assert (response.context_data['form'].errors['partido'] ==
            ['Este campo é obrigatório.'])
    assert (response.context_data['form'].errors['data'] ==
            ['Este campo é obrigatório.'])


@pytest.mark.django_db(transaction=False)
def test_mandato_submit(client):
    mommy.make(Parlamentar, pk=14)
    mommy.make(Legislatura, pk=5)

    client.post(reverse('parlamentares:parlamentar_mandato',
                        kwargs={'pk': 14}),
                {'legislatura': 5,
                 'data_fim_mandato': '2016-01-01',
                 'data_expedicao_diploma': '2016-03-22',
                 'observacao': 'Observação do mandato',
                 'salvar': 'salvar'},
                follow=True)

    mandato = Mandato.objects.first()
    assert 'Observação do mandato' == mandato.observacao


@pytest.mark.django_db(transaction=False)
def test_form_errors_mandato(client):
    mommy.make(Parlamentar, pk=14)
    response = client.post(reverse('parlamentares:parlamentar_mandato',
                                   kwargs={'pk': 14}),
                           {'legislatura': '',
                            'salvar': 'salvar'},
                           follow=True)

    assert (response.context_data['form'].errors['legislatura'] ==
            ['Este campo é obrigatório.'])
    assert (response.context_data['form'].errors['data_fim_mandato'] ==
            ['Este campo é obrigatório.'])
    assert (response.context_data['form'].errors['data_expedicao_diploma'] ==
            ['Este campo é obrigatório.'])