Skip to content

Commit 0fab9b5

Browse files
committed
test(serve, int-test): test query from pg-mem
1 parent b65d1dd commit 0fab9b5

File tree

8 files changed

+1153
-19
lines changed

8 files changed

+1153
-19
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"from2": "^2.3.0",
5757
"jest": "27.5.1",
5858
"nx": "14.0.3",
59+
"pg-mem": "^2.6.3",
5960
"prettier": "^2.5.1",
6061
"supertest": "^6.2.3",
6162
"ts-essentials": "^9.1.2",

packages/integration-testing/src/example1/buildAndServe.spec.ts

+28-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { VulcanBuilder, IBuildOptions } from '@vulcan-sql/build';
22
import { VulcanServer, ServeConfig, APIProviderType } from '@vulcan-sql/serve';
33
import * as path from 'path';
4+
import * as supertest from 'supertest';
45

56
const projectConfig: ServeConfig & IBuildOptions = {
67
name: 'example project 1',
@@ -24,12 +25,36 @@ const projectConfig: ServeConfig & IBuildOptions = {
2425
folderPath: __dirname,
2526
},
2627
types: [APIProviderType.RESTFUL],
28+
executor: {
29+
type: 'pg-mem',
30+
},
31+
extensions: {
32+
mockEx: path.resolve(__dirname, '..', 'mockExtensions'),
33+
},
34+
'rate-limit': {
35+
interval: { min: 1 },
36+
max: 10000,
37+
},
2738
};
2839

40+
let server: VulcanServer;
41+
42+
afterEach(async () => {
43+
await server.close();
44+
});
45+
2946
it('Example1: Build and server should work', async () => {
3047
const builder = new VulcanBuilder();
3148
await builder.build(projectConfig);
32-
const server = new VulcanServer(projectConfig);
33-
await server.start(3000);
34-
await server.close();
49+
server = new VulcanServer(projectConfig);
50+
const httpServer = await server.start(3000);
51+
52+
const agent = supertest(httpServer);
53+
const result = await agent.get(
54+
'/user?id=436193eb-f686-4105-ad7b-b5945276c14a'
55+
);
56+
expect(result.body).toContainEqual({
57+
id: '436193eb-f686-4105-ad7b-b5945276c14a',
58+
name: 'ivan',
59+
});
3560
}, 10000);

packages/integration-testing/src/example1/sqls/user.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
url: /user/:id
1+
url: /user
22
request:
33
- fieldName: id
4-
fieldIn: path
4+
fieldIn: query
55
description: user id
66
validators:
77
- uuid
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './mockDb';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import {
2+
DataResult,
3+
DataSource,
4+
ExecuteOptions,
5+
VulcanExtensionId,
6+
} from '@vulcan-sql/core';
7+
import { newDb } from 'pg-mem';
8+
import { Stream } from 'stream';
9+
10+
const db = newDb();
11+
db.public.many(`create table users(id uuid, name varchar);
12+
insert into users values ('436193eb-f686-4105-ad7b-b5945276c14a','ivan');
13+
`);
14+
15+
@VulcanExtensionId('pg-mem')
16+
export class MockDataSource extends DataSource {
17+
public async execute(options: ExecuteOptions): Promise<DataResult> {
18+
const data = db.public.many(options.statement);
19+
const readStream = new Stream.Readable({
20+
objectMode: true,
21+
read: () => null,
22+
});
23+
data.forEach((r) => readStream.push(r));
24+
readStream.push(null);
25+
return {
26+
getColumns: () => {
27+
return [];
28+
},
29+
getData: () => {
30+
return readStream;
31+
},
32+
};
33+
}
34+
}

packages/serve/src/lib/route/route-component/baseRoute.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ export abstract class BaseRoute implements IRoute {
5252
const { reqParams } = transformed;
5353
// could template name or template path, use for template engine
5454
const { templateSource } = this.apiSchema;
55-
const result = await this.templateEngine.execute(templateSource, reqParams);
55+
const result = await this.templateEngine.execute(templateSource, {
56+
context: { params: reqParams },
57+
});
5658
return result;
5759
}
5860
}

packages/serve/src/lib/route/route-component/restfulRoute.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ export class RestfulRoute extends BaseRoute {
3434

3535
public async respond(ctx: KoaRouterContext) {
3636
const transformed = await this.prepare(ctx);
37-
await this.handle(transformed);
38-
// TODO: get template engine handled result and return response by checking API schema
37+
const result = await this.handle(transformed);
3938
ctx.response.body = {
40-
...transformed,
39+
data: result.getData(),
40+
columns: result.getColumns(),
4141
};
4242
}
4343

0 commit comments

Comments
 (0)