From 249625ad1a2632a41fd53d81204511ef5576f6d4 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 31 May 2023 17:18:01 +0100 Subject: [PATCH] Updating backend tests to actually utilise the redis container which is spun up as part of the tests, doing away with the somewhat problematic ioredis-mock which was breaking some tests due to the addition of the changes for multi-dev collab. --- packages/backend-core/src/environment.ts | 1 - packages/backend-core/src/index.ts | 1 + packages/backend-core/src/redis/redis.ts | 11 +---------- packages/backend-core/src/redis/utils.ts | 2 +- packages/server/package.json | 1 - packages/server/src/utilities/redis.ts | 8 ++++++-- packages/server/src/websockets/builder.ts | 4 ++-- packages/server/src/websockets/index.ts | 16 ++++++++++------ yarn.lock | 14 ++------------ 9 files changed, 23 insertions(+), 35 deletions(-) diff --git a/packages/backend-core/src/environment.ts b/packages/backend-core/src/environment.ts index 9163dfeba6..325eac3335 100644 --- a/packages/backend-core/src/environment.ts +++ b/packages/backend-core/src/environment.ts @@ -97,7 +97,6 @@ const environment = { REDIS_URL: process.env.REDIS_URL || "localhost:6379", REDIS_PASSWORD: process.env.REDIS_PASSWORD, REDIS_CLUSTERED: process.env.REDIS_CLUSTERED, - MOCK_REDIS: process.env.MOCK_REDIS, MINIO_ACCESS_KEY: process.env.MINIO_ACCESS_KEY, MINIO_SECRET_KEY: process.env.MINIO_SECRET_KEY, AWS_REGION: process.env.AWS_REGION, diff --git a/packages/backend-core/src/index.ts b/packages/backend-core/src/index.ts index 40233b3827..7b98674788 100644 --- a/packages/backend-core/src/index.ts +++ b/packages/backend-core/src/index.ts @@ -21,6 +21,7 @@ export * as context from "./context" export * as cache from "./cache" export * as objectStore from "./objectStore" export * as redis from "./redis" +export { Client as RedisClient } from "./redis" export * as locks from "./redis/redlockImpl" export * as utils from "./utils" export * as errors from "./errors" diff --git a/packages/backend-core/src/redis/redis.ts b/packages/backend-core/src/redis/redis.ts index 2d54b51a9f..60d3966e27 100644 --- a/packages/backend-core/src/redis/redis.ts +++ b/packages/backend-core/src/redis/redis.ts @@ -1,6 +1,6 @@ import env from "../environment" // ioredis mock is all in memory -const Redis = env.MOCK_REDIS ? require("ioredis-mock") : require("ioredis") +import Redis from "ioredis" import { addDbPrefix, removeDbPrefix, @@ -21,11 +21,6 @@ let CLIENTS: { [key: number]: any } = {} let CONNECTED = false -// mock redis always connected -if (env.MOCK_REDIS) { - CONNECTED = true -} - function pickClient(selectDb: number): any { return CLIENTS[selectDb] } @@ -62,10 +57,6 @@ function init(selectDb = DEFAULT_SELECT_DB) { if (client && CONNECTED) { return } - // testing uses a single in memory client - if (env.MOCK_REDIS) { - CLIENTS[selectDb] = new Redis(getRedisOptions()) - } // start the timer - only allowed 5 seconds to connect timeout = setTimeout(() => { if (!CONNECTED) { diff --git a/packages/backend-core/src/redis/utils.ts b/packages/backend-core/src/redis/utils.ts index f8b815824c..ab39acf215 100644 --- a/packages/backend-core/src/redis/utils.ts +++ b/packages/backend-core/src/redis/utils.ts @@ -95,7 +95,7 @@ export function getRedisOptions() { opts.port = port opts.password = password } - return { opts, host, port, redisProtocolUrl } + return { opts, host, port: parseInt(port), redisProtocolUrl } } export function addDbPrefix(db: string, key: string) { diff --git a/packages/server/package.json b/packages/server/package.json index cb53a1618e..472d221aa9 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -157,7 +157,6 @@ "copyfiles": "2.4.1", "docker-compose": "0.23.17", "eslint": "6.8.0", - "ioredis-mock": "7.2.0", "is-wsl": "2.2.0", "jest": "29.5.0", "jest-openapi": "0.14.2", diff --git a/packages/server/src/utilities/redis.ts b/packages/server/src/utilities/redis.ts index ff1c863bf7..d7e9b16290 100644 --- a/packages/server/src/utilities/redis.ts +++ b/packages/server/src/utilities/redis.ts @@ -1,10 +1,14 @@ -import { redis } from "@budibase/backend-core" +import { redis, RedisClient } from "@budibase/backend-core" import { getGlobalIDFromUserMetadataID } from "../db/utils" import { ContextUser } from "@budibase/types" +import env from "../environment" const APP_DEV_LOCK_SECONDS = 600 const AUTOMATION_TEST_FLAG_SECONDS = 60 -let devAppClient: any, debounceClient: any, flagClient: any, socketClient: any +let devAppClient: RedisClient, + debounceClient: RedisClient, + flagClient: RedisClient, + socketClient: RedisClient // We need to maintain a duplicate client for socket.io pub/sub let socketSubClient: any diff --git a/packages/server/src/websockets/builder.ts b/packages/server/src/websockets/builder.ts index de8709129d..d856dd42ae 100644 --- a/packages/server/src/websockets/builder.ts +++ b/packages/server/src/websockets/builder.ts @@ -49,12 +49,12 @@ export default class BuilderSocket extends Socket { emitTableUpdate(ctx: any, table: Table) { this.io.in(ctx.appId).emit("table-change", { id: table._id, table }) - gridSocket.emitTableUpdate(table) + gridSocket?.emitTableUpdate(table) } emitTableDeletion(ctx: any, id: string) { this.io.in(ctx.appId).emit("table-change", { id, table: null }) - gridSocket.emitTableDeletion(id) + gridSocket?.emitTableDeletion(id) } emitDatasourceUpdate(ctx: any, datasource: Datasource) { diff --git a/packages/server/src/websockets/index.ts b/packages/server/src/websockets/index.ts index b74a8adfca..30693c2d25 100644 --- a/packages/server/src/websockets/index.ts +++ b/packages/server/src/websockets/index.ts @@ -3,15 +3,19 @@ import Koa from "koa" import ClientAppSocket from "./client" import GridSocket from "./grid" import BuilderSocket from "./builder" +import env from "../environment" -let clientAppSocket: ClientAppSocket -let gridSocket: GridSocket -let builderSocket: BuilderSocket +let clientAppSocket: ClientAppSocket | undefined +let gridSocket: GridSocket | undefined +let builderSocket: BuilderSocket | undefined export const initialise = (app: Koa, server: http.Server) => { - clientAppSocket = new ClientAppSocket(app, server) - gridSocket = new GridSocket(app, server) - builderSocket = new BuilderSocket(app, server) + // currently we use ioredis-mock which doesn't work with the websocket system for testing + if (!env.isTest()) { + clientAppSocket = new ClientAppSocket(app, server) + gridSocket = new GridSocket(app, server) + builderSocket = new BuilderSocket(app, server) + } } export { clientAppSocket, gridSocket, builderSocket } diff --git a/yarn.lock b/yarn.lock index d932fa7437..9218b005b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11846,7 +11846,7 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== -fengari-interop@^0.1.2, fengari-interop@^0.1.3: +fengari-interop@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/fengari-interop/-/fengari-interop-0.1.3.tgz#3ad37a90e7430b69b365441e9fc0ba168942a146" integrity sha512-EtZ+oTu3kEwVJnoymFPBVLIbQcCoy9uWCVnMA6h3M/RqHkUBsLYp29+RRHf9rKr6GwjubWREU1O7RretFIXjHw== @@ -13893,16 +13893,6 @@ ioredis-mock@5.8.0: lodash "^4.17.21" standard-as-callback "^2.1.0" -ioredis-mock@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/ioredis-mock/-/ioredis-mock-7.2.0.tgz#48f006c07ef7f1f93f75e60d8f9035fa46c4ef0a" - integrity sha512-xzABBG3NhfDBGxH1KX9n6vs7WGNn9lhcxMT3b+vjynVImxlUV+vOXU+tjGzSUnGmx4IYllA8RqbXN8z6ROMPVA== - dependencies: - fengari "^0.1.4" - fengari-interop "^0.1.3" - redis-commands "^1.7.0" - standard-as-callback "^2.1.0" - ioredis@4.28.0: version "4.28.0" resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.28.0.tgz#5a2be3f37ff2075e2332f280eaeb02ab4d9ff0d3" @@ -21649,7 +21639,7 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redis-commands@1.7.0, redis-commands@^1.7.0: +redis-commands@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==