87 lines
3.6 KiB
Haskell
87 lines
3.6 KiB
Haskell
module Feature.Query.Preferences.TimezoneSpec where
|
|
|
|
import Network.HTTP.Types
|
|
import Test.Hspec
|
|
import Test.Hspec.Wai
|
|
import Test.Hspec.Wai.JSON
|
|
|
|
import Protolude hiding (get)
|
|
import SpecHelper
|
|
|
|
spec :: SpecWithConfig
|
|
spec withConfig = withConfig baseCfg $ do
|
|
context "test Prefer: timezone=America/Los_Angeles" $ do
|
|
it "should change timezone with handling=strict" $
|
|
request methodGet "/timestamps"
|
|
[("Prefer", "handling=strict, timezone=America/Los_Angeles")]
|
|
""
|
|
`shouldRespondWith`
|
|
[json|[{"t":"2023-10-18T05:37:59.611-07:00"}, {"t":"2023-10-18T07:37:59.611-07:00"}, {"t":"2023-10-18T09:37:59.611-07:00"}]|]
|
|
{ matchStatus = 200
|
|
, matchHeaders = [matchContentTypeJson
|
|
, "Preference-Applied" <:> "handling=strict, timezone=America/Los_Angeles"]}
|
|
|
|
it "should change timezone without handling=strict" $
|
|
request methodGet "/timestamps"
|
|
[("Prefer", "timezone=America/Los_Angeles")]
|
|
""
|
|
`shouldRespondWith`
|
|
[json|[{"t":"2023-10-18T05:37:59.611-07:00"}, {"t":"2023-10-18T07:37:59.611-07:00"}, {"t":"2023-10-18T09:37:59.611-07:00"}]|]
|
|
{ matchStatus = 200
|
|
, matchHeaders = [matchContentTypeJson
|
|
, "Preference-Applied" <:> "timezone=America/Los_Angeles"] }
|
|
|
|
context "test Prefer: timezone=Invalid/Timezone" $ do
|
|
it "should throw error without handling" $
|
|
request methodGet "/timestamps"
|
|
[("Prefer", "timezone=Invalid/Timezone")]
|
|
""
|
|
`shouldRespondWith`
|
|
[json|{"code":"22023","details":null,"hint":null,"message":"invalid value for parameter \"TimeZone\": \"Invalid/Timezone\""}|]
|
|
{ matchStatus = 400 }
|
|
|
|
it "should throw error with handling=strict" $
|
|
request methodGet "/timestamps"
|
|
[("Prefer", "handling=strict, timezone=Invalid/Timezone")]
|
|
""
|
|
`shouldRespondWith`
|
|
[json|{"code":"22023","details":null,"hint":null,"message":"invalid value for parameter \"TimeZone\": \"Invalid/Timezone\""}|]
|
|
{ matchStatus = 400 }
|
|
|
|
it "should throw error with handling=lenient" $
|
|
request methodGet "/timestamps"
|
|
[("Prefer", "handling=lenient, timezone=Invalid/Timezone")]
|
|
""
|
|
`shouldRespondWith`
|
|
[json|{"code":"22023","details":null,"hint":null,"message":"invalid value for parameter \"TimeZone\": \"Invalid/Timezone\""}|]
|
|
{ matchStatus = 400 }
|
|
|
|
context "test Prefer: timezone offsets" $ do
|
|
it "should change with positive offset" $
|
|
request methodGet "/timestamps"
|
|
[("Prefer", "timezone=+05:30")]
|
|
""
|
|
`shouldRespondWith`
|
|
[json|[{"t":"2023-10-18T07:07:59.611-05:30"}, {"t":"2023-10-18T09:07:59.611-05:30"}, {"t":"2023-10-18T11:07:59.611-05:30"}]|]
|
|
{ matchStatus = 200
|
|
, matchHeaders = [matchContentTypeJson
|
|
, "Preference-Applied" <:> "timezone=+05:30"] }
|
|
|
|
it "should change with negative offset" $
|
|
request methodGet "/timestamps"
|
|
[("Prefer", "timezone=-4")]
|
|
""
|
|
`shouldRespondWith`
|
|
[json|[{"t":"2023-10-18T08:37:59.611-04:00"}, {"t":"2023-10-18T10:37:59.611-04:00"}, {"t":"2023-10-18T12:37:59.611-04:00"}]|]
|
|
{ matchStatus = 200
|
|
, matchHeaders = [matchContentTypeJson
|
|
, "Preference-Applied" <:> "timezone=-4"] }
|
|
|
|
it "fails on leap seconds" $
|
|
request methodGet "/timestamps"
|
|
[("Prefer", "timezone=05:30:15")]
|
|
""
|
|
`shouldRespondWith`
|
|
[json|{"code":"22023","details":"PostgreSQL does not support leap seconds.","hint":null,"message":"time zone \"05:30:15\" appears to use leap seconds"}|]
|
|
{ matchStatus = 400 }
|