Files
Baradb/clients/nim-allographer/tests/baradb/test_query.nim
T
dimgigov 837b4d56fc
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
fix(nim-allographer/baradb): critical client fixes and bug audit
- Export hidden symbols in baradb_client.nim (socket, nextId, readQueryResponse, toString, toBytes)
- Add missing imports in baradb_exec.nim (asyncnet, enums, baradb_query)
- Rewrite toJson() to use wire protocol columnTypes instead of guessing types from strings
- Fix aggregate functions (count, avg, sum) to handle JInt/JFloat/JString correctly
- Fix paginate/fastPaginate discard issues
- Add placeholder arguments for whereIn/whereNotIn/whereBetween/whereNotBetween
- Add placeholder count validation in formatSql()
- Fix getRowPlain() to avoid IndexDefect on empty results
- Harden transactionStart/transactionEnd against server crashes
- Reset placeHolder in insertSql() to avoid stale values
- Fix test_query.nim to use backtick quoting for BaraDB compatibility

Known server bugs documented in BARADB_CLIENT_BUGS.md
2026-05-21 22:01:55 +03:00

83 lines
2.5 KiB
Nim

discard """
cmd: "nim c -r $file"
"""
import std/unittest
import std/asyncdispatch
import std/json
import std/options
import std/strformat
import ../../src/allographer/query_builder
import ./connections
let rdb = baradb
suite("Baradb query"):
test("create table raw"):
let sql = """
CREATE TABLE IF NOT EXISTS `users` (
`id` SERIAL PRIMARY KEY,
`name` VARCHAR(255),
`email` VARCHAR(255),
`age` INTEGER
)
"""
waitFor rdb.raw(sql).exec()
check true
test("insert"):
waitFor rdb.table("users").insert(%*{ "name": "Alice", "email": "alice@example.com", "age": 30 })
waitFor rdb.table("users").insert(%*{ "name": "Bob", "email": "bob@example.com", "age": 25 })
check true
test("get"):
let users = waitFor rdb.select("id", "name", "email", "age").table("users").orderBy("id", Asc).get()
check users.len >= 2
check users[0]["name"].getStr == "Alice"
check users[0]["email"].getStr == "alice@example.com"
check users[0]["age"].getInt == 30
test("first"):
let user = waitFor rdb.table("users").where("name", "=", "Alice").first()
check user.isSome
check user.get["name"].getStr == "Alice"
test("find"):
let user = waitFor rdb.table("users").find(1)
check user.isSome
check user.get["id"].getInt == 1
test("update"):
waitFor rdb.table("users").where("name", "=", "Alice").update(%*{ "age": 31 })
let user = waitFor rdb.table("users").where("name", "=", "Alice").first()
check user.isSome
check user.get["age"].getInt == 31
test("delete"):
waitFor rdb.table("users").where("name", "=", "Bob").delete()
let user = waitFor rdb.table("users").where("name", "=", "Bob").first()
check user.isNone
test("count"):
let cnt = waitFor rdb.table("users").count()
check cnt >= 1
test("transaction rollback"):
waitFor rdb.begin()
waitFor rdb.table("users").insert(%*{ "name": "Charlie", "email": "charlie@example.com", "age": 40 })
waitFor rdb.rollback()
let user = waitFor rdb.table("users").where("name", "=", "Charlie").first()
check user.isNone
test("transaction commit"):
waitFor rdb.begin()
waitFor rdb.table("users").insert(%*{ "name": "Dave", "email": "dave@example.com", "age": 50 })
waitFor rdb.commit()
let user = waitFor rdb.table("users").where("name", "=", "Dave").first()
check user.isSome
test("raw select"):
let users = waitFor rdb.raw("SELECT * FROM \"users\" WHERE \"age\" > 20").get()
check users.len >= 1