@@ -9,7 +9,7 @@ import Data.Enum (toEnum)
99import Data.Maybe (Maybe(..), fromJust)
1010import Data.Time (Time(..))
1111import Partial.Unsafe (unsafePartial)
12−import Data.String (contains, Pattern(..))
12+
1313import Data.Tuple.Nested (type (/\))
1414import Effect.Aff (Aff)
1515import Effect.Class (liftEffect)
@@ -414,26 +414,15 @@ spec = do
414414 describe "Schema" do
415415 describe "CREATE TABLE DDL" do
416416 it "generates correct DDL for UsersTable" do
417− ddl `shouldSatisfy` contains (Pattern "CREATE TABLE users")
418− ddl `shouldSatisfy` contains (Pattern "id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY")
419− ddl `shouldSatisfy` contains (Pattern "name TEXT NOT NULL")
420− ddl `shouldSatisfy` contains (Pattern "email TEXT NOT NULL UNIQUE")
421− ddl `shouldSatisfy` contains (Pattern "age INTEGER,")
417+ ddl `shouldEqual` "CREATE TABLE users (age INTEGER, email TEXT NOT NULL UNIQUE, id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, name TEXT NOT NULL)"
422418
423419 describe "Extended types DDL" do
424420 it "generates DDL with JSONB, TIMESTAMPTZ, BIGINT, arrays" do
425− eventsDDL `shouldSatisfy` contains (Pattern "CREATE TABLE events")
426− eventsDDL `shouldSatisfy` contains (Pattern "metadata JSONB NOT NULL")
427− eventsDDL `shouldSatisfy` contains (Pattern "tags TEXT[] NOT NULL")
428− eventsDDL `shouldSatisfy` contains (Pattern "created_at TIMESTAMPTZ NOT NULL")
429− eventsDDL `shouldSatisfy` contains (Pattern "view_count BIGINT NOT NULL")
421+ eventsDDL `shouldEqual` "CREATE TABLE events (created_at TIMESTAMPTZ NOT NULL, id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, metadata JSONB NOT NULL, tags TEXT[] NOT NULL, title TEXT NOT NULL, view_count BIGINT NOT NULL)"
430422
431423 describe "INSERT SQL" do
432424 it "generates INSERT skipping AutoIncrement columns" do
433− insertSQL `shouldSatisfy` contains (Pattern "INSERT INTO users")
434− insertSQL `shouldSatisfy` contains (Pattern "(age, email, name)")
435− insertSQL `shouldSatisfy` contains (Pattern "VALUES ($1, $2, $3)")
436− insertSQL `shouldSatisfy` contains (Pattern "RETURNING *")
425+ insertSQL `shouldEqual` "INSERT INTO users (age, email, name) VALUES ($1, $2, $3) RETURNING *"
437426
438427 describe "SELECT SQL" do
439428 it "generates SELECT ALL" do
@@ -443,9 +432,7 @@ spec = do
443432
444433 describe "Defaults" do
445434 it "renders DEFAULT in DDL" do
446− configDDL `shouldSatisfy` contains (Pattern "active BOOLEAN NOT NULL DEFAULT true")
447− configDDL `shouldSatisfy` contains (Pattern "role TEXT NOT NULL DEFAULT 'user'")
448− configDDL `shouldSatisfy` contains (Pattern "score INTEGER NOT NULL DEFAULT 0")
435+ configDDL `shouldEqual` "CREATE TABLE config (active BOOLEAN NOT NULL DEFAULT true, id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY, role TEXT NOT NULL DEFAULT 'user', score INTEGER NOT NULL DEFAULT 0)"
449436 it "skips Default columns in INSERT" do
450437 configInsertSQL `shouldEqual` "INSERT INTO config () VALUES () RETURNING *"
451438
@@ -473,12 +460,9 @@ spec = do
473460
474461 describe "Builder INSERT" do
475462 it "builds INSERT" do
476− builderInsert `shouldSatisfy` contains (Pattern "INSERT INTO users")
477− builderInsert `shouldSatisfy` contains (Pattern "(age, email, name)")
478− builderInsert `shouldSatisfy` contains (Pattern "VALUES ($1, $2, $3)")
463+ builderInsert `shouldEqual` "INSERT INTO users (age, email, name) VALUES ($1, $2, $3)"
479464 it "builds INSERT with RETURNING" do
480− builderInsertReturning `shouldSatisfy` contains (Pattern "INSERT INTO users")
481− builderInsertReturning `shouldSatisfy` contains (Pattern "RETURNING id, name")
465+ builderInsertReturning `shouldEqual` "INSERT INTO users (email, name) VALUES ($1, $2) RETURNING id, name"
482466
483467 describe "Builder UPDATE" do
484468 it "builds UPDATE SET" do
@@ -488,7 +472,7 @@ spec = do
488472
489473 describe "Builder ON CONFLICT" do
490474 it "builds INSERT ON CONFLICT DO NOTHING" do
491− builderUpsert `shouldSatisfy` contains (Pattern "ON CONFLICT (email) DO NOTHING")
475+ builderUpsert `shouldEqual` "INSERT INTO users (age, email, name) VALUES ($1, $2, $3) ON CONFLICT (email) DO NOTHING"
492476
493477 describe "Builder DELETE" do
494478 it "builds DELETE with WHERE" do
@@ -510,15 +494,9 @@ spec = do
510494 it "builds LEFT JOIN" do
511495 typedLeftJoinSQL `shouldEqual` "SELECT users.name, posts.title FROM users LEFT JOIN posts ON users.id = posts.user_id"
512496 it "builds JOIN with ORDER BY, LIMIT, OFFSET" do
513− let sql = typedJoinLimitOffset # toSQL
514− sql `shouldSatisfy` contains (Pattern "INNER JOIN posts ON")
515− sql `shouldSatisfy` contains (Pattern "ORDER BY users.name")
516− sql `shouldSatisfy` contains (Pattern "LIMIT 10")
517− sql `shouldSatisfy` contains (Pattern "OFFSET 5")
497+ (typedJoinLimitOffset # toSQL) `shouldEqual` "SELECT users.name, posts.title FROM users INNER JOIN posts ON users.id = posts.user_id ORDER BY users.name LIMIT 10 OFFSET 5"
518498 it "builds multi-way JOIN" do
519− let sql = typedMultiJoin # toSQL
520− sql `shouldSatisfy` contains (Pattern "INNER JOIN posts ON")
521− sql `shouldSatisfy` contains (Pattern "INNER JOIN comments ON")
499+ (typedMultiJoin # toSQL) `shouldEqual` "SELECT users.name, posts.title, comments.text FROM users INNER JOIN posts ON users.id = posts.user_id INNER JOIN comments ON posts.id = comments.post_id"
522500
523501integrationSpec :: PG.Connection -> Spec Unit
524502integrationSpec conn = do