import pytest
from modelo import (Tarefa, listar_tarefas, memdb, criar_tarefa,
                    remover_tarefa, recuperar_tarefa, editar_tarefa)


def test_define_tarefa():
    tarefa = Tarefa('titulo', 'descrição', False)
    assert tarefa.titulo == 'titulo'
    assert tarefa.descricao == 'descrição'
    assert tarefa.status is False


def test_status_nao_obrigatorio():
    tarefa = Tarefa('titulo', 'descrição')
    assert tarefa.status is False
    tarefa = Tarefa('titulo', 'descrição', True)
    assert tarefa.status is True


def test_toda_tarefa_tem_identificador_unico():
    tarefa1 = Tarefa('titulo', 'descrição')
    tarefa2 = Tarefa('titulo', 'descrição')
    tarefa1.id != tarefa2.id


def test_listar_tarefas():
    tarefa1 = Tarefa('titulo 1', 'descrição')
    tarefa2 = Tarefa('titulo 2', 'descrição')
    memdb[tarefa1.id] = tarefa1
    memdb[tarefa2.id] = tarefa2
    for indice, tarefa in enumerate(listar_tarefas(), 1):
        assert tarefa.titulo == 'titulo {}'.format(indice)


def test_ordem_tarefas():
    memdb.clear()
    tarefa1 = Tarefa('titulo 1', 'descrição', True)  # tarefa já finalizada
    tarefa2 = Tarefa('titulo 2', 'descrição')  # não finalizada
    memdb[tarefa1.id] = tarefa1
    memdb[tarefa2.id] = tarefa2
    tarefas = list(listar_tarefas())
    assert tarefas[0].titulo == 'titulo 2'
    assert tarefas[1].titulo == 'titulo 1'


def test_criar_tarefa():
    memdb.clear()
    tarefa = criar_tarefa('titulo', 'descrição')
    assert tarefa.titulo == 'titulo'
    assert tarefa.descricao == 'descrição'
    assert tarefa.status is False
    assert len(memdb) > 0


def test_remover_tarefa():
    memdb.clear()
    tarefa = Tarefa('titulo', 'descricao')
    memdb[tarefa.id] = tarefa
    remover_tarefa(tarefa.id)
    assert len(memdb) == 0


def test_tarefa_nao_existente():
    memdb.clear()
    with pytest.raises(KeyError):
        remover_tarefa(1)


def test_recuperar_tarefa():
    memdb.clear()
    tarefa = Tarefa('titulo', 'descricao')
    memdb[tarefa.id] = tarefa
    recuperado = recuperar_tarefa(tarefa.id)
    assert tarefa.id == recuperado.id
    assert tarefa.titulo == recuperado.titulo
    assert tarefa.descricao == recuperado.descricao


def test_recuperar_tarefa_nao_existente():
    memdb.clear()
    with pytest.raises(KeyError):
        remover_tarefa(1)


def test_editar_tarefa():
    memdb.clear()
    tarefa = Tarefa('titulo', 'descricao')
    memdb[tarefa.id] = tarefa
    modificado = Tarefa('titulo modificado', 'descricao')
    editar_tarefa(tarefa.id, modificado)
    assert memdb[tarefa.id].titulo == 'titulo modificado'
