packages feed

pg-wire-0.1.0.0: test/PgWire/Connection/ConfigSpec.hs

{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module PgWire.Connection.ConfigSpec (spec) where

import PgWire.Connection.Config
import Test.Hspec

spec :: Spec
spec = do
  describe "parseConnString (URI format)" $ do
    it "parses basic postgres:// URL" $ do
      let Right cfg = parseConnString "postgres://user:pass@localhost:5432/mydb"
      ccHost cfg `shouldBe` "localhost"
      ccPort cfg `shouldBe` 5432
      ccUser cfg `shouldBe` "user"
      ccPassword cfg `shouldBe` "pass"
      ccDatabase cfg `shouldBe` "mydb"

    it "parses postgresql:// scheme" $ do
      let Right cfg = parseConnString "postgresql://u:p@host:1234/db"
      ccHost cfg `shouldBe` "host"
      ccPort cfg `shouldBe` 1234

    it "defaults port to 5432" $ do
      let Right cfg = parseConnString "postgres://u:p@myhost/db"
      ccPort cfg `shouldBe` 5432

    it "parses sslmode=require" $ do
      let Right cfg = parseConnString "postgres://u:p@h:5432/db?sslmode=require"
      ccTls cfg `shouldBe` TlsRequire

    it "parses connect_timeout from query params" $ do
      let Right cfg = parseConnString "postgres://u:p@h:5432/db?connect_timeout=30"
      ccConnectTimeout cfg `shouldBe` 30

    it "defaults connect timeout to 10" $ do
      let Right cfg = parseConnString "postgres://u:p@h:5432/db"
      ccConnectTimeout cfg `shouldBe` 10

    it "defaults query timeout to 0 (no timeout)" $ do
      let Right cfg = parseConnString "postgres://u:p@h:5432/db"
      ccQueryTimeout cfg `shouldBe` 0

  describe "parseConnString (key=value format)" $ do
    it "parses key=value pairs" $ do
      let Right cfg = parseConnString "host=myhost port=9999 user=alice password=secret dbname=testdb"
      ccHost cfg `shouldBe` "myhost"
      ccPort cfg `shouldBe` 9999
      ccUser cfg `shouldBe` "alice"
      ccPassword cfg `shouldBe` "secret"
      ccDatabase cfg `shouldBe` "testdb"

    it "defaults missing fields" $ do
      let Right cfg = parseConnString "host=myhost dbname=db"
      ccPort cfg `shouldBe` 5432
      ccUser cfg `shouldBe` ""

    it "parses connect_timeout" $ do
      let Right cfg = parseConnString "host=h connect_timeout=5"
      ccConnectTimeout cfg `shouldBe` 5

    it "parses sslmode" $ do
      let Right cfg = parseConnString "host=h sslmode=prefer"
      ccTls cfg `shouldBe` TlsPrefer

  describe "defaultConnConfig" $ do
    it "has sensible defaults" $ do
      ccHost defaultConnConfig `shouldBe` "localhost"
      ccPort defaultConnConfig `shouldBe` 5432
      ccTls defaultConnConfig `shouldBe` TlsDisable
      ccConnectTimeout defaultConnConfig `shouldBe` 10
      ccQueryTimeout defaultConnConfig `shouldBe` 0