diff --git a/test/spec/Feature/Query/ServerTimingSpec.hs b/test/spec/Feature/Query/ServerTimingSpec.hs index 4ab8954a304..b894e781494 100644 --- a/test/spec/Feature/Query/ServerTimingSpec.hs +++ b/test/spec/Feature/Query/ServerTimingSpec.hs @@ -22,8 +22,7 @@ spec = `shouldRespondWith` [json|[{"id":6,"name":"Oscorp","referee":3,"auditor":4,"manager_id":6}]|] { matchStatus = 200 - , matchHeaders = [ matchContentTypeJson - , matchHeaderPresent "Server-Timing"] + , matchHeaders = matchContentTypeJson : map matchServerTimingHasTiming ["jwt", "plan", "query", "render"] } it "works with post request" $ @@ -33,8 +32,7 @@ spec = `shouldRespondWith` [json|[{"id":7,"name":"John","referee":null,"auditor":null,"manager_id":6}]|] { matchStatus = 201 - , matchHeaders = [ matchContentTypeJson - , matchHeaderPresent "Server-Timing"] + , matchHeaders = matchContentTypeJson : map matchServerTimingHasTiming ["jwt", "plan", "query", "render"] } it "works with patch request" $ @@ -43,8 +41,7 @@ spec = `shouldRespondWith` "" { matchStatus = 204 - , matchHeaders = [ matchHeaderAbsent hContentType - , matchHeaderPresent "Server-Timing" ] + , matchHeaders = matchHeaderAbsent hContentType : map matchServerTimingHasTiming ["jwt", "plan", "query", "render"] } it "works with put request" $ @@ -54,7 +51,7 @@ spec = `shouldRespondWith` [json| [ { "name": "Go", "rank": 19 } ]|] { matchStatus = 200 - , matchHeaders = [ matchHeaderPresent "Server-Timing" ] + , matchHeaders = map matchServerTimingHasTiming ["jwt", "plan", "query", "render"] } it "works with delete request" $ @@ -64,8 +61,7 @@ spec = `shouldRespondWith` "" { matchStatus = 204 - , matchHeaders = [ matchHeaderAbsent hContentType - , matchHeaderPresent "Server-Timing" ] + , matchHeaders = matchHeaderAbsent hContentType : map matchServerTimingHasTiming ["jwt", "plan", "query", "render"] } it "works with rpc call" $ @@ -75,5 +71,5 @@ spec = `shouldRespondWith` [json|{"x": 1, "y": 2}|] { matchStatus = 200 - , matchHeaders = [ matchHeaderPresent "Server-Timing" ] + , matchHeaders = map matchServerTimingHasTiming ["jwt", "plan", "query", "render"] } diff --git a/test/spec/SpecHelper.hs b/test/spec/SpecHelper.hs index 7bee04a95b8..506b802a1d7 100644 --- a/test/spec/SpecHelper.hs +++ b/test/spec/SpecHelper.hs @@ -33,6 +33,7 @@ import PostgREST.MediaType (MediaType (..)) import PostgREST.SchemaCache.Identifiers (QualifiedIdentifier (..)) import Protolude hiding (get, toS) import Protolude.Conv (toS) +import Data.String (String) matchContentTypeJson :: MatchHeader matchContentTypeJson = "Content-Type" <:> "application/json; charset=utf-8" @@ -64,6 +65,15 @@ matchHeaderPresent name = MatchHeader $ \headers _body -> Just _ -> Nothing Nothing -> Just $ "missing header: " <> toS (original name) <> "\n" +-- | Matches Server-Timing header has a well-formed metric with the given name +matchServerTimingHasTiming :: String -> MatchHeader +matchServerTimingHasTiming metric = MatchHeader $ \headers _body -> + case lookup "Server-Timing" headers of + Just hdr -> if hdr =~ (metric <> ";dur=[[:digit:]]+.[[:digit:]]+") + then Nothing + else Just $ "missing metric: " <> metric <> "\n" + Nothing -> Just "missing Server-Timing header\n" + validateOpenApiResponse :: [Header] -> WaiSession () () validateOpenApiResponse headers = do r <- request methodGet "/" headers ""