Skip to content

Commit d120f9f

Browse files
committed
wip
1 parent e4b2490 commit d120f9f

6 files changed

Lines changed: 73 additions & 16 deletions

File tree

orb.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff 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

package.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff 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

src/Orb/Handler/Form.hs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ insertParamField ::
4242
Map.Map T.Text (NEL.NonEmpty T.Text)
4343
insertParamField 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))
5454
insertFileField 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+
6165
data FormField
6266
= ParamField (NEL.NonEmpty T.Text)
6367
| FileField (NEL.NonEmpty (Wai.FileInfo LBS.ByteString))

stack.yaml.lock

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff 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
8383
snapshots:
8484
- completed:
8585
sha256: 0d0bb681dd5be9b930c8fc070d717aae757b9aed176ae6047d87624b46406816

test/Form.hs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
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."

test/Main.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ module Main
44

55
import Test.Tasty qualified as Tasty
66

7+
import Form qualified
78
import Handler qualified
89
import OpenApi qualified
910
import SwaggerUI qualified
@@ -13,7 +14,8 @@ main =
1314
Tasty.defaultMain $
1415
Tasty.testGroup
1516
"Orb"
16-
[ Handler.testGroup
17+
[ Form.testGroup
18+
, Handler.testGroup
1719
, OpenApi.testGroup
1820
, SwaggerUI.testGroup
1921
]

0 commit comments

Comments
 (0)