summaryrefslogtreecommitdiffstats
path: root/test/cepis/batch_test.exs
blob: dd8fe8330431ebf7ef957b522ba7787b9e5ef0b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
defmodule Cepis.BatchTest do
  use Cepis.ServerCase

  test "order is preserved and a missing CEP becomes nil", %{server: server, client: client} do
    body =
      csv([
        "01001000,Praça da Sé,lado ímpar,,Sé,São Paulo,SP,São Paulo," <>
          "Sudeste,3550308,1004,11,7107",
        "99999999,,,,,,,,,,,,",
        "20040020,Avenida Rio Branco,,,Centro,Rio de Janeiro,RJ," <>
          "Rio de Janeiro,Sudeste,3304557,,21,6001"
      ])

    FakeServer.on_request(server, fn _path, _n -> {200, body, []} end)

    assert {:ok, [first, nil, third]} =
             Cepis.lookup_many(["01001000", "99999999", "20040020"], client)

    assert first.localidade == "São Paulo"
    assert third.uf == "RJ"

    assert [path] = FakeServer.calls(server)
    assert path == "/csv?ceps=01001000%2C99999999%2C20040020"
  end

  test "batches never carry a coordinate", %{server: server, client: client} do
    body = csv(["01001000,Praça da Sé,,,Sé,São Paulo,SP,São Paulo,Sudeste,3550308,1004,11,7107"])
    FakeServer.on_request(server, fn _path, _n -> {200, body, []} end)

    assert {:ok, [address]} = Cepis.lookup_many(["01001000"], client)
    assert address.geo == nil
  end

  test "a quoted field containing a comma is parsed, not split", %{server: server, client: client} do
    body = csv([~s(01001000,"Rua Um, Dois",,,Centro,São Paulo,SP,São Paulo,Sudeste,1,,11,1)])
    FakeServer.on_request(server, fn _path, _n -> {200, body, []} end)

    assert {:ok, [address]} = Cepis.lookup_many(["01001000"], client)
    assert address.logradouro == "Rua Um, Dois"
  end

  test "an escaped quote inside a quoted field is unescaped", %{server: server, client: client} do
    body = csv([~s(01001000,"Rua ""A""",,,Centro,São Paulo,SP,São Paulo,Sudeste,1,,11,1)])
    FakeServer.on_request(server, fn _path, _n -> {200, body, []} end)

    assert {:ok, [address]} = Cepis.lookup_many(["01001000"], client)
    assert address.logradouro == ~s(Rua "A")
  end

  test "an empty list makes no request", %{server: server, client: client} do
    assert Cepis.lookup_many([], client) == {:ok, []}
    assert FakeServer.calls(server) == []
  end

  test "more than 500 CEPs become more than one request", %{server: server, client: client} do
    ceps = Enum.map(0..500, &String.pad_leading(to_string(&1), 8, "0"))
    {first, second} = Enum.split(ceps, 500)

    rows = fn chunk ->
      csv(Enum.map(chunk, &"#{&1},,,,,X,SP,São Paulo,Sudeste,1,,11,1"))
    end

    bodies = %{1 => rows.(first), 2 => rows.(second)}
    FakeServer.on_request(server, fn _path, n -> {200, Map.fetch!(bodies, n), []} end)

    assert {:ok, result} = Cepis.lookup_many(ceps, client)
    assert length(result) == 501
    assert Enum.all?(result, &(&1.localidade == "X"))
    assert length(FakeServer.calls(server)) == 2
  end

  test "a truncated response pads rather than shifting", %{server: server, client: client} do
    body = csv(["01001000,,,,,São Paulo,SP,São Paulo,Sudeste,1,,11,1"])
    FakeServer.on_request(server, fn _path, _n -> {200, body, []} end)

    assert {:ok, [first, nil]} = Cepis.lookup_many(["01001000", "20040020"], client)
    assert first.localidade == "São Paulo"
  end

  test "an empty body yields a full list of nils", %{server: server, client: client} do
    FakeServer.on_request(server, fn _path, _n -> {200, "", []} end)

    assert {:ok, [nil, nil]} = Cepis.lookup_many(["01001000", "20040020"], client)
  end

  test "a transport failure fails the whole batch", %{server: server, client: client} do
    FakeServer.on_request(server, fn _path, _n -> {503, "", []} end)

    assert {:error, %Cepis.ServerError{status: 503}} = Cepis.lookup_many(["01001000"], client)
  end

  test "the bang variant returns the list", %{server: server, client: client} do
    body = csv(["01001000,,,,,São Paulo,SP,São Paulo,Sudeste,1,,11,1"])
    FakeServer.on_request(server, fn _path, _n -> {200, body, []} end)

    assert [%Cepis.Address{}] = Cepis.lookup_many!(["01001000"], client)
  end
end