FakeServer

Build StatusCoverage Status

FakeServer is a simple HTTP server used to simulate external services instability on your tests. When you create the server, you provides a list of status, and the requests will be responded with those status, in order of arrival. If there are no more status, the server will respond always 200.

Basic Usage

defmodule UserTest do
  use ExUnit.Case

  setup_all do
    # create some status that your external server could respond with
    # you just need to do it once for you entire test suite.
    FakeServer.Status.create(:status200, %{response_code: 200, response_body: ~s<"username": "mr_user">})
    FakeServer.Status.create(:status500, %{response_code: 500, response_body: ~s<"error": "internal server error">})
    FakeServer.Status.create(:status403, %{response_code: 403, response_body: ~s<"error": "forbidden">})
    :ok
  end
  
  test "#get returns user if the external server responds 200" do
    # start a fake server with a list of status
    {:ok, address} = FakeServer.Server.run(:external_server, :status200)
    # tell your application to access the server
    System.put_env(:external_server_url, address)
    assert User.get == %{username: "mr_user"}
    # stop the server
    FakeServer.Server.stop(:external_server)
  end
  
  test "#get retry up to 3 times when external server responds with 500" do
    {:ok, address} = FakeServer.Server.run(:external_server, [:status500, :status500, :status500, :status200])
    System.put_env(:external_server_url, address)
    # user will be get after 3 retrys
    assert User.get == %{username: "mr_user"}
    FakeServer.Server.stop(:external_server)
  end
  
  test "#get returns timeout after 3 retrys" do
    {:ok, address} = FakeServer.Server.run(:external_server, [:status500, :status500, :status500, :status500])
    System.put_env(:external_server_url, address)
    assert User.get == %{error: "timeout", code: 408}
    FakeServer.Server.stop(:external_server)
  end
end