123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- 'use strict'
- import test from 'ava'
- import WebSocket from 'ws'
- import { json, getHttpServer, getWebSocketServer, connectDb } from './_test_functions'
- import DataController from '../../server/database/controllers/Data'
- // Database and WebSocket testing
- // Before all tests, connect to the database
- test.beforeEach(async t => (t.context.server = await getHttpServer()))
- test('Check database is working', async t => {
- // Connect to database
- await connectDb()
- // Add the document
- const testData = { AUTOMATED_TEST_DB: true, TEST_DATABASE_OBJ: { msg: 'add' } }
- const doc = await DataController.add(testData)
- t.deepEqual(doc.data, testData, json(doc))
- // Find the document
- const findDoc = await DataController.find(doc.id)
- t.deepEqual(findDoc.data, testData, json(findDoc))
- // Update the document
- testData.TEST_DATABASE_OBJ.msg = 'updated'
- const updateTo = { AUTOMATED_TEST_DB: true, newObject: 'test', newProperties: { test: true } }
- const docUpdated = await DataController.update(doc.id, updateTo)
- t.deepEqual(docUpdated.data, updateTo, json(docUpdated))
- // Delete the added document
- await t.notThrowsAsync(DataController.del(doc.id))
- })
- test('Check WebSocket server is working', async t => {
- // Connect to database
- await connectDb()
- // Start the server and get its ephemeral port
- const server = t.context.server.listen(0)
- const { port } = server.address()
- // Start the WebSocket server
- getWebSocketServer(server)
- t.timeout(15000)
- t.plan(11)
- // Start the WebSocket client
- const ws = new WebSocket(`ws://localhost:${port}`)
- await new Promise((resolve, reject) => {
- let sent = 0
- let received = 0
- ws.on('open', async () => {
- // Send data on connect
- ws.send(JSON.stringify({ AUTOMATED_TEST_WS: true, TEST_OBJECT: { msg: 'open' } }))
- t.pass()
- sent++
- })
- ws.on('message', async receivedData => {
- received++
- if (sent === 1) {
- // Send data on receive
- t.is('{"message":"ok"}', receivedData, json(receivedData))
- ws.send(JSON.stringify({ AUTOMATED_TEST_WS: true, TEST_OBJECT: { msg: 'message' } }))
- t.pass()
- sent++
- }
- else if (sent === 2) {
- // Send invalid JSON data
- t.is('{"message":"ok"}', receivedData, json(receivedData))
- ws.send('Not a valid JSON string')
- t.pass()
- sent++
- }
- else if (sent === 3) {
- // Received error from server, check it is valid JSON
- let obj = null
- t.notThrows(() => {
- try {
- obj = JSON.parse(receivedData)
- }
- catch (err) {
- throw new Error('Not valid JSON')
- }
- })
- t.truthy(obj, json(receivedData))
- t.is(obj.log.error, 'Invalid JSON data.', json(obj))
- t.truthy(obj.log.stack, json(obj))
- t.is(sent, received)
- resolve()
- }
- })
- ws.on('error', async err => {
- // Unknown WebSocket error
- t.fail(json(err.message))
- reject(err)
- })
- })
- // Delete every collected data during test
- const db = DataController.Model
- const found = await db.deleteMany({ 'data.AUTOMATED_TEST_WS': true })
- t.true(found.deletedCount >= 2)
- })
|