-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathtinyrpc.test.ts
102 lines (87 loc) · 2.08 KB
/
tinyrpc.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
* @see https://trpc.io/blog/tinyrpc-client
*/
import '../server/___packages';
import '@trpc/server';
import { initTRPC, TRPCError } from '@trpc/server';
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import fetch from 'node-fetch';
import { z } from 'zod';
import { createTinyRPCClient } from './tinyrpc';
globalThis.fetch = fetch as any;
const t = initTRPC.create({});
const router = t.router;
const publicProcedure = t.procedure;
const posts = [
{
id: '1',
title: 'Hello World',
},
];
const appRouter = router({
listPosts: publicProcedure.query(() => posts),
addPost: publicProcedure
.input(
z.object({
title: z.string(),
}),
)
.mutation((opts) => {
const id = Math.random().toString();
posts.push({
id,
title: opts.input.title,
});
return {
id,
};
}),
byId: publicProcedure
.input(
z.object({
id: z.string(),
}),
)
.query((opts) => {
const post = posts.find((p) => p.id === opts.input.id);
if (!post) throw new TRPCError({ code: 'NOT_FOUND' });
return post;
}),
});
type AppRouter = typeof appRouter;
function createServer() {
const app = createHTTPServer({
router: appRouter,
});
const { port } = app.listen(0);
return {
port: port!,
async close() {
await new Promise((resolve) => {
app.server.close(resolve);
});
},
};
}
test('tinytrpc', async () => {
const server = createServer();
const trpc = createTinyRPCClient<AppRouter>(
`http://localhost:${server.port}`,
);
const posts = await trpc.listPosts.query();
expect(posts).toMatchInlineSnapshot(`
Array [
Object {
"id": "1",
"title": "Hello World",
},
]
`);
const title = 'Hello from test';
const addedPost = await trpc.addPost.mutate({ title });
const post = await trpc.byId.query({ id: addedPost.id });
expect(post).not.toBeFalsy();
expect(post.title).toBe(title);
expect(await trpc.listPosts.query()).toHaveLength(posts.length + 1);
await server.close();
});