Skip to content

Commit c5e44f3

Browse files
committed
🎉 init test
1 parent 958de4c commit c5e44f3

9 files changed

Lines changed: 2258 additions & 37 deletions

File tree

__tests__/ddl.spec.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { getDBConfig, getSpace } from './utils'
2+
import { QueryResult, SQParam } from '../src/skytable'
3+
4+
const testSpace = 'ddltestspace';
5+
6+
describe('DDL', () => {
7+
let db: any;
8+
const dbConfig = getDBConfig();
9+
10+
beforeAll(async () => {
11+
db = await dbConfig.connect()
12+
})
13+
14+
afterAll(async () => {
15+
dbConfig.disconnect()
16+
})
17+
18+
it('CREATE SPACE', async () => {
19+
const spaceName = `${testSpace + Date.now()}`;
20+
try {
21+
expect(await db.query(`CREATE SPACE ${spaceName}`)).toBe(null);
22+
} finally {
23+
await db.query(`DROP SPACE ALLOW NOT EMPTY ${spaceName}`);
24+
}
25+
})
26+
27+
// FIXME need to fix
28+
// it('ALTER SPACE', async () => {
29+
// const spaceName = `${testSpace + Date.now()}`;
30+
// try {
31+
// const isNotCreated = await db.query(`CREATE SPACE IF NOT EXISTS ${spaceName}`);
32+
33+
// if (isNotCreated) {
34+
// await db.query(`CREATE SPACE ${spaceName} WITH { property_name: ? }`, 1234);
35+
// }
36+
37+
// expect(await db.query(`ALTER SPACE ${spaceName} WITH { property_name: ? }`, 456)).toBe(null);
38+
// } finally {
39+
// await db.query(`DROP SPACE ALLOW NOT EMPTY ${spaceName}`);
40+
// }
41+
// })
42+
})

__tests__/dml.spec.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { getDBConfig, getTable } from './utils'
2+
3+
describe('DDL', () => {
4+
let db: any;
5+
const dbConfig = getDBConfig();
6+
7+
beforeAll(async () => {
8+
db = await dbConfig.connect()
9+
})
10+
11+
afterAll(async () => {
12+
dbConfig.disconnect()
13+
})
14+
15+
it('null type', async () => {
16+
const tableName = await getTable(db);
17+
18+
await db.query(`CREATE MODEL ${tableName}(username: string, null email_id: string)`)
19+
20+
await db.query(`INSERT INTO ${tableName}(?, ?)`, 'test', null)
21+
22+
expect(await db.query(`SELECT username,email_id FROM ${tableName} WHERE username = ?`, 'test')).toEqual([
23+
['test', null]
24+
])
25+
})
26+
27+
it('int number type', async () => {
28+
const tableName = await getTable(db);
29+
30+
await db.query(`CREATE MODEL ${tableName}(u8: uint8, u16: uint16, u32: uint32, u32: uint64)`)
31+
32+
await db.query(`INSERT INTO ${tableName}(?, ?, ?, ?)`, 1, 2, 3312321, BigInt(478787872837218382))
33+
34+
expect(await db.query(`SELECT * FROM ${tableName} WHERE u8 = ?`, 1)).toEqual([
35+
[1, 2, 3312321, BigInt(478787872837218382)]
36+
])
37+
})
38+
});

__tests__/utils.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Config } from "../src";
2+
3+
export function getDBConfig() {
4+
return new Config(
5+
'root',
6+
'admin123456123456',
7+
'127.0.0.1',
8+
2003
9+
);
10+
}
11+
12+
export async function getSpace(db: any, space = 'testspace') {
13+
const isNotCreated = await db.query(`CREATE SPACE IF NOT EXISTS ${space}`);
14+
15+
if (isNotCreated) {
16+
await db.query(`CREATE SPACE ${space}`);
17+
}
18+
19+
await db.query(`USE ${space}`);
20+
21+
afterAll(async () => {
22+
await db.query(`DROP SPACE ALLOW NOT EMPTY ${space}`);
23+
})
24+
25+
return space;
26+
}
27+
28+
export async function getTable(db: any) {
29+
const space = await getSpace(db, `testTableSpace${Date.now()}`);
30+
const isNotCreated = await db.query(`CREATE SPACE IF NOT EXISTS ${space}`);
31+
32+
if (isNotCreated) {
33+
await db.query(`CREATE SPACE ${space}`);
34+
}
35+
36+
await db.query(`USE ${space}`);
37+
38+
afterAll(async () => {
39+
await db.query(`DROP SPACE ALLOW NOT EMPTY ${space}`);
40+
})
41+
42+
return `${space}.testTable${Date.now()}`;
43+
}

jest.config.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module.exports = {
2+
preset: 'ts-jest',
3+
testEnvironment: 'node',
4+
globals: {
5+
'ts-jest': {
6+
tsconfig: 'tsconfig.json'
7+
}
8+
},
9+
testMatch: ['**/?*.(spec|test|e2e).(j|t)s?(x)'],
10+
testPathIgnorePatterns: ['/node_modules/', '/dist/'],
11+
}

package.json

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,35 @@
66
"author": "Sayan Nandan <nandansayan@outlook.com>",
77
"license": "Apache-2.0",
88
"repository": {
9-
"url": "https://github.com/skytable/client-nodejs"
10-
},
11-
"bugs": {
12-
"url": "https://github.com/skytable/client-nodejs/issues"
13-
},
9+
"url": "https://github.com/skytable/client-nodejs"
10+
},
11+
"bugs": {
12+
"url": "https://github.com/skytable/client-nodejs/issues"
13+
},
1414
"scripts": {
1515
"build": "tsc",
16-
"test": "npx tsx examples/test.ts",
16+
"debugger": "npx tsx examples/test.ts",
17+
"test": "jest",
1718
"formatting": "prettier src --check",
1819
"prettier:fix": "prettier src --write"
1920
},
2021
"dependencies": {
2122
"@types/node": "^20.10.4"
2223
},
2324
"devDependencies": {
25+
"@types/jest": "^29.5.11",
26+
"jest": "^29.7.0",
2427
"nodemon": "^3.0.2",
2528
"prettier": "^3.1.1",
29+
"ts-jest": "^29.1.1",
2630
"tsx": "^4.6.2",
2731
"typescript": "^5.3.3"
2832
},
2933
"publishConfig": {
30-
"access": "public"
31-
},
34+
"access": "public"
35+
},
3236
"keywords": [
33-
"skytable",
34-
"skytable-client"
35-
]
37+
"skytable",
38+
"skytable-client"
39+
]
3640
}

src/protocol.ts

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@ const PARAMS_TYPE = {
1212
};
1313

1414
const RESPONSES_RESULT = {
15+
NULL: 0,
16+
BOOL: 1,
17+
U8INT: 2,
18+
U16INT: 3,
19+
U32INT: 4,
20+
U64INT: 5,
21+
S8INT: 6,
22+
S16INT: 7,
23+
S32INT: 8,
24+
S64INT: 9,
25+
FLOAT32: 10,
26+
FLOAT64: 11,
27+
BINARY: 12,
28+
STRING: 13,
29+
LIST: 14,
1530
ERROR: 0x10,
1631
ROW: 0x11,
1732
EMPTY: 0x12,
@@ -23,6 +38,10 @@ const HANDSHAKE_RESULT = {
2338
ERROR: 'H01',
2439
};
2540

41+
function isResponsesResult(type: number): boolean {
42+
return Object.values(RESPONSES_RESULT).includes(type);
43+
}
44+
2645
function isFloat(number: number | string): boolean {
2746
return Number.isFinite(number) && !Number.isInteger(number);
2847
}
@@ -114,31 +133,31 @@ function parseSkytableData(buffer: Buffer): Column[] {
114133
buffer = buffer.subarray(1);
115134

116135
switch (type) {
117-
case 0: // Null
136+
case RESPONSES_RESULT.NULL: // Null
118137
return parseNext(null, buffer.subarray(0));
119-
case 1: // Bool
138+
case RESPONSES_RESULT.BOOL: // Bool
120139
return parseNext(Boolean(buffer.readUInt8(0)), buffer.subarray(1));
121-
case 2: // 8-bit Unsigned Integer
140+
case RESPONSES_RESULT.U8INT: // 8-bit Unsigned Integer
122141
return parseNumberNext(Number, buffer);
123-
case 3: // 16-bit Unsigned Integer
142+
case RESPONSES_RESULT.U16INT: // 16-bit Unsigned Integer
124143
return parseNumberNext(Number, buffer);
125-
case 4: // 32-bit Unsigned Integer
144+
case RESPONSES_RESULT.U32INT: // 32-bit Unsigned Integer
126145
return parseNumberNext(Number, buffer);
127-
case 5: // 64-bit Unsigned Integer
146+
case RESPONSES_RESULT.U64INT: // 64-bit Unsigned Integer
128147
return parseNumberNext<bigint>(BigInt, buffer);
129-
case 6: // 8-bit Signed Integer
148+
case RESPONSES_RESULT.S8INT: // 8-bit Signed Integer
130149
return parseNumberNext(Number, buffer);
131-
case 7: // 16-bit Signed Integer
150+
case RESPONSES_RESULT.S16INT: // 16-bit Signed Integer
132151
return parseNumberNext(Number, buffer);
133-
case 8: // 32-bit Signed Integer
152+
case RESPONSES_RESULT.S32INT: // 32-bit Signed Integer
134153
return parseNumberNext(Number, buffer);
135-
case 9: // 64-bit Signed Integer
154+
case RESPONSES_RESULT.S64INT: // 64-bit Signed Integer
136155
return parseNumberNext<bigint>(BigInt, buffer);
137-
case 10: // f32
156+
case RESPONSES_RESULT.FLOAT32: // f32
138157
return parseNumberNext(Number.parseFloat, buffer);
139-
case 11: // f64
158+
case RESPONSES_RESULT.FLOAT64: // f64
140159
return parseNumberNext(Number.parseFloat, buffer);
141-
case 12: {
160+
case RESPONSES_RESULT.BINARY: {
142161
// Binary <size>\n<payload>,
143162
const sizeOffset = getFirstSplitOffset(buffer);
144163
const size = Number(buffer.subarray(0, sizeOffset).toString('utf-8'));
@@ -149,7 +168,7 @@ function parseSkytableData(buffer: Buffer): Column[] {
149168

150169
return parseNext(buffer.subarray(start, end), buffer.subarray(end));
151170
}
152-
case 13: {
171+
case RESPONSES_RESULT.STRING: {
153172
// String <size>\n<body>
154173
const sizeOffset = getFirstSplitOffset(buffer);
155174
const size = Number(buffer.subarray(0, sizeOffset).toString('utf-8'));
@@ -158,7 +177,7 @@ function parseSkytableData(buffer: Buffer): Column[] {
158177

159178
return parseNext(str, buffer.subarray(end));
160179
}
161-
case 14: {
180+
case RESPONSES_RESULT.LIST: {
162181
// List <size>\n<body>
163182
const sizeOffset = getFirstSplitOffset(buffer);
164183
const size = Number(buffer.subarray(0, sizeOffset).toString('utf-8'));
@@ -219,6 +238,11 @@ export function formatResponse(buffer: Buffer): QueryResult {
219238
`response error code: ${buffer.subarray(1, 2).readInt8()}`,
220239
);
221240
default:
241+
if (isResponsesResult(type)) {
242+
const result = parseSkytableData(buffer);
243+
// FIXME to be better
244+
return result?.[0];
245+
}
222246
throw new TypeError('unknown response type');
223247
}
224248
}

src/skytable.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export type Row = Column[];
2424

2525
export type Rows = Row[];
2626

27-
export type QueryResult = null | Row | Rows;
27+
export type QueryResult = Column | Row | Rows;
2828

2929
export function createSkytable(connection: Socket | TLSSocket) {
3030
const query = async (

tsconfig.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@
129129
]
130130
},
131131
"include": [
132-
"src/**/*.ts",
133-
"types/**/*.d.ts"
132+
"src/**/*.ts"
134133
]
135134
}

0 commit comments

Comments
 (0)