Skip to main content
Glama

DevDb MCP Server

sqlite.test.ts6.59 kB
import * as assert from 'assert'; import { SqliteEngine } from '../../../database-engines/sqlite-engine'; import { SerializedMutation } from '../../../types'; describe('Sqlite Tests', () => { it('should return foreign key definitions', async () => { let engine = new SqliteEngine let connection = (new SqliteEngine()).getConnection()!; await engine?.raw(`DROP TABLE IF EXISTS ChildTable`); await engine?.raw(`DROP TABLE IF EXISTS ParentTable`); // Create two tables with a foreign key relationship for testing await engine.raw(` CREATE TABLE ParentTable ( id INTEGER PRIMARY KEY AUTOINCREMENT ) `); await engine.raw(` CREATE TABLE ChildTable ( id INTEGER PRIMARY KEY AUTOINCREMENT, parentId INTEGER, FOREIGN KEY(parentId) REFERENCES ParentTable(id) ) `); const columns = await engine.getColumns('ChildTable'); const foreignKeyColumn = columns.find((column: { name: string }) => column.name === 'parentId'); assert.strictEqual(foreignKeyColumn?.foreignKey?.table, 'ParentTable'); engine.destroy(); }); describe('SqliteEngine Tests', () => { let engine: SqliteEngine; before(async function () { engine = new SqliteEngine(); }); beforeEach(async () => { await engine?.raw(`DROP TABLE IF EXISTS products`); }); afterEach(async () => { const tables = await engine.getTables(); for (const table of tables) { await engine?.raw(`DROP TABLE ${table}`); } }); it('should return table names', async () => { await engine?.raw(` CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER ) `); await engine?.raw(` CREATE TABLE products ( id INTEGER PRIMARY KEY, name TEXT, price INTEGER ) `); const tables = await engine.getTables(); assert.deepStrictEqual(tables, ['products', 'users']); }); it('should return column definitions', async () => { await engine?.raw(` CREATE TABLE users ( id INTEGER PRIMARY KEY NOT NULL, name TEXT, age INTEGER ) `); const columns = await engine.getColumns('users'); assert.deepStrictEqual(columns, [ { name: 'id', type: 'INTEGER', isPrimaryKey: true, isNumeric: true, isNullable: false, foreignKey: undefined, isEditable: true, isPlainTextType: false }, { name: 'name', type: 'TEXT', isPrimaryKey: false, isNumeric: false, isNullable: true, foreignKey: undefined, isEditable: true, isPlainTextType: true }, { name: 'age', type: 'INTEGER', isPrimaryKey: false, isNumeric: true, isNullable: true, foreignKey: undefined, isEditable: true, isPlainTextType: false } ]); }); it('should return total rows', async () => { await engine?.raw(` CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER ) `); await engine?.raw(` INSERT INTO users (name, age) VALUES ('John', 30), ('Jane', 25), ('Bob', 40) `); const totalRows = await engine.getTotalRows('users', []); assert.strictEqual(totalRows, 3); }); it('should return rows', async () => { await engine?.raw(` CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER ) `); await engine?.raw(` INSERT INTO users (name, age) VALUES ('John', 30), ('Jane', 25), ('Bob', 40) `); const rows = await engine.getRows('users', await engine.getColumns('users'), 2, 0); assert.deepStrictEqual(rows?.rows, [ { id: 1, name: 'John', age: 30 }, { id: 2, name: 'Jane', age: 25 } ]); }); it('should save changes', async () => { await engine?.raw(` CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER ) `); await engine?.raw(` INSERT INTO users (name, age) VALUES ('John', 30) `); const mutation: SerializedMutation = { type: 'cell-update', id: '1', tabId: 'abc', column: { name: 'age', type: 'INTEGER', isPlainTextType: true, isNumeric: true, isNullable: true, isEditable: false, isPrimaryKey: false }, newValue: 31, primaryKey: 1, primaryKeyColumn: 'id', table: 'users' }; await engine.commitChange(mutation, await engine.transaction()); const rows = await engine.getRows('users', await engine.getColumns('users'), 1, 0); assert.strictEqual(rows?.rows[0].age, 31); }); it('should return table creation SQL', async () => { await engine?.raw(` CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER ) `); const creationSql = (await engine.getTableCreationSql('users')) // make single line by removing newlines and tabs, and turn all spaces into single spaces .replace(/\n|\t/g, '') .replace(/\s+/g, ' ') .trim(); assert.strictEqual(creationSql, 'CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)'); }); it('should return rows with where clause', async () => { await engine?.raw(` CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER ) `); await engine?.raw(` INSERT INTO users (name, age) VALUES ('Jane', 25), ('John', 30), ('Bob', 40), ('Alice', 30) `); const columns = await engine.getColumns('users') // Test filtering by age const whereClause = { age: 30 }; const rows = await engine.getRows('users', columns, 10, 0, whereClause); assert.strictEqual(rows?.rows.length, 2); assert.deepStrictEqual(rows?.rows.map(r => r.name).sort(), ['Alice', 'John']); // Test filtering by name const nameWhereClause = { name: 'Bob' }; const bobRows = await engine.getRows('users', columns, 10, 0, nameWhereClause); assert.strictEqual(bobRows?.rows.length, 1); assert.strictEqual(bobRows?.rows[0].age, 40); }); it('should return version information', async () => { const version = await engine.getVersion(); assert.strictEqual(Number(version.split('.').join('')) >= 10, true); }); after(async function () { engine?.destroy(); }); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/damms005/devdb-vscode'

If you have feedback or need assistance with the MCP directory API, please join our Discord server