aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/lux/world/net/http/client.lux
blob: b2999b74d8120797bad67d2391fa38a279ffddcc (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
(.module:
  [library
   [lux "*"
    ["_" test {"+" [Test]}]
    [abstract
     [monad {"+" [do]}]]
    [control
     [pipe {"+" [do>]}]
     ["." io {"+" [IO]}]
     ["." try]
     ["." function]]
    [data
     ["." binary]
     ["." product]
     ["." text
      ["%" format {"+" [format]}]
      [encoding
       ["." utf8]]]
     [collection
      ["." dictionary]]]
    [math
     ["." random {"+" [Random]}]
     [number
      ["." nat]]]]]
  [\\library
   ["." /
    ["/#" //
     ["#." status]]]])

(def: .public test
  Test
  (<| (_.covering /._)
      (_.for [/.Client])
      (do [! random.monad]
        [on_post random.nat
         on_get random.nat
         on_put random.nat
         on_patch random.nat
         on_delete random.nat
         on_head random.nat
         on_connect random.nat
         on_options random.nat
         on_trace random.nat
         num_headers (\ ! each (nat.% 10) random.nat)
         headers (random.dictionary text.hash num_headers (random.ascii/lower 3) (random.ascii/lower 3))
         .let [mock (: (/.Client IO)
                       (implementation
                        (def: (request method url headers data)
                          (io.io (let [value (case method
                                               #//.Post on_post
                                               #//.Get on_get
                                               #//.Put on_put
                                               #//.Patch on_patch
                                               #//.Delete on_delete
                                               #//.Head on_head
                                               #//.Connect on_connect
                                               #//.Options on_options
                                               #//.Trace on_trace)
                                       data (|> value
                                                (\ nat.decimal encoded)
                                                (\ utf8.codec encoded))]
                                   (#try.Success [//status.ok
                                                  [#//.headers headers
                                                   #//.body (function (_ ?wanted_bytes)
                                                              (io.io (#try.Success [(binary.size data)
                                                                                    data])))]]))))))]]
        (`` ($_ _.and
                (~~ (template [<definition> <expected>]
                      [(_.cover [<definition>]
                                (|> (<definition> "" //.empty #.None mock)
                                    (do> try.monad
                                         [io.run!]
                                         [product.right (value@ #//.body) (function.on #.None) io.run!]
                                         [product.right (\ utf8.codec decoded)]
                                         [(\ nat.decimal decoded)]
                                         [(nat.= <expected>) in])
                                    (try.else false)))]

                      [/.post on_post]
                      [/.get on_get]
                      [/.put on_put]
                      [/.patch on_patch]
                      [/.delete on_delete]
                      [/.head on_head]
                      [/.connect on_connect]
                      [/.options on_options]
                      [/.trace on_trace]
                      ))
                (_.cover [/.headers]
                         (nat.= (dictionary.size headers)
                                (|> headers
                                    dictionary.entries
                                    /.headers
                                    dictionary.size)))
                )))))