From f472a517f025ff6dff53bcefc4bfe0e718f86a0e Mon Sep 17 00:00:00 2001 From: itsmura-h Date: Sat, 28 Mar 2026 15:03:12 +0000 Subject: [PATCH 1/4] rm v1 --- example/columnType.nim | 2 +- example/connections.nim | 25 +- tests/v1.bk/mariadb/test_open.nim | 39 -- tests/v1.bk/mariadb/test_query.nim | 527 --------------- tests/v1.bk/mariadb/test_schema.nim | 308 --------- tests/v1.bk/mariadb/test_transaction.nim | 125 ---- tests/v1.bk/mysql/test_open.nim | 39 -- tests/v1.bk/mysql/test_query.nim | 526 --------------- tests/v1.bk/mysql/test_schema.nim | 617 ------------------ tests/v1.bk/mysql/test_transaction.nim | 125 ---- tests/v1.bk/postgres/test_open.nim | 39 -- tests/v1.bk/postgres/test_query.nim | 523 --------------- tests/v1.bk/postgres/test_schema.nim | 308 --------- tests/v1.bk/postgres/test_transaction.nim | 125 ---- tests/v1.bk/sqlite/connection.nim | 8 - tests/v1.bk/sqlite/test_query.nim | 533 --------------- tests/v1.bk/sqlite/test_schema.nim | 298 --------- tests/v1.bk/sqlite/test_transaction.nim | 130 ---- tests/v1.bk/surrealdb/test_autoincrements.nim | 95 --- tests/v1.bk/surrealdb/test_query.nim | 448 ------------- tests/v1.bk/surrealdb/test_schema.nim | 488 -------------- tests/v1.bk/test_orm.nim | 76 --- 22 files changed, 10 insertions(+), 5394 deletions(-) delete mode 100644 tests/v1.bk/mariadb/test_open.nim delete mode 100644 tests/v1.bk/mariadb/test_query.nim delete mode 100644 tests/v1.bk/mariadb/test_schema.nim delete mode 100644 tests/v1.bk/mariadb/test_transaction.nim delete mode 100644 tests/v1.bk/mysql/test_open.nim delete mode 100644 tests/v1.bk/mysql/test_query.nim delete mode 100644 tests/v1.bk/mysql/test_schema.nim delete mode 100644 tests/v1.bk/mysql/test_transaction.nim delete mode 100644 tests/v1.bk/postgres/test_open.nim delete mode 100644 tests/v1.bk/postgres/test_query.nim delete mode 100644 tests/v1.bk/postgres/test_schema.nim delete mode 100644 tests/v1.bk/postgres/test_transaction.nim delete mode 100644 tests/v1.bk/sqlite/connection.nim delete mode 100644 tests/v1.bk/sqlite/test_query.nim delete mode 100644 tests/v1.bk/sqlite/test_schema.nim delete mode 100644 tests/v1.bk/sqlite/test_transaction.nim delete mode 100644 tests/v1.bk/surrealdb/test_autoincrements.nim delete mode 100644 tests/v1.bk/surrealdb/test_query.nim delete mode 100644 tests/v1.bk/surrealdb/test_schema.nim delete mode 100644 tests/v1.bk/test_orm.nim diff --git a/example/columnType.nim b/example/columnType.nim index b81a0f12..ed2801f6 100644 --- a/example/columnType.nim +++ b/example/columnType.nim @@ -5,7 +5,7 @@ import ../src/allographer/schema_builder import ./connections asyncBlock: - rdb.schema([ + rdb.create([ table("auth",[ Column().increments("id"), Column().string("auth") diff --git a/example/connections.nim b/example/connections.nim index f375a425..c245b8ea 100644 --- a/example/connections.nim +++ b/example/connections.nim @@ -1,25 +1,18 @@ -import os, strutils +import std/strutils import ../src/allographer/connection let - database = getEnv("DB_DATABASE") - user = getEnv("DB_USER") - password = getEnv("DB_PASSWORD") - sqliteHost = getEnv("SQLITE_HOST") - mysqlHost = getEnv("MY_HOST") - mariadbHost = getEnv("MARIA_HOST") - mysqlPort = getEnv("MY_PORT").parseInt - pgHost = getEnv("PG_HOST") - pgPort = getEnv("PG_PORT").parseInt - maxConnections = getEnv("DB_MAX_CONNECTION").parseInt - timeout = getEnv("DB_TIMEOUT").parseInt + maxConnections = 95 + timeout = 30 + mysqlUrl = "mysql://user:pass@mysql:3306/database" + mariadbUrl = "mariadb://user:pass@mariadb:3306/database" + pgUrl = "postgresql://user:pass@postgres:5432/database" -let # rdb* = dbOpen(SQLite3, sqliteHost, maxConnections=maxConnections, shouldDisplayLog=false) rdb* = dbOpen(SQLite3, ":memory:", maxConnections=maxConnections, shouldDisplayLog=false) - # rdb* = dbOpen(MySQL, databaseUrl = asDatabaseUrl("mysql://user:password@" & mysqlHost & ":" & $mysqlPort & "/" & database), maxConnections, timeout, shouldDisplayLog=true) - # rdb* = dbOpen(MariaDB, databaseUrl = asDatabaseUrl("mariadb://user:password@" & mariadbHost & ":" & $mysqlPort & "/" & database), maxConnections, timeout, shouldDisplayLog=true) - # rdb* = dbOpen(PostgreSQL, databaseUrl = asDatabaseUrl("postgresql://user:password@" & pgHost & ":" & $pgPort & "/" & database), maxConnections, timeout, shouldDisplayLog=true) + # rdb* = dbOpen(MySQL, mysqlUrl, maxConnections, timeout, shouldDisplayLog=true) + # rdb* = dbOpen(MariaDB, mariadbUrl, maxConnections, timeout, shouldDisplayLog=true) + # rdb* = dbOpen(PostgreSQL, pgUrl, maxConnections, timeout, shouldDisplayLog=true) template asyncBlock*(body:untyped) = (proc(){.async.}= diff --git a/tests/v1.bk/mariadb/test_open.nim b/tests/v1.bk/mariadb/test_open.nim deleted file mode 100644 index 5dee840c..00000000 --- a/tests/v1.bk/mariadb/test_open.nim +++ /dev/null @@ -1,39 +0,0 @@ -discard """ - cmd: "nim c $file" -""" - -# nim c -r tests/v2/mariadb/test_open.nim - -import std/unittest -import ../../../src/allographer/connection -import ../../../src/allographer/query_builder - - -suite("MariaDB connection"): - test("connection"): - let database = "database" - let user = "user" - let password = "pass" - let host = "mariadb" - let port = 3306 - - let rdb = dbOpen(Mariadb, database, user, password, host, port) - check(rdb.isConnected()) - - - test("connection with URL"): - let url = "mariadb://user:pass@mariadb:3306/database" - let rdb = dbOpen(Mariadb, url) - check(rdb.isConnected()) - - - test("url is not start with mariadb://"): - let url = "aaa://user:pass@mariadb:3306/database" - expect(ValueError): - discard dbOpen(Mariadb, url) - - - test("cannot reach to database"): - let url = "mariadb://john:password@host:0001/database" - expect(DbError): - discard dbOpen(Mariadb, url) diff --git a/tests/v1.bk/mariadb/test_query.nim b/tests/v1.bk/mariadb/test_query.nim deleted file mode 100644 index 0857d2c6..00000000 --- a/tests/v1.bk/mariadb/test_query.nim +++ /dev/null @@ -1,527 +0,0 @@ -discard """ - cmd: "nim c -d:reset -d:ssl -r $file" -""" - -# nim c -d:reset -d:ssl -r tests/v1/mariadb/test_query.nim - -import std/unittest -import std/asyncdispatch -import std/httpclient -import std/json -import std/options -import std/streams -import std/strformat -import ../../../src/allographer/schema_builder -import ../../../src/allographer/query_builder -import ../../connections -import ../../clear_tables - - -let rdb = mariadb - -proc setup(rdb:MariadbConnections) = - rdb.create([ - table("auth",[ - Column.increments("id"), - Column.string("auth") - ]), - table("user",[ - Column.increments("id"), - Column.string("name").nullable(), - Column.string("email").nullable(), - Column.string("address").nullable(), - Column.date("submit_on").nullable(), - Column.datetime("submit_at").nullable(), - Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL).nullable() - ]) - ]) - - # seeder - seeder(rdb, "auth"): - rdb.table("auth").insert(@[ - %*{"auth": "admin"}, - %*{"auth": "user"} - ]) - .waitFor - - seeder(rdb, "user"): - var users: seq[JsonNode] - for i in 1..10: - let authId = if i mod 2 == 0: 2 else: 1 - let month = if i > 9: $i else: &"0{i}" - users.add( - %*{ - "name": &"user{i}", - "email": &"user{i}@example.com", - "auth_id": authId, - "submit_on": &"2020-{month}-01", - "submit_at": &"2020-{month}-01 00:00:00", - } - ) - - rdb.table("user").insert(users).waitFor - - -setup(rdb) - -suite($rdb & " get"): - test("get"): - let t = rdb.table("user").get().waitFor - let expect = %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1} - echo t[0] - echo expect - check t[0] == expect - - - test("getPlain"): - let t = rdb.table("user").getPlain().waitFor - check t[0] == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("first"): - var t = rdb.table("user").where("name", "=", "user1").first().waitFor().get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("firstPlain"): - var t = rdb.table("user").firstPlain().waitFor - check t == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("find"): - var t = rdb.table("user").find(1).waitFor.get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("findString"): - var t = rdb.table("user").find("1").waitFor.get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("findPlain"): - var t = rdb.table("user").findPlain(1).waitFor - check t == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("columns"): - let columns = rdb.table("user").columns().waitFor - check columns == @["id", "name", "email", "address", "submit_on", "submit_at", "auth_id"] - - - test("select"): - var t = rdb.select("name", "email").table("user").get().waitFor - check t[0] == %*{"name": "user1", "email": "user1@example.com"} - - - test("selectAs"): - var t = rdb.select("name as user_name", "email").table("user").get().waitFor - check t[0] == %*{"user_name": "user1", "email": "user1@example.com"} - - - test("selectLike"): - var t = rdb.select("email").table("user").where("email", "LIKE", "%10%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - t = rdb.select("email").table("user").where("email", "LIKE", "user10%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - t = rdb.select("email").table("user").where("email", "LIKE", "%10@example.com%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - - - test("select count"): - var t = rdb.select("COUNT(id) as count").table("user").get().waitFor - check t[0]["count"].getInt() == 10 - - - test("select max"): - var t = rdb.select("MAX(id) as max").table("user").get().waitFor - check t[0]["max"].getInt() == 10 - - - test("where"): - var t = rdb.table("user").where("auth_id", "=", "1").get().waitFor - check t == @[ - %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1}, - %*{"id":3,"name":"user3","email":"user3@example.com","address":newJNull(),"submit_on":"2020-03-01","submit_at":"2020-03-01 00:00:00","auth_id":1}, - %*{"id":5,"name":"user5","email":"user5@example.com","address":newJNull(),"submit_on":"2020-05-01","submit_at":"2020-05-01 00:00:00","auth_id":1}, - %*{"id":7,"name":"user7","email":"user7@example.com","address":newJNull(),"submit_on":"2020-07-01","submit_at":"2020-07-01 00:00:00","auth_id":1}, - %*{"id":9,"name":"user9","email":"user9@example.com","address":newJNull(),"submit_on":"2020-09-01","submit_at":"2020-09-01 00:00:00","auth_id":1} - ] - - - test("orWhere"): - var t = rdb.table("user").where("auth_id", "=", "1").orWhere("name", "=", "user2").get().waitFor - check t == @[ - %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1}, - %*{"id":2,"name":"user2","email":"user2@example.com","address":newJNull(),"submit_on":"2020-02-01","submit_at":"2020-02-01 00:00:00","auth_id":2}, - %*{"id":3,"name":"user3","email":"user3@example.com","address":newJNull(),"submit_on":"2020-03-01","submit_at":"2020-03-01 00:00:00","auth_id":1}, - %*{"id":5,"name":"user5","email":"user5@example.com","address":newJNull(),"submit_on":"2020-05-01","submit_at":"2020-05-01 00:00:00","auth_id":1}, - %*{"id":7,"name":"user7","email":"user7@example.com","address":newJNull(),"submit_on":"2020-07-01","submit_at":"2020-07-01 00:00:00","auth_id":1}, - %*{"id":9,"name":"user9","email":"user9@example.com","address":newJNull(),"submit_on":"2020-09-01","submit_at":"2020-09-01 00:00:00","auth_id":1} - ] - - - test("whereBetween"): - var t = rdb - .select("id", "name") - .table("user") - .where("auth_id", "=", 1) - .whereBetween("id", [6, 9]) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user7" - - - test("whereBetweenString"): - var t = rdb - .table("user") - .whereBetween("submit_at", ["2020-01-01 00:00:00", "2020-01-31 00:00:00"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - t = rdb - .table("user") - .whereBetween("submit_on", ["2020-01-01", "2020-01-31"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - - test("whereNotBetween"): - var t = rdb - .select("id", "name") - .table("user") - .where("auth_id", "=", 1) - .whereNotBetween("id", [1, 4]) - .get() - .waitFor - check t[0]["name"].getStr() == "user5" - - - test("whereNotBetweenString"): - var t = rdb - .table("user") - .whereNotBetween("submit_at", ["2020-2-1 00:00:00", "2020-12-31 00:00:00"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - t = rdb - .table("user") - .whereNotBetween("submit_on", ["2020-2-1", "2020-12-31"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - - test("whereIn"): - var t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereIn("id", @[5, 6, 7]) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user5" - - t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereIn("name", @["user5", "user6", "user7"]) - .get() - .waitFor - check t[0]["name"].getStr() == "user5" - - - test("whereNotIn"): - var t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereNotIn("id", @[5, 6, 7]) - .get() - .waitFor - echo t - check t == @[ - %*{"id":4, "name": "user4"}, - %*{"id":8, "name": "user8"}, - %*{"id":9, "name": "user9"}, - %*{"id":10, "name": "user10"}, - ] - - t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereNotIn("name", @["user5", "user6", "user7"]) - .get() - .waitFor - echo t - check t == @[ - %*{"id":4, "name": "user4"}, - %*{"id":8, "name": "user8"}, - %*{"id":9, "name": "user9"}, - %*{"id":10, "name": "user10"}, - ] - - - test("whereNull"): - setUp(rdb) - rdb.table("user").insert(%*{"email": "user11@example.com"}).waitFor - var t = rdb - .select("id", "name", "email") - .table("user") - .whereNull("name") - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 11 - - - test("groupBy"): - var t = rdb - .table("user") - .groupBy("auth_id") - .max("id") - .waitFor() - .get() - echo t - check t == "11" - - - test("having"): - var t = rdb - .select("id", "name") - .table("user") - .groupBy("auth_id") - .groupBy("id") - .having("auth_id", "=", 1) - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 1 - - - test("orderBy"): - var t = rdb.table("user") - .where("auth_id", "is not", nil) - .orderBy("auth_id", Asc) - .orderBy("id", Desc) - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 9 - - - test("join"): - var t = rdb - .select("user.id", "user.name") - .table("user") - .join("auth", "auth.id", "=", "user.auth_id") - .where("auth.id", "=", "2") - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user2" - - - test("leftJoin"): - rdb.table("user").insert(%*{ - "name": "user11" - }) - .waitFor - var t = rdb - .select("user.id", "user.name", "user.auth_id") - .table("user") - .leftJoin("auth", "auth.id", "=", "user.auth_id") - .orderBy("user.id", Desc) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user11" - check t[0]["auth_id"] == newJNull() - - - test("resultIsNull"): - check rdb.table("user").find(50).waitFor().isSome == false - check newSeq[JsonNode](0) == rdb.table("user").where("id", "=", 50).get().waitFor - - -suite($rdb & " insert"): - setup: - setup(rdb) - - test("insert row"): - rdb.table("user").insert(%*{"name": "Alice"}).waitFor - let t = rdb.table("user").orderBy("id", Desc).first().waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insert rows"): - rdb.table("user").insert(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - let t = rdb.table("user").orderBy("id", Desc).limit(2).get().waitFor() - check t[0]["name"].getStr() == "Bob" - check t[1]["name"].getStr() == "Alice" - - - test("insertId row"): - var id = rdb.table("user").insertId(%*{"name": "Alice"}).waitFor - echo id - let t = rdb.table("user").find(id).waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insertId rows"): - let ids = rdb.table("user").insertId(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - - var t = rdb.table("user").find(ids[0]).waitFor().get() - check t["name"].getStr == "Alice" - - t = rdb.table("user").find(ids[1]).waitFor().get() - check t["name"].getStr == "Bob" - - - test("insertNil"): - var id = rdb.table("user").insertId(%*{ - "name": "Alice", - "email": nil, - "address": "" - }) - .waitFor - var res = rdb.table("user").find(id).waitFor - echo res.get - check res.get["email"] == newJNull() - - res = rdb.table("user").where("email", "is", nil).first().waitFor - echo res.get - check res.get["email"] == newJNull() - - -suite($rdb & " update"): - setup: - setup(rdb) - - test("update"): - rdb.table("user").where("id", "=", 1).update(%*{"name": "Alice"}).waitFor - var t = rdb.table("user").find(1).waitFor().get() - check t["name"].getStr() == "Alice" - - -suite($rdb & " delete"): - setup(rdb) - - test("delete"): - rdb.table("user").delete(1).waitFor - check rdb.table("user").find(1).waitFor.isSome == false - - - test("delete where"): - rdb.table("user").where("name", "=", "user1").delete().waitFor - check rdb.table("user").find(1).waitFor.isSome == false - - -suite($rdb & " rawQuery"): - setup(rdb) - - test("get"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT * FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %*[1]).get().waitFor - echo res - check res[0]["name"].getStr == "user1" - - - test("getPlain"): - let sql = &"SELECT * FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %*[1]).getPlain().waitFor - echo res - check res[0][1] == "user1" - - - test("first"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT * FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %*[1]).first().waitFor().get() - echo res - check res["name"].getStr == "user1" - - - test("firstPlain"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT name FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %*[1]).firstPlain().waitFor() - echo res - check res[0] == "user1" - - - test("exec"): - var sql = "UPDATE `user` SET `name` = ? WHERE `id` = ?" - rdb.raw(sql, %*["updated user1", 1]).exec().waitFor - sql = &"SELECT * FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %[1]).get().waitFor - echo res - check res[0]["name"].getStr == "updated user1" - - -setup(rdb) -suite($rdb & " aggregates"): - test("count"): - var t = rdb.table("user").count().waitFor - check t == 10 - - test("max"): - var t = rdb.table("user").max("name").waitFor.get - check t == "user9" - var t2 = rdb.table("user").max("id").waitFor.get - check t2 == "10" - - test("min"): - var t = rdb.table("user").min("name").waitFor.get - check t == "user1" - var t2 = rdb.table("user").min("id").waitFor.get - check t2 == "1" - - test("avg"): - var t = rdb.table("user").avg("id").waitFor.get - check t == 5.5 - - test("sum"): - var t = rdb.table("user").sum("id").waitFor.get - check t == 55.0 - - -suite($rdb & " insert binary"): - test("should success"): - rdb.create( - table("test", [ - Column.increments("id"), - Column.binary("pic"), - ]) - ) - - let client = newAsyncHttpClient() - let response = client.getContent("https://nim-lang.org/assets/img/twitter_banner.png").waitFor() - let imageStream = newStringStream(response) - let binaryImage = imageStream.readAll() - - let id = rdb.table("test").insertId(%*{"pic": binaryImage}).waitFor() - - var res = rdb.table("test").find(id).waitFor().get() - check res["pic"].getStr().len > 0 - - rdb.table("test").where("id","=", id).update(%*{"pic": binaryImage}).waitFor() - - res = rdb.table("test").find(id).waitFor().get() - check res["pic"].getStr().len > 0 - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/mariadb/test_schema.nim b/tests/v1.bk/mariadb/test_schema.nim deleted file mode 100644 index 4f803719..00000000 --- a/tests/v1.bk/mariadb/test_schema.nim +++ /dev/null @@ -1,308 +0,0 @@ -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 = mariadb - -suite("MariaDB 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: - 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: - 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"] - ) - ) - - -suite("Comment"): - test("column comment"): - rdb.create( - table("Comment", [ - Column.integer("index1").comment("index1 comment"), - Column.string("string").comment("string comment") - ]) - ) - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/mariadb/test_transaction.nim b/tests/v1.bk/mariadb/test_transaction.nim deleted file mode 100644 index 14553a05..00000000 --- a/tests/v1.bk/mariadb/test_transaction.nim +++ /dev/null @@ -1,125 +0,0 @@ -discard """ - cmd: "nim c --mm:orc -d:reset -r $file" -""" - -import std/unittest -import std/json -import std/strformat -import std/strutils -import std/options -import std/asyncdispatch -import ../../../src/allographer/schema_builder -import ../../../src/allographer/query_builder -import ../../connections -import ../../clear_tables - - -let rdb = mariadb - -proc setUp(rdb:MariadbConnections) = - rdb.create([ - table("auth",[ - Column.increments("id"), - Column.string("auth") - ]), - table("user",[ - Column.increments("id"), - Column.string("name").nullable(), - Column.string("email").nullable(), - Column.string("address").nullable(), - Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL) - ]) - ]) - - # seeder - seeder(rdb, "auth"): - rdb.table("auth").insert(@[ - %*{"auth": "admin"}, - %*{"auth": "user"} - ]) - .waitFor() - - seeder(rdb, "user"): - var users: seq[JsonNode] - for i in 1..10: - let authId = if i mod 2 == 0: 2 else: 1 - users.add( - %*{ - "name": &"user{i}", - "email": &"user{i}@example.com", - "auth_id": authId - } - ) - - rdb.table("user").insert(users).waitFor() - - -suite("transaction"): - setup: - setUp(rdb) - - suite("raw code"): - test("commit"): - (proc() {.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - block: - rdb.begin().await - try: - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - rdb.commit().await - except: - rdb.rollback().await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "updated" - )().waitFor - - - test("rollback"): - (proc() {.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - block: - rdb.begin().await - try: - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - raise newException(Exception, "") - except: - rdb.rollback().await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - )().waitFor - - suite("transaction template"): - test("commit"): - (proc(){.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - transaction(rdb): - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "updated" - )().waitFor() - - - test("rollback"): - (proc(){.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - transaction(rdb): - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - raise newException(Exception, "") - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - )().waitFor() - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/mysql/test_open.nim b/tests/v1.bk/mysql/test_open.nim deleted file mode 100644 index f2622169..00000000 --- a/tests/v1.bk/mysql/test_open.nim +++ /dev/null @@ -1,39 +0,0 @@ -discard """ - cmd: "nim c $file" -""" - -# nim c -r tests/v1/mariadb/test_open.nim - -import std/unittest -import ../../../src/allographer/connection -import ../../../src/allographer/query_builder - - -suite("MySQL connection"): - test("connection"): - let database = "database" - let user = "user" - let password = "pass" - let host = "mariadb" - let port = 3306 - - let rdb = dbOpen(MySQL, database, user, password, host, port) - check(rdb.isConnected()) - - - test("connection with URL"): - let url = "mysql://user:pass@mariadb:3306/database" - let rdb = dbOpen(MySQL, url) - check(rdb.isConnected()) - - - test("url is not start with mysql://"): - let url = "aaa://user:pass@mariadb:3306/database" - expect(ValueError): - discard dbOpen(MySQL, url) - - - test("cannot reach to database"): - let url = "mysql://john:password@host:0001/database" - expect(DbError): - discard dbOpen(MySQL, url) diff --git a/tests/v1.bk/mysql/test_query.nim b/tests/v1.bk/mysql/test_query.nim deleted file mode 100644 index 52faadb3..00000000 --- a/tests/v1.bk/mysql/test_query.nim +++ /dev/null @@ -1,526 +0,0 @@ -discard """ - cmd: "nim c -d:reset -d:ssl -r $file" -""" - -import std/unittest -import std/asyncdispatch -import std/httpclient -import std/json -import std/options -import std/streams -import std/strformat -import ../../../src/allographer/schema_builder -import ../../../src/allographer/query_builder -import ../../connections -import ../../clear_tables - - -let rdb = mysql - -proc setup(rdb:MysqlConnections) = - rdb.create([ - table("auth",[ - Column.increments("id"), - Column.string("auth") - ]), - table("user",[ - Column.increments("id"), - Column.string("name").nullable(), - Column.string("email").nullable(), - Column.string("address").nullable(), - Column.date("submit_on").nullable(), - Column.datetime("submit_at").nullable(), - Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL).nullable() - ]) - ]) - - # seeder - seeder(rdb, "auth"): - rdb.table("auth").insert(@[ - %*{"auth": "admin"}, - %*{"auth": "user"} - ]) - .waitFor - - seeder(rdb, "user"): - var users: seq[JsonNode] - for i in 1..10: - let authId = if i mod 2 == 0: 2 else: 1 - let month = if i > 9: $i else: &"0{i}" - users.add( - %*{ - "name": &"user{i}", - "email": &"user{i}@example.com", - "auth_id": authId, - "submit_on": &"2020-{month}-01", - "submit_at": &"2020-{month}-01 00:00:00", - } - ) - - rdb.table("user").insert(users).waitFor - - -setup(rdb) - -suite($rdb & " get"): - test("get"): - let t = rdb.table("user").get().waitFor - let expect = %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1} - echo t[0] - echo expect - check t[0] == expect - - - test("getPlain"): - let t = rdb.table("user").getPlain().waitFor - check t[0] == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("first"): - var t = rdb.table("user").where("name", "=", "user1").first().waitFor().get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("firstPlain"): - var t = rdb.table("user").firstPlain().waitFor - check t == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("find"): - var t = rdb.table("user").find(1).waitFor.get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("findString"): - var t = rdb.table("user").find("1").waitFor.get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("findPlain"): - var t = rdb.table("user").findPlain(1).waitFor - check t == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("columns"): - let columns = rdb.table("user").columns().waitFor - check columns == @["id", "name", "email", "address", "submit_on", "submit_at", "auth_id"] - - - test("select"): - var t = rdb.select("name", "email").table("user").get().waitFor - check t[0] == %*{"name": "user1", "email": "user1@example.com"} - - - test("selectAs"): - var t = rdb.select("name as user_name", "email").table("user").get().waitFor - check t[0] == %*{"user_name": "user1", "email": "user1@example.com"} - - - test("selectLike"): - var t = rdb.select("email").table("user").where("email", "LIKE", "%10%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - t = rdb.select("email").table("user").where("email", "LIKE", "user10%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - t = rdb.select("email").table("user").where("email", "LIKE", "%10@example.com%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - - - test("select count"): - var t = rdb.select("COUNT(id) as count").table("user").get().waitFor - check t[0]["count"].getInt() == 10 - - - test("select max"): - var t = rdb.select("MAX(id) as max").table("user").get().waitFor - check t[0]["max"].getInt() == 10 - - - test("where"): - var t = rdb.table("user").where("auth_id", "=", "1").get().waitFor - check t == @[ - %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1}, - %*{"id":3,"name":"user3","email":"user3@example.com","address":newJNull(),"submit_on":"2020-03-01","submit_at":"2020-03-01 00:00:00","auth_id":1}, - %*{"id":5,"name":"user5","email":"user5@example.com","address":newJNull(),"submit_on":"2020-05-01","submit_at":"2020-05-01 00:00:00","auth_id":1}, - %*{"id":7,"name":"user7","email":"user7@example.com","address":newJNull(),"submit_on":"2020-07-01","submit_at":"2020-07-01 00:00:00","auth_id":1}, - %*{"id":9,"name":"user9","email":"user9@example.com","address":newJNull(),"submit_on":"2020-09-01","submit_at":"2020-09-01 00:00:00","auth_id":1} - ] - - - test("orWhere"): - var t = rdb.table("user").where("auth_id", "=", "1").orWhere("name", "=", "user2").get().waitFor - check t == @[ - %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1}, - %*{"id":2,"name":"user2","email":"user2@example.com","address":newJNull(),"submit_on":"2020-02-01","submit_at":"2020-02-01 00:00:00","auth_id":2}, - %*{"id":3,"name":"user3","email":"user3@example.com","address":newJNull(),"submit_on":"2020-03-01","submit_at":"2020-03-01 00:00:00","auth_id":1}, - %*{"id":5,"name":"user5","email":"user5@example.com","address":newJNull(),"submit_on":"2020-05-01","submit_at":"2020-05-01 00:00:00","auth_id":1}, - %*{"id":7,"name":"user7","email":"user7@example.com","address":newJNull(),"submit_on":"2020-07-01","submit_at":"2020-07-01 00:00:00","auth_id":1}, - %*{"id":9,"name":"user9","email":"user9@example.com","address":newJNull(),"submit_on":"2020-09-01","submit_at":"2020-09-01 00:00:00","auth_id":1} - ] - - - test("whereBetween"): - var t = rdb - .select("id", "name") - .table("user") - .where("auth_id", "=", 1) - .whereBetween("id", [6, 9]) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user7" - - - test("whereBetweenString"): - var t = rdb - .table("user") - .whereBetween("submit_at", ["2020-01-01 00:00:00", "2020-01-31 00:00:00"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - t = rdb - .table("user") - .whereBetween("submit_on", ["2020-01-01", "2020-01-31"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - - test("whereNotBetween"): - var t = rdb - .select("id", "name") - .table("user") - .where("auth_id", "=", 1) - .whereNotBetween("id", [1, 4]) - .get() - .waitFor - check t[0]["name"].getStr() == "user5" - - - test("whereNotBetweenString"): - var t = rdb - .table("user") - .whereNotBetween("submit_at", ["2020-2-1 00:00:00", "2020-12-31 00:00:00"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - t = rdb - .table("user") - .whereNotBetween("submit_on", ["2020-2-1", "2020-12-31"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - - test("whereIn"): - var t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereIn("id", @[5, 6, 7]) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user5" - - t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereIn("name", @["user5", "user6", "user7"]) - .get() - .waitFor - check t[0]["name"].getStr() == "user5" - - - test("whereNotIn"): - var t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereNotIn("id", @[5, 6, 7]) - .get() - .waitFor - echo t - check t == @[ - %*{"id":4, "name": "user4"}, - %*{"id":8, "name": "user8"}, - %*{"id":9, "name": "user9"}, - %*{"id":10, "name": "user10"}, - ] - - t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereNotIn("name", @["user5", "user6", "user7"]) - .get() - .waitFor - echo t - check t == @[ - %*{"id":4, "name": "user4"}, - %*{"id":8, "name": "user8"}, - %*{"id":9, "name": "user9"}, - %*{"id":10, "name": "user10"}, - ] - - - test("whereNull"): - setUp(rdb) - rdb.table("user").insert(%*{"email": "user11@example.com"}).waitFor - var t = rdb - .select("id", "name", "email") - .table("user") - .whereNull("name") - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 11 - - - test("groupBy"): - var t = rdb - .table("user") - .where("auth_id", "=", 1) - .groupBy("auth_id") - .max("id") - .waitFor() - .get() - echo t - check t == "9" - - - test("having"): - var t = rdb - .select("id", "name") - .table("user") - .groupBy("auth_id") - .groupBy("id") - .having("auth_id", "=", 1) - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 1 - - - test("orderBy"): - var t = rdb.table("user") - .where("auth_id", "is not", nil) - .orderBy("auth_id", Asc) - .orderBy("id", Desc) - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 9 - - - test("join"): - var t = rdb - .select("user.id", "user.name") - .table("user") - .join("auth", "auth.id", "=", "user.auth_id") - .where("auth.id", "=", "2") - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user2" - - - test("leftJoin"): - rdb.table("user").insert(%*{ - "name": "user11" - }) - .waitFor - var t = rdb - .select("user.id", "user.name", "user.auth_id") - .table("user") - .leftJoin("auth", "auth.id", "=", "user.auth_id") - .orderBy("user.id", Desc) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user11" - check t[0]["auth_id"] == newJNull() - - - test("resultIsNull"): - check rdb.table("user").find(50).waitFor().isSome == false - check newSeq[JsonNode](0) == rdb.table("user").where("id", "=", 50).get().waitFor - - -suite($rdb & " insert"): - setup: - setup(rdb) - - test("insert row"): - rdb.table("user").insert(%*{"name": "Alice"}).waitFor - let t = rdb.table("user").orderBy("id", Desc).first().waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insert rows"): - rdb.table("user").insert(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - let t = rdb.table("user").orderBy("id", Desc).limit(2).get().waitFor() - check t[0]["name"].getStr() == "Bob" - check t[1]["name"].getStr() == "Alice" - - - test("insertId row"): - var id = rdb.table("user").insertId(%*{"name": "Alice"}).waitFor - echo id - let t = rdb.table("user").find(id).waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insertId rows"): - let ids = rdb.table("user").insertId(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - - var t = rdb.table("user").find(ids[0]).waitFor().get() - check t["name"].getStr == "Alice" - - t = rdb.table("user").find(ids[1]).waitFor().get() - check t["name"].getStr == "Bob" - - - test("insertNil"): - var id = rdb.table("user").insertId(%*{ - "name": "Alice", - "email": nil, - "address": "" - }) - .waitFor - var res = rdb.table("user").find(id).waitFor - echo res.get - check res.get["email"] == newJNull() - - res = rdb.table("user").where("email", "is", nil).first().waitFor - echo res.get - check res.get["email"] == newJNull() - - -suite($rdb & " update"): - setup: - setup(rdb) - - test("update"): - rdb.table("user").where("id", "=", 1).update(%*{"name": "Alice"}).waitFor - var t = rdb.table("user").find(1).waitFor().get() - check t["name"].getStr() == "Alice" - - -suite($rdb & " delete"): - setup(rdb) - - test("delete"): - rdb.table("user").delete(1).waitFor - check rdb.table("user").find(1).waitFor.isSome == false - - - test("delete where"): - rdb.table("user").where("name", "=", "user1").delete().waitFor - check rdb.table("user").find(1).waitFor.isSome == false - - -suite($rdb & " rawQuery"): - setup(rdb) - - test("get"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT * FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %*[1]).get().waitFor - echo res - check res[0]["name"].getStr == "user1" - - - test("getPlain"): - let sql = &"SELECT * FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %*[1]).getPlain().waitFor - echo res - check res[0][1] == "user1" - - - test("first"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT * FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %*[1]).first().waitFor().get() - echo res - check res["name"].getStr == "user1" - - - test("firstPlain"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT name FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %*[1]).firstPlain().waitFor() - echo res - check res[0] == "user1" - - - test("exec"): - var sql = "UPDATE `user` SET `name` = ? WHERE `id` = ?" - rdb.raw(sql, %*["updated user1", 1]).exec().waitFor - sql = &"SELECT * FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %[1]).get().waitFor - echo res - check res[0]["name"].getStr == "updated user1" - - -setup(rdb) -suite($rdb & " aggregates"): - test("count"): - var t = rdb.table("user").count().waitFor - check t == 10 - - test("max"): - var t = rdb.table("user").max("name").waitFor.get - check t == "user9" - var t2 = rdb.table("user").max("id").waitFor.get - check t2 == "10" - - test("min"): - var t = rdb.table("user").min("name").waitFor.get - check t == "user1" - var t2 = rdb.table("user").min("id").waitFor.get - check t2 == "1" - - test("avg"): - var t = rdb.table("user").avg("id").waitFor.get - check t == 5.5 - - test("sum"): - var t = rdb.table("user").sum("id").waitFor.get - check t == 55.0 - - -suite($rdb & " insert binary"): - test("should success"): - rdb.create( - table("test", [ - Column.increments("id"), - Column.binary("pic"), - ]) - ) - - let client = newAsyncHttpClient() - let response = client.getContent("https://nim-lang.org/assets/img/twitter_banner.png").waitFor() - let imageStream = newStringStream(response) - let binaryImage = imageStream.readAll() - - let id = rdb.table("test").insertId(%*{"pic": binaryImage}).waitFor() - - var res = rdb.table("test").find(id).waitFor().get() - check res["pic"].getStr().len > 0 - - rdb.table("test").where("id","=", id).update(%*{"pic": binaryImage}).waitFor() - - res = rdb.table("test").find(id).waitFor().get() - check res["pic"].getStr().len > 0 - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/mysql/test_schema.nim b/tests/v1.bk/mysql/test_schema.nim deleted file mode 100644 index df3f0d89..00000000 --- a/tests/v1.bk/mysql/test_schema.nim +++ /dev/null @@ -1,617 +0,0 @@ -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 = mysql - -suite("MySQL create table"): - test("create table"): - rdb.create( - table("IntRelation", [ - Column.increments("id") - ]), - table("StrRelation", [ - Column.uuid("uuid") - ]), - # text, binary, json column can't use default value and index - 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"), - Column.mediumText("mediumText"), - Column.longText("longText"), - 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"), - Column.boolean("boolean").index().default(true), - Column.enumField("enumField", ["A", "B", "C"]).index().default("A"), - Column.json("json"), - Column.foreign("int_relation_id").reference("id").onTable("IntRelation").onDelete(SET_NULL), - Column.strForeign("str_relation_id").reference("uuid").onTable("StrRelation").onDelete(SET_NULL) - ]), - # text, binary, json column can't use default value, index and unique - 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"), - Column.mediumText("mediumText"), - Column.longText("longText"), - 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"), - Column.boolean("boolean").unique().index().default(true), - Column.enumField("enumField", ["A", "B", "C"]).unique().index().default("A"), - Column.json("json"), - 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").change(), - Column.mediumText("mediumText").change(), - Column.longText("longText").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").change(), - Column.boolean("boolean").index().default(true).change(), - Column.enumField("enumField", ["A", "B", "C"]).index().default("A").change(), - Column.json("json").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").change(), - Column.mediumText("mediumText").change(), - Column.longText("longText").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").change(), - Column.boolean("boolean").unique().index().default(true).change(), - Column.enumField("enumField", ["A", "B", "C"]).unique().index().default("A").change(), - Column.json("json").change(), - ]) - ) - - -suite("error in text, blob, json column for default, index and unique"): - suite("create table"): - test("text"): - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.text("text").default("A"), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.text("text").index(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.text("text").unique(), - ]) - ) - - test("mediumText"): - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.mediumText("mediumText").default("A"), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.mediumText("mediumText").index(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.mediumText("mediumText").unique(), - ]) - ) - - test("longText"): - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.longText("longText").default("A"), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.longText("longText").index(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.longText("longText").unique(), - ]) - ) - - test("binary"): - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.binary("binary").default("A"), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.binary("binary").index(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.binary("binary").unique(), - ]) - ) - - test("json"): - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.json("json").default(%*{"key": "value"}), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.json("json").index(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.json("json").unique(), - ]) - ) - - - suite("add column"): - test("text"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.text("text").default("A").add(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.text("text").index().add(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.text("text").unique().add(), - ]) - ) - - test("mediumText"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.mediumText("mediumText").default("A").add(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.mediumText("mediumText").index().add(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.mediumText("mediumText").unique().add(), - ]) - ) - - test("longText"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.longText("longText").default("A").add(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.longText("longText").index().add(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.longText("longText").unique().add(), - ]) - ) - - test("binary"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.binary("binary").default("A").add(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.binary("binary").index().add(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.binary("binary").unique().add(), - ]) - ) - - test("json"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.json("json").default(%*{"key": "value"}).add(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.json("json").index().add(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.json("json").unique().add(), - ]) - ) - - - suite("change column"): - test("text"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.text("text").default("A").change(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.text("text").index().change(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.text("text").unique().change(), - ]) - ) - - test("mediumText"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.mediumText("mediumText").default("A").change(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.mediumText("mediumText").index().change(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.mediumText("mediumText").unique().change(), - ]) - ) - - test("longText"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.longText("longText").default("A").change(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.longText("longText").index().change(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.longText("longText").unique().change(), - ]) - ) - - test("binary"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.binary("binary").default("A").change(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.binary("binary").index().change(), - ]) - ) - expect DbError: - rdb.create( - table("TypeIndex", [ - Column.binary("binary").unique().change(), - ]) - ) - - test("json"): - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.json("json").default(%*{"key": "value"}).change(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.json("json").index().change(), - ]) - ) - expect DbError: - rdb.alter( - table("TypeIndex", [ - Column.json("json").unique().change(), - ]) - ) - - -suite("MySQL 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").add(), - Column.mediumText("mediumText").add(), - Column.longText("longText").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").add(), - Column.boolean("boolean").index().default(true).add(), - Column.enumField("enumField", ["A", "B", "C"]).index().default("A").add(), - Column.json("json").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").add(), - Column.mediumText("mediumText").add(), - Column.longText("longText").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").add(), - Column.boolean("boolean").unique().index().default(true).add(), - Column.enumField("enumField", ["A", "B", "C"]).unique().index().default("A").add(), - Column.json("json").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: - 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: - 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"] - ) - ) - - -suite("Comment"): - test("column comment"): - rdb.create( - table("Comment", [ - Column.integer("index1").comment("index1 comment"), - Column.string("string").comment("string comment") - ]) - ) - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/mysql/test_transaction.nim b/tests/v1.bk/mysql/test_transaction.nim deleted file mode 100644 index de9103c5..00000000 --- a/tests/v1.bk/mysql/test_transaction.nim +++ /dev/null @@ -1,125 +0,0 @@ -discard """ - cmd: "nim c --mm:orc -d:reset -r $file" -""" - -import std/unittest -import std/json -import std/strformat -import std/strutils -import std/options -import std/asyncdispatch -import ../../../src/allographer/schema_builder -import ../../../src/allographer/query_builder -import ../../connections -import ../../clear_tables - - -let rdb = mysql - -proc setUp(rdb:MysqlConnections) = - rdb.create([ - table("auth",[ - Column.increments("id"), - Column.string("auth") - ]), - table("user",[ - Column.increments("id"), - Column.string("name").nullable(), - Column.string("email").nullable(), - Column.string("address").nullable(), - Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL) - ]) - ]) - - # seeder - seeder(rdb, "auth"): - rdb.table("auth").insert(@[ - %*{"auth": "admin"}, - %*{"auth": "user"} - ]) - .waitFor() - - seeder(rdb, "user"): - var users: seq[JsonNode] - for i in 1..10: - let authId = if i mod 2 == 0: 2 else: 1 - users.add( - %*{ - "name": &"user{i}", - "email": &"user{i}@example.com", - "auth_id": authId - } - ) - - rdb.table("user").insert(users).waitFor() - - -suite("transaction"): - setup: - setUp(rdb) - - suite("raw code"): - test("commit"): - (proc() {.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - block: - rdb.begin().await - try: - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - rdb.commit().await - except: - rdb.rollback().await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "updated" - )().waitFor - - - test("rollback"): - (proc() {.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - block: - rdb.begin().await - try: - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - raise newException(Exception, "") - except: - rdb.rollback().await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - )().waitFor - - suite("transaction template"): - test("commit"): - (proc(){.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - transaction(rdb): - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "updated" - )().waitFor() - - - test("rollback"): - (proc(){.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - transaction(rdb): - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - raise newException(Exception, "") - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - )().waitFor() - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/postgres/test_open.nim b/tests/v1.bk/postgres/test_open.nim deleted file mode 100644 index cc96fc6a..00000000 --- a/tests/v1.bk/postgres/test_open.nim +++ /dev/null @@ -1,39 +0,0 @@ -discard """ - cmd: "nim c $file" -""" - -# nim c -r tests/v1/postgres/test_open.nim - -import std/unittest -import ../../../src/allographer/connection -import ../../../src/allographer/query_builder - - -suite("PostgreSQL connection"): - test("connection"): - let database = "database" - let user = "user" - let password = "pass" - let host = "postgres" - let port = 5432 - - let rdb = dbOpen(PostgreSQL, database, user, password, host, port) - check(rdb.isConnected()) - - - test("connection with URL"): - let url = "postgresql://user:pass@postgres:5432/database" - let rdb = dbOpen(PostgreSQL, url) - check(rdb.isConnected()) - - - test("url is not start with postgresql://"): - let url = "mysql://user:pass@postgres:5432/database" - expect(ValueError): - discard dbOpen(PostgreSQL, url) - - - test("cannot reach to database"): - let url = "postgresql://john:password@host:0001/database" - expect(DbError): - discard dbOpen(PostgreSQL, url) diff --git a/tests/v1.bk/postgres/test_query.nim b/tests/v1.bk/postgres/test_query.nim deleted file mode 100644 index df037298..00000000 --- a/tests/v1.bk/postgres/test_query.nim +++ /dev/null @@ -1,523 +0,0 @@ -discard """ - cmd: "nim c -d:reset -d:ssl -r $file" -""" - -import std/unittest -import std/asyncdispatch -import std/httpclient -import std/json -import std/options -import std/streams -import std/strformat -import ../../../src/allographer/schema_builder -import ../../../src/allographer/query_builder -import ../../connections -import ../../clear_tables - - -let rdb = postgres - -# ============================================================================= -# test -# ============================================================================= - -proc setup(rdb:PostgresConnections) = - rdb.create([ - table("auth",[ - Column.increments("id"), - Column.string("auth") - ]), - table("user",[ - Column.increments("id"), - Column.string("name").nullable(), - Column.string("email").nullable(), - Column.string("address").nullable(), - Column.date("submit_on").nullable(), - Column.datetime("submit_at").nullable(), - Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL).nullable() - ]) - ]) - - # seeder - seeder(rdb, "auth"): - rdb.table("auth").insert(@[ - %*{"auth": "admin"}, - %*{"auth": "user"} - ]) - .waitFor - - seeder(rdb, "user"): - var users: seq[JsonNode] - for i in 1..10: - let authId = if i mod 2 == 0: 2 else: 1 - let month = if i > 9: $i else: &"0{i}" - users.add( - %*{ - "name": &"user{i}", - "email": &"user{i}@example.com", - "auth_id": authId, - "submit_on": &"2020-{month}-01", - "submit_at": &"2020-{month}-01 00:00:00", - } - ) - - rdb.table("user").insert(users).waitFor - - -setup(rdb) - -suite($rdb & " get"): - test("get"): - let t = rdb.table("user").get().waitFor - let expect = %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1} - echo t[0] - echo expect - check t[0] == expect - - - test("getPlain"): - let t = rdb.table("user").getPlain().waitFor - check t[0] == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("first"): - var t = rdb.table("user").where("name", "=", "user1").first().waitFor().get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("firstPlain"): - var t = rdb.table("user").firstPlain().waitFor - check t == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("find"): - var t = rdb.table("user").find(1).waitFor.get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("findString"): - var t = rdb.table("user").find("1").waitFor.get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("findPlain"): - var t = rdb.table("user").findPlain(1).waitFor - check t == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("columns"): - let columns = rdb.table("user").columns().waitFor - check columns == @["id", "name", "email", "address", "submit_on", "submit_at", "auth_id"] - - - test("select"): - var t = rdb.select("name", "email").table("user").get().waitFor - check t[0] == %*{"name": "user1", "email": "user1@example.com"} - - - test("selectAs"): - var t = rdb.select("name as user_name", "email").table("user").get().waitFor - check t[0] == %*{"user_name": "user1", "email": "user1@example.com"} - - - test("selectLike"): - var t = rdb.select("email").table("user").where("email", "LIKE", "%10%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - t = rdb.select("email").table("user").where("email", "LIKE", "user10%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - t = rdb.select("email").table("user").where("email", "LIKE", "%10@example.com%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - - - test("select count"): - var t = rdb.select("COUNT(id) as count").table("user").get().waitFor - check t[0]["count"].getInt() == 10 - - - test("where"): - var t = rdb.table("user").where("auth_id", "=", "1").get().waitFor - check t == @[ - %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1}, - %*{"id":3,"name":"user3","email":"user3@example.com","address":newJNull(),"submit_on":"2020-03-01","submit_at":"2020-03-01 00:00:00","auth_id":1}, - %*{"id":5,"name":"user5","email":"user5@example.com","address":newJNull(),"submit_on":"2020-05-01","submit_at":"2020-05-01 00:00:00","auth_id":1}, - %*{"id":7,"name":"user7","email":"user7@example.com","address":newJNull(),"submit_on":"2020-07-01","submit_at":"2020-07-01 00:00:00","auth_id":1}, - %*{"id":9,"name":"user9","email":"user9@example.com","address":newJNull(),"submit_on":"2020-09-01","submit_at":"2020-09-01 00:00:00","auth_id":1} - ] - - - test("orWhere"): - var t = rdb.table("user").where("auth_id", "=", "1").orWhere("name", "=", "user2").get().waitFor - check t == @[ - %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1}, - %*{"id":2,"name":"user2","email":"user2@example.com","address":newJNull(),"submit_on":"2020-02-01","submit_at":"2020-02-01 00:00:00","auth_id":2}, - %*{"id":3,"name":"user3","email":"user3@example.com","address":newJNull(),"submit_on":"2020-03-01","submit_at":"2020-03-01 00:00:00","auth_id":1}, - %*{"id":5,"name":"user5","email":"user5@example.com","address":newJNull(),"submit_on":"2020-05-01","submit_at":"2020-05-01 00:00:00","auth_id":1}, - %*{"id":7,"name":"user7","email":"user7@example.com","address":newJNull(),"submit_on":"2020-07-01","submit_at":"2020-07-01 00:00:00","auth_id":1}, - %*{"id":9,"name":"user9","email":"user9@example.com","address":newJNull(),"submit_on":"2020-09-01","submit_at":"2020-09-01 00:00:00","auth_id":1} - ] - - - test("whereBetween"): - var t = rdb - .select("id", "name") - .table("user") - .where("auth_id", "=", 1) - .whereBetween("id", [6, 9]) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user7" - - - test("whereBetweenString"): - var t = rdb - .table("user") - .whereBetween("submit_at", ["2020-01-01 00:00:00", "2020-01-31 00:00:00"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - t = rdb - .table("user") - .whereBetween("submit_on", ["2020-01-01", "2020-01-31"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - - test("whereNotBetween"): - var t = rdb - .select("id", "name") - .table("user") - .where("auth_id", "=", 1) - .whereNotBetween("id", [1, 4]) - .get() - .waitFor - check t[0]["name"].getStr() == "user5" - - - test("whereNotBetweenString"): - var t = rdb - .table("user") - .whereNotBetween("submit_at", ["2020-2-1 00:00:00", "2020-12-31 00:00:00"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - t = rdb - .table("user") - .whereNotBetween("submit_on", ["2020-2-1", "2020-12-31"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - - test("whereIn"): - var t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereIn("id", @[5, 6, 7]) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user5" - - t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereIn("name", @["user5", "user6", "user7"]) - .get() - .waitFor - check t[0]["name"].getStr() == "user5" - - - test("whereNotIn"): - var t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereNotIn("id", @[5, 6, 7]) - .get() - .waitFor - echo t - check t == @[ - %*{"id":4, "name": "user4"}, - %*{"id":8, "name": "user8"}, - %*{"id":9, "name": "user9"}, - %*{"id":10, "name": "user10"}, - ] - - t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereNotIn("name", @["user5", "user6", "user7"]) - .get() - .waitFor - echo t - check t == @[ - %*{"id":4, "name": "user4"}, - %*{"id":8, "name": "user8"}, - %*{"id":9, "name": "user9"}, - %*{"id":10, "name": "user10"}, - ] - - - test("whereNull"): - setUp(rdb) - rdb.table("user").insert(%*{"email": "user11@example.com"}).waitFor - var t = rdb - .select("id", "name", "email") - .table("user") - .whereNull("name") - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 11 - - - test("groupBy"): - var t = rdb - .table("user") - .groupBy("auth_id") - .max("id") - .waitFor() - .get() - echo t - check t == "11" - - - test("having"): - var t = rdb - .select("id", "name") - .table("user") - .groupBy("auth_id") - .groupBy("id") - .having("auth_id", "=", 1) - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 1 - - - test("orderBy"): - var t = rdb.table("user") - .where("auth_id", "is not", nil) - .orderBy("auth_id", Asc) - .orderBy("id", Desc) - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 9 - - - test("join"): - var t = rdb - .select("user.id", "user.name") - .table("user") - .join("auth", "auth.id", "=", "user.auth_id") - .where("auth.id", "=", "2") - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user2" - - - test("leftJoin"): - rdb.table("user").insert(%*{ - "name": "user11" - }) - .waitFor - var t = rdb - .select("user.id", "user.name", "user.auth_id") - .table("user") - .leftJoin("auth", "auth.id", "=", "user.auth_id") - .orderBy("user.id", Desc) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user11" - check t[0]["auth_id"] == newJNull() - - - test("resultIsNull"): - check rdb.table("user").find(50).waitFor().isSome == false - check newSeq[JsonNode](0) == rdb.table("user").where("id", "=", 50).get().waitFor - - -suite($rdb & " insert"): - setup: - setup(rdb) - - test("insert row"): - rdb.table("user").insert(%*{"name": "Alice"}).waitFor - let t = rdb.table("user").orderBy("id", Desc).first().waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insert rows"): - rdb.table("user").insert(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - let t = rdb.table("user").orderBy("id", Desc).limit(2).get().waitFor() - check t[0]["name"].getStr() == "Bob" - check t[1]["name"].getStr() == "Alice" - - - test("insertId row"): - var id = rdb.table("user").insertId(%*{"name": "Alice"}).waitFor - echo id - let t = rdb.table("user").find(id).waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insertId rows"): - let ids = rdb.table("user").insertId(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - - var t = rdb.table("user").find(ids[0]).waitFor().get() - check t["name"].getStr == "Alice" - - t = rdb.table("user").find(ids[1]).waitFor().get() - check t["name"].getStr == "Bob" - - - test("insertNil"): - var id = rdb.table("user").insertId(%*{ - "name": "Alice", - "email": nil, - "address": "" - }) - .waitFor - var res = rdb.table("user").find(id).waitFor - echo res.get - check res.get["email"] == newJNull() - - res = rdb.table("user").where("email", "is", nil).first().waitFor - echo res.get - check res.get["email"] == newJNull() - - -suite($rdb & " update"): - setup: - setup(rdb) - - test("update"): - rdb.table("user").where("id", "=", 1).update(%*{"name": "Alice"}).waitFor - var t = rdb.table("user").find(1).waitFor().get() - check t["name"].getStr() == "Alice" - - -suite($rdb & " delete"): - setup(rdb) - - test("delete"): - rdb.table("user").delete(1).waitFor - check rdb.table("user").find(1).waitFor.isSome == false - - - test("delete where"): - rdb.table("user").where("name", "=", "user1").delete().waitFor - check rdb.table("user").find(1).waitFor.isSome == false - - -suite($rdb & " rawQuery"): - setup(rdb) - - test("get"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT * FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %*[1]).get().waitFor - echo res - check res[0]["name"].getStr == "user1" - - - test("getPlain"): - let sql = &"SELECT * FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %*[1]).getPlain().waitFor - echo res - check res[0][1] == "user1" - - - test("first"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT * FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %*[1]).first().waitFor().get() - echo res - check res["name"].getStr == "user1" - - - test("firstPlain"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT name FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %*[1]).firstPlain().waitFor() - echo res - check res[0] == "user1" - - - test("exec"): - var sql = "UPDATE \"user\" SET \"name\" = ? WHERE \"id\" = ?" - rdb.raw(sql, %*["updated user1", 1]).exec().waitFor - sql = &"SELECT * FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %[1]).get().waitFor - echo res - check res[0]["name"].getStr == "updated user1" - -setup(rdb) -suite($rdb & " aggregates"): - test("count"): - var t = rdb.table("user").count().waitFor - check t == 10 - - test("max"): - var t = rdb.table("user").max("name").waitFor.get - check t == "user9" - var t2 = rdb.table("user").max("id").waitFor.get - check t2 == "10" - - test("min"): - var t = rdb.table("user").min("name").waitFor.get - check t == "user1" - var t2 = rdb.table("user").min("id").waitFor.get - check t2 == "1" - - test("avg"): - var t = rdb.table("user").avg("id").waitFor.get - check t == 5.5 - - test("sum"): - var t = rdb.table("user").sum("id").waitFor.get - check t == 55.0 - - -suite($rdb & " binary data"): - test("insert binary"): - rdb.create( - table("test", [ - Column.increments("id"), - Column.binary("pic"), - ]) - ) - - let client = newAsyncHttpClient() - let response = client.getContent("https://nim-lang.org/assets/img/twitter_banner.png").waitFor() - let imageStream = newStringStream(response) - let binaryImage = imageStream.readAll() - - let id = rdb.table("test").insertId(%*{"pic": binaryImage}).waitFor() - - var res = rdb.table("test").find(id).waitFor().get() - check res["pic"].getStr().len > 0 - - rdb.table("test").where("id","=", id).update(%*{"pic": binaryImage}).waitFor() - - res = rdb.table("test").find(id).waitFor().get() - check res["pic"].getStr().len > 0 - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/postgres/test_schema.nim b/tests/v1.bk/postgres/test_schema.nim deleted file mode 100644 index d070237d..00000000 --- a/tests/v1.bk/postgres/test_schema.nim +++ /dev/null @@ -1,308 +0,0 @@ -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 = postgres - -suite("PostgreSQL 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: - 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: - 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"] - ) - ) - - -suite("Comment"): - test("column comment"): - rdb.create( - table("Comment", [ - Column.integer("index1").comment("index1 comment"), - Column.string("string").comment("string comment") - ]) - ) - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/postgres/test_transaction.nim b/tests/v1.bk/postgres/test_transaction.nim deleted file mode 100644 index e0e3fcf2..00000000 --- a/tests/v1.bk/postgres/test_transaction.nim +++ /dev/null @@ -1,125 +0,0 @@ -discard """ - cmd: "nim c --mm:orc -d:reset -r $file" -""" - -import std/unittest -import std/json -import std/strformat -import std/strutils -import std/options -import std/asyncdispatch -import ../../../src/allographer/schema_builder -import ../../../src/allographer/query_builder -import ../../connections -import ../../clear_tables - - -let rdb = postgres - -proc setUp(rdb:PostgresConnections) = - rdb.create([ - table("auth",[ - Column.increments("id"), - Column.string("name") - ]), - table("user",[ - Column.increments("id"), - Column.string("name").nullable(), - Column.string("email").nullable(), - Column.string("address").nullable(), - Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL) - ]) - ]) - - # seeder - seeder(rdb, "auth"): - rdb.table("auth").insert(@[ - %*{"name": "admin"}, - %*{"name": "user"} - ]) - .waitFor() - - seeder(rdb, "user"): - var users: seq[JsonNode] - for i in 1..10: - let authId = if i mod 2 == 0: 2 else: 1 - users.add( - %*{ - "name": &"user{i}", - "email": &"user{i}@example.com", - "auth_id": authId - } - ) - - rdb.table("user").insert(users).waitFor() - - -suite("transaction"): - setup: - setUp(rdb) - - suite("raw code"): - test("commit"): - (proc() {.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - block: - rdb.begin().await - try: - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - rdb.commit().await - except: - rdb.rollback().await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "updated" - )().waitFor - - - test("rollback"): - (proc() {.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - block: - rdb.begin().await - try: - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - raise newException(Exception, "") - except: - rdb.rollback().await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - )().waitFor - - suite("transaction template"): - test("commit"): - (proc(){.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - transaction(rdb): - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "updated" - )().waitFor() - - - test("rollback"): - (proc(){.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - transaction(rdb): - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - raise newException(Exception, "") - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - )().waitFor() - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/sqlite/connection.nim b/tests/v1.bk/sqlite/connection.nim deleted file mode 100644 index a353398f..00000000 --- a/tests/v1.bk/sqlite/connection.nim +++ /dev/null @@ -1,8 +0,0 @@ -import std/os -import std/strutils -import ../../../src/allographer/connection - -let maxConnections = getEnv("DB_MAX_CONNECTION").parseInt - -let sqlite* = dbOpen(SQLite3, ":memory:", maxConnections=maxConnections, shouldDisplayLog=false) -# let sqlite* = dbopen(SQLite3, getCurrentDir() / "db.sqlite3" , maxConnections=maxConnections, shouldDisplayLog=true) diff --git a/tests/v1.bk/sqlite/test_query.nim b/tests/v1.bk/sqlite/test_query.nim deleted file mode 100644 index 705f3673..00000000 --- a/tests/v1.bk/sqlite/test_query.nim +++ /dev/null @@ -1,533 +0,0 @@ -discard """ - cmd: "nim c -d:reset -d:ssl -r $file" -""" - -# nim c -d:reset -d:ssl -r tests/v1/sqlite/test_query.nim - - -import std/unittest -import std/asyncdispatch -import std/httpclient -import std/json -import std/options -import std/streams -import std/strformat -import std/strutils -import ../../../src/allographer/schema_builder -import ../../../src/allographer/query_builder -import ../../connections -import ../../clear_tables - - -let rdb = sqlite - -# ============================================================================= -# test -# ============================================================================= - -proc setup(rdb:SqliteConnections) = - rdb.create([ - table("auth",[ - Column.increments("id"), - Column.string("auth") - ]), - table("user",[ - Column.increments("id"), - Column.string("name").nullable(), - Column.string("email").nullable(), - Column.string("address").nullable(), - Column.date("submit_on").nullable(), - Column.datetime("submit_at").nullable(), - Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL).nullable() - ]) - ]) - - # seeder - seeder(rdb, "auth"): - rdb.table("auth").insert(@[ - %*{"auth": "admin"}, - %*{"auth": "user"} - ]) - .waitFor - - seeder(rdb, "user"): - var users: seq[JsonNode] - for i in 1..10: - let authId = if i mod 2 == 0: 2 else: 1 - let month = if i > 9: $i else: &"0{i}" - users.add( - %*{ - "name": &"user{i}", - "email": &"user{i}@example.com", - "auth_id": authId, - "submit_on": &"2020-{month}-01", - "submit_at": &"2020-{month}-01 00:00:00", - } - ) - - rdb.table("user").insert(users).waitFor - - -setup(rdb) - -suite($rdb & " get"): - test("get"): - let t = rdb.table("user").get().waitFor - let expect = %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1} - echo t[0] - echo expect - check t[0] == expect - - - test("getPlain"): - let t = rdb.table("user").getPlain().waitFor - check t[0] == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("first"): - var t = rdb.table("user").where("name", "=", "user1").first().waitFor().get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("firstPlain"): - var t = rdb.table("user").firstPlain().waitFor - check t == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("find"): - var t = rdb.table("user").find(1).waitFor.get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("findString"): - var t = rdb.table("user").find("1").waitFor.get - check t == %*{"id": 1, "name": "user1", "email": "user1@example.com", "address":newJNull(), "submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00", "auth_id": 1} - - - test("findPlain"): - var t = rdb.table("user").findPlain(1).waitFor - check t == @["1", "user1", "user1@example.com", "", "2020-01-01", "2020-01-01 00:00:00", "1"] - - - test("columns"): - let columns = rdb.table("user").columns().waitFor - check columns == @["id", "name", "email", "address", "submit_on", "submit_at", "auth_id"] - - - test("select"): - var t = rdb.select("name", "email").table("user").get().waitFor - check t[0] == %*{"name": "user1", "email": "user1@example.com"} - - - test("selectAs"): - var t = rdb.select("name as user_name", "email").table("user").get().waitFor - check t[0] == %*{"user_name": "user1", "email": "user1@example.com"} - - - test("selectLike"): - var t = rdb.select("email").table("user").where("email", "LIKE", "%10%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - t = rdb.select("email").table("user").where("email", "LIKE", "user10%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - t = rdb.select("email").table("user").where("email", "LIKE", "%10@example.com%").get().waitFor - check t == @[%*{"email":"user10@example.com"}] - - - test("select count"): - var t = rdb.select("COUNT(id) as count").table("user").get().waitFor - check t[0]["count"].getStr() == "10" - - - test("select max"): - var t = rdb.select("MAX(id) as max").table("user").get().waitFor - check t[0]["max"].getStr() == "10" - - - test("where"): - var t = rdb.table("user").where("auth_id", "=", "1").get().waitFor - check t == @[ - %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1}, - %*{"id":3,"name":"user3","email":"user3@example.com","address":newJNull(),"submit_on":"2020-03-01","submit_at":"2020-03-01 00:00:00","auth_id":1}, - %*{"id":5,"name":"user5","email":"user5@example.com","address":newJNull(),"submit_on":"2020-05-01","submit_at":"2020-05-01 00:00:00","auth_id":1}, - %*{"id":7,"name":"user7","email":"user7@example.com","address":newJNull(),"submit_on":"2020-07-01","submit_at":"2020-07-01 00:00:00","auth_id":1}, - %*{"id":9,"name":"user9","email":"user9@example.com","address":newJNull(),"submit_on":"2020-09-01","submit_at":"2020-09-01 00:00:00","auth_id":1} - ] - - - test("orWhere"): - var t = rdb.table("user").where("auth_id", "=", "1").orWhere("name", "=", "user2").get().waitFor - check t == @[ - %*{"id":1,"name":"user1","email":"user1@example.com","address":newJNull(),"submit_on":"2020-01-01","submit_at":"2020-01-01 00:00:00","auth_id":1}, - %*{"id":2,"name":"user2","email":"user2@example.com","address":newJNull(),"submit_on":"2020-02-01","submit_at":"2020-02-01 00:00:00","auth_id":2}, - %*{"id":3,"name":"user3","email":"user3@example.com","address":newJNull(),"submit_on":"2020-03-01","submit_at":"2020-03-01 00:00:00","auth_id":1}, - %*{"id":5,"name":"user5","email":"user5@example.com","address":newJNull(),"submit_on":"2020-05-01","submit_at":"2020-05-01 00:00:00","auth_id":1}, - %*{"id":7,"name":"user7","email":"user7@example.com","address":newJNull(),"submit_on":"2020-07-01","submit_at":"2020-07-01 00:00:00","auth_id":1}, - %*{"id":9,"name":"user9","email":"user9@example.com","address":newJNull(),"submit_on":"2020-09-01","submit_at":"2020-09-01 00:00:00","auth_id":1} - ] - - - test("whereBetween"): - var t = rdb - .select("id", "name") - .table("user") - .where("auth_id", "=", 1) - .whereBetween("id", [6, 9]) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user7" - - - test("whereBetweenString"): - var t = rdb - .table("user") - .whereBetween("submit_at", ["2020-01-01 00:00:00", "2020-01-31 00:00:00"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - t = rdb - .table("user") - .whereBetween("submit_on", ["2020-01-01", "2020-01-31"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - - test("whereNotBetween"): - var t = rdb - .select("id", "name") - .table("user") - .where("auth_id", "=", 1) - .whereNotBetween("id", [1, 4]) - .get() - .waitFor - check t[0]["name"].getStr() == "user5" - - - test("whereNotBetweenString"): - var t = rdb - .table("user") - .whereNotBetween("submit_at", ["2020-2-1 00:00:00", "2020-12-31 00:00:00"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - t = rdb - .table("user") - .whereNotBetween("submit_on", ["2020-2-1", "2020-12-31"]) - .get() - .waitFor - check t[0]["name"].getStr == "user1" - - - test("whereIn"): - var t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereIn("id", @[5, 6, 7]) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user5" - - t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereIn("name", @["user5", "user6", "user7"]) - .get() - .waitFor - check t[0]["name"].getStr() == "user5" - - - test("whereNotIn"): - var t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereNotIn("id", @[5, 6, 7]) - .get() - .waitFor - echo t - check t == @[ - %*{"id":4, "name": "user4"}, - %*{"id":8, "name": "user8"}, - %*{"id":9, "name": "user9"}, - %*{"id":10, "name": "user10"}, - ] - - t = rdb - .select("id", "name") - .table("user") - .whereBetween("id", [4, 10]) - .whereNotIn("name", @["user5", "user6", "user7"]) - .get() - .waitFor - echo t - check t == @[ - %*{"id":4, "name": "user4"}, - %*{"id":8, "name": "user8"}, - %*{"id":9, "name": "user9"}, - %*{"id":10, "name": "user10"}, - ] - - - test("whereNull"): - setUp(rdb) - rdb.table("user").insert(%*{"email": "user11@example.com"}).waitFor - var t = rdb - .select("id", "name", "email") - .table("user") - .whereNull("name") - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 11 - - - test("groupBy"): - var t = rdb - .table("user") - .groupBy("auth_id") - .max("id") - .waitFor() - .get() - echo t - check t == "11" - - - test("having"): - var t = rdb - .select("id", "name") - .table("user") - .groupBy("auth_id") - .groupBy("id") - .having("auth_id", "=", 1) - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 1 - - - test("orderBy"): - var t = rdb.table("user") - .where("auth_id", "is not", nil) - .orderBy("auth_id", Asc) - .orderBy("id", Desc) - .get() - .waitFor - echo t - check t[0]["id"].getInt() == 9 - - - test("join"): - var t = rdb - .select("user.id", "user.name") - .table("user") - .join("auth", "auth.id", "=", "user.auth_id") - .where("auth.id", "=", "2") - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user2" - - - test("leftJoin"): - rdb.table("user").insert(%*{ - "name": "user11" - }) - .waitFor - var t = rdb - .select("user.id", "user.name", "user.auth_id") - .table("user") - .leftJoin("auth", "auth.id", "=", "user.auth_id") - .orderBy("user.id", Desc) - .get() - .waitFor - echo t - check t[0]["name"].getStr() == "user11" - check t[0]["auth_id"] == newJNull() - - - test("resultIsNull"): - check rdb.table("user").find(50).waitFor().isSome == false - check newSeq[JsonNode](0) == rdb.table("user").where("id", "=", 50).get().waitFor - - -suite($rdb & " insert"): - setup: - setup(rdb) - - test("insert row"): - rdb.table("user").insert(%*{"name": "Alice"}).waitFor - let t = rdb.table("user").orderBy("id", Desc).first().waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insert rows"): - rdb.table("user").insert(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - let t = rdb.table("user").orderBy("id", Desc).limit(2).get().waitFor() - check t[0]["name"].getStr() == "Bob" - check t[1]["name"].getStr() == "Alice" - - - test("insertId row"): - var id = rdb.table("user").insertId(%*{"name": "Alice"}).waitFor - echo id - let t = rdb.table("user").find(id).waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insertId rows"): - let ids = rdb.table("user").insertId(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - - var t = rdb.table("user").find(ids[0]).waitFor().get() - check t["name"].getStr == "Alice" - - t = rdb.table("user").find(ids[1]).waitFor().get() - check t["name"].getStr == "Bob" - - - test("insertNil"): - var id = rdb.table("user").insertId(%*{ - "name": "Alice", - "email": nil, - "address": "" - }) - .waitFor - var res = rdb.table("user").find(id).waitFor - echo res.get - check res.get["email"] == newJNull() - - res = rdb.table("user").where("email", "is", nil).first().waitFor - echo res.get - check res.get["email"] == newJNull() - - -suite($rdb & " update"): - setup: - setup(rdb) - - test("update"): - rdb.table("user").where("id", "=", 1).update(%*{"name": "Alice"}).waitFor - var t = rdb.table("user").find(1).waitFor().get() - check t["name"].getStr() == "Alice" - - -suite($rdb & " delete"): - setup(rdb) - - test("delete"): - rdb.table("user").delete(1).waitFor - check rdb.table("user").find(1).waitFor.isSome == false - - - test("delete where"): - rdb.table("user").where("name", "=", "user1").delete().waitFor - check rdb.table("user").find(1).waitFor.isSome == false - - -suite($rdb & " rawQuery"): - setup(rdb) - - test("get"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT * FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %*[1]).get().waitFor - echo res - check res[0]["name"].getStr == "user1" - - - test("getPlain"): - let sql = &"SELECT * FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %*[1]).getPlain().waitFor - echo res - check res[0][1] == "user1" - - - test("first"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT * FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %*[1]).first().waitFor().get() - echo res - check res["name"].getStr == "user1" - - - test("firstPlain"): - echo rdb.table("user").get().waitFor - let sql = &"SELECT name FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %*[1]).firstPlain().waitFor() - echo res - check res[0] == "user1" - - - test("exec"): - var sql = "UPDATE \"user\" SET \"name\" = ? WHERE \"id\" = ?" - rdb.raw(sql, %*["updated user1", 1]).exec().waitFor - sql = &"SELECT * FROM \"user\" WHERE \"id\" = ?" - let res = rdb.raw(sql, %[1]).get().waitFor - echo res - check res[0]["name"].getStr == "updated user1" - - -setup(rdb) -suite($rdb & " aggregates"): - test("count"): - var t = rdb.table("user").count().waitFor - check t == 10 - - test("max"): - var t = rdb.table("user").max("name").waitFor.get - check t == "user9" - var t2 = rdb.table("user").max("id").waitFor.get - check t2 == "10" - - test("min"): - var t = rdb.table("user").min("name").waitFor.get - check t == "user1" - var t2 = rdb.table("user").min("id").waitFor.get - check t2 == "1" - - test("avg"): - var t = rdb.table("user").avg("id").waitFor.get - check t == 5.5 - - test("sum"): - var t = rdb.table("user").sum("id").waitFor.get - check t == 55.0 - - -suite($rdb & " insert binary"): - test("should success"): - rdb.create( - table("test", [ - Column.increments("id"), - Column.binary("pic"), - ]) - ) - - let client = newAsyncHttpClient() - let response = client.getContent("https://nim-lang.org/assets/img/twitter_banner.png").waitFor() - let imageStream = newStringStream(response) - let binaryImage = imageStream.readAll() - - let id = rdb.table("test").insertId(%*{"pic": binaryImage}).waitFor() - - var res = rdb.table("test").find(id).waitFor().get() - check res["pic"].getStr().len > 0 - - rdb.table("test").where("id","=", id).update(%*{"pic": binaryImage}).waitFor() - - res = rdb.table("test").find(id).waitFor().get() - check res["pic"].getStr().len > 0 - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/sqlite/test_schema.nim b/tests/v1.bk/sqlite/test_schema.nim deleted file mode 100644 index 18841421..00000000 --- a/tests/v1.bk/sqlite/test_schema.nim +++ /dev/null @@ -1,298 +0,0 @@ -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: - 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: - 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() diff --git a/tests/v1.bk/sqlite/test_transaction.nim b/tests/v1.bk/sqlite/test_transaction.nim deleted file mode 100644 index 926a3002..00000000 --- a/tests/v1.bk/sqlite/test_transaction.nim +++ /dev/null @@ -1,130 +0,0 @@ -discard """ - cmd: "nim c --mm:orc -d:reset $file" -""" - -# nim c -r -d:reset tests/v1/sqlite/test_transaction.nim - -import std/unittest -import std/json -import std/strformat -import std/strutils -import std/options -import std/asyncdispatch -import ../../../src/allographer/schema_builder -import ../../../src/allographer/query_builder -import ../../connections -import ../../clear_tables - - -let rdb = sqlite - -proc setUp(rdb:SqliteConnections) = - rdb.create([ - table("auth",[ - Column.increments("id"), - Column.string("auth") - ]), - table("user",[ - Column.increments("id"), - Column.string("name").nullable(), - Column.string("email").nullable(), - Column.string("address").nullable(), - Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL) - ]) - ]) - - # seeder - seeder(rdb, "auth"): - rdb.table("auth").insert(@[ - %*{"auth": "admin"}, - %*{"auth": "user"} - ]) - .waitFor() - - seeder(rdb, "user"): - var users: seq[JsonNode] - for i in 1..10: - let authId = if i mod 2 == 0: 2 else: 1 - users.add( - %*{ - "name": &"user{i}", - "email": &"user{i}@example.com", - "auth_id": authId - } - ) - - rdb.table("user").insert(users).waitFor() - - -suite("transaction"): - setup: - setUp(rdb) - - test("raw code commit"): - (proc() {.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - block: - rdb.begin().await - try: - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - rdb.commit().await - except: - rdb.rollback().await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "updated" - )().waitFor - - - test("raw code rollback"): - (proc() {.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - block: - rdb.begin().await - try: - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - raise newException(Exception, "") - except: - rdb.rollback().await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - )().waitFor - - -suite("transaction template"): - setup: - setUp(rdb) - - test("commit"): - (proc(){.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - transaction(rdb): - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "updated" - )().waitFor() - - - test("rollback"): - (proc(){.async.} = - var user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - - transaction(rdb): - rdb.table("user").where("id", "=", 1).update(%*{"name": "updated"}).await - raise newException(Exception, "") - - user1 = rdb.table("user").find(1).await.get() - check user1["name"].getStr() == "user1" - )().waitFor() - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/surrealdb/test_autoincrements.nim b/tests/v1.bk/surrealdb/test_autoincrements.nim deleted file mode 100644 index a39ab6e7..00000000 --- a/tests/v1.bk/surrealdb/test_autoincrements.nim +++ /dev/null @@ -1,95 +0,0 @@ -discard """ - cmd: "nim c -d:reset $file" -""" - -import std/unittest -import std/asyncdispatch -import std/json -import std/options -import std/strformat -import ../../../src/allographer/query_builder -import ../../../src/allographer/schema_builder -import ../../connections -import ../../clear_tables - - -let rdb = surreal - -suite("autoincrements"): - test("sequence table is not exists"): - rdb.raw("REMOVE TABLE _autoincrement_sequences").exec().waitFor() - - var info = rdb.raw("INFO FOR DB").info().waitFor() - check not info[0]["result"]["tb"].contains("_autoincrement_sequences") - - rdb.create( - table("user", [ - Column.increments("index"), - Column.string("name") - ]) - ) - - info = rdb.raw("INFO FOR DB").info().waitFor() - check info[0]["result"]["tb"].contains("_autoincrement_sequences") - - let id = rdb.table("user").insertId(%*{"name": "alice"}).waitFor() - var user = rdb.table("user").find(id).waitFor().get() - check user["name"].getStr == "alice" - check user["index"].getInt == 1 - - rdb.update(id, %*{"name": "updated"}).waitFor() - - user = rdb.table("user").find(id).waitFor().get() - check user["name"].getStr == "updated" - check user["index"].getInt == 1 - - - test("sequence table is exists"): - var info = rdb.raw("INFO FOR DB").info().waitFor() - check info[0]["result"]["tb"].contains("_autoincrement_sequences") - - rdb.create( - table("user", [ - Column.increments("index"), - Column.string("name") - ]) - ) - - let id = rdb.table("user").insertId(%*{"name": "alice"}).waitFor() - var user = rdb.table("user").find(id).waitFor().get() - check user["name"].getStr == "alice" - check user["index"].getInt == 1 - - rdb.update(id, %*{"name": "updated"}).waitFor() - - user = rdb.table("user").find(id).waitFor().get() - check user["name"].getStr == "updated" - check user["index"].getInt == 1 - - - test("cycle"): - rdb.create( - table("user", [ - Column.increments("index"), - Column.string("name") - ]) - ) - - var users: seq[JsonNode] - for i in 1..100: - users.add(%*{"name": &"user{i}"}) - rdb.table("user").insert(users).waitFor() - - var user = rdb.table("user").where("index", "=", 1).first().waitFor().get() - check user["index"].getInt == 1 - - user = rdb.table("user").where("index", "=", 50).first().waitFor().get() - check user["index"].getInt == 50 - - user = rdb.table("user").where("index", "=", 100).first().waitFor().get() - check user["index"].getInt == 100 - - echo rdb.table("user").orderBy("index", Asc).limit(20).get().waitFor() - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/surrealdb/test_query.nim b/tests/v1.bk/surrealdb/test_query.nim deleted file mode 100644 index 8b89f478..00000000 --- a/tests/v1.bk/surrealdb/test_query.nim +++ /dev/null @@ -1,448 +0,0 @@ -discard """ - cmd: "nim c -d:reset $file" -""" - -import std/unittest -import std/asyncdispatch -import std/json -import std/options -import std/strformat -import std/times -import ../../../src/allographer/schema_builder -import ../../../src/allographer/query_builder -import ../../connections -import ../../clear_tables - - -let rdb = surreal - -# ============================================================================= -# test -# ============================================================================= - -proc setup(rdb:SurrealConnections) = - # rdb.raw("REMOVE TABLE auth; REMOVE TABLE user").exec().waitFor - # rdb.raw("DEFINE TABLE auth SCHEMAFULL; DEFINE TABLE user SCHEMAFULL").exec().waitFor - rdb.create([ - table("auth",[ - Column.increments("index"), - Column.string("name") - ]), - table("user",[ - Column.increments("index"), - Column.string("name").nullable(), - Column.string("email").nullable(), - Column.string("address").nullable(), - Column.date("submit_on"), - Column.datetime("submit_at"), - Column.foreign("auth").reference("id").onTable("auth").onDelete(SET_NULL).nullable() - ]) - ]) - - # seeder - var adminId, userId:SurrealId - seeder(rdb, "auth"): - adminId = rdb.table("auth").insertId(%*{"name":"admin"}).waitFor() - userId = rdb.table("auth").insertId(%*{"name":"user"}).waitFor() - - seeder(rdb, "user"): - var users: seq[JsonNode] - for i in 1..10: - let authId = if i mod 2 == 0: userId else: adminId - let month = if i > 9: $i else: &"0{i}" - users.add( - %*{ - "name": &"user{i}", - "email": &"user{i}@example.com", - "auth": authId, - "submit_on": &"2020-{month}-01", - "submit_at": &"2020-{month}-01 00:00:00", - } - ) - - rdb.table("user").insert(users).waitFor() - - -setup(rdb) - -suite($rdb & " get"): - test("get"): - let t = rdb.table("user").orderBy("name", Asc).get().waitFor() - echo t[0] - check t[0]["index"].getInt() == 1 - check t[0]["name"].getStr() == "user1" - check t[0]["email"].getStr() == "user1@example.com" - check t[0]["address"].kind == JNull - check t[0]["submit_on"].getStr().parse("yyyy-MM-dd'T'hh:mm:ss'Z'").format("yyyy-MM-dd") == "2020-01-01" - check t[0]["submit_at"].getStr() == "2020-01-01T00:00:00Z" - - - test("first"): - var t = rdb.table("user").where("name", "=", "user1").orderBy("name", Asc).first().waitFor().get() - check t["index"].getInt() == 1 - check t["name"].getStr() == "user1" - check t["email"].getStr() == "user1@example.com" - check t["address"].kind == JNull - check t["submit_on"].getStr().parse("yyyy-MM-dd'T'hh:mm:ss'Z'").format("yyyy-MM-dd") == "2020-01-01" - check t["submit_at"].getStr() == "2020-01-01T00:00:00Z" - - - test("find"): - var t = rdb.table("user").where("name", "=", "user1").orderBy("name", Asc).first().waitFor().get() - let id = SurrealId.new(t["id"].getStr()) - t = rdb.table("user").find(id).waitFor().get() - check t["index"].getInt() == 1 - check t["name"].getStr() == "user1" - check t["email"].getStr() == "user1@example.com" - check t["address"].kind == JNull - check t["submit_on"].getStr().parse("yyyy-MM-dd'T'hh:mm:ss'Z'").format("yyyy-MM-dd") == "2020-01-01" - check t["submit_at"].getStr() == "2020-01-01T00:00:00Z" - - - test("columns"): - let columns = rdb.table("user").columns().waitFor() - check columns == @["address", "auth", "email", "index", "name", "submit_at", "submit_on"] - - - test("select"): - var t = rdb.select("name", "email").table("user").orderBy("name", Asc).get().waitFor() - check t[0] == %*{"name": "user1", "email": "user1@example.com"} - - - test("selectAs"): - var t = rdb.select("name as user_name", "email").table("user").orderBy("user_name", Asc).get().waitFor() - check t[0] == %*{"user_name": "user1", "email": "user1@example.com"} - - - test("selectLike"): - let users = rdb.table("user").where("email", "CONTAINS", "10").get().waitFor() - check users[0]["email"].getStr() == "user10@example.com" - - var user10 = rdb.raw("SELECT * FROM user WHERE string::startsWith(email, \"user10\")").first().waitFor() - check user10.get()["email"].getStr() == "user10@example.com" - - user10 = rdb.raw("SELECT * FROM user WHERE string::endsWith(email, \"10@example.com\")").first().waitFor() - check user10.get()["email"].getStr() == "user10@example.com" - - - test("select count"): - var t = rdb.raw("SELECT count(`id`) as `count` FROM `user` GROUP ALL").get().waitFor - echo t - check t[0]["count"].getInt() == 10 - - - test("select max"): - var t = rdb.raw("SELECT math::max(`index`) as `max` FROM `user` GROUP ALL").get().waitFor - echo t - check t[0]["max"].getInt() == 10 - - - test("where string"): - let admin = rdb.table("auth").where("name", "=", "admin").first().waitFor().get() - let adminId = SurrealId.new(admin["id"].getStr()) - - var t = rdb.table("user").where("auth", "=", adminId.rawId()).orderBy("index", Asc).get().waitFor() - const ids = [1,3,5,7,9] - for i, row in t: - check row["index"].getInt() == ids[i] - check row["name"].getStr() == &"user{ids[i]}" - check row["email"].getStr() == &"user{ids[i]}@example.com" - check row["address"].kind == JNull - check row["submit_on"].getStr() == &"2020-0{ids[i]}-01T00:00:00Z" - - - test("where int"): - var t = rdb.table("user").where("index", "=", 1).orderBy("index", Asc).first().waitFor().get() - check t["index"].getInt() == 1 - check t["name"].getStr() == "user1" - check t["email"].getStr() == "user1@example.com" - check t["address"].kind == JNull - check t["submit_on"].getStr() == "2020-01-01T00:00:00Z" - - - test("orWhere"): - let admin = rdb.table("auth").where("name", "=", "admin").first().waitFor().get() - let adminId = SurrealId.new(admin["id"].getStr()) - - var t = rdb.table("user").where("auth", "=", adminId).orWhere("name", "=", "user2").orderBy("index", Asc).get().waitFor() - const ids = [1,2,3,5,7,9] - for i, row in t: - check row["index"].getInt() == ids[i] - check row["name"].getStr() == &"user{ids[i]}" - check row["email"].getStr() == &"user{ids[i]}@example.com" - check row["address"].kind == JNull - check row["submit_on"].getStr() == &"2020-0{ids[i]}-01T00:00:00Z" - - - test("whereBetween"): - var t = rdb - .table("user") - .whereBetween("index", [6, 9]) - .orderBy("index", Asc) - .get() - .waitFor() - - const ids = [6,7,8,9] - for i, row in t: - check row["index"].getInt() == ids[i] - check row["name"].getStr() == &"user{ids[i]}" - check row["email"].getStr() == &"user{ids[i]}@example.com" - check row["address"].kind == JNull - check row["submit_on"].getStr() == &"2020-0{ids[i]}-01T00:00:00Z" - - - test("whereNotBetween"): - var t = rdb - .table("user") - .whereNotBetween("index", [2, 6]) - .orderBy("index", Asc) - .get() - .waitFor() - - const ids = [1,7,8,9] - for i, row in t: - check row["index"].getInt() == ids[i] - check row["name"].getStr() == &"user{ids[i]}" - check row["email"].getStr() == &"user{ids[i]}@example.com" - check row["address"].kind == JNull - check row["submit_on"].getStr() == &"2020-0{ids[i]}-01T00:00:00Z" - - - test("whereIn"): - var t = rdb - .table("user") - .whereIn("index", @[5, 6, 7]) - .orderBy("index", Asc) - .get() - .waitFor() - - const ids = [5,6,7] - for i, row in t: - check row["index"].getInt() == ids[i] - check row["name"].getStr() == &"user{ids[i]}" - check row["email"].getStr() == &"user{ids[i]}@example.com" - check row["address"].kind == JNull - check row["submit_on"].getStr() == &"2020-0{ids[i]}-01T00:00:00Z" - - - test("whereNotIn"): - var t = rdb - .table("user") - .whereNotIn("index", @[4, 5, 6, 7, 10]) - .orderBy("index", Asc) - .get() - .waitFor() - - const ids = [1,2,3,8,9] - for i, row in t: - check row["index"].getInt() == ids[i] - check row["name"].getStr() == &"user{ids[i]}" - check row["email"].getStr() == &"user{ids[i]}@example.com" - check row["address"].kind == JNull - check row["submit_on"].getStr() == &"2020-0{ids[i]}-01T00:00:00Z" - - - test("whereNull"): - rdb.table("user").insert(%*{"email": "user11@example.com"}).waitFor() - var t = rdb - .table("user") - .whereNull("name") - .first() - .waitFor() - check t.get()["index"].getInt() == 11 - - setUp(rdb) - - # TODO: not work - # test("groupBy"): - # var t = rdb - # .select("auth.name") - # .table("user") - # .groupBy("auth.name") - # .get() - # .waitFor() - # echo t - - - test("orderBy"): - var res = rdb.table("user").orderBy("name", Asc).get().waitFor() - check res[0]["name"].getStr() == "user1" - - res = rdb.table("user").orderBy("name", Desc).get().waitFor() - check res[0]["name"].getStr() == "user9" - - res = rdb.table("user").orderBy("index", Numeric, Asc).get().waitFor() - check res[0]["name"].getStr() == "user1" - - res = rdb.table("user").orderBy("index", Numeric, Desc).get().waitFor() - check res[0]["name"].getStr() == "user10" - - res = rdb.table("user").orderBy("name", Collate, Asc).get().waitFor() - check res[0]["name"].getStr() == "user1" - - res = rdb.table("user").orderBy("name", Collate, Desc).get().waitFor() - check res[0]["name"].getStr() == "user9" - - - test("fetch"): - var res = rdb.table("user").where("name", "=", "user1").fetch("auth").first().waitFor().get() - check res["auth"]["name"].getStr() == "admin" - res = rdb.table("user").where("name", "=", "user2").fetch("auth").first().waitFor().get() - check res["auth"]["name"].getStr() == "user" - - - test("resultIsNull"): - check rdb.table("user").where("id", "=", 50).first().waitFor().isSome() == false - check newSeq[JsonNode](0) == rdb.table("user").where("id", "=", 50).get().waitFor() - - -suite($rdb & " insert"): - setup: - setup(rdb) - - test("insert row"): - rdb.table("user").insert(%*{"name": "Alice"}).waitFor - let t = rdb.table("user").orderBy("index", Desc).first().waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insert rows"): - rdb.table("user").insert(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - let t = rdb.table("user").orderBy("index", Desc).limit(2).get().waitFor() - check t[0]["name"].getStr() == "Bob" - check t[1]["name"].getStr() == "Alice" - - - test("insertId row"): - var id = rdb.table("user").insertId(%*{"name": "Alice"}).waitFor - echo id - let t = rdb.table("user").find(id).waitFor().get() - check t["name"].getStr() == "Alice" - - - test("insertId rows"): - let ids = rdb.table("user").insertId(@[ - %*{"name": "Alice"}, - %*{"name": "Bob"}, - ]).waitFor - - var t = rdb.table("user").find(ids[0]).waitFor().get() - check t["name"].getStr == "Alice" - - t = rdb.table("user").find(ids[1]).waitFor().get() - check t["name"].getStr == "Bob" - - - test("insertNil"): - var id = rdb.table("user").insertId(%*{ - "name": "Alice", - "email": nil, - "address": "" - }) - .waitFor - - var res = rdb.table("user").find(id).waitFor - check res.get["email"] == newJNull() - - res = rdb.table("user").where("email", "is", nil).first().waitFor - check res.get["email"] == newJNull() - - -suite($rdb & " update"): - setup: - setup(rdb) - - - test("update"): - var user1 = rdb.table("user").where("index", "=", 1).first().waitFor().get() - let user1Id = SurrealId.new(user1["id"].getStr()) - rdb.table("user").where("id", "=", user1Id).update(%*{"name": "Alice"}).waitFor() - user1 = rdb.table("user").find(user1Id).waitFor().get() - check user1["name"].getStr() == "Alice" - - - test("update merge"): - var user1 = rdb.table("user").where("index", "=", 1).first().waitFor().get() - let user1Id = SurrealId.new(user1["id"].getStr()) - rdb.update(user1Id, %*{"name": "updated"}).waitFor() - user1 = rdb.table("user").find(user1Id).waitFor().get() - check user1["name"].getStr() == "updated" - - -suite($rdb & " delete"): - setup: - setup(rdb) - - test("delete"): - let user1 = rdb.table("user").where("index", "=", 1).first().waitFor().get() - let user1Id = SurrealId.new(user1["id"].getStr()) - rdb.table("user").where("name", "=", "user1").delete().waitFor() - check rdb.table("user").find(user1Id).waitFor().isSome() == false - - test("delete id"): - let user1 = rdb.table("user").where("index", "=", 1).first().waitFor().get() - let user1Id = SurrealId.new(user1["id"].getStr()) - rdb.table("user").delete(user1Id).waitFor - check rdb.table("user").find(user1Id).waitFor().isSome() == false - - -suite($rdb & " rawQuery"): - setup(rdb) - - test("get"): - let sql = &"SELECT * FROM `user` WHERE `index` = ?" - let res = rdb.raw(sql, %*[1]).get().waitFor - check res[0]["name"].getStr == "user1" - - - test("first"): - let sql = &"SELECT * FROM `user` WHERE `index` = ?" - let res = rdb.raw(sql, %*[1]).first().waitFor().get() - check res["name"].getStr() == "user1" - - - test("exec"): - var sql = "SELECT * FROM `user` WHERE `index` = ?" - let user1 = rdb.raw(sql, %*[1]).first().waitFor().get() - let user1Id = SurrealId.new(user1["id"].getStr()) - - sql = "UPDATE `user` SET `name` = ? WHERE `id` = ?" - rdb.raw(sql, %*["updated", user1Id.rawId()]).exec().waitFor - - sql = &"SELECT * FROM `user` WHERE `id` = ?" - let res = rdb.raw(sql, %[user1Id.rawId()]).get().waitFor - check res[0]["name"].getStr == "updated" - - -setup(rdb) -suite($rdb & " aggregates"): - - test("count"): - var t = rdb.table("user").count().waitFor() - check t == 10 - - test("max"): - var t = rdb.table("user").max("name", Collate).waitFor() - check t == "user9" - var t2 = rdb.table("user").max("index", Numeric).waitFor() - check t2 == "10" - - test("min"): - var t = rdb.table("user").min("name", Collate).waitFor() - check t == "user1" - var t2 = rdb.table("user").min("index", Numeric).waitFor() - check t2 == "1" - - test("avg"): - let t = rdb.table("user").avg("index").waitFor() - check t == 5.5 - - test("sum"): - let t = rdb.table("user").sum("index").waitFor() - check t == 55.0 - - -clearTables(rdb).waitFor() diff --git a/tests/v1.bk/surrealdb/test_schema.nim b/tests/v1.bk/surrealdb/test_schema.nim deleted file mode 100644 index cc1599a2..00000000 --- a/tests/v1.bk/surrealdb/test_schema.nim +++ /dev/null @@ -1,488 +0,0 @@ -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 = surreal - -suite("SurrealDB create table"): - test("create table"): - rdb.create( - table("relation", [ - Column.uuid("uuid").unique(), - ]), - table("TypeIndex", [ - Column.increments("index"), - 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", 256).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("datetime1").index().default(Current), - Column.datetime("datetime2").index().default(CurrentOnUpdate), - 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("relation").reference("id").onTable("relation").onDelete(SET_NULL).nullable(), - ]), - table("TypeUnique", [ - Column.increments("index"), - Column.integer("integer").unsigned().index().unique().unique().default(1), - Column.smallInteger("smallInteger").unsigned().index().unique().unique().default(1), - Column.mediumInteger("mediumInteger").unsigned().index().unique().unique().default(1), - Column.bigInteger("bigInteger").unsigned().index().unique().unique().default(1), - Column.decimal("decimal", 10, 3).unsigned().index().unique().unique().default(1.1), - Column.double("double", 10, 3).unsigned().index().unique().unique().default(1.1), - Column.float("float").unsigned().index().unique().unique().default(1.1), - Column.uuid("uuid").index().unique().unique().default("A"), - Column.char("char", 256).index().unique().unique().default("A"), - Column.string("string").index().unique().unique().default("A"), - Column.text("text").index().unique().unique().default("A"), - Column.mediumText("mediumText").index().unique().unique().default("A"), - Column.longText("longText").index().unique().unique().default("A"), - Column.date("date").index().unique().unique().default(), - Column.datetime("datetime1").index().unique().unique().default(Current), - Column.datetime("datetime2").index().unique().unique().default(CurrentOnUpdate), - Column.timestamp("timestamp").index().unique().unique().default(), - Column.timestamps(), - Column.softDelete(), - Column.binary("binary").index().unique().unique().default("A"), - Column.boolean("boolean").index().unique().unique().default(true), - Column.enumField("enumField", ["A", "B", "C"]).index().unique().default("A"), - Column.json("json").index().unique().default(%*{"key":"value"}), - Column.foreign("relation").reference("id").onTable("relation").onDelete(SET_NULL).nullable(), - ]), - ) - - block: - let info = rdb.raw(""" INFO FOR TABLE TypeIndex """).info().waitFor() - let fields = info[0]["result"]["fd"] - check fields["index"].getStr == "DEFINE FIELD index ON TypeIndex TYPE int" - check fields["integer"].getStr == "DEFINE FIELD integer ON TypeIndex TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["smallInteger"].getStr == "DEFINE FIELD smallInteger ON TypeIndex TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["mediumInteger"].getStr == "DEFINE FIELD mediumInteger ON TypeIndex TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["bigInteger"].getStr == "DEFINE FIELD bigInteger ON TypeIndex TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["decimal"].getStr == "DEFINE FIELD decimal ON TypeIndex TYPE decimal VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["double"].getStr == "DEFINE FIELD double ON TypeIndex TYPE decimal VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["float"].getStr == "DEFINE FIELD float ON TypeIndex TYPE float VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["uuid"].getStr == "DEFINE FIELD uuid ON TypeIndex TYPE string VALUE $value OR rand::uuid() ASSERT $value != NONE" - check fields["char"].getStr == "DEFINE FIELD char ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT string::len($value) < 256 AND $value != NONE" - check fields["string"].getStr == "DEFINE FIELD string ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT string::len($value) < 256 AND $value != NONE" - check fields["text"].getStr == "DEFINE FIELD text ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["mediumText"].getStr == "DEFINE FIELD mediumText ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["longText"].getStr == "DEFINE FIELD longText ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["date"].getStr == "DEFINE FIELD date ON TypeIndex TYPE datetime VALUE $value OR '1970-01-01T00:00:00Z' ASSERT $value != NONE" - check fields["datetime1"].getStr == "DEFINE FIELD datetime1 ON TypeIndex TYPE datetime VALUE $value OR time::now() ASSERT $value != NONE" - check fields["datetime2"].getStr == "DEFINE FIELD datetime2 ON TypeIndex TYPE datetime VALUE time::now() ASSERT $value != NONE" - check fields["timestamp"].getStr == "DEFINE FIELD timestamp ON TypeIndex TYPE datetime VALUE $value OR '1970-01-01T00:00:00Z' ASSERT $value != NONE" - check fields["created_at"].getStr == "DEFINE FIELD created_at ON TypeIndex TYPE datetime VALUE $value OR time::now()" - check fields["updated_at"].getStr == "DEFINE FIELD updated_at ON TypeIndex TYPE datetime VALUE time::now()" - check fields["deleted_at"].getStr == "DEFINE FIELD deleted_at ON TypeIndex TYPE datetime" - check fields["binary"].getStr == "DEFINE FIELD binary ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["boolean"].getStr == "DEFINE FIELD boolean ON TypeIndex TYPE bool VALUE $value OR true ASSERT $value != NONE" - check fields["enumField"].getStr == "DEFINE FIELD enumField ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value INSIDE ['A', 'B', 'C'] AND $value != NONE" - check fields["json"].getStr == "DEFINE FIELD json ON TypeIndex FLEXIBLE TYPE object VALUE $value OR { key: 'value' } ASSERT $value != NONE" - check fields["relation"].getStr == "DEFINE FIELD relation ON TypeIndex TYPE record(relation) VALUE $value OR NULL" - - let indexs = info[0]["result"]["ix"] - check indexs["TypeIndex_integer_index"].getStr == "DEFINE INDEX TypeIndex_integer_index ON TypeIndex FIELDS integer" - check indexs["TypeIndex_smallInteger_index"].getStr == "DEFINE INDEX TypeIndex_smallInteger_index ON TypeIndex FIELDS smallInteger" - check indexs["TypeIndex_mediumInteger_index"].getStr == "DEFINE INDEX TypeIndex_mediumInteger_index ON TypeIndex FIELDS mediumInteger" - check indexs["TypeIndex_bigInteger_index"].getStr == "DEFINE INDEX TypeIndex_bigInteger_index ON TypeIndex FIELDS bigInteger" - check indexs["TypeIndex_decimal_index"].getStr == "DEFINE INDEX TypeIndex_decimal_index ON TypeIndex FIELDS decimal" - check indexs["TypeIndex_double_index"].getStr == "DEFINE INDEX TypeIndex_double_index ON TypeIndex FIELDS double" - check indexs["TypeIndex_float_index"].getStr == "DEFINE INDEX TypeIndex_float_index ON TypeIndex FIELDS float" - check indexs["TypeIndex_uuid_unique"].getStr == "DEFINE INDEX TypeIndex_uuid_unique ON TypeIndex FIELDS uuid UNIQUE" - check indexs["TypeIndex_char_index"].getStr == "DEFINE INDEX TypeIndex_char_index ON TypeIndex FIELDS char" - check indexs["TypeIndex_string_index"].getStr == "DEFINE INDEX TypeIndex_string_index ON TypeIndex FIELDS string" - check indexs["TypeIndex_text_index"].getStr == "DEFINE INDEX TypeIndex_text_index ON TypeIndex FIELDS text" - check indexs["TypeIndex_mediumText_index"].getStr == "DEFINE INDEX TypeIndex_mediumText_index ON TypeIndex FIELDS mediumText" - check indexs["TypeIndex_longText_index"].getStr == "DEFINE INDEX TypeIndex_longText_index ON TypeIndex FIELDS longText" - check indexs["TypeIndex_date_index"].getStr == "DEFINE INDEX TypeIndex_date_index ON TypeIndex FIELDS date" - check indexs["TypeIndex_datetime1_index"].getStr == "DEFINE INDEX TypeIndex_datetime1_index ON TypeIndex FIELDS datetime1" - check indexs["TypeIndex_datetime2_index"].getStr == "DEFINE INDEX TypeIndex_datetime2_index ON TypeIndex FIELDS datetime2" - check indexs["TypeIndex_timestamp_index"].getStr == "DEFINE INDEX TypeIndex_timestamp_index ON TypeIndex FIELDS timestamp" - check indexs["TypeIndex_created_at_index"].getStr == "DEFINE INDEX TypeIndex_created_at_index ON TypeIndex FIELDS created_at" - check indexs["TypeIndex_updated_at_index"].getStr == "DEFINE INDEX TypeIndex_updated_at_index ON TypeIndex FIELDS updated_at" - check indexs["TypeIndex_deleted_at_index"].getStr == "DEFINE INDEX TypeIndex_deleted_at_index ON TypeIndex FIELDS deleted_at" - check indexs["TypeIndex_binary_index"].getStr == "DEFINE INDEX TypeIndex_binary_index ON TypeIndex FIELDS binary" - check indexs["TypeIndex_boolean_index"].getStr == "DEFINE INDEX TypeIndex_boolean_index ON TypeIndex FIELDS boolean" - check indexs["TypeIndex_enumField_index"].getStr == "DEFINE INDEX TypeIndex_enumField_index ON TypeIndex FIELDS enumField" - check indexs["TypeIndex_json_index"].getStr == "DEFINE INDEX TypeIndex_json_index ON TypeIndex FIELDS json" - - block: - let info = rdb.raw(""" INFO FOR TABLE TypeUnique """).info().waitFor() - let fields = info[0]["result"]["fd"] - check fields["index"].getStr == "DEFINE FIELD index ON TypeUnique TYPE int" - check fields["integer"].getStr == "DEFINE FIELD integer ON TypeUnique TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["smallInteger"].getStr == "DEFINE FIELD smallInteger ON TypeUnique TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["mediumInteger"].getStr == "DEFINE FIELD mediumInteger ON TypeUnique TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["bigInteger"].getStr == "DEFINE FIELD bigInteger ON TypeUnique TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["decimal"].getStr == "DEFINE FIELD decimal ON TypeUnique TYPE decimal VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["double"].getStr == "DEFINE FIELD double ON TypeUnique TYPE decimal VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["float"].getStr == "DEFINE FIELD float ON TypeUnique TYPE float VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["uuid"].getStr == "DEFINE FIELD uuid ON TypeUnique TYPE string VALUE $value OR rand::uuid() ASSERT $value != NONE" - check fields["char"].getStr == "DEFINE FIELD char ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT string::len($value) < 256 AND $value != NONE" - check fields["string"].getStr == "DEFINE FIELD string ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT string::len($value) < 256 AND $value != NONE" - check fields["text"].getStr == "DEFINE FIELD text ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["mediumText"].getStr == "DEFINE FIELD mediumText ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["longText"].getStr == "DEFINE FIELD longText ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["date"].getStr == "DEFINE FIELD date ON TypeUnique TYPE datetime VALUE $value OR '1970-01-01T00:00:00Z' ASSERT $value != NONE" - check fields["datetime1"].getStr == "DEFINE FIELD datetime1 ON TypeUnique TYPE datetime VALUE $value OR time::now() ASSERT $value != NONE" - check fields["datetime2"].getStr == "DEFINE FIELD datetime2 ON TypeUnique TYPE datetime VALUE time::now() ASSERT $value != NONE" - check fields["timestamp"].getStr == "DEFINE FIELD timestamp ON TypeUnique TYPE datetime VALUE $value OR '1970-01-01T00:00:00Z' ASSERT $value != NONE" - check fields["created_at"].getStr == "DEFINE FIELD created_at ON TypeUnique TYPE datetime VALUE $value OR time::now()" - check fields["updated_at"].getStr == "DEFINE FIELD updated_at ON TypeUnique TYPE datetime VALUE time::now()" - check fields["deleted_at"].getStr == "DEFINE FIELD deleted_at ON TypeUnique TYPE datetime" - check fields["binary"].getStr == "DEFINE FIELD binary ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["boolean"].getStr == "DEFINE FIELD boolean ON TypeUnique TYPE bool VALUE $value OR true ASSERT $value != NONE" - check fields["enumField"].getStr == "DEFINE FIELD enumField ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value INSIDE ['A', 'B', 'C'] AND $value != NONE" - check fields["json"].getStr == "DEFINE FIELD json ON TypeUnique FLEXIBLE TYPE object VALUE $value OR { key: 'value' } ASSERT $value != NONE" - check fields["relation"].getStr == "DEFINE FIELD relation ON TypeUnique TYPE record(relation) VALUE $value OR NULL" - - let indexs = info[0]["result"]["ix"] - check indexs["TypeUnique_integer_unique"].getStr == "DEFINE INDEX TypeUnique_integer_unique ON TypeUnique FIELDS integer UNIQUE" - check indexs["TypeUnique_smallInteger_unique"].getStr == "DEFINE INDEX TypeUnique_smallInteger_unique ON TypeUnique FIELDS smallInteger UNIQUE" - check indexs["TypeUnique_mediumInteger_unique"].getStr == "DEFINE INDEX TypeUnique_mediumInteger_unique ON TypeUnique FIELDS mediumInteger UNIQUE" - check indexs["TypeUnique_bigInteger_unique"].getStr == "DEFINE INDEX TypeUnique_bigInteger_unique ON TypeUnique FIELDS bigInteger UNIQUE" - check indexs["TypeUnique_decimal_unique"].getStr == "DEFINE INDEX TypeUnique_decimal_unique ON TypeUnique FIELDS decimal UNIQUE" - check indexs["TypeUnique_double_unique"].getStr == "DEFINE INDEX TypeUnique_double_unique ON TypeUnique FIELDS double UNIQUE" - check indexs["TypeUnique_float_unique"].getStr == "DEFINE INDEX TypeUnique_float_unique ON TypeUnique FIELDS float UNIQUE" - check indexs["TypeUnique_uuid_unique"].getStr == "DEFINE INDEX TypeUnique_uuid_unique ON TypeUnique FIELDS uuid UNIQUE" - check indexs["TypeUnique_char_unique"].getStr == "DEFINE INDEX TypeUnique_char_unique ON TypeUnique FIELDS char UNIQUE" - check indexs["TypeUnique_string_unique"].getStr == "DEFINE INDEX TypeUnique_string_unique ON TypeUnique FIELDS string UNIQUE" - check indexs["TypeUnique_text_unique"].getStr == "DEFINE INDEX TypeUnique_text_unique ON TypeUnique FIELDS text UNIQUE" - check indexs["TypeUnique_mediumText_unique"].getStr == "DEFINE INDEX TypeUnique_mediumText_unique ON TypeUnique FIELDS mediumText UNIQUE" - check indexs["TypeUnique_longText_unique"].getStr == "DEFINE INDEX TypeUnique_longText_unique ON TypeUnique FIELDS longText UNIQUE" - check indexs["TypeUnique_date_unique"].getStr == "DEFINE INDEX TypeUnique_date_unique ON TypeUnique FIELDS date UNIQUE" - check indexs["TypeUnique_datetime1_unique"].getStr == "DEFINE INDEX TypeUnique_datetime1_unique ON TypeUnique FIELDS datetime1 UNIQUE" - check indexs["TypeUnique_datetime2_unique"].getStr == "DEFINE INDEX TypeUnique_datetime2_unique ON TypeUnique FIELDS datetime2 UNIQUE" - check indexs["TypeUnique_timestamp_unique"].getStr == "DEFINE INDEX TypeUnique_timestamp_unique ON TypeUnique FIELDS timestamp UNIQUE" - check indexs["TypeUnique_created_at_index"].getStr == "DEFINE INDEX TypeUnique_created_at_index ON TypeUnique FIELDS created_at" - check indexs["TypeUnique_updated_at_index"].getStr == "DEFINE INDEX TypeUnique_updated_at_index ON TypeUnique FIELDS updated_at" - check indexs["TypeUnique_deleted_at_index"].getStr == "DEFINE INDEX TypeUnique_deleted_at_index ON TypeUnique FIELDS deleted_at" - check indexs["TypeUnique_binary_unique"].getStr == "DEFINE INDEX TypeUnique_binary_unique ON TypeUnique FIELDS binary UNIQUE" - check indexs["TypeUnique_boolean_unique"].getStr == "DEFINE INDEX TypeUnique_boolean_unique ON TypeUnique FIELDS boolean UNIQUE" - check indexs["TypeUnique_enumField_unique"].getStr == "DEFINE INDEX TypeUnique_enumField_unique ON TypeUnique FIELDS enumField UNIQUE" - check indexs["TypeUnique_json_unique"].getStr == "DEFINE INDEX TypeUnique_json_unique ON TypeUnique FIELDS json UNIQUE" - - - test("autoincrement"): - rdb.create( - table("test",[ - Column.increments("index"), - Column.integer("index2").autoIncrement(), - Column.string("string") - ]) - ) - - rdb.table("test").insert(%*{"string": "a"}).waitFor - rdb.table("test").insert(%*{"string": "b"}).waitFor - rdb.table("test").insert(%*{"string": "c"}).waitFor - rdb.table("test").where("string", "=", "b").delete().waitFor - rdb.table("test").insert(%*{"string": "d"}).waitFor - - let data = rdb.table("test").orderBy("index", Asc).get().waitFor - for row in data: - if row["string"].getStr == "a": - check row["index"].getInt == 1 - check row["index2"].getInt == 1 - - if row["string"].getStr == "c": - check row["index"].getInt == 3 - check row["index2"].getInt == 3 - - if row["string"].getStr == "d": - check row["index2"].getInt == 4 - - - suite("Datetime"): - test("datetime default"): - rdb.create( - table("test", [ - Column.string("name"), - Column.datetime("created_at").default(Current), - Column.datetime("updated_at").default(CurrentOnUpdate), - ]) - ) - - let aliceId = rdb.table("test").insertId(%*{"name": "alice"}).waitFor() - - var alice = rdb.table("test").find(aliceId).waitFor().get() - echo alice - let aliceCreatedAt1 = alice["created_at"].getStr() - let aliceUpdatedAt1 = alice["updated_at"].getStr() - - rdb.table("test").where("id", "=", aliceId).update(%*{"name": "updated"}).waitFor() - - alice = rdb.table("test").find(aliceId).waitFor().get() - echo alice - let aliceCreatedAt2 = alice["created_at"].getStr() - let aliceUpdatedAt2 = alice["updated_at"].getStr() - - check aliceCreatedAt1 == aliceCreatedAt2 - check aliceUpdatedAt1 != aliceUpdatedAt2 - - - test("timestamps"): - rdb.create( - table("test", [ - Column.string("name"), - Column.timestamps() - ]) - ) - - let aliceId = rdb.table("test").insertId(%*{"name": "alice"}).waitFor() - - var alice = rdb.table("test").find(aliceId).waitFor().get() - let aliceCreatedAt1 = alice["created_at"].getStr() - let aliceUpdatedAt1 = alice["updated_at"].getStr() - - rdb.table("test").where("id", "=", aliceId).update(%*{"name": "updated"}).waitFor() - - alice = rdb.table("test").find(aliceId).waitFor().get() - let aliceCreatedAt2 = alice["created_at"].getStr() - let aliceUpdatedAt2 = alice["updated_at"].getStr() - - check aliceCreatedAt1 == aliceCreatedAt2 - check aliceUpdatedAt1 != aliceUpdatedAt2 - - - -suite("SurrealDB alter table"): - setup: - rdb.create( - table("relation", [ - Column.uuid("uuid").unique(), - ]), - table("TypeUnique", [ - Column.integer("num"), - Column.string("str"), - ]), - table("TypeIndex", [ - Column.integer("num"), - Column.string("str"), - ]) - ) - - - test("add column"): - rdb.alter( - table("TypeIndex", [ - Column.increments("index").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", 256).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("datetime1").index().default(Current).add(), - Column.datetime("datetime2").index().default(CurrentOnUpdate).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("relation").reference("id").onTable("relation").onDelete(SET_NULL).nullable().add(), - ]), - table("TypeUnique", [ - Column.increments("index").add(), - Column.integer("integer").unsigned().index().unique().unique().default(1).add(), - Column.smallInteger("smallInteger").unsigned().index().unique().unique().default(1).add(), - Column.mediumInteger("mediumInteger").unsigned().index().unique().unique().default(1).add(), - Column.bigInteger("bigInteger").unsigned().index().unique().unique().default(1).add(), - Column.decimal("decimal", 10, 3).unsigned().index().unique().unique().default(1.1).add(), - Column.double("double", 10, 3).unsigned().index().unique().unique().default(1.1).add(), - Column.float("float").unsigned().index().unique().unique().default(1.1).add(), - Column.uuid("uuid").index().unique().unique().default("A").add(), - Column.char("char", 256).index().unique().unique().default("A").add(), - Column.string("string").index().unique().unique().default("A").add(), - Column.text("text").index().unique().unique().default("A").add(), - Column.mediumText("mediumText").index().unique().unique().default("A").add(), - Column.longText("longText").index().unique().unique().default("A").add(), - Column.date("date").index().unique().unique().default().add(), - Column.datetime("datetime1").index().unique().unique().default(Current).add(), - Column.datetime("datetime2").index().unique().unique().default(CurrentOnUpdate).add(), - Column.timestamp("timestamp").index().unique().unique().default().add(), - Column.timestamps().add(), - Column.softDelete().add(), - Column.binary("binary").index().unique().unique().default("A").add(), - Column.boolean("boolean").index().unique().unique().default(true).add(), - Column.enumField("enumField", ["A", "B", "C"]).index().unique().default("A").add(), - Column.json("json").index().unique().default(%*{"key":"value"}).add(), - Column.foreign("relation").reference("id").onTable("relation").onDelete(SET_NULL).nullable().add(), - ]), - ) - - block: - let info = rdb.raw(""" INFO FOR TABLE TypeIndex """).info().waitFor() - let fields = info[0]["result"]["fd"] - check fields["index"].getStr == "DEFINE FIELD index ON TypeIndex TYPE int" - check fields["integer"].getStr == "DEFINE FIELD integer ON TypeIndex TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["smallInteger"].getStr == "DEFINE FIELD smallInteger ON TypeIndex TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["mediumInteger"].getStr == "DEFINE FIELD mediumInteger ON TypeIndex TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["bigInteger"].getStr == "DEFINE FIELD bigInteger ON TypeIndex TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["decimal"].getStr == "DEFINE FIELD decimal ON TypeIndex TYPE decimal VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["double"].getStr == "DEFINE FIELD double ON TypeIndex TYPE decimal VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["float"].getStr == "DEFINE FIELD float ON TypeIndex TYPE float VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["uuid"].getStr == "DEFINE FIELD uuid ON TypeIndex TYPE string VALUE $value OR rand::uuid() ASSERT $value != NONE" - check fields["char"].getStr == "DEFINE FIELD char ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT string::len($value) < 256 AND $value != NONE" - check fields["string"].getStr == "DEFINE FIELD string ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT string::len($value) < 256 AND $value != NONE" - check fields["text"].getStr == "DEFINE FIELD text ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["mediumText"].getStr == "DEFINE FIELD mediumText ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["longText"].getStr == "DEFINE FIELD longText ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["date"].getStr == "DEFINE FIELD date ON TypeIndex TYPE datetime VALUE $value OR '1970-01-01T00:00:00Z' ASSERT $value != NONE" - check fields["datetime1"].getStr == "DEFINE FIELD datetime1 ON TypeIndex TYPE datetime VALUE $value OR time::now() ASSERT $value != NONE" - check fields["datetime2"].getStr == "DEFINE FIELD datetime2 ON TypeIndex TYPE datetime VALUE time::now() ASSERT $value != NONE" - check fields["timestamp"].getStr == "DEFINE FIELD timestamp ON TypeIndex TYPE datetime VALUE $value OR '1970-01-01T00:00:00Z' ASSERT $value != NONE" - check fields["created_at"].getStr == "DEFINE FIELD created_at ON TypeIndex TYPE datetime VALUE $value OR time::now()" - check fields["updated_at"].getStr == "DEFINE FIELD updated_at ON TypeIndex TYPE datetime VALUE time::now()" - check fields["deleted_at"].getStr == "DEFINE FIELD deleted_at ON TypeIndex TYPE datetime" - check fields["binary"].getStr == "DEFINE FIELD binary ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["boolean"].getStr == "DEFINE FIELD boolean ON TypeIndex TYPE bool VALUE $value OR true ASSERT $value != NONE" - check fields["enumField"].getStr == "DEFINE FIELD enumField ON TypeIndex TYPE string VALUE $value OR 'A' ASSERT $value INSIDE ['A', 'B', 'C'] AND $value != NONE" - check fields["json"].getStr == "DEFINE FIELD json ON TypeIndex FLEXIBLE TYPE object VALUE $value OR { key: 'value' } ASSERT $value != NONE" - check fields["relation"].getStr == "DEFINE FIELD relation ON TypeIndex TYPE record(relation) VALUE $value OR NULL" - - let indexs = info[0]["result"]["ix"] - check indexs["TypeIndex_integer_index"].getStr == "DEFINE INDEX TypeIndex_integer_index ON TypeIndex FIELDS integer" - check indexs["TypeIndex_smallInteger_index"].getStr == "DEFINE INDEX TypeIndex_smallInteger_index ON TypeIndex FIELDS smallInteger" - check indexs["TypeIndex_mediumInteger_index"].getStr == "DEFINE INDEX TypeIndex_mediumInteger_index ON TypeIndex FIELDS mediumInteger" - check indexs["TypeIndex_bigInteger_index"].getStr == "DEFINE INDEX TypeIndex_bigInteger_index ON TypeIndex FIELDS bigInteger" - check indexs["TypeIndex_decimal_index"].getStr == "DEFINE INDEX TypeIndex_decimal_index ON TypeIndex FIELDS decimal" - check indexs["TypeIndex_double_index"].getStr == "DEFINE INDEX TypeIndex_double_index ON TypeIndex FIELDS double" - check indexs["TypeIndex_float_index"].getStr == "DEFINE INDEX TypeIndex_float_index ON TypeIndex FIELDS float" - check indexs["TypeIndex_uuid_unique"].getStr == "DEFINE INDEX TypeIndex_uuid_unique ON TypeIndex FIELDS uuid UNIQUE" - check indexs["TypeIndex_char_index"].getStr == "DEFINE INDEX TypeIndex_char_index ON TypeIndex FIELDS char" - check indexs["TypeIndex_string_index"].getStr == "DEFINE INDEX TypeIndex_string_index ON TypeIndex FIELDS string" - check indexs["TypeIndex_text_index"].getStr == "DEFINE INDEX TypeIndex_text_index ON TypeIndex FIELDS text" - check indexs["TypeIndex_mediumText_index"].getStr == "DEFINE INDEX TypeIndex_mediumText_index ON TypeIndex FIELDS mediumText" - check indexs["TypeIndex_longText_index"].getStr == "DEFINE INDEX TypeIndex_longText_index ON TypeIndex FIELDS longText" - check indexs["TypeIndex_date_index"].getStr == "DEFINE INDEX TypeIndex_date_index ON TypeIndex FIELDS date" - check indexs["TypeIndex_datetime1_index"].getStr == "DEFINE INDEX TypeIndex_datetime1_index ON TypeIndex FIELDS datetime1" - check indexs["TypeIndex_datetime2_index"].getStr == "DEFINE INDEX TypeIndex_datetime2_index ON TypeIndex FIELDS datetime2" - check indexs["TypeIndex_timestamp_index"].getStr == "DEFINE INDEX TypeIndex_timestamp_index ON TypeIndex FIELDS timestamp" - check indexs["TypeIndex_created_at_index"].getStr == "DEFINE INDEX TypeIndex_created_at_index ON TypeIndex FIELDS created_at" - check indexs["TypeIndex_updated_at_index"].getStr == "DEFINE INDEX TypeIndex_updated_at_index ON TypeIndex FIELDS updated_at" - check indexs["TypeIndex_deleted_at_index"].getStr == "DEFINE INDEX TypeIndex_deleted_at_index ON TypeIndex FIELDS deleted_at" - check indexs["TypeIndex_binary_index"].getStr == "DEFINE INDEX TypeIndex_binary_index ON TypeIndex FIELDS binary" - check indexs["TypeIndex_boolean_index"].getStr == "DEFINE INDEX TypeIndex_boolean_index ON TypeIndex FIELDS boolean" - check indexs["TypeIndex_enumField_index"].getStr == "DEFINE INDEX TypeIndex_enumField_index ON TypeIndex FIELDS enumField" - check indexs["TypeIndex_json_index"].getStr == "DEFINE INDEX TypeIndex_json_index ON TypeIndex FIELDS json" - - block: - let info = rdb.raw(""" INFO FOR TABLE TypeUnique """).info().waitFor() - let fields = info[0]["result"]["fd"] - check fields["index"].getStr == "DEFINE FIELD index ON TypeUnique TYPE int" - check fields["integer"].getStr == "DEFINE FIELD integer ON TypeUnique TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["smallInteger"].getStr == "DEFINE FIELD smallInteger ON TypeUnique TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["mediumInteger"].getStr == "DEFINE FIELD mediumInteger ON TypeUnique TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["bigInteger"].getStr == "DEFINE FIELD bigInteger ON TypeUnique TYPE int VALUE $value OR 1 ASSERT $value != NONE AND $value >= 0" - check fields["decimal"].getStr == "DEFINE FIELD decimal ON TypeUnique TYPE decimal VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["double"].getStr == "DEFINE FIELD double ON TypeUnique TYPE decimal VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["float"].getStr == "DEFINE FIELD float ON TypeUnique TYPE float VALUE $value OR 1.1 ASSERT $value != NONE AND $value >= 0" - check fields["uuid"].getStr == "DEFINE FIELD uuid ON TypeUnique TYPE string VALUE $value OR rand::uuid() ASSERT $value != NONE" - check fields["char"].getStr == "DEFINE FIELD char ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT string::len($value) < 256 AND $value != NONE" - check fields["string"].getStr == "DEFINE FIELD string ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT string::len($value) < 256 AND $value != NONE" - check fields["text"].getStr == "DEFINE FIELD text ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["mediumText"].getStr == "DEFINE FIELD mediumText ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["longText"].getStr == "DEFINE FIELD longText ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["date"].getStr == "DEFINE FIELD date ON TypeUnique TYPE datetime VALUE $value OR '1970-01-01T00:00:00Z' ASSERT $value != NONE" - check fields["datetime1"].getStr == "DEFINE FIELD datetime1 ON TypeUnique TYPE datetime VALUE $value OR time::now() ASSERT $value != NONE" - check fields["datetime2"].getStr == "DEFINE FIELD datetime2 ON TypeUnique TYPE datetime VALUE time::now() ASSERT $value != NONE" - check fields["timestamp"].getStr == "DEFINE FIELD timestamp ON TypeUnique TYPE datetime VALUE $value OR '1970-01-01T00:00:00Z' ASSERT $value != NONE" - check fields["created_at"].getStr == "DEFINE FIELD created_at ON TypeUnique TYPE datetime VALUE $value OR time::now()" - check fields["updated_at"].getStr == "DEFINE FIELD updated_at ON TypeUnique TYPE datetime VALUE time::now()" - check fields["deleted_at"].getStr == "DEFINE FIELD deleted_at ON TypeUnique TYPE datetime" - check fields["binary"].getStr == "DEFINE FIELD binary ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value != NONE" - check fields["boolean"].getStr == "DEFINE FIELD boolean ON TypeUnique TYPE bool VALUE $value OR true ASSERT $value != NONE" - check fields["enumField"].getStr == "DEFINE FIELD enumField ON TypeUnique TYPE string VALUE $value OR 'A' ASSERT $value INSIDE ['A', 'B', 'C'] AND $value != NONE" - check fields["json"].getStr == "DEFINE FIELD json ON TypeUnique FLEXIBLE TYPE object VALUE $value OR { key: 'value' } ASSERT $value != NONE" - check fields["relation"].getStr == "DEFINE FIELD relation ON TypeUnique TYPE record(relation) VALUE $value OR NULL" - - let indexs = info[0]["result"]["ix"] - check indexs["TypeUnique_integer_unique"].getStr == "DEFINE INDEX TypeUnique_integer_unique ON TypeUnique FIELDS integer UNIQUE" - check indexs["TypeUnique_smallInteger_unique"].getStr == "DEFINE INDEX TypeUnique_smallInteger_unique ON TypeUnique FIELDS smallInteger UNIQUE" - check indexs["TypeUnique_mediumInteger_unique"].getStr == "DEFINE INDEX TypeUnique_mediumInteger_unique ON TypeUnique FIELDS mediumInteger UNIQUE" - check indexs["TypeUnique_bigInteger_unique"].getStr == "DEFINE INDEX TypeUnique_bigInteger_unique ON TypeUnique FIELDS bigInteger UNIQUE" - check indexs["TypeUnique_decimal_unique"].getStr == "DEFINE INDEX TypeUnique_decimal_unique ON TypeUnique FIELDS decimal UNIQUE" - check indexs["TypeUnique_double_unique"].getStr == "DEFINE INDEX TypeUnique_double_unique ON TypeUnique FIELDS double UNIQUE" - check indexs["TypeUnique_float_unique"].getStr == "DEFINE INDEX TypeUnique_float_unique ON TypeUnique FIELDS float UNIQUE" - check indexs["TypeUnique_uuid_unique"].getStr == "DEFINE INDEX TypeUnique_uuid_unique ON TypeUnique FIELDS uuid UNIQUE" - check indexs["TypeUnique_char_unique"].getStr == "DEFINE INDEX TypeUnique_char_unique ON TypeUnique FIELDS char UNIQUE" - check indexs["TypeUnique_string_unique"].getStr == "DEFINE INDEX TypeUnique_string_unique ON TypeUnique FIELDS string UNIQUE" - check indexs["TypeUnique_text_unique"].getStr == "DEFINE INDEX TypeUnique_text_unique ON TypeUnique FIELDS text UNIQUE" - check indexs["TypeUnique_mediumText_unique"].getStr == "DEFINE INDEX TypeUnique_mediumText_unique ON TypeUnique FIELDS mediumText UNIQUE" - check indexs["TypeUnique_longText_unique"].getStr == "DEFINE INDEX TypeUnique_longText_unique ON TypeUnique FIELDS longText UNIQUE" - check indexs["TypeUnique_date_unique"].getStr == "DEFINE INDEX TypeUnique_date_unique ON TypeUnique FIELDS date UNIQUE" - check indexs["TypeUnique_datetime1_unique"].getStr == "DEFINE INDEX TypeUnique_datetime1_unique ON TypeUnique FIELDS datetime1 UNIQUE" - check indexs["TypeUnique_datetime2_unique"].getStr == "DEFINE INDEX TypeUnique_datetime2_unique ON TypeUnique FIELDS datetime2 UNIQUE" - check indexs["TypeUnique_timestamp_unique"].getStr == "DEFINE INDEX TypeUnique_timestamp_unique ON TypeUnique FIELDS timestamp UNIQUE" - check indexs["TypeUnique_created_at_index"].getStr == "DEFINE INDEX TypeUnique_created_at_index ON TypeUnique FIELDS created_at" - check indexs["TypeUnique_updated_at_index"].getStr == "DEFINE INDEX TypeUnique_updated_at_index ON TypeUnique FIELDS updated_at" - check indexs["TypeUnique_deleted_at_index"].getStr == "DEFINE INDEX TypeUnique_deleted_at_index ON TypeUnique FIELDS deleted_at" - check indexs["TypeUnique_binary_unique"].getStr == "DEFINE INDEX TypeUnique_binary_unique ON TypeUnique FIELDS binary UNIQUE" - check indexs["TypeUnique_boolean_unique"].getStr == "DEFINE INDEX TypeUnique_boolean_unique ON TypeUnique FIELDS boolean UNIQUE" - check indexs["TypeUnique_enumField_unique"].getStr == "DEFINE INDEX TypeUnique_enumField_unique ON TypeUnique FIELDS enumField UNIQUE" - check indexs["TypeUnique_json_unique"].getStr == "DEFINE INDEX TypeUnique_json_unique ON TypeUnique FIELDS json UNIQUE" - - - test("drop column"): - rdb.alter( - table("TypeIndex", [ - Column.dropColumn("str") - ]) - ) - - let columns = rdb.table("TypeIndex").columns().waitFor - check not columns.contains("str") - - - test("drop table"): - rdb.create( - table("TypeIndex", [ - Column.integer("num") - ]) - ) - - rdb.drop( - table("TypeIndex") - ) - - let res = rdb.table("TypeIndex").first().waitFor() - check not res.isSome - - -clearTables(surreal).waitFor() diff --git a/tests/v1.bk/test_orm.nim b/tests/v1.bk/test_orm.nim deleted file mode 100644 index be325e00..00000000 --- a/tests/v1.bk/test_orm.nim +++ /dev/null @@ -1,76 +0,0 @@ -discard """ - cmd: "nim c -d:reset $file" -""" - -import std/unittest -import std/asyncdispatch -import std/json -import std/options -import ../../src/allographer/query_builder - -suite("test orm"): - test("seq[JsonNode]"): - type Typ = object - bool: bool - int: int - float: float - str: string - - proc function():Future[seq[JsonNode]] {.async.} = - return @[ - %*{"bool":true, "int":1, "float": 1.1, "str": "str"}, - %*{"bool":false, "int":2, "float": 1.2, "str": "str"} - ] - - let expect = @[ - Typ(bool: true, int: 1, float: 1.1, str: "str"), - Typ(bool: false, int: 2, float: 1.2, str: "str") - ] - - check function().orm(Typ).waitFor() == expect - - - test("seq[JsonNode] empty"): - type Typ = object - bool: bool - int: int - float: float - str: string - - proc function():Future[seq[JsonNode]] {.async.} = - return @[] - - let expect:seq[Typ] = @[] - - check function().orm(Typ).waitFor() == expect - - - test("Option[JsonNode] some"): - type Typ = object - bool: bool - int: int - float: float - str: string - - proc function():Future[Option[JsonNode]] {.async.} = - let json = %*{"bool":true, "int":1, "float": 1.1, "str": "str"} - return json.some() - - let expect = Typ(bool: true, int: 1, float: 1.1, str: "str").some() - - check function().orm(Typ).waitFor() == expect - - - test("Option[JsonNode] none"): - type Typ = object - bool: bool - int: int - float: float - str: string - - proc function():Future[Option[JsonNode]] {.async.} = - return none(JsonNode) - - let expect = none(Typ) - - check function().orm(Typ).waitFor() == expect From b6b73df05fbf8cf23eda527011c9b4e2a8324fdf Mon Sep 17 00:00:00 2001 From: itsmura-h Date: Sat, 28 Mar 2026 22:55:54 +0000 Subject: [PATCH 2/4] fix example --- example/columnType.nim | 53 +++++++--------- example/database/seeder/data/post_seeder.nim | 6 +- example/database/seeder/data/user_seeder.nim | 9 +-- example/database/seeder/production.nim | 3 + example/ddd/repository.nim | 17 ++--- example/ddd/service.nim | 3 +- example/mariadb/chatgpt_code.nim | 66 ++------------------ example/prepare.nim | 23 ++----- example/run.nim | 33 ++++------ example/sarrogate_key.nim | 14 +---- example/surreal.nim | 6 +- example/surrealDb.nim | 2 +- example/typedReturn.nim | 8 +-- example/upperCase.nim | 11 ++-- 14 files changed, 85 insertions(+), 169 deletions(-) diff --git a/example/columnType.nim b/example/columnType.nim index ed2801f6..26e1c233 100644 --- a/example/columnType.nim +++ b/example/columnType.nim @@ -1,5 +1,6 @@ -import json, asyncdispatch - +# nim c -r -d:reset example/columnType.nim +import std/json +import std/asyncdispatch import ../src/allographer/query_builder import ../src/allographer/schema_builder import ./connections @@ -7,37 +8,35 @@ import ./connections asyncBlock: rdb.create([ table("auth",[ - Column().increments("id"), - Column().string("auth") + Column.increments("id"), + Column.string("auth") ]), table("users",[ - Column().increments("id"), - Column().string("name").nullable(), - Column().string("email").nullable(), - Column().string("password").nullable(), - Column().string("address").nullable(), - Column().date("birth_date").nullable(), - Column().foreign("auth_id").reference("id").on("auth").onDelete(SET_NULL) + Column.increments("id"), + Column.string("name").nullable(), + Column.string("email").nullable(), + Column.string("password").nullable(), + Column.string("address").nullable(), + Column.date("birth_date").nullable(), + Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL) ]), table("sample", [ - Column().increments("id"), - Column().float("float"), - Column().string("string"), - Column().datetime("datetime"), - Column().string("null").nullable(), - Column().boolean("is_admin") + Column.increments("id"), + Column.float("float"), + Column.string("string"), + Column.datetime("datetime"), + Column.string("null").nullable(), + Column.boolean("is_admin") ]) ]) - echo repr await rdb.table("users").select("id", "name", "address") + echo await rdb.select("id", "name", "address").table("users") .limit(2) .get() - echo await rdb.table("users").select("id", "name", "address").first() + echo await rdb.select("id", "name", "address").table("users").first() - echo await rdb.table("users") - .select("id", "name", "address") - .find(3) + echo await rdb.select("id", "name", "address").table("users").find(3) await rdb.table("sample").insert(%*{ "id": 1, @@ -47,17 +46,13 @@ asyncBlock: "is_admin": true }) - echo await rdb.table("sample") - .select("id", "float", "string", "datetime", "null", "is_admin") - .get() + echo await rdb.select("id", "float", "string", "datetime", "null", "is_admin").table("sample").get() - echo await rdb.table("sample") - .select("id", "float", "string", "datetime", "null", "is_admin") - .get() + echo await rdb.select("id", "float", "string", "datetime", "null", "is_admin").table("sample").get() var sql = "update users set name='John' where id = 1" await rdb.raw(sql).exec() sql = "select * from users where id = 1" - echo await rdb.raw(sql).getRaw() + echo await rdb.raw(sql).get() diff --git a/example/database/seeder/data/post_seeder.nim b/example/database/seeder/data/post_seeder.nim index 2efa4e06..eac5d2f3 100644 --- a/example/database/seeder/data/post_seeder.nim +++ b/example/database/seeder/data/post_seeder.nim @@ -23,9 +23,9 @@ proc postSeeder*() {.async.} = id: $genOid(), title: &"post {i}", content: &"content {i}", - userId: users[i-1].id, - createdAt: now().toTime().toUnix().int, - updatedAt: now().toTime().toUnix().int + user_id: users[i-1].id, + created_at: now().toTime().toUnix().int, + updated_at: now().toTime().toUnix().int ) postList.add(%row) diff --git a/example/database/seeder/data/user_seeder.nim b/example/database/seeder/data/user_seeder.nim index 98929a8b..0aa346d7 100644 --- a/example/database/seeder/data/user_seeder.nim +++ b/example/database/seeder/data/user_seeder.nim @@ -3,24 +3,21 @@ import std/strformat import std/asyncdispatch import std/oids import std/times -import bcrypt import ../../../../src/allographer/query_builder import ../../connection import ../../schema proc userSeeder*() {.async.} = seeder(rdb, "user"): - let salt = genSalt(10) - var userList: seq[JsonNode] for i in 1..10: let row = UserTable( id: $genOid(), name: &"user {i}", email: &"user{i}@example.com", - password: hash(&"password{i}", salt), - createdAt: now().toTime().toUnix().int, - updatedAt: now().toTime().toUnix().int, + password: &"password{i}", + created_at: now().toTime().toUnix().int, + updated_at: now().toTime().toUnix().int, ) userList.add(%row) diff --git a/example/database/seeder/production.nim b/example/database/seeder/production.nim index 0ecce128..1b0e7a29 100644 --- a/example/database/seeder/production.nim +++ b/example/database/seeder/production.nim @@ -8,4 +8,7 @@ proc seed() = if env != "production": raise newException(Exception, "This command is only available in the production environment") + userSeeder().waitFor() + postSeeder().waitFor() + seed() diff --git a/example/ddd/repository.nim b/example/ddd/repository.nim index 51a914f9..9cfdafbe 100644 --- a/example/ddd/repository.nim +++ b/example/ddd/repository.nim @@ -1,14 +1,17 @@ import json +import std/asyncdispatch +import std/options import ../../src/allographer/query_builder +import ../connections type Repository* = ref object - rdb:Rdb + rdb*: SqliteConnections -proc newRepository*():Repository = - return Repository(rdb:rdb()) +proc newRepository*(): Repository = + Repository(rdb: rdb) -proc getUsers*(this:Repository):seq[JsonNode] = - return this.rdb.table("users").get() +proc getUsers*(this: Repository): seq[JsonNode] = + this.rdb.table("users").get().waitFor() -proc getUser*(this:Repository, id:int):JsonNode = - return this.rdb.table("users").find(id) +proc getUser*(this: Repository, id: int): Option[JsonNode] = + this.rdb.table("users").find(id).waitFor() diff --git a/example/ddd/service.nim b/example/ddd/service.nim index f6ebd3fc..d939a66c 100644 --- a/example/ddd/service.nim +++ b/example/ddd/service.nim @@ -1,4 +1,5 @@ import json +import std/options import ../../src/allographer/query_builder import repository @@ -13,5 +14,5 @@ proc newService*():Service = proc getUsers*(this:Service):seq[JsonNode] = return this.repository.getUsers() -proc getUser*(this:Service, id:int):JsonNode = +proc getUser*(this:Service, id:int):Option[JsonNode] = return this.repository.getUser(id) diff --git a/example/mariadb/chatgpt_code.nim b/example/mariadb/chatgpt_code.nim index 22f7cab0..5696e326 100644 --- a/example/mariadb/chatgpt_code.nim +++ b/example/mariadb/chatgpt_code.nim @@ -1,63 +1,7 @@ -{.passL: "-lmariadb".} -{.passC: "-D_DEFAULT_SOURCE".} +import std/json +import ../../src/allographer/connection +import ../../src/allographer/query_builder -import os, sequtils +let rdb = dbOpen(MariaDB, "database", "user", "pass", "mariadb", 3306, shouldDisplayLog=true) -# C言語のヘッダーファイルと関数のバインディング -type - MYSQL* = pointer - MYSQL_STMT* = pointer - MYSQL_BIND* = pointer - -proc mysql_library_init(nr: cint, argv: ptr ptr cchar, groups: ptr ptr cchar): cint {.importc, dynlib: "libmariadb.so".} -proc mysql_init(mysql: MYSQL): MYSQL {.importc, dynlib: "libmariadb.so".} -proc mysql_real_connect(mysql: MYSQL, host: cstring, user: cstring, passwd: cstring, db: cstring, port: cuint, unix_socket: cstring, client_flag: cuint): MYSQL {.importc, dynlib: "libmariadb.so".} -proc mysql_close(mysql: MYSQL) {.importc, dynlib: "libmariadb.so".} -proc mysql_error(mysql: MYSQL): cstring {.importc, dynlib: "libmariadb.so".} - -proc mysql_stmt_init(mysql: MYSQL): MYSQL_STMT {.importc, dynlib: "libmariadb.so".} -proc mysql_stmt_prepare(stmt: MYSQL_STMT, query: cstring, length: culong): cint {.importc, dynlib: "libmariadb.so".} -proc mysql_stmt_bind_param(stmt: MYSQL_STMT, params: MYSQL_BIND): cint {.importc, dynlib: "libmariadb.so".} -proc mysql_stmt_execute(stmt: MYSQL_STMT): cint {.importc, dynlib: "libmariadb.so".} -proc mysql_stmt_close(stmt: MYSQL_STMT): cint {.importc, dynlib: "libmariadb.so".} -proc mysql_stmt_error(stmt: MYSQL_STMT): cstring {.importc, dynlib: "libmariadb.so".} - -proc main() = - if mysql_library_init(0, nil, nil) != 0: - raise newException(Exception, "Could not initialize MySQL client library") - - let mysql = mysql_init(nil) - if mysql == nil: - raise newException(Exception, "mysql_init() failed: " & $mysql_error(mysql)) - - if mysql_real_connect(mysql, "localhost", "username", "password", "dbname", 3306, nil, 0) == nil: - raise newException(Exception, "mysql_real_connect() failed: " & $mysql_error(mysql)) - - let stmt = mysql_stmt_init(mysql) - if stmt == nil: - raise newException(Exception, "mysql_stmt_init() failed: " & $mysql_error(mysql)) - - let query = "INSERT INTO test(id, str) VALUES(?, ?)" - if mysql_stmt_prepare(stmt, query, csize_t(query.len)) != 0: - raise newException(Exception, "mysql_stmt_prepare() failed: " & $mysql_stmt_error(stmt)) - - var bindSeq: seq[MYSQL_BIND] - bindSeq.setLen(2) - var id: cint = 1 - var strData = "alice" - bindSeq[0].buffer_type = MYSQL_TYPE_LONG - bindSeq[0].buffer = addr(id) - bindSeq[1].buffer_type = MYSQL_TYPE_STRING - bindSeq[1].buffer = addr(strData) - bindSeq[1].buffer_length = cunsigned_long(strData.len) - - if mysql_stmt_bind_param(stmt, addr(bindSeq[0])) != 0: - raise newException(Exception, "mysql_stmt_bind_param() failed: " & $mysql_stmt_error(stmt)) - - if mysql_stmt_execute(stmt) != 0: - raise newException(Exception, "mysql_stmt_execute() failed: " & $mysql_stmt_error(stmt)) - - discard mysql_stmt_close(stmt) - mysql_close(mysql) - -main() +discard rdb.table("test").where("id", "=", 1).update(%*{"name": "alice"}) diff --git a/example/prepare.nim b/example/prepare.nim index 432f03bc..5915c26b 100644 --- a/example/prepare.nim +++ b/example/prepare.nim @@ -5,7 +5,7 @@ import std/times, ../src/allographer/query_builder, ../src/allographer/schema_builder, - ../src/allographer/async/async_db + ../src/allographer/query_builder/libs/sqlite/sqlite_impl from connections import rdb randomize() @@ -20,26 +20,15 @@ rdb.create( seeder rdb, "num_table": var data = newSeq[JsonNode]() for i in 1..10000: - let randomNum = rand(10000) - data.add(%*{"id": i, "randomnumber": randomNum}) + data.add(%*{"id": i, "randomnumber": rand(10000)}) rdb.table("num_table").insert(data).waitFor let start = cpuTime() -let resp = newJArray() (proc(){.async.}= - let conn = rdb.conn - let prepare = conn.prepare(PostgreSQL, "select * from num_table where id = $1", "12345").await - let n = 100 - var futures = newSeq[Future[(seq[Row], DbRows)]](n) - for i in 1..n: - futures[i-1] = prepare.query(PostgreSQL, @[$i]) - - let resArr = all(futures).await - for row in resArr: - let data = row[0] - let dbInfo = row[1] - echo data - # resp.add(%*{dbInfo[0][0].name: data[0][0], dbInfo[0][1].name: data[0][1]}) + let conn = rdb.pools.conns[0].conn + let stmt = await conn.prepare("select * from num_table where id = ?", 30) + let resultSet = await conn.preparedQuery(@["1"], stmt) + echo resultSet[0] )() .waitFor echo cpuTime() - start diff --git a/example/run.nim b/example/run.nim index 9e361f84..b0948011 100644 --- a/example/run.nim +++ b/example/run.nim @@ -1,5 +1,4 @@ -import strformat, json, progress, asyncdispatch -import bcrypt +import strformat, json, asyncdispatch import ../src/allographer/query_builder import ../src/allographer/schema_builder @@ -18,7 +17,7 @@ rdb.create([ Column.string("password").nullable(), Column.string("address").nullable(), Column.date("birth_date").nullable(), - Column.foreign("auth_id").reference("id").on("auth").onDelete(SET_NULL) + Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL) ]) ]) @@ -31,34 +30,26 @@ seeder rdb, "auth": .waitFor() seeder rdb, "users": - # プログレスバー let total = 20 - var pb = newProgressBar(total=total) # totalは分母 - - pb.start() var insertData: seq[JsonNode] for i in 1..total: - let salt = genSalt(10) - let password = hash(&"password{i}", salt) let authId = if i mod 2 == 0: 1 else: 2 insertData.add( %*{ "name": &"user{i}", "email": &"user{i}@gmail.com", - "password": password, + "password": &"password{i}", "auth_id": authId } ) - pb.increment() - pb.finish() rdb.table("users").insert(insertData).waitFor() echo rdb.table("users").get().waitFor() echo rdb - .table("users") .select("users.id", "users.email") + .table("users") .where("name", "=", "user3") .orWhere("name", "=", "user4") .orWhere("users.id", "=", 5) @@ -67,10 +58,10 @@ echo rdb .get() .waitFor() -echo rdb.table("users").select("id", "email").limit(5).get().waitFor() -echo rdb.table("users").select("id", "email").limit(5).first().waitFor() +echo rdb.select("id", "email").table("users").limit(5).get().waitFor() +echo rdb.select("id", "email").table("users").limit(5).first().waitFor() echo rdb.table("users").find(4).waitFor() -echo rdb.table("users").select("id", "email").limit(5).find(3).waitFor() +echo rdb.select("id", "email").table("users").limit(5).find(3).waitFor() echo "" @@ -86,7 +77,7 @@ rdb.table("users").insert( ) .waitFor() -rdb.table("users").inserts( +rdb.table("users").insert( @[ %*{"name": "Mick", "email": "Mick@gmail.com"}, %*{"name": "Keith", "password": "KeithPass"} @@ -97,19 +88,19 @@ rdb.table("users").inserts( rdb.table("users").where("id", "=", 2).update(%*{"name": "David"}).waitFor() rdb.table("users").where("id", "=", 2).update(%*{"name": "David"}).waitFor() -echo rdb.table("users").select().where("name", "=", "David").get().waitFor() +echo rdb.select().table("users").where("name", "=", "David").get().waitFor() echo rdb.table("users").find(2).waitFor() rdb.table("users").where("name", "=", "David").delete().waitFor() rdb.table("users").delete(3).waitFor() echo rdb.table("users").find(3).waitFor() echo rdb.table("users").limit(5).get().waitFor() -echo rdb.table("users").select("name").where("address", "is", nil).get().waitFor() +echo rdb.select("name").table("users").where("address", "is", nil).get().waitFor() # sql check let r = rdb - .table("users") .select("users.id", "users.email") + .table("users") .where("name", "=", "user3") .where("name", "=", "user4") .where("users.id", "=", 5) @@ -132,7 +123,7 @@ type User = ref object address:string birth_date:string auth_id:int -let users = rdb.table("users").limit(5).get(User).waitFor() +let users = rdb.table("users").limit(5).get().orm(User).waitFor() for user in users: echo user.name diff --git a/example/sarrogate_key.nim b/example/sarrogate_key.nim index 33c85d6a..cf889297 100644 --- a/example/sarrogate_key.nim +++ b/example/sarrogate_key.nim @@ -1,8 +1,6 @@ import std/asyncdispatch import std/strformat import std/json -import progress -import bcrypt import ../src/allographer/query_builder import ../src/allographer/schema_builder from ./connections import rdb @@ -20,7 +18,7 @@ rdb.create([ Column.string("password").nullable(), Column.string("address").nullable(), Column.date("birth_date").nullable(), - Column.foreign("auth_id").reference("id").on("auth").onDelete(SET_NULL) + Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL) ]) ]) @@ -32,27 +30,19 @@ seeder rdb, "auth": ]) .waitFor -# プログレスバー let total = 20 -var pb = newProgressBar(total=total) # totalは分母 - -pb.start() var insertData: seq[JsonNode] for i in 1..total: - let salt = genSalt(10) - let password = hash(&"password{i}", salt) let authId = if i mod 2 == 0: 1 else: 2 insertData.add( %*{ "name": &"user{i}", "email": &"user{i}@gmail.com", - "password": password, + "password": &"password{i}", "auth_id": authId } ) - pb.increment() -pb.finish() rdb.table("users").insert(insertData).waitFor() echo rdb.table("users").get().waitFor() diff --git a/example/surreal.nim b/example/surreal.nim index 6df09acd..4e72d92e 100644 --- a/example/surreal.nim +++ b/example/surreal.nim @@ -6,7 +6,7 @@ import ../src/allographer/connection import ../src/allographer/query_builder proc main() {.async.} = - let surreal = dbOpen(SurrealDb, "test", "test", "user", "pass", "http://surreal", 8000, 10, 30, true, false).await + let surreal = await dbOpen(SurrealDb, "test", "test", "user", "pass", "http://surreal", 8000, 10, 30, true, false) surreal.raw("DELETE type").exec().await surreal.table("type").insert(%*[ @@ -139,7 +139,7 @@ DEFINE FIELD float ON TABLE type TYPE float; DEFINE FIELD int ON TABLE type TYPE int; DEFINE FIELD string ON TABLE type TYPE string; """ - surreal.raw(define).exec().await() + surreal.raw(define).exec().await echo surreal.raw("INFO FOR TABLE type").info().await @@ -156,7 +156,7 @@ DEFINE FIELD string ON TABLE type TYPE string; string: "aaa" } """, - $max, now().format("yyyy-MM-dd'T'HH:mm:sszzz")) + %*[$max, now().format("yyyy-MM-dd'T'HH:mm:sszzz")]) .exec() .await diff --git a/example/surrealDb.nim b/example/surrealDb.nim index 1adfc518..5900bbdb 100644 --- a/example/surrealDb.nim +++ b/example/surrealDb.nim @@ -4,7 +4,7 @@ import ../src/allographer/connection import ../src/allographer/query_builder -let db = dbOpen(SurrealDB, "test:test", "user", "pass", "http://surreal", 8000, 10, 30, true, true) +let db = dbOpen(SurrealDB, "test", "test", "user", "pass", "http://surreal", 8000, 10, 30, true, true).waitFor() db.raw("DELETE FROM account").exec().waitFor echo db.raw("INFO FOR DB").get().waitFor diff --git a/example/typedReturn.nim b/example/typedReturn.nim index 4a45055d..608a81ee 100644 --- a/example/typedReturn.nim +++ b/example/typedReturn.nim @@ -1,4 +1,4 @@ -import times, json, typeinfo, macros +import times, json, macros # type Type = ref object # id: int @@ -13,8 +13,8 @@ var response = @[ ] macro orm(head, body: untyped) = - echo head - echo body + echo repr(head) + echo repr(body) orm typ: response @@ -32,4 +32,4 @@ proc orm(response_arg:openArray[JsonNode], typ:var tuple):seq[typ.type] = response.add(typ) return response -]# \ No newline at end of file +]# diff --git a/example/upperCase.nim b/example/upperCase.nim index c69b7acb..9544f1ac 100644 --- a/example/upperCase.nim +++ b/example/upperCase.nim @@ -1,7 +1,10 @@ import json +import ../src/allographer/connection import ../src/allographer/query_builder -discard Rdb().table("world").where("id", "=", 1).updateSql(%*{"randomnumber": 2}) -discard Rdb().table("World").where("Id", "=", 1).updateSql(%*{"randomNumber": 2}) -discard Rdb().table("world").select("id", "randomnumber").where("id", "=", 1).selectSql() -discard Rdb().table("World").select("id", "randomNumber").where("Id", "=", 1).selectSql() +let rdb = dbOpen(SQLite3, ":memory:", shouldDisplayLog=false) + +discard rdb.table("world").where("id", "=", 1).update(%*{"randomnumber": 2}) +discard rdb.table("World").where("Id", "=", 1).update(%*{"randomNumber": 2}) +discard rdb.select("id", "randomnumber").table("world").where("id", "=", 1).get() +discard rdb.select("id", "randomNumber").table("World").where("Id", "=", 1).get() From 5953a3c780bf70d914099b6b56de867201d5d7db Mon Sep 17 00:00:00 2001 From: itsmura-h Date: Sun, 29 Mar 2026 01:25:54 +0000 Subject: [PATCH 3/4] fix prepare import --- example/prepare.nim | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/example/prepare.nim b/example/prepare.nim index 5915c26b..ba182d72 100644 --- a/example/prepare.nim +++ b/example/prepare.nim @@ -1,11 +1,10 @@ -import - std/asyncdispatch, - std/json, - std/random, - std/times, - ../src/allographer/query_builder, - ../src/allographer/schema_builder, - ../src/allographer/query_builder/libs/sqlite/sqlite_impl +import std/asyncdispatch +import std/json +import std/random +import std/times +import ../src/allographer/query_builder +import ../src/allographer/schema_builder +import ../src/allographer/query_builder/libs/sqlite/sqlite_impl from connections import rdb randomize() From 31588e7bb17d592be413d54e632917d8964caa39 Mon Sep 17 00:00:00 2001 From: itsmura-h Date: Sun, 29 Mar 2026 01:36:05 +0000 Subject: [PATCH 4/4] update docs --- documents/rdb/query_builder.md | 27 ++++++---- documents/rdb/schema_builder.md | 76 +++++++++++++-------------- documents/rdb/typeDifinition.md | 4 +- documents/surrealdb/schema_builder.md | 19 +++---- 4 files changed, 67 insertions(+), 59 deletions(-) diff --git a/documents/rdb/query_builder.md b/documents/rdb/query_builder.md index ad5e734e..681769af 100644 --- a/documents/rdb/query_builder.md +++ b/documents/rdb/query_builder.md @@ -48,13 +48,20 @@ import allographer/connection let maxConnections = 95 let timeout = 30 -let rdb = dbOpen(PostgreSQL, "database", "user", "password", "localhost", 5432, maxConnections, timeout) -# also available -# let rdb = dbOpen(Sqlite3, "/path/to/db/sqlite3.db", maxConnections=maxConnections, timeout=timeout) -# let rdb = dbOpen(MySQL, "database", "user", "password", "localhost", 3306, maxConnections, timeout) -# let rdb = dbOpen(MariaDB, "database", "user", "password", "localhost", 3306, maxConnections, timeout) -# let rdb = dbOpen(PostgreSQL, databaseUrl = asDatabaseUrl("postgresql://user:password@localhost:5432/database"), maxConnections=maxConnections, timeout=timeout) +# Using connection URL (Recommended) +let rdb = dbOpen(PostgreSQL, "postgresql://user:password@localhost:5432/database", maxConnections, timeout) + +# Using positional arguments +# let rdb = dbOpen(PostgreSQL, "database", "user", "password", "localhost", 5432, maxConnections, timeout) + +# SQLite +# let rdb = dbOpen(SQLite3, "/path/to/db.sqlite3", maxConnections, timeout) +# let rdb = dbOpen(SQLite3, ":memory:", maxConnections, timeout) + +# MySQL / MariaDB +# let rdb = dbOpen(MySQL, "mysql://user:password@localhost:3306/database", maxConnections, timeout) +# let rdb = dbOpen(MariaDB, "mariadb://user:password@localhost:3306/database", maxConnections, timeout) ``` ## SELECT @@ -294,7 +301,7 @@ let users = rdb ### paginate ```nim -rdb.table("users").delete(2) +rdb.table("users").delete(2).await let users = rdb .table("users") .select("id", "name") @@ -486,7 +493,7 @@ rdb.table("users").insert( ```nim import allographer/query_builder -rdb.table("users").inserts( +echo rdb.table("users").insert( @[ %*{"name": "John", "email": "John@gmail.com", "address": "London"}, %*{"name": "Paul", "email": "Paul@gmail.com", "address": "London"}, @@ -531,7 +538,7 @@ echo rdb.table("users").insertId( ```nim import allographer/query_builder -echo rdb.table("users").insertsID( +echo rdb.table("users").insertId( @[ %*{"name": "John", "email": "John@gmail.com", "address": "London"}, %*{"name": "Paul", "email": "Paul@gmail.com", "address": "London"}, @@ -669,7 +676,7 @@ Except of `count`, these functions return `Option` type. ```nim import allographer/query_builder -echo rdb.table("users").count() +echo rdb.table("users").count().await >> 10 # int let response = await rdb.table("users").max("name").await diff --git a/documents/rdb/schema_builder.md b/documents/rdb/schema_builder.md index 727bbc62..8868f515 100644 --- a/documents/rdb/schema_builder.md +++ b/documents/rdb/schema_builder.md @@ -4,24 +4,24 @@ Example: Schema Builder ## index -* [Example: Schema Builder](#example-schema-builder) - * [index](#index) - * [Create table](#create-table) - * [Alter Table](#alter-table) - * [add column](#add-column) - * [change column](#change-column) - * [drop column](#drop-column) - * [rename table](#rename-table) - * [drop table](#drop-table) - * [Migration history](#migration-history) - * [seeder template](#seeder-template) - * [integer](#integer) - * [float](#float) - * [char](#char) - * [date](#date) - * [others](#others) - * [options](#options) - * [Foreign Key Constraints](#foreign-key-constraints) +- [Example: Schema Builder](#example-schema-builder) + - [index](#index) + - [Create table](#create-table) + - [Alter Table](#alter-table) + - [add column](#add-column) + - [change column](#change-column) + - [drop column](#drop-column) + - [rename table](#rename-table) + - [drop table](#drop-table) + - [Migration history](#migration-history) + - [seeder template](#seeder-template) + - [integer](#integer) + - [float](#float) + - [char](#char) + - [date](#date) + - [others](#others) + - [options](#options) + - [Foreign Key Constraints](#foreign-key-constraints) @@ -32,9 +32,9 @@ Example: Schema Builder ## Create table ```nim import allographer/schema_builder -from ../database import rdb +import connections # or define rdb here -rdb.create([ +rdb.create( table("auth", [ Column.increments("id"), Column.uuid("uuid"), @@ -44,10 +44,10 @@ rdb.create([ table("users", [ Column.increments("id"), Column.string("name"), - Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL) - Column.strForeign("uuid").reference("uuid")..onDelete(SET_NULL) + Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL), + Column.strForeign("uuid").reference("uuid").onTable("auth").onDelete(SET_NULL) ]) -]) +) ``` ## Alter Table @@ -55,10 +55,9 @@ rdb.create([ ```nim rdb.alter( table("auth", [ - Column.increments("id").add(), - Column.string("name").add(), + Column.string("email").add(), ]), - table("users",[ + table("users", [ Column.string("email").unique().default("").add(), Column.foreign("auth_id").reference("id").onTable("auth").onDelete(SET_NULL).add() ]) @@ -70,10 +69,10 @@ rdb.alter( ### change column ```nim rdb.alter( - table("users", + table("users", [ Column.renameColumn("name", "new_name"), - Column.char("name", 20).unique().default("").cange() - ) + Column.char("name", 20).unique().default("").change() + ]) ) ``` - Create new table with new column definition @@ -85,16 +84,16 @@ rdb.alter( ### drop column ```nim rdb.alter( - table("users", + table("users", [ Column.dropColumn("name") - ) + ]) ) ``` ### rename table ```nim rdb.alter( - rename("users", "new_users") + table("users").renameTo("new_users") ) ``` `>> ALTER TABLE users RENAME TO new_users` @@ -108,18 +107,17 @@ rdb.drop( `>> DROP TABLE users` ## Migration history -allographer generate `_migrations` table in your database. It has migration history data which have hash key generated a query. +allographer generate `_allographer_migrations` table in your database. It has migration history data which have hash key generated a query. ```nim # migrate.nim -import json +import std/asyncdispatch +import std/json import allographer/schema_builder -import allographer/query_builder - -let rdb = dbopen(SQLite3, "/path/to/db.sqlite") +import connections -rdb.schema( +rdb.create( table("auth", [ Column.increments("id"), Column.string("name") @@ -151,7 +149,7 @@ seeder rdb, "users": ```sh # first time nim c -r migrate ->> run query and generate `_migrations` table +>> run query and generate `_allographer_migrations` table # secound time nim c -r migrate >> nothing to do diff --git a/documents/rdb/typeDifinition.md b/documents/rdb/typeDifinition.md index f433e462..ea991afd 100644 --- a/documents/rdb/typeDifinition.md +++ b/documents/rdb/typeDifinition.md @@ -37,7 +37,9 @@ |binary|BLOB|BLOB|BYTEA|JString |boolean|TINYINT|TINYINT|BOOLEAN|JBool |enumField|VARCHAR|ENUM|CHARACTER|JString -|json|TEXT|JSON|JSON|JString +|json|TEXT|JSON|JSON|JObject / JArray *1| + +*1: For SQLite, it returns `JString`. For other databases, it returns parsed `JsonNode` (`JObject` or `JArray`). |foreign|INTEGER|INT|INT|JInt |strForeign|VARCHAR|VARCHAR|VARCHAR|JString diff --git a/documents/surrealdb/schema_builder.md b/documents/surrealdb/schema_builder.md index 4fd895d7..1947828c 100644 --- a/documents/surrealdb/schema_builder.md +++ b/documents/surrealdb/schema_builder.md @@ -34,12 +34,13 @@ You can create `SCHEMAFULL` table for SurrealDB. [DEFINE FIELD](https://surrealdb.com/docs/surrealql/statements/define/field) ```nim +import std/asyncdispatch import allographer/connection import allographer/schema_builder -let surreal = dbOpen(SurrealDb, "test", "test", "user", "pass", "htttp://surreal", 8000, 5, 30, false, false).waitFor() +let surreal = dbOpen(SurrealDb, "test", "test", "user", "pass", "http://surreal", 8000, 5, 30, false, false).await -surreal.create([ +surreal.create( table("auth", [ Column.increments("index"), Column.uuid("uuid"), @@ -49,9 +50,9 @@ surreal.create([ table("user", [ Column.increments("index"), Column.string("name"), - Column.foreign("auth").reference("id").on("auth").onDelete(SET_NULL) + Column.foreign("auth").reference("id").onTable("auth").onDelete(SET_NULL) ]) -]) +) ``` These query run. @@ -96,9 +97,9 @@ surreal.alter( Column.increments("index").add(), Column.string("name").add(), ]), - table("user",[ + table("user", [ Column.string("email").unique().default("").add(), - Column.foreign("auth").reference("id").on("auth").onDelete(SET_NULL).add() + Column.foreign("auth").reference("id").onTable("auth").onDelete(SET_NULL).add() ]) ) ``` @@ -121,9 +122,9 @@ DEFINE FIELD `auth` ON TABLE `user` TYPE record (`auth`) ASSERT $value != NONE ### drop column ```nim surreal.alter( - table("user", + table("user", [ Column.dropColumn("name") - ) + ]) ) ``` @@ -133,7 +134,7 @@ REMOVE FIELD `name` ON TABLE `user` ### drop table ```nim -rdb.drop( +surreal.drop( table("user") ) ```