network-ts-sdk/tests/e2e/db.test.ts
2025-10-22 09:06:42 +03:00

150 lines
3.9 KiB
TypeScript

import { describe, it, expect, beforeEach } from "vitest";
import { createTestClient, skipIfNoGateway, generateTableName } from "./setup";
describe("Database", () => {
if (skipIfNoGateway()) {
console.log("Skipping database tests");
}
let tableName: string;
beforeEach(() => {
tableName = generateTableName();
});
it("should create a table", async () => {
const client = await createTestClient();
await client.db.createTable(
`CREATE TABLE ${tableName} (id INTEGER PRIMARY KEY, name TEXT, email TEXT)`
);
// Verify by querying schema
const schema = await client.db.getSchema();
expect(schema).toBeDefined();
});
it("should insert and query data", async () => {
const client = await createTestClient();
// Create table
await client.db.createTable(
`CREATE TABLE ${tableName} (id INTEGER PRIMARY KEY, name TEXT, email TEXT)`
);
// Insert data
const result = await client.db.exec(
`INSERT INTO ${tableName} (name, email) VALUES (?, ?)`,
["Alice", "alice@example.com"]
);
expect(result.rows_affected).toBeGreaterThan(0);
// Query data
const rows = await client.db.query(
`SELECT * FROM ${tableName} WHERE email = ?`,
["alice@example.com"]
);
expect(rows).toHaveLength(1);
expect(rows[0].name).toBe("Alice");
});
it("should use find() and findOne()", async () => {
const client = await createTestClient();
// Create table
await client.db.createTable(
`CREATE TABLE ${tableName} (id INTEGER PRIMARY KEY, name TEXT, email TEXT)`
);
// Insert data
await client.db.exec(
`INSERT INTO ${tableName} (name, email) VALUES (?, ?)`,
["Bob", "bob@example.com"]
);
// Find one
const bob = await client.db.findOne(tableName, {
email: "bob@example.com",
});
expect(bob).toBeDefined();
expect(bob?.name).toBe("Bob");
// Find all
const all = await client.db.find(tableName, {});
expect(all.length).toBeGreaterThan(0);
});
it("should use QueryBuilder", async () => {
const client = await createTestClient();
// Create table
await client.db.createTable(
`CREATE TABLE ${tableName} (id INTEGER PRIMARY KEY, name TEXT, email TEXT, active INTEGER)`
);
// Insert test data
await client.db.exec(
`INSERT INTO ${tableName} (name, email, active) VALUES (?, ?, ?)`,
["Charlie", "charlie@example.com", 1]
);
await client.db.exec(
`INSERT INTO ${tableName} (name, email, active) VALUES (?, ?, ?)`,
["Diana", "diana@example.com", 0]
);
// Query with builder
const qb = client.db.createQueryBuilder(tableName);
const active = await qb
.where("active = ?", [1])
.orderBy("name")
.getMany();
expect(active.length).toBeGreaterThan(0);
expect(active[0].name).toBe("Charlie");
});
it("should use Repository for save/remove", async () => {
const client = await createTestClient();
// Create table
await client.db.createTable(
`CREATE TABLE ${tableName} (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, email TEXT)`
);
const repo = client.db.repository<{
id?: number;
name: string;
email: string;
}>(tableName);
// Save (insert)
const entity = { name: "Eve", email: "eve@example.com" };
await repo.save(entity);
expect(entity.id).toBeDefined();
// Find one
const found = await repo.findOne({ email: "eve@example.com" });
expect(found).toBeDefined();
expect(found?.name).toBe("Eve");
// Update
if (found) {
found.name = "Eve Updated";
await repo.save(found);
}
// Verify update
const updated = await repo.findOne({ id: entity.id });
expect(updated?.name).toBe("Eve Updated");
// Remove
if (updated) {
await repo.remove(updated);
}
// Verify deletion
const deleted = await repo.findOne({ id: entity.id });
expect(deleted).toBeNull();
});
});