summaryrefslogtreecommitdiffstats
path: root/tests/test-batch.R
blob: 6b28bcc90e58f56946b792ca1e37bc7be58ca43d (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
library(cepis)
source(file.path("helper", "utils.R"))

rows <- c(
  paste0(
    "01001000,Pra\u00e7a da S\u00e9,lado \u00edmpar,,S\u00e9,S\u00e3o Paulo,",
    "SP,S\u00e3o Paulo,Sudeste,3550308,1004,11,7107"
  ),
  "99999999,,,,,,,,,,,,",
  paste0(
    "20040020,Avenida Rio Branco,,,Centro,Rio de Janeiro,RJ,Rio de Janeiro,",
    "Sudeste,3304557,,21,6001"
  )
)

with_server(
  list(route("/csv?", response(200L, csv(rows)))),
  function(client, server) {
    result <- cep_lookup_many(c("01001000", "99999999", "20040020"), client)
    check("the batch is as long as the input", length(result) == 3L)
    check("the first CEP resolved", identical(result[[1L]]$localidade, "S\u00e3o Paulo"))
    check("a missing CEP is NULL at its position", is.null(result[[2L]]))
    check("the third CEP kept its position", identical(result[[3L]]$uf, "RJ"))
    check("a batch address carries no coordinate", is.null(result[[3L]]$geo))
    check("one request served the whole batch", calls(server, "/csv?") == 1L)
  }
)

quoted <- paste0(
  '01001000,"Rua Um, Dois",,,Centro,S\u00e3o Paulo,SP,S\u00e3o Paulo,',
  "Sudeste,1,,11,1"
)

with_server(
  list(route("/csv?", response(200L, csv(quoted)))),
  function(client, server) {
    result <- cep_lookup_many("01001000", client)
    check(
      "a quoted field containing a comma is parsed as one value",
      identical(result[[1L]]$logradouro, "Rua Um, Dois")
    )
  }
)

with_server(
  list(route("/csv?", response(200L, csv(character(0L))))),
  function(client, server) {
    check("an empty input returns an empty list", identical(cep_lookup_many(character(0L), client), list()))
    check("and makes no request at all", calls(server) == 0L)
  }
)

many <- sprintf("%08d", seq_len(501L) - 1L)
chunk_row <- function(cep) paste0(cep, ",,,,,X,SP,S\u00e3o Paulo,Sudeste,1,,11,1")

with_server(
  list(route(
    "/csv?",
    response(200L, csv(vapply(many[1:500], chunk_row, character(1L)))),
    response(200L, csv(vapply(many[501], chunk_row, character(1L))))
  )),
  function(client, server) {
    result <- cep_lookup_many(many, client)
    check("501 CEPs are split into two requests", calls(server, "/csv?") == 2L)
    check("the result still has one entry per input", length(result) == 501L)
    check("the last entry belongs to the last CEP", identical(result[[501L]]$cep, "00000500"))
  }
)

with_server(
  list(route("/csv?", response(200L, csv("01001000,,,,,S\u00e3o Paulo,SP,S\u00e3o Paulo,Sudeste,1,,11,1")))),
  function(client, server) {
    result <- cep_lookup_many(c("01001000", "20040020"), client)
    check("a truncated response is padded, never shifted", length(result) == 2L)
    check("the missing row became NULL", is.null(result[[2L]]))
    check("the row that arrived kept its position", identical(result[[1L]]$cep, "01001000"))
  }
)