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: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",
|
||||
|
||||
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 { 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')
|
||||
})
|
||||
@@ -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':
|
||||
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':
|
||||
|
||||
Reference in New Issue
Block a user