Problema com os testes

Pessoal, boa tarde!,
encontrei alguns problemas com os testes desse desafio, no fim do post segue meu test_main.py reescrito, mas vai um breakdown de tudo aqui antes, acho que do jeito que corrigi está correto :slight_smile:

Lendo a resposta como um json

Objetos de HTTPResponse do tornado não possuem um método response.json, então não é possível verificar diretamente se a resposta do servidor, que vem em bytes, equivale ao dicionário especificado no teste. O workaround que encontrei foi utilizar json.loads(response.body.decode(‘utf-8’)) == dicionario_de_verificacao

Tratando as requisições que devem retornar erro 422

O método http_client.fetch() levanta uma exceção HTTPClientError para requisições mal sucedidas, o que falha o teste. Solução é simplesmente um bloco try catch para tratar a exceção diretamente

Typos

os testes test_set_different_strings e test_different_size_should_return_size_mismatch estavam com as variáveis left e right invertidas na requisição POST para atualizar as strings armazenadas. Além disso, o teste test_set_equals_strings estava fazendo o _build_url passando como argumento a variável id não inicializada no momento de buildar a request GET (nas requests de POST o valor estava hardcodado).

Minha versão do código de testes

import pytest
import json

from leftright import DiffApplication
from tornado.httputil import url_concat
from tornado.httpclient import HTTPClientError


@pytest.fixture
def app():
    return DiffApplication().build()


@pytest.mark.gen_test
def test_set_left(http_client, base_url):
    content = "Y29udGVudHJpa25hc2tqZGxhbWRsa3Nh"

    url = _build_url(base_url, id="abc", side="left", content=content)
    post_response = yield http_client.fetch(url, method="POST", body="")
    assert 200 == post_response.code


@pytest.mark.gen_test
def test_set_right(http_client, base_url):
    content = "Y29udGVudHJpa25hc2tqZGxhbWRsa3Nh"

    url = _build_url(base_url, id="abc", side="right", content=content)

    post_response = yield http_client.fetch(url, method="POST", body="")
    assert 200 == post_response.code


@pytest.mark.gen_test
def test_set_equals_strings(http_client, base_url):
    content = "a"
    right_url = _build_url(base_url, id="abc", side="right", content=content)
    left_url = _build_url(base_url, id="abc", side="left", content=content)

    response = yield http_client.fetch(right_url, method="POST", body="")
    response = yield http_client.fetch(left_url, method="POST", body="")

    url = _build_url(base_url, id="abc")
    response = yield http_client.fetch(url)
    assert 200 == response.code
    assert json.loads(response.body.decode('utf-8')) == {
        "state": "equals", "left": content, "right": content
    }


@pytest.mark.gen_test
@pytest.mark.parametrize("left,right,offset", [
    ("Y29", "a29", 0),
    ("acv", "aBc", 1)
])
def test_set_different_strings(http_client, base_url, left, right, offset):
    id = "abc"
    right_url = _build_url(base_url, id=id, side="right", content=right)
    left_url = _build_url(base_url, id=id, side="left", content=left)

    yield http_client.fetch(right_url, method="POST", body="")
    yield http_client.fetch(left_url, method="POST", body="")

    url = _build_url(base_url, id=id)
    try:
        response = yield http_client.fetch(url)
        assert False
    except HTTPClientError as e:
        assert 422 == e.code
        assert json.loads(e.response.body.decode('utf-8')) == {
			"state": "content_mismatch", "left": left, "right": right, "offset": offset
		}


@pytest.mark.gen_test
def test_different_size_should_return_size_mismatch(http_client, base_url):
    id = "abc"
    left = "Y29udGVudHJpa25hc2tqZGxhbWRsa3Nh"
    right = "Y29udGVudHJpZ2h0"

    right_url = _build_url(base_url, id=id, side="left", content=left)
    left_url = _build_url(base_url, id=id, side="right", content=right)

    yield http_client.fetch(right_url, method="POST", body="")
    yield http_client.fetch(left_url, method="POST", body="")

    url = _build_url(base_url, id=id)
    try:
        response = yield http_client.fetch(url)
        assert False
    except HTTPClientError as e:
        assert e.code == 422

        assert json.loads(e.response.body.decode('utf-8')) == {
			"state": "size_mismatch",
			"left": left,
			"right": right
		}



def _build_url(base_url, id, side=None, content=None, resource_base="v1/diff"):
    parts = [base_url, resource_base, id]

    if side:
        parts.append(side)
        if content:
            parts.append(content)

    url = "/".join(parts)
    return url
1 Curtida