Skip to content

Commit f1ebe70

Browse files
committed
test: test-server package
1 parent 722fa0f commit f1ebe70

File tree

8 files changed

+193
-154
lines changed

8 files changed

+193
-154
lines changed

packages/test-e2e-composable-vue3/package.json

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,25 @@
1010
"test:e2e:client": "vue-cli-service test:e2e --mode production --headless",
1111
"test:e2e:dev": "start-server-and-test api:dev 'http-get://localhost:4042/graphql?query=%7B__typename%7D' test:e2e:dev:client",
1212
"test:e2e:dev:client": "vue-cli-service test:e2e --mode development",
13-
"api": "node server.mjs --simulate-latency 100",
14-
"api:dev": "node server.mjs --simulate-latency 500"
13+
"api": "test-server --simulate-latency 100",
14+
"api:dev": "test-server --simulate-latency 500"
1515
},
1616
"dependencies": {
1717
"@apollo/client": "^3.7.7",
18-
"@apollo/server": "^4.7.3",
19-
"@graphql-tools/schema": "^10.0.0",
2018
"@vue/apollo-composable": "workspace:*",
2119
"@vue/apollo-util": "workspace:*",
22-
"body-parser": "^1.20.2",
2320
"core-js": "^3.23.2",
24-
"cors": "^2.8.5",
25-
"express": "^4.18.1",
2621
"graphql": "^16.6.0",
27-
"graphql-subscriptions": "^2.0.0",
2822
"graphql-tag": "^2.12.6",
2923
"graphql-ws": "^5.13.1",
3024
"regenerator-runtime": "^0.13.9",
31-
"shortid": "^2.2.16",
25+
"test-server": "workspace:*",
3226
"vue": "^3.2.37",
3327
"vue-demi": "^0.13.1",
34-
"vue-router": "^4.0.16",
35-
"ws": "^8.13.0"
28+
"vue-router": "^4.0.16"
3629
},
3730
"devDependencies": {
3831
"@babel/core": "^7.18.5",
39-
"@types/shortid": "^0.0.29",
4032
"@vue/cli-plugin-babel": "^5.0.6",
4133
"@vue/cli-plugin-e2e-cypress": "^5.0.6",
4234
"@vue/cli-plugin-typescript": "^5.0.6",

packages/test-server/bin.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/usr/bin/env node
2+
'use strict'
3+
4+
import './src/index.mjs'

packages/test-server/package.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"name": "test-server",
3+
"version": "4.0.0-alpha.16",
4+
"private": true,
5+
"bin": {
6+
"test-server": "./bin.mjs"
7+
},
8+
"dependencies": {
9+
"@apollo/server": "^4.7.3",
10+
"@graphql-tools/schema": "^10.0.0",
11+
"body-parser": "^1.20.2",
12+
"cors": "^2.8.5",
13+
"express": "^4.18.1",
14+
"graphql": "^16.6.0",
15+
"graphql-subscriptions": "^2.0.0",
16+
"graphql-tag": "^2.12.6",
17+
"graphql-ws": "^5.13.1",
18+
"shortid": "^2.2.16",
19+
"ws": "^8.13.0"
20+
},
21+
"devDependencies": {
22+
"@types/shortid": "^0.0.29"
23+
}
24+
}

packages/test-server/src/data.mjs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
export let channels = []
2+
3+
export function resetDatabase () {
4+
channels = [
5+
{
6+
id: 'general',
7+
label: 'General',
8+
messages: [],
9+
},
10+
{
11+
id: 'random',
12+
label: 'Random',
13+
messages: [],
14+
},
15+
]
16+
}
17+
18+
resetDatabase()

packages/test-server/src/index.mjs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { createServer } from 'node:http'
2+
import express from 'express'
3+
import cors from 'cors'
4+
import bodyParser from 'body-parser'
5+
import { ApolloServer } from '@apollo/server'
6+
import { expressMiddleware } from '@apollo/server/express4'
7+
import { WebSocketServer } from 'ws'
8+
import { useServer } from 'graphql-ws/lib/use/ws'
9+
import { schema } from './schema.mjs'
10+
import { resetDatabase } from './data.mjs'
11+
12+
const app = express()
13+
14+
app.use(cors('*'))
15+
16+
app.use(bodyParser.json())
17+
18+
app.get('/_reset', (req, res) => {
19+
resetDatabase()
20+
res.status(200).end()
21+
})
22+
23+
const server = new ApolloServer({
24+
schema,
25+
context: () => new Promise(resolve => {
26+
setTimeout(() => resolve({}), 50)
27+
}),
28+
plugins: [
29+
// Proper shutdown for the WebSocket server.
30+
{
31+
async serverWillStart () {
32+
return {
33+
async drainServer () {
34+
await serverCleanup.dispose()
35+
},
36+
}
37+
},
38+
},
39+
],
40+
csrfPrevention: false,
41+
})
42+
43+
await server.start()
44+
45+
app.use('/graphql', expressMiddleware(server))
46+
47+
const httpServer = createServer(app)
48+
49+
// Websocket
50+
51+
const wsServer = new WebSocketServer({
52+
server: httpServer,
53+
path: '/graphql',
54+
})
55+
56+
const serverCleanup = useServer({
57+
schema,
58+
}, wsServer)
59+
60+
httpServer.listen({
61+
port: 4042,
62+
}, () => {
63+
console.log('🚀 Server ready at http://localhost:4042')
64+
})
Lines changed: 4 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,11 @@
1-
import { createServer } from 'node:http'
2-
import express from 'express'
3-
import cors from 'cors'
4-
import bodyParser from 'body-parser'
5-
import { ApolloServer } from '@apollo/server'
6-
import { expressMiddleware } from '@apollo/server/express4'
71
import { makeExecutableSchema } from '@graphql-tools/schema'
8-
import { WebSocketServer } from 'ws'
9-
import { useServer } from 'graphql-ws/lib/use/ws'
102
import { PubSub, withFilter } from 'graphql-subscriptions'
113
import shortid from 'shortid'
124
import gql from 'graphql-tag'
13-
import { GraphQLError } from 'graphql'
5+
import { channels } from './data.mjs'
6+
import { simulateLatency, GraphQLErrorWithCode } from './util.mjs'
147

15-
const shouldSimulateLatency = process.argv.includes('--simulate-latency')
16-
17-
let latency = 500
18-
if (shouldSimulateLatency) {
19-
const index = process.argv.indexOf('--simulate-latency')
20-
if (index !== -1 && process.argv.length > index + 1) {
21-
latency = parseInt(process.argv[index + 1])
22-
}
23-
}
24-
25-
export class GraphQLErrorWithCode extends GraphQLError {
26-
constructor (message, code, extensions) {
27-
super(message, {
28-
extensions: {
29-
code,
30-
...extensions,
31-
},
32-
})
33-
}
34-
}
8+
const pubsub = new PubSub()
359

3610
const typeDefs = gql`
3711
type Channel {
@@ -77,37 +51,6 @@ type Subscription {
7751
}
7852
`
7953

80-
const pubsub = new PubSub()
81-
82-
let channels = []
83-
84-
function resetDatabase () {
85-
channels = [
86-
{
87-
id: 'general',
88-
label: 'General',
89-
messages: [],
90-
},
91-
{
92-
id: 'random',
93-
label: 'Random',
94-
messages: [],
95-
},
96-
]
97-
}
98-
99-
resetDatabase()
100-
101-
function simulateLatency () {
102-
return new Promise(resolve => {
103-
if (shouldSimulateLatency) {
104-
setTimeout(resolve, latency)
105-
} else {
106-
resolve()
107-
}
108-
})
109-
}
110-
11154
const resolvers = {
11255
Query: {
11356
hello: () => simulateLatency().then(() => 'Hello world!'),
@@ -168,61 +111,7 @@ const resolvers = {
168111
},
169112
}
170113

171-
const schema = makeExecutableSchema({
114+
export const schema = makeExecutableSchema({
172115
typeDefs,
173116
resolvers,
174117
})
175-
176-
const app = express()
177-
178-
app.use(cors('*'))
179-
180-
app.use(bodyParser.json())
181-
182-
app.get('/_reset', (req, res) => {
183-
resetDatabase()
184-
res.status(200).end()
185-
})
186-
187-
const server = new ApolloServer({
188-
schema,
189-
context: () => new Promise(resolve => {
190-
setTimeout(() => resolve({}), 50)
191-
}),
192-
plugins: [
193-
// Proper shutdown for the WebSocket server.
194-
{
195-
async serverWillStart () {
196-
return {
197-
async drainServer () {
198-
await serverCleanup.dispose()
199-
},
200-
}
201-
},
202-
},
203-
],
204-
csrfPrevention: false,
205-
})
206-
207-
await server.start()
208-
209-
app.use('/graphql', expressMiddleware(server))
210-
211-
const httpServer = createServer(app)
212-
213-
// Websocket
214-
215-
const wsServer = new WebSocketServer({
216-
server: httpServer,
217-
path: '/graphql',
218-
})
219-
220-
const serverCleanup = useServer({
221-
schema,
222-
}, wsServer)
223-
224-
httpServer.listen({
225-
port: 4042,
226-
}, () => {
227-
console.log('🚀 Server ready at http://localhost:4042')
228-
})

packages/test-server/src/util.mjs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { GraphQLError } from 'graphql'
2+
3+
const shouldSimulateLatency = process.argv.includes('--simulate-latency')
4+
5+
let latency = 500
6+
if (shouldSimulateLatency) {
7+
const index = process.argv.indexOf('--simulate-latency')
8+
if (index !== -1 && process.argv.length > index + 1) {
9+
latency = parseInt(process.argv[index + 1])
10+
}
11+
}
12+
13+
export function simulateLatency () {
14+
return new Promise(resolve => {
15+
if (shouldSimulateLatency) {
16+
setTimeout(resolve, latency)
17+
} else {
18+
resolve()
19+
}
20+
})
21+
}
22+
23+
export class GraphQLErrorWithCode extends GraphQLError {
24+
constructor (message, code, extensions) {
25+
super(message, {
26+
extensions: {
27+
code,
28+
...extensions,
29+
},
30+
})
31+
}
32+
}

0 commit comments

Comments
 (0)