test: test-server package

This commit is contained in:
Guillaume Chau
2023-06-12 15:11:42 +02:00
parent 722fa0ff89
commit f1ebe703d5
8 changed files with 193 additions and 154 deletions
+4 -12
View File
@@ -10,33 +10,25 @@
"test:e2e:client": "vue-cli-service test:e2e --mode production --headless",
"test:e2e:dev": "start-server-and-test api:dev 'http-get://localhost:4042/graphql?query=%7B__typename%7D' test:e2e:dev:client",
"test:e2e:dev:client": "vue-cli-service test:e2e --mode development",
"api": "node server.mjs --simulate-latency 100",
"api:dev": "node server.mjs --simulate-latency 500"
"api": "test-server --simulate-latency 100",
"api:dev": "test-server --simulate-latency 500"
},
"dependencies": {
"@apollo/client": "^3.7.7",
"@apollo/server": "^4.7.3",
"@graphql-tools/schema": "^10.0.0",
"@vue/apollo-composable": "workspace:*",
"@vue/apollo-util": "workspace:*",
"body-parser": "^1.20.2",
"core-js": "^3.23.2",
"cors": "^2.8.5",
"express": "^4.18.1",
"graphql": "^16.6.0",
"graphql-subscriptions": "^2.0.0",
"graphql-tag": "^2.12.6",
"graphql-ws": "^5.13.1",
"regenerator-runtime": "^0.13.9",
"shortid": "^2.2.16",
"test-server": "workspace:*",
"vue": "^3.2.37",
"vue-demi": "^0.13.1",
"vue-router": "^4.0.16",
"ws": "^8.13.0"
"vue-router": "^4.0.16"
},
"devDependencies": {
"@babel/core": "^7.18.5",
"@types/shortid": "^0.0.29",
"@vue/cli-plugin-babel": "^5.0.6",
"@vue/cli-plugin-e2e-cypress": "^5.0.6",
"@vue/cli-plugin-typescript": "^5.0.6",
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env node
'use strict'
import './src/index.mjs'
+24
View File
@@ -0,0 +1,24 @@
{
"name": "test-server",
"version": "4.0.0-alpha.16",
"private": true,
"bin": {
"test-server": "./bin.mjs"
},
"dependencies": {
"@apollo/server": "^4.7.3",
"@graphql-tools/schema": "^10.0.0",
"body-parser": "^1.20.2",
"cors": "^2.8.5",
"express": "^4.18.1",
"graphql": "^16.6.0",
"graphql-subscriptions": "^2.0.0",
"graphql-tag": "^2.12.6",
"graphql-ws": "^5.13.1",
"shortid": "^2.2.16",
"ws": "^8.13.0"
},
"devDependencies": {
"@types/shortid": "^0.0.29"
}
}
+18
View File
@@ -0,0 +1,18 @@
export let channels = []
export function resetDatabase () {
channels = [
{
id: 'general',
label: 'General',
messages: [],
},
{
id: 'random',
label: 'Random',
messages: [],
},
]
}
resetDatabase()
+64
View File
@@ -0,0 +1,64 @@
import { createServer } from 'node:http'
import express from 'express'
import cors from 'cors'
import bodyParser from 'body-parser'
import { ApolloServer } from '@apollo/server'
import { expressMiddleware } from '@apollo/server/express4'
import { WebSocketServer } from 'ws'
import { useServer } from 'graphql-ws/lib/use/ws'
import { schema } from './schema.mjs'
import { resetDatabase } from './data.mjs'
const app = express()
app.use(cors('*'))
app.use(bodyParser.json())
app.get('/_reset', (req, res) => {
resetDatabase()
res.status(200).end()
})
const server = new ApolloServer({
schema,
context: () => new Promise(resolve => {
setTimeout(() => resolve({}), 50)
}),
plugins: [
// Proper shutdown for the WebSocket server.
{
async serverWillStart () {
return {
async drainServer () {
await serverCleanup.dispose()
},
}
},
},
],
csrfPrevention: false,
})
await server.start()
app.use('/graphql', expressMiddleware(server))
const httpServer = createServer(app)
// Websocket
const wsServer = new WebSocketServer({
server: httpServer,
path: '/graphql',
})
const serverCleanup = useServer({
schema,
}, wsServer)
httpServer.listen({
port: 4042,
}, () => {
console.log('🚀 Server ready at http://localhost:4042')
})
@@ -1,37 +1,11 @@
import { createServer } from 'node:http'
import express from 'express'
import cors from 'cors'
import bodyParser from 'body-parser'
import { ApolloServer } from '@apollo/server'
import { expressMiddleware } from '@apollo/server/express4'
import { makeExecutableSchema } from '@graphql-tools/schema'
import { WebSocketServer } from 'ws'
import { useServer } from 'graphql-ws/lib/use/ws'
import { PubSub, withFilter } from 'graphql-subscriptions'
import shortid from 'shortid'
import gql from 'graphql-tag'
import { GraphQLError } from 'graphql'
import { channels } from './data.mjs'
import { simulateLatency, GraphQLErrorWithCode } from './util.mjs'
const shouldSimulateLatency = process.argv.includes('--simulate-latency')
let latency = 500
if (shouldSimulateLatency) {
const index = process.argv.indexOf('--simulate-latency')
if (index !== -1 && process.argv.length > index + 1) {
latency = parseInt(process.argv[index + 1])
}
}
export class GraphQLErrorWithCode extends GraphQLError {
constructor (message, code, extensions) {
super(message, {
extensions: {
code,
...extensions,
},
})
}
}
const pubsub = new PubSub()
const typeDefs = gql`
type Channel {
@@ -77,37 +51,6 @@ type Subscription {
}
`
const pubsub = new PubSub()
let channels = []
function resetDatabase () {
channels = [
{
id: 'general',
label: 'General',
messages: [],
},
{
id: 'random',
label: 'Random',
messages: [],
},
]
}
resetDatabase()
function simulateLatency () {
return new Promise(resolve => {
if (shouldSimulateLatency) {
setTimeout(resolve, latency)
} else {
resolve()
}
})
}
const resolvers = {
Query: {
hello: () => simulateLatency().then(() => 'Hello world!'),
@@ -168,61 +111,7 @@ const resolvers = {
},
}
const schema = makeExecutableSchema({
export const schema = makeExecutableSchema({
typeDefs,
resolvers,
})
const app = express()
app.use(cors('*'))
app.use(bodyParser.json())
app.get('/_reset', (req, res) => {
resetDatabase()
res.status(200).end()
})
const server = new ApolloServer({
schema,
context: () => new Promise(resolve => {
setTimeout(() => resolve({}), 50)
}),
plugins: [
// Proper shutdown for the WebSocket server.
{
async serverWillStart () {
return {
async drainServer () {
await serverCleanup.dispose()
},
}
},
},
],
csrfPrevention: false,
})
await server.start()
app.use('/graphql', expressMiddleware(server))
const httpServer = createServer(app)
// Websocket
const wsServer = new WebSocketServer({
server: httpServer,
path: '/graphql',
})
const serverCleanup = useServer({
schema,
}, wsServer)
httpServer.listen({
port: 4042,
}, () => {
console.log('🚀 Server ready at http://localhost:4042')
})
+32
View File
@@ -0,0 +1,32 @@
import { GraphQLError } from 'graphql'
const shouldSimulateLatency = process.argv.includes('--simulate-latency')
let latency = 500
if (shouldSimulateLatency) {
const index = process.argv.indexOf('--simulate-latency')
if (index !== -1 && process.argv.length > index + 1) {
latency = parseInt(process.argv[index + 1])
}
}
export function simulateLatency () {
return new Promise(resolve => {
if (shouldSimulateLatency) {
setTimeout(resolve, latency)
} else {
resolve()
}
})
}
export class GraphQLErrorWithCode extends GraphQLError {
constructor (message, code, extensions) {
super(message, {
extensions: {
code,
...extensions,
},
})
}
}
+43 -27
View File
@@ -178,36 +178,18 @@ importers:
'@apollo/client':
specifier: ^3.7.7
version: 3.7.9(graphql-ws@5.13.1)(graphql@16.0.0)
'@apollo/server':
specifier: ^4.7.3
version: 4.7.3(graphql@16.0.0)
'@graphql-tools/schema':
specifier: ^10.0.0
version: 10.0.0(graphql@16.0.0)
'@vue/apollo-composable':
specifier: workspace:*
version: link:../vue-apollo-composable
'@vue/apollo-util':
specifier: workspace:*
version: link:../vue-apollo-util
body-parser:
specifier: ^1.20.2
version: 1.20.2
core-js:
specifier: ^3.23.2
version: 3.28.0
cors:
specifier: ^2.8.5
version: 2.8.5
express:
specifier: ^4.18.1
version: 4.18.2
graphql:
specifier: ^16
version: 16.0.0
graphql-subscriptions:
specifier: ^2.0.0
version: 2.0.0(graphql@16.0.0)
graphql-tag:
specifier: ^2.12.6
version: 2.12.6(graphql@16.0.0)
@@ -217,9 +199,9 @@ importers:
regenerator-runtime:
specifier: ^0.13.9
version: 0.13.11
shortid:
specifier: ^2.2.16
version: 2.2.16
test-server:
specifier: workspace:*
version: link:../test-server
vue:
specifier: ^3.2.37
version: 3.2.47
@@ -229,16 +211,10 @@ importers:
vue-router:
specifier: ^4.0.16
version: 4.1.6(vue@3.2.47)
ws:
specifier: ^8.13.0
version: 8.13.0
devDependencies:
'@babel/core':
specifier: ^7.18.5
version: 7.21.0
'@types/shortid':
specifier: ^0.0.29
version: 0.0.29
'@vue/cli-plugin-babel':
specifier: ^5.0.6
version: 5.0.8(@vue/cli-service@5.0.8)(core-js@3.28.0)(esbuild@0.8.57)(vue@3.2.47)
@@ -267,6 +243,46 @@ importers:
specifier: ^1.9.6
version: 1.9.6
packages/test-server:
dependencies:
'@apollo/server':
specifier: ^4.7.3
version: 4.7.3(graphql@16.0.0)
'@graphql-tools/schema':
specifier: ^10.0.0
version: 10.0.0(graphql@16.0.0)
body-parser:
specifier: ^1.20.2
version: 1.20.2
cors:
specifier: ^2.8.5
version: 2.8.5
express:
specifier: ^4.18.1
version: 4.18.2
graphql:
specifier: ^16
version: 16.0.0
graphql-subscriptions:
specifier: ^2.0.0
version: 2.0.0(graphql@16.0.0)
graphql-tag:
specifier: ^2.12.6
version: 2.12.6(graphql@16.0.0)
graphql-ws:
specifier: ^5.13.1
version: 5.13.1(graphql@16.0.0)
shortid:
specifier: ^2.2.16
version: 2.2.16
ws:
specifier: ^8.13.0
version: 8.13.0
devDependencies:
'@types/shortid':
specifier: ^0.0.29
version: 0.0.29
packages/vue-apollo-components:
dependencies:
'@vue/apollo-option':