Tratando dados da resposta

Você deve ter notado que a resposta do cliente so testa o status.

defmodule CoffeeShop.Integrations.Coffee.ClientTest do
  # ...
  describe "all_hot_coffees/0" do
    test "respond a list of hot coffees", %{bypass: bypass} do
      Bypass.expect(bypass, "GET", "/coffee/hot", fn conn ->
        Plug.Conn.resp(conn, 200, "")
      end)

      opts = [
        base_url: "http://localhost:3000"
      ]

      assert {:ok, %Response{status: status}} = Client.all_hot_coffees(opts)
      assert status == 200
    end
    
    # ...
  end
end

Não conseguimos fazer muita coisa apenas com o status. Precisamos de dados.

Para deixar as coisas mais estruturadas, utilizarei nesse estudo utilizarei struct onde conseguir tirar mais proveito. Você pode não precisar de tanta estrutura, isso vai depender do seu projeto.

Seguimos.

Agora precisamos obter uma resposta de nosso serviço, para usar como dado. Acessando o endpoint, conseguimos isso fácil: https://api.sampleapis.com/coffee/hot

Com o dado em mão, criamos o arquivo e adicionamos a resposta diretamente em JSON.

Depois precisamos carregar esse arquivo em nosso teste e retornar a resposta dele em nosso mock.

Mockamos uma resposta usando o arquivo e atualizamos nossas assertions para garantir que algo está vindo de resposta no body.

Perfeito, temos um body com uma resposta no formato de string e uma estrutura JSON dentro. Para verificarmos se esta tudo certo, podemos utilizar o iex.

Obtendo dados:

Pode notar que o body vem com scapes, que são essas barras antes de cada aspas duplas (\") deixando utilizar aspas duplas dentro de aspas duplas.

Como pode ser notado, temos os dados em mãos, porém temos a dificuldade de pegar um dado especifico, uma vez que ele não está identificado como estrutura de fácil acesso. Para facilitar isso, podemos decodificar o JSON transformando o dado para estruturas que o elixir consegue lidar melhor, lista e mapas.

O responsável por lidar com a resposta é nossa função Response.build/1. Vamos atualizar seu test para refletir o que queremos. Para termos um cenário mais próximo do real, podemos usar o arquivo JSON que criamos.

Rodaremos o teste

Falhou como esperado, devido a não ser uma lista. Agora precisamos resolver isso na função Response.build/1.

Utilizamos o JSON.decode!/1 para decodificar o JSON de nossa resposta.

Com o dado vindo no formato que o Elixir consegue tratar, podemos validar sua estrutura:

Nosso response está funcionando e pronto para uso. Vamos ver se tudo continua como deve estar.

Tudo em seu devido lugar.

Atualizado

Isto foi útil?