hasql-1.10: src/library-tests/Sharing/ByUnit/Decoders/InetSpec.hs
module Sharing.ByUnit.Decoders.InetSpec (spec) where
import Data.IP (IPv4, IPv6)
import Data.IP qualified as IP
import Hasql.Connection qualified as Connection
import Hasql.Decoders qualified as Decoders
import Hasql.Encoders qualified as Encoders
import Hasql.Session qualified as Session
import Hasql.Statement qualified as Statement
import Helpers.Scripts qualified as Scripts
import Test.Hspec
import Prelude
spec :: SpecWith (Text, Word16)
spec = do
describe "INET Decoders" do
it "decodes IPv4 address" \config -> do
Scripts.onPreparableConnection config \connection -> do
let statement =
Statement.preparable
"select '192.168.1.1/32'::inet"
Encoders.noParams
(Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.inet)))
result <- Connection.use connection (Session.statement () statement)
let expectedAddr = read "192.168.1.1" :: IPv4
expectedRange = IP.makeAddrRange expectedAddr 32
result `shouldBe` Right (IP.IPv4Range expectedRange)
it "decodes IPv4 CIDR" \config -> do
Scripts.onPreparableConnection config \connection -> do
let statement =
Statement.preparable
"select '10.0.0.0/8'::inet"
Encoders.noParams
(Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.inet)))
result <- Connection.use connection (Session.statement () statement)
let expectedAddr = read "10.0.0.0" :: IPv4
expectedRange = IP.makeAddrRange expectedAddr 8
result `shouldBe` Right (IP.IPv4Range expectedRange)
it "decodes IPv6 address" \config -> do
Scripts.onPreparableConnection config \connection -> do
let statement =
Statement.preparable
"select '::1/128'::inet"
Encoders.noParams
(Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.inet)))
result <- Connection.use connection (Session.statement () statement)
let expectedAddr = read "::1" :: IPv6
expectedRange = IP.makeAddrRange expectedAddr 128
result `shouldBe` Right (IP.IPv6Range expectedRange)
describe "MACADDR Decoders" do
it "decodes MAC address" \config -> do
Scripts.onPreparableConnection config \connection -> do
let statement =
Statement.preparable
"select '08:00:2b:01:02:03'::macaddr"
Encoders.noParams
(Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.macaddr)))
result <- Connection.use connection (Session.statement () statement)
result `shouldBe` Right (0x08, 0x00, 0x2b, 0x01, 0x02, 0x03)
it "decodes another MAC address format" \config -> do
Scripts.onPreparableConnection config \connection -> do
let statement =
Statement.preparable
"select 'ff:ff:ff:ff:ff:ff'::macaddr"
Encoders.noParams
(Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.macaddr)))
result <- Connection.use connection (Session.statement () statement)
result `shouldBe` Right (0xff, 0xff, 0xff, 0xff, 0xff, 0xff)