test: test-server package
This commit is contained in:
@@ -10,33 +10,25 @@
|
|||||||
"test:e2e:client": "vue-cli-service test:e2e --mode production --headless",
|
"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": "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",
|
"test:e2e:dev:client": "vue-cli-service test:e2e --mode development",
|
||||||
"api": "node server.mjs --simulate-latency 100",
|
"api": "test-server --simulate-latency 100",
|
||||||
"api:dev": "node server.mjs --simulate-latency 500"
|
"api:dev": "test-server --simulate-latency 500"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@apollo/client": "^3.7.7",
|
"@apollo/client": "^3.7.7",
|
||||||
"@apollo/server": "^4.7.3",
|
|
||||||
"@graphql-tools/schema": "^10.0.0",
|
|
||||||
"@vue/apollo-composable": "workspace:*",
|
"@vue/apollo-composable": "workspace:*",
|
||||||
"@vue/apollo-util": "workspace:*",
|
"@vue/apollo-util": "workspace:*",
|
||||||
"body-parser": "^1.20.2",
|
|
||||||
"core-js": "^3.23.2",
|
"core-js": "^3.23.2",
|
||||||
"cors": "^2.8.5",
|
|
||||||
"express": "^4.18.1",
|
|
||||||
"graphql": "^16.6.0",
|
"graphql": "^16.6.0",
|
||||||
"graphql-subscriptions": "^2.0.0",
|
|
||||||
"graphql-tag": "^2.12.6",
|
"graphql-tag": "^2.12.6",
|
||||||
"graphql-ws": "^5.13.1",
|
"graphql-ws": "^5.13.1",
|
||||||
"regenerator-runtime": "^0.13.9",
|
"regenerator-runtime": "^0.13.9",
|
||||||
"shortid": "^2.2.16",
|
"test-server": "workspace:*",
|
||||||
"vue": "^3.2.37",
|
"vue": "^3.2.37",
|
||||||
"vue-demi": "^0.13.1",
|
"vue-demi": "^0.13.1",
|
||||||
"vue-router": "^4.0.16",
|
"vue-router": "^4.0.16"
|
||||||
"ws": "^8.13.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.18.5",
|
"@babel/core": "^7.18.5",
|
||||||
"@types/shortid": "^0.0.29",
|
|
||||||
"@vue/cli-plugin-babel": "^5.0.6",
|
"@vue/cli-plugin-babel": "^5.0.6",
|
||||||
"@vue/cli-plugin-e2e-cypress": "^5.0.6",
|
"@vue/cli-plugin-e2e-cypress": "^5.0.6",
|
||||||
"@vue/cli-plugin-typescript": "^5.0.6",
|
"@vue/cli-plugin-typescript": "^5.0.6",
|
||||||
|
|||||||
Executable
+4
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
import './src/index.mjs'
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
export let channels = []
|
||||||
|
|
||||||
|
export function resetDatabase () {
|
||||||
|
channels = [
|
||||||
|
{
|
||||||
|
id: 'general',
|
||||||
|
label: 'General',
|
||||||
|
messages: [],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'random',
|
||||||
|
label: 'Random',
|
||||||
|
messages: [],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
resetDatabase()
|
||||||
@@ -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')
|
||||||
|
})
|
||||||
+4
-115
@@ -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 { makeExecutableSchema } from '@graphql-tools/schema'
|
||||||
import { WebSocketServer } from 'ws'
|
|
||||||
import { useServer } from 'graphql-ws/lib/use/ws'
|
|
||||||
import { PubSub, withFilter } from 'graphql-subscriptions'
|
import { PubSub, withFilter } from 'graphql-subscriptions'
|
||||||
import shortid from 'shortid'
|
import shortid from 'shortid'
|
||||||
import gql from 'graphql-tag'
|
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')
|
const pubsub = new PubSub()
|
||||||
|
|
||||||
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 typeDefs = gql`
|
const typeDefs = gql`
|
||||||
type Channel {
|
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 = {
|
const resolvers = {
|
||||||
Query: {
|
Query: {
|
||||||
hello: () => simulateLatency().then(() => 'Hello world!'),
|
hello: () => simulateLatency().then(() => 'Hello world!'),
|
||||||
@@ -168,61 +111,7 @@ const resolvers = {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
const schema = makeExecutableSchema({
|
export const schema = makeExecutableSchema({
|
||||||
typeDefs,
|
typeDefs,
|
||||||
resolvers,
|
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')
|
|
||||||
})
|
|
||||||
@@ -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,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Generated
+43
-27
@@ -178,36 +178,18 @@ importers:
|
|||||||
'@apollo/client':
|
'@apollo/client':
|
||||||
specifier: ^3.7.7
|
specifier: ^3.7.7
|
||||||
version: 3.7.9(graphql-ws@5.13.1)(graphql@16.0.0)
|
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':
|
'@vue/apollo-composable':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../vue-apollo-composable
|
version: link:../vue-apollo-composable
|
||||||
'@vue/apollo-util':
|
'@vue/apollo-util':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../vue-apollo-util
|
version: link:../vue-apollo-util
|
||||||
body-parser:
|
|
||||||
specifier: ^1.20.2
|
|
||||||
version: 1.20.2
|
|
||||||
core-js:
|
core-js:
|
||||||
specifier: ^3.23.2
|
specifier: ^3.23.2
|
||||||
version: 3.28.0
|
version: 3.28.0
|
||||||
cors:
|
|
||||||
specifier: ^2.8.5
|
|
||||||
version: 2.8.5
|
|
||||||
express:
|
|
||||||
specifier: ^4.18.1
|
|
||||||
version: 4.18.2
|
|
||||||
graphql:
|
graphql:
|
||||||
specifier: ^16
|
specifier: ^16
|
||||||
version: 16.0.0
|
version: 16.0.0
|
||||||
graphql-subscriptions:
|
|
||||||
specifier: ^2.0.0
|
|
||||||
version: 2.0.0(graphql@16.0.0)
|
|
||||||
graphql-tag:
|
graphql-tag:
|
||||||
specifier: ^2.12.6
|
specifier: ^2.12.6
|
||||||
version: 2.12.6(graphql@16.0.0)
|
version: 2.12.6(graphql@16.0.0)
|
||||||
@@ -217,9 +199,9 @@ importers:
|
|||||||
regenerator-runtime:
|
regenerator-runtime:
|
||||||
specifier: ^0.13.9
|
specifier: ^0.13.9
|
||||||
version: 0.13.11
|
version: 0.13.11
|
||||||
shortid:
|
test-server:
|
||||||
specifier: ^2.2.16
|
specifier: workspace:*
|
||||||
version: 2.2.16
|
version: link:../test-server
|
||||||
vue:
|
vue:
|
||||||
specifier: ^3.2.37
|
specifier: ^3.2.37
|
||||||
version: 3.2.47
|
version: 3.2.47
|
||||||
@@ -229,16 +211,10 @@ importers:
|
|||||||
vue-router:
|
vue-router:
|
||||||
specifier: ^4.0.16
|
specifier: ^4.0.16
|
||||||
version: 4.1.6(vue@3.2.47)
|
version: 4.1.6(vue@3.2.47)
|
||||||
ws:
|
|
||||||
specifier: ^8.13.0
|
|
||||||
version: 8.13.0
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@babel/core':
|
'@babel/core':
|
||||||
specifier: ^7.18.5
|
specifier: ^7.18.5
|
||||||
version: 7.21.0
|
version: 7.21.0
|
||||||
'@types/shortid':
|
|
||||||
specifier: ^0.0.29
|
|
||||||
version: 0.0.29
|
|
||||||
'@vue/cli-plugin-babel':
|
'@vue/cli-plugin-babel':
|
||||||
specifier: ^5.0.6
|
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)
|
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
|
specifier: ^1.9.6
|
||||||
version: 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:
|
packages/vue-apollo-components:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vue/apollo-option':
|
'@vue/apollo-option':
|
||||||
|
|||||||
Reference in New Issue
Block a user