module Test.HTTPurple.QuerySpec where

import Prelude

import Data.Tuple (Tuple(Tuple))
import Foreign.Object (empty, fromFoldable, singleton)
import HTTPurple.Query (read)
import Test.HTTPurple.TestHelpers (Test, mockRequest, (?=))
import Test.Spec (describe, it)

readSpec :: Test
readSpec =
  describe "read" do
    describe "with no query string" do
      it "is an empty Map" do
        req <- mockRequest "" "" "/test" "" []
        read req ?= empty
    describe "with an empty query string" do
      it "is an empty Map" do
        req <- mockRequest "" "" "/test?" "" []
        read req ?= empty
    describe "with a query parameter in the query string" do
      it "is a correct Map" do
        req <- mockRequest "" "" "/test?a=b" "" []
        read req ?= singleton "a" "b"
    describe "with empty fields in the query string" do
      it "ignores the empty fields" do
        req <- mockRequest "" "" "/test?&&a=b&&" "" []
        read req ?= singleton "a" "b"
    describe "with duplicated params" do
      it "takes the last param value" do
        req <- mockRequest "" "" "/test?a=b&a=c" "" []
        read req ?= singleton "a" "c"
    describe "with empty params" do
      it "uses '' as the value" do
        req <- mockRequest "" "" "/test?a" "" []
        read req ?= singleton "a" ""
    describe "with complex params" do
      it "is the correct Map" do
        req <- mockRequest "" "" "/test?&&a&b=c&b=d&&&e=f&g=&" "" []
        let
          expectedComplexResult =
            fromFoldable
              [ Tuple "a" ""
              , Tuple "b" "d"
              , Tuple "e" "f"
              , Tuple "g" ""
              ]
        read req ?= expectedComplexResult
    describe "with urlencoded params" do
      it "decodes valid keys and values" do
        req <- mockRequest "" "" "/test?foo%20bar=%3Fx%3Dtest" "" []
        read req ?= singleton "foo bar" "?x=test"
      it "passes invalid keys and values through" do
        req <- mockRequest "" "" "/test?%%=%C3" "" []
        read req ?= singleton "%%" "%C3"
      it "converts + to a space" do
        req <- mockRequest "" "" "/test?foo=bar+baz" "" []
        read req ?= singleton "foo" "bar baz"

querySpec :: Test
querySpec =
  describe "Query" do
    readSpec