content: module Feature.Query.ServerTimingSpec where
  
  import Network.Wai (Application)
  
  import Network.HTTP.Types
  import Test.Hspec
  import Test.Hspec.Wai
  import Test.Hspec.Wai.JSON
  
  import Protolude  hiding (get)
  import SpecHelper
  
  spec :: SpecWith ((), Application)
  spec =
    describe "Show Duration on Server-Timing header" $ do
  
      context "responds with Server-Timing header" $ do
        it "works with get request" $ do
          request methodGet  "/organizations?id=eq.6"
            []
            ""
            `shouldRespondWith`
            [json|[{"id":6,"name":"Oscorp","referee":3,"auditor":4,"manager_id":6}]|]
            { matchStatus  = 200
            , matchHeaders = matchContentTypeJson : map matchServerTimingHasTiming ["jwt", "parse", "plan", "transaction", "response"]
            }
  
        it "works with post request" $
          request methodPost  "/organizations?select=*"
            [("Prefer","return=representation")]
            [json|{"id":7,"name":"John","referee":null,"auditor":null,"manager_id":6}|]
            `shouldRespondWith`
            [json|[{"id":7,"name":"John","referee":null,"auditor":null,"manager_id":6}]|]
            { matchStatus  = 201
            , matchHeaders = matchContentTypeJson : map matchServerTimingHasTiming ["jwt", "parse", "plan", "transaction", "response"]
            }
  
        it "works with patch request" $
          request methodPatch "/no_pk?b=eq.0" mempty
              [json| { b: "1" } |]
            `shouldRespondWith`
              ""
              { matchStatus  = 204
              , matchHeaders = matchHeaderAbsent hContentType : map matchServerTimingHasTiming ["jwt", "parse", "plan", "transaction", "response"]
              }
  
        it "works with put request" $
          request methodPut "/tiobe_pls?name=eq.Python"
              [("Prefer", "return=representation")]
              [json| [ { "name": "Python", "rank": 19 } ]|]
            `shouldRespondWith`
              [json| [ { "name": "Python", "rank": 19 } ]|]
              { matchStatus  = 200
              , matchHeaders = map matchServerTimingHasTiming ["jwt", "parse", "plan", "transaction", "response"]
              }
  
        it "works with delete request" $
          request methodDelete "/items?id=eq.1"
              []
              ""
            `shouldRespondWith`
              ""
              { matchStatus  = 204
              , matchHeaders = matchHeaderAbsent hContentType : map matchServerTimingHasTiming ["jwt", "parse", "plan", "transaction", "response"]
              }
  
        it "works with rpc call" $
          request methodPost "/rpc/ret_point_overloaded"
            []
            [json|{"x": 1, "y": 2}|]
            `shouldRespondWith`
            [json|{"x": 1, "y": 2}|]
            { matchStatus  = 200
            , matchHeaders = map matchServerTimingHasTiming ["jwt", "parse", "plan", "transaction", "response"]
            }
  
        it "works with root spec" $
          request methodHead "/"
            []
            ""
            `shouldRespondWith`
            ""
            { matchStatus  = 200
            , matchHeaders = map matchServerTimingHasTiming ["jwt", "parse", "plan", "transaction", "response"]
            }
  
        it "works with OPTIONS method" $ do
          request methodOptions "/organizations"
            []
            ""
            `shouldRespondWith`
            ""
            { matchStatus  = 200
            , matchHeaders = map matchServerTimingHasTiming ["jwt", "parse", "response"]
            }
          request methodOptions "/rpc/getallprojects"
            []
            ""
            `shouldRespondWith`
            ""
            { matchStatus  = 200
            , matchHeaders = map matchServerTimingHasTiming ["jwt", "parse", "response"]
            }
          request methodOptions "/"
            []
            ""
            `shouldRespondWith`
            ""
            { matchStatus  = 200
            , matchHeaders = map matchServerTimingHasTiming ["jwt", "parse", "response"]
            }
  