defmodule EslHnWeb.Api.ControllerTest do use EslHnWeb.ConnCase, async: false use ExUnitProperties import EslHn.Test.Data alias EslHn.Cache setup do on_exit(fn -> Cache.flush(EslHn) end) end describe "GET /" do test "with empty cache returns empty list", %{conn: conn} do resp = conn |> get(~p"/") |> json_response(200) assert resp == [] end property "with some stories in index these are fetched", %{conn: conn} do check all(stories <- list_of(story(), max_length: 10)) do ids = Enum.map(stories, & &1.id) Cache.write(EslHn, :index, ids) Cache.write_all(EslHn, Enum.map(stories, &{&1.id, &1})) resp_ids = conn |> get(~p"/") |> json_response(200) |> Enum.map(& &1["id"]) assert Enum.all?(ids, &(&1 in resp_ids)) end end property "return at most 10 elements at once", %{conn: conn} do check all(stories <- list_of(story())) do ids = Enum.map(stories, & &1.id) Cache.write(EslHn, :index, ids) Cache.write_all(EslHn, Enum.map(stories, &{&1.id, &1})) resp = conn |> get(~p"/") |> json_response(200) assert length(resp) <= 10 end end property "if more than 10 elements there are stories on second page", %{ conn: conn } do check all(stories <- list_of(story(), min_length: 11)) do ids = Enum.map(stories, & &1.id) Cache.write(EslHn, :index, ids) Cache.write_all(EslHn, Enum.map(stories, &{&1.id, &1})) resp = conn |> get(~p"/?page=2") |> json_response(200) assert length(resp) in 1..10 end end property "if requested page is outside of the possible range, returns empty list", %{ conn: conn } do check all(stories <- list_of(story(), max_length: 50)) do ids = Enum.map(stories, & &1.id) Cache.write(EslHn, :index, ids) Cache.write_all(EslHn, Enum.map(stories, &{&1.id, &1})) resp = conn |> get(~p"/?page=2137") |> json_response(200) assert resp == [] end end end describe "GET /:id" do test "for non-existent story returns 404", %{conn: conn} do conn |> get(~p"/2137") |> json_response(404) end test "for non-integer story ID returns 404", %{conn: conn} do conn |> get(~p"/foo-bar") |> json_response(404) end test "return data for existing story", %{conn: conn} do Cache.write_all(EslHn, [ {2137, %EslHn.Hn.Story{id: 2137, title: "Foo"}} ]) resp = conn |> get(~p"/2137") |> json_response(200) assert "Foo" == resp["title"] end end end