Files
Baradb/clients/nim-allographer/tests/sqlite/test_schema.nim
T
dimgigov 6bfc5b3a3c
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
feat(clients): add nim-allographer client with BaraDB driver support
- Pure Nim wire protocol client (async + sync, no C FFI)
- Query Builder: fluent API, SQL generator, execution, transactions
- Schema Builder: create/alter/drop tables, column operations
- Connection pool with aging and timeout handling
- ORM integration via compile-time DB_BARADB switch
- Tests: test_open, test_query
- Documentation: README.md, PLAN_BARADB.md
2026-05-21 15:49:11 +03:00

299 lines
13 KiB
Nim

discard """
cmd: "nim c -d:reset $file"
"""
import std/unittest
import std/asyncdispatch
import std/json
import std/options
import ../../src/allographer/schema_builder
import ../../src/allographer/query_builder
import ./connections
import ../clear_tables
let rdb = sqlite
suite("Sqlite create table"):
test("create table"):
rdb.create(
table("IntRelation", [
Column.increments("id")
]),
table("StrRelation", [
Column.uuid("uuid")
]),
table("TypeIndex", [
Column.increments("id"),
Column.integer("integer").unsigned().index().default(1),
Column.smallInteger("smallInteger").unsigned().index().default(1),
Column.mediumInteger("mediumInteger").unsigned().index().default(1),
Column.bigInteger("bigInteger").unsigned().index().default(1),
Column.decimal("decimal", 10, 3).unsigned().index().default(1.1),
Column.double("double", 10, 3).unsigned().index().default(1.1),
Column.float("float").unsigned().index().default(1.1),
Column.uuid("uuid").index().default("A"),
Column.char("char", 255).index().default("A"),
Column.string("string").index().default("A"),
Column.text("text").index().default("A"),
Column.mediumText("mediumText").index().default("A"),
Column.longText("longText").index().default("A"),
Column.date("date").index().default(),
Column.datetime("datetime").index().default(),
Column.time("time").index().default(),
Column.timestamp("timestamp").index().default(),
Column.timestamps(),
Column.softDelete(),
Column.binary("binary").index().default("A"),
Column.boolean("boolean").index().default(true),
Column.enumField("enumField", ["A", "B", "C"]).index().default("A"),
Column.json("json").index().default(%*{"key":"value"}),
Column.foreign("int_relation_id").reference("id").onTable("IntRelation").onDelete(SET_NULL),
Column.strForeign("str_relation_id").reference("uuid").onTable("StrRelation").onDelete(SET_NULL)
]),
table("TypeUnique", [
Column.increments("id"),
Column.integer("integer").unsigned().unique().index().default(1),
Column.smallInteger("smallInteger").unsigned().unique().index().default(1),
Column.mediumInteger("mediumInteger").unsigned().unique().index().default(1),
Column.bigInteger("bigInteger").unsigned().unique().index().default(1),
Column.decimal("decimal", 10, 3).unsigned().unique().index().default(1.1),
Column.double("double", 10, 3).unsigned().unique().index().default(1.1),
Column.float("float").unsigned().unique().index().default(1.1),
Column.uuid("uuid").unique().index().default("A"),
Column.char("char", 255).unique().index().default("A"),
Column.string("string").unique().index().default("A"),
Column.text("text").unique().index().default("A"),
Column.mediumText("mediumText").unique().index().default("A"),
Column.longText("longText").unique().index().default("A"),
Column.date("date").unique().index().default(),
Column.datetime("datetime").unique().index().default(),
Column.time("time").unique().index().default(),
Column.timestamp("timestamp").unique().index().default(),
Column.timestamps(),
Column.softDelete(),
Column.binary("binary").unique().index().default("A"),
Column.boolean("boolean").unique().index().default(true),
Column.enumField("enumField", ["A", "B", "C"]).unique().index().default("A"),
Column.json("json").unique().index().default(%*{"key":"value"}),
Column.foreign("int_relation_id").reference("id").onTable("IntRelation").onDelete(SET_NULL),
Column.strForeign("str_relation_id").reference("uuid").onTable("StrRelation").onDelete(SET_NULL)
])
)
test("change columns"):
rdb.alter(
table("TypeIndex", [
Column.integer("integer").unsigned().index().default(1).change(),
Column.smallInteger("smallInteger").unsigned().index().default(1).change(),
Column.mediumInteger("mediumInteger").unsigned().index().default(1).change(),
Column.bigInteger("bigInteger").unsigned().index().default(1).change(),
Column.decimal("decimal", 10, 3).unsigned().index().default(1.1).change(),
Column.double("double", 10, 3).unsigned().index().default(1.1).change(),
Column.float("float").unsigned().index().default(1.1).change(),
Column.uuid("uuid").index().default("A").change(),
Column.char("char", 255).index().default("A").change(),
Column.string("string").index().default("A").change(),
Column.text("text").index().default("A").change(),
Column.mediumText("mediumText").index().default("A").change(),
Column.longText("longText").index().default("A").change(),
Column.date("date").index().default().change(),
Column.datetime("datetime").index().default().change(),
Column.time("time").index().default().change(),
Column.timestamp("timestamp").index().default().change(),
Column.binary("binary").index().default("A").change(),
Column.boolean("boolean").index().default(true).change(),
Column.enumField("enumField", ["A", "B", "C"]).index().default("A").change(),
Column.json("json").index().default(%*{"key":"value"}).change(),
]),
table("TypeUnique", [
Column.integer("integer").unsigned().unique().index().default(1).change(),
Column.smallInteger("smallInteger").unsigned().unique().index().default(1).change(),
Column.mediumInteger("mediumInteger").unsigned().unique().index().default(1).change(),
Column.bigInteger("bigInteger").unsigned().unique().index().default(1).change(),
Column.decimal("decimal", 10, 3).unsigned().unique().index().default(1.1).change(),
Column.double("double", 10, 3).unsigned().unique().index().default(1.1).change(),
Column.float("float").unsigned().unique().index().default(1.1).change(),
Column.uuid("uuid").unique().index().default("A").change(),
Column.char("char", 255).unique().index().default("A").change(),
Column.string("string").unique().index().default("A").change(),
Column.text("text").unique().index().default("A").change(),
Column.mediumText("mediumText").unique().index().default("A").change(),
Column.longText("longText").unique().index().default("A").change(),
Column.date("date").unique().index().default().change(),
Column.datetime("datetime").unique().index().default().change(),
Column.time("time").unique().index().default().change(),
Column.timestamp("timestamp").unique().index().default().change(),
Column.binary("binary").unique().index().default("A").change(),
Column.boolean("boolean").unique().index().default(true).change(),
Column.enumField("enumField", ["A", "B", "C"]).unique().index().default("A").change(),
Column.json("json").unique().index().default(%*{"key":"value"}).change(),
])
)
suite($rdb & " alter table"):
setup:
rdb.create(
table("IntRelation", [
Column.increments("id"),
]),
table("StrRelation", [
Column.uuid("uuid"),
]),
table("TypeUnique", [
Column.integer("num"),
Column.string("str"),
]),
table("TypeIndex", [
Column.integer("num"),
Column.string("str"),
])
)
test("add columns"):
rdb.alter(
table("TypeIndex", [
Column.increments("id").add(),
Column.integer("integer").unsigned().index().default(1).add(),
Column.smallInteger("smallInteger").unsigned().index().default(1).add(),
Column.mediumInteger("mediumInteger").unsigned().index().default(1).add(),
Column.bigInteger("bigInteger").unsigned().index().default(1).add(),
Column.decimal("decimal", 10, 3).unsigned().index().default(1.1).add(),
Column.double("double", 10, 3).unsigned().index().default(1.1).add(),
Column.float("float").unsigned().index().default(1.1).add(),
Column.uuid("uuid").index().default("A").add(),
Column.char("char", 255).index().default("A").add(),
Column.string("string").index().default("A").add(),
Column.text("text").index().default("A").add(),
Column.mediumText("mediumText").index().default("A").add(),
Column.longText("longText").index().default("A").add(),
Column.date("date").index().default().add(),
Column.datetime("datetime").index().default(),
Column.time("time").index().default().add(),
Column.timestamp("timestamp").index().default().add(),
Column.timestamps().add(),
Column.softDelete().add(),
Column.binary("binary").index().default("A").add(),
Column.boolean("boolean").index().default(true).add(),
Column.enumField("enumField", ["A", "B", "C"]).index().default("A").add(),
Column.json("json").index().default(%*{"key":"value"}).add(),
Column.foreign("int_relation_id").reference("id").onTable("IntRelation").onDelete(SET_NULL).add(),
Column.strForeign("str_relation_id").reference("uuid").onTable("StrRelation").onDelete(SET_NULL).add()
]),
table("TypeUnique", [
Column.increments("id").add(),
Column.integer("integer").unsigned().unique().index().default(1).add(),
Column.smallInteger("smallInteger").unsigned().unique().index().default(1).add(),
Column.mediumInteger("mediumInteger").unsigned().unique().index().default(1).add(),
Column.bigInteger("bigInteger").unsigned().unique().index().default(1).add(),
Column.decimal("decimal", 10, 3).unsigned().unique().index().default(1.1).add(),
Column.double("double", 10, 3).unsigned().unique().index().default(1.1).add(),
Column.float("float").unsigned().unique().index().default(1.1).add(),
Column.uuid("uuid").unique().index().default("A").add(),
Column.char("char", 255).unique().index().default("A").add(),
Column.string("string").unique().index().default("A").add(),
Column.text("text").unique().index().default("A").add(),
Column.mediumText("mediumText").unique().index().default("A").add(),
Column.longText("longText").unique().index().default("A").add(),
Column.date("date").unique().index().default().add(),
Column.datetime("datetime").unique().index().default().add(),
Column.time("time").unique().index().default().add(),
Column.timestamp("timestamp").unique().index().default().add(),
Column.timestamps().add(),
Column.softDelete().add(),
Column.binary("binary").unique().index().default("A").add(),
Column.boolean("boolean").unique().index().default(true).add(),
Column.enumField("enumField", ["A", "B", "C"]).unique().index().default("A").add(),
Column.json("json").unique().index().default(%*{"key":"value"}).add()
])
)
test("rename column"):
rdb.alter(
table("TypeIndex", [
Column.renameColumn("num", "num2"),
Column.renameColumn("str", "str2"),
])
)
let columns = rdb.table("TypeIndex").columns().waitFor
check not columns.contains("num")
check columns.contains("num2")
check not columns.contains("str")
check columns.contains("str2")
test("drop column"):
rdb.alter(
table("TypeIndex", [
Column.dropColumn("str")
])
)
let columns = rdb.table("TypeIndex").columns().waitFor
check not columns.contains("str")
test("rename table"):
rdb.drop(
table("TypeIndex_renamed")
)
rdb.table("TypeIndex").insert(%*{"num":1, "str": "a"}).waitFor
rdb.alter(
table("TypeIndex").renameTo("TypeIndex_renamed")
)
var res:Option[JsonNode]
try:
res = rdb.table("TypeIndex").first().waitFor
check not res.isSome
except CatchableError:
check true
res = rdb.table("TypeIndex_renamed").first().waitFor
check res.isSome
test("drop table"):
rdb.create(
table("TypeIndex", [
Column.integer("num")
])
)
rdb.drop(
table("TypeIndex")
)
var res:Option[JsonNode]
try:
res = rdb.table("TypeIndex").first().waitFor
check not res.isSome
except CatchableError:
check true
suite($rdb & " primary"):
test("primary key"):
rdb.create(
table("relation", [
Column.increments("id"),
]),
table("TypeIndex", @[
Column.integer("index1"),
Column.integer("index2"),
Column.string("string"),
Column.foreign("relation_id").reference("id").onTable("relation").onDelete(SET_NULL)
],
primary = @["index1", "index2"]
)
)
clearTables(rdb).waitFor()