Files
UUVPN/iOS-SwiftUI-Code/GRDB.swift-6.29.3/Tests/GRDBTests/QueryInterfacePromiseTests.swift
T

130 lines
4.9 KiB
Swift

import XCTest
import GRDB
private struct Node: TableRecord {
static let parent = belongsTo(Node.self)
}
private struct NotARecord { }
// Here we test that filter(key:), orderByPrimaryKey(), and groupByPrimaryKey()
// don't forget their table when the request type is changed.
class QueryInterfacePromiseTests: GRDBTestCase {
override func setup(_ dbWriter: some DatabaseWriter) throws {
try dbWriter.write { db in
try db.create(table: "node") { t in
t.autoIncrementedPrimaryKey("id")
t.belongsTo("parent", inTable: "node")
}
}
}
func testFilterKeyCapturesTableName() throws {
let dbQueue = try makeDatabaseQueue()
try dbQueue.read { db in
do {
let request = Node
.filter(key: 1)
let sql = """
SELECT * FROM "node" WHERE "id" = 1
"""
try assertEqualSQL(db, request, sql)
try assertEqualSQL(db, request.asRequest(of: Row.self), sql)
}
do {
let request = Node
.filter(key: 1)
.joining(optional: Node.parent.filter(key: 2))
let sql = """
SELECT "node1".* \
FROM "node" "node1" \
LEFT JOIN "node" "node2" ON ("node2"."id" = "node1"."parentId") AND ("node2"."id" = 2) \
WHERE "node1"."id" = 1
"""
try assertEqualSQL(db, request, sql)
try assertEqualSQL(db, request.asRequest(of: Row.self), sql)
}
do {
let request = Node
.joining(optional: Node.parent.filter(key: 2))
.filter(key: 1)
let sql = """
SELECT "node1".* \
FROM "node" "node1" \
LEFT JOIN "node" "node2" ON ("node2"."id" = "node1"."parentId") AND ("node2"."id" = 2) \
WHERE "node1"."id" = 1
"""
try assertEqualSQL(db, request, sql)
try assertEqualSQL(db, request.asRequest(of: Row.self), sql)
}
}
}
func testOrderByPrimaryKeyCapturesTableName() throws {
let dbQueue = try makeDatabaseQueue()
try dbQueue.read { db in
do {
let request = Node.orderByPrimaryKey()
let sql = """
SELECT * FROM "node" ORDER BY "id"
"""
try assertEqualSQL(db, request, sql)
try assertEqualSQL(db, request.asRequest(of: Row.self), sql)
}
do {
let request = Node.orderByPrimaryKey().joining(optional: Node.parent.orderByPrimaryKey())
let sql = """
SELECT "node1".* \
FROM "node" "node1" \
LEFT JOIN "node" "node2" ON "node2"."id" = "node1"."parentId" \
ORDER BY "node1"."id", "node2"."id"
"""
try assertEqualSQL(db, request, sql)
try assertEqualSQL(db, request.asRequest(of: Row.self), sql)
}
}
}
func testGroupByPrimaryKeyCapturesTableName() throws {
let dbQueue = try makeDatabaseQueue()
try dbQueue.read { db in
let request = Node.all().groupByPrimaryKey()
let sql = """
SELECT * FROM "node" GROUP BY "id"
"""
try assertEqualSQL(db, request, sql)
try assertEqualSQL(db, request.asRequest(of: Row.self), sql)
}
}
func testSourceTableIsCapturedInTheRequestAndNotInTheTypeOfTheFetchedRecord() throws {
let dbQueue = try makeDatabaseQueue()
try dbQueue.read { db in
do {
let request = Node.all()
.asRequest(of: NotARecord.self)
.filter(key: 1)
let sql = """
SELECT * FROM "node" WHERE "id" = 1
"""
try assertEqualSQL(db, request, sql)
try assertEqualSQL(db, request.asRequest(of: Row.self), sql)
}
do {
let request = Node
.joining(optional: Node.parent.filter(key: 2))
.asRequest(of: NotARecord.self)
.filter(key: 1)
let sql = """
SELECT "node1".* \
FROM "node" "node1" \
LEFT JOIN "node" "node2" ON ("node2"."id" = "node1"."parentId") AND ("node2"."id" = 2) \
WHERE "node1"."id" = 1
"""
try assertEqualSQL(db, request, sql)
try assertEqualSQL(db, request.asRequest(of: Row.self), sql)
}
}
}
}