File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -129,6 +129,7 @@ test-suite orb-test
129129 Fixtures.SimplePost
130130 Fixtures.TaggedUnion
131131 Fixtures.Union
132+ Form
132133 Handler
133134 OpenApi
134135 SwaggerUI
Original file line number Diff line number Diff line change @@ -31,7 +31,6 @@ extra-source-files:
3131 - src/Orb/SwaggerUI/swagger-ui-dist-5.25.2/swagger-ui-standalone-preset.js
3232 - src/Orb/SwaggerUI/swagger-ui-dist-5.25.2/swagger-ui.css
3333 - src/Orb/SwaggerUI/swagger-ui-dist-5.25.2/swagger-ui.js
34-
3534
3635# Metadata used when publishing your package
3736# synopsis: Short description of your package
Original file line number Diff line number Diff line change @@ -42,7 +42,7 @@ insertParamField ::
4242 Map. Map T. Text (NEL. NonEmpty T. Text )
4343insertParamField params (k, v) =
4444 Map. insertWith
45- (<>)
45+ appendField
4646 (TE. decodeUtf8 k)
4747 (NEL. singleton $ TE. decodeUtf8 v)
4848 params
@@ -53,11 +53,15 @@ insertFileField ::
5353 Map. Map T. Text (NEL. NonEmpty (Wai. FileInfo LBS. ByteString ))
5454insertFileField files (k, v) =
5555 Map. insertWith
56- (<>)
56+ appendField
5757 (TE. decodeUtf8 k)
5858 (NEL. singleton v)
5959 files
6060
61+ appendField :: NEL. NonEmpty a -> NEL. NonEmpty a -> NEL. NonEmpty a
62+ appendField new old =
63+ old <> new
64+
6165data FormField
6266 = ParamField (NEL. NonEmpty T. Text )
6367 | FileField (NEL. NonEmpty (Wai. FileInfo LBS. ByteString ))
Original file line number Diff line number Diff line change @@ -57,29 +57,29 @@ packages:
5757- completed:
5858 name: json-fleece-aeson
5959 pantry-tree:
60- sha256: 4821f2305b6a4a38fea102375dce74a3f9296cb804aaa009fead93d07b73e51d
61- size: 581
62- sha256: f39c90b9e0dd1efbc362fd4f012ca9d0475bba7982b97964b97b8a598f3165d7
63- size: 3068986
60+ sha256: d687b890f3727930fba309980fdb2b7f099e3c6092006940867c7fed3c19bd64
61+ size: 628
62+ sha256: d37000c263116c1f30d69dde80ece99f2a0037a5f07a378537cb282c3ac5debf
63+ size: 3073901
6464 subdir: json-fleece-aeson
65- url: https://github.com/flipstone/json-fleece/archive/4dcf90fc0c24abe28dfa029db74adc32dbb6b027 .tar.gz
65+ url: https://github.com/flipstone/json-fleece/archive/2064e681d594a603fcbaf2e58105c64ee53156a1 .tar.gz
6666 version: 0.3.8.0
6767 original:
6868 subdir: json-fleece-aeson
69- url: https://github.com/flipstone/json-fleece/archive/4dcf90fc0c24abe28dfa029db74adc32dbb6b027 .tar.gz
69+ url: https://github.com/flipstone/json-fleece/archive/2064e681d594a603fcbaf2e58105c64ee53156a1 .tar.gz
7070- completed:
7171 name: json-fleece-core
7272 pantry-tree:
73- sha256: 4f1b4f4684155abec72fe865975865e0caa94a01440c0281e38f864afb052c02
74- size: 444
75- sha256: f39c90b9e0dd1efbc362fd4f012ca9d0475bba7982b97964b97b8a598f3165d7
76- size: 3068986
73+ sha256: 5adc2bf8c045e936eeb32d4388ee1dcd44cb4557e078b485c9a7415b98a9387f
74+ size: 491
75+ sha256: d37000c263116c1f30d69dde80ece99f2a0037a5f07a378537cb282c3ac5debf
76+ size: 3073901
7777 subdir: json-fleece-core
78- url: https://github.com/flipstone/json-fleece/archive/4dcf90fc0c24abe28dfa029db74adc32dbb6b027 .tar.gz
78+ url: https://github.com/flipstone/json-fleece/archive/2064e681d594a603fcbaf2e58105c64ee53156a1 .tar.gz
7979 version: 0.8.0.0
8080 original:
8181 subdir: json-fleece-core
82- url: https://github.com/flipstone/json-fleece/archive/4dcf90fc0c24abe28dfa029db74adc32dbb6b027 .tar.gz
82+ url: https://github.com/flipstone/json-fleece/archive/2064e681d594a603fcbaf2e58105c64ee53156a1 .tar.gz
8383snapshots:
8484- completed:
8585 sha256: 0d0bb681dd5be9b930c8fc070d717aae757b9aed176ae6047d87624b46406816
Original file line number Diff line number Diff line change 1+ module Form
2+ ( testGroup
3+ ) where
4+
5+ import Data.List.NonEmpty qualified as NEL
6+ import Data.Map.Strict qualified as Map
7+ import Data.Text qualified as T
8+ import Data.Text.Encoding qualified as TE
9+ import Hedgehog ((===) )
10+ import Hedgehog qualified as HH
11+ import Hedgehog.Gen qualified as Gen
12+ import Hedgehog.Range qualified as Range
13+ import Test.Tasty qualified as Tasty
14+ import Test.Tasty.Hedgehog qualified as TastyHH
15+
16+ import Orb qualified
17+
18+ testGroup :: Tasty. TestTree
19+ testGroup =
20+ Tasty. testGroup
21+ " Form"
22+ [ TastyHH. testProperty " preserves the order of a repeated param" prop_repeatedParamOrderPreserved
23+ ]
24+
25+ prop_repeatedParamOrderPreserved :: HH. Property
26+ prop_repeatedParamOrderPreserved = HH. property $ do
27+ vals <-
28+ HH. forAll
29+ . Gen. nonEmpty (Range. linear 1 50 )
30+ $ Gen. text (Range. linear 1 12 ) Gen. alphaNum
31+
32+ let
33+ keyText = T. pack " item"
34+ key = TE. encodeUtf8 keyText
35+ params =
36+ [ (key, TE. encodeUtf8 v)
37+ | v <- NEL. toList vals
38+ ]
39+
40+ form <- HH. evalEither $ Orb. getForm (params, [] )
41+ field <-
42+ maybe
43+ (fail " Expected key 'item' to exist in the form." )
44+ pure
45+ (Map. lookup keyText form)
46+
47+ case field of
48+ Orb. ParamField ps ->
49+ NEL. toList ps === NEL. toList vals
50+ Orb. FileField _fs ->
51+ fail " Expected ParamField for 'item', but got FileField."
Original file line number Diff line number Diff line change @@ -4,6 +4,7 @@ module Main
44
55import Test.Tasty qualified as Tasty
66
7+ import Form qualified
78import Handler qualified
89import OpenApi qualified
910import SwaggerUI qualified
1314 Tasty. defaultMain $
1415 Tasty. testGroup
1516 " Orb"
16- [ Handler. testGroup
17+ [ Form. testGroup
18+ , Handler. testGroup
1719 , OpenApi. testGroup
1820 , SwaggerUI. testGroup
1921 ]
You can’t perform that action at this time.
0 commit comments