From 2f9843bd4cc2c39baa39fdfcb85bf6b8d8e707a3 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 15 Sep 2023 11:21:10 +0200 Subject: [PATCH] Handle ids --- .../rowProcessor/bbReferenceProcessor.ts | 25 +++++++- .../tests/bbReferenceProcessor.spec.ts | 62 +++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts diff --git a/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts b/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts index ae31810856..2d296cea3f 100644 --- a/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts +++ b/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts @@ -1,6 +1,27 @@ +import { cache } from "@budibase/backend-core" +import { utils } from "@budibase/shared-core" import { FieldSubtype } from "@budibase/types" -export async function processOutputBBReferences( +export async function processInputBBReferences( value: string, subtype: FieldSubtype -) {} +) { + const result = [] + const ids = value.split(",").map((id: string) => id.trim()) + + switch (subtype) { + case FieldSubtype.USER: + for (const id of ids) { + result.push(await cache.user.getUser(id)) + } + break + default: + utils.unreachable(subtype) + } + + if (result.length > 1) { + return result + } + + return result[0] +} diff --git a/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts b/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts new file mode 100644 index 0000000000..95716b0467 --- /dev/null +++ b/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts @@ -0,0 +1,62 @@ +import * as backendCore from "@budibase/backend-core" +import { FieldSubtype, User } from "@budibase/types" +import { processInputBBReferences } from "../bbReferenceProcessor" +import { generator, structures } from "@budibase/backend-core/tests" + +jest.mock("@budibase/backend-core", (): typeof backendCore => { + const actual = jest.requireActual("@budibase/backend-core") + return { + ...actual, + cache: { + ...actual.cache, + user: { + getUser: jest.fn(), + invalidateUser: jest.fn(), + }, + }, + } +}) + +describe("bbReferenceProcessor", () => { + const mockedCacheGetUser = backendCore.cache.user.getUser as jest.Mock + + beforeEach(() => { + jest.resetAllMocks() + }) + + describe("processInputBBReferences", () => { + describe("subtype user", () => { + it("fetches by user id", async () => { + const input = generator.guid() + + const userFromCache = structures.users.user() + mockedCacheGetUser.mockResolvedValueOnce(userFromCache) + + const result = await processInputBBReferences(input, FieldSubtype.USER) + + expect(result).toEqual(userFromCache) + expect(mockedCacheGetUser).toBeCalledTimes(1) + expect(mockedCacheGetUser).toBeCalledWith(input) + }) + + it("fetches by user id when send as csv", async () => { + const users: Record = {} + for (let i = 0; i < 5; i++) { + const userId = generator.guid() + const user = structures.users.user({ _id: userId, userId }) + mockedCacheGetUser.mockResolvedValueOnce(user) + users[userId] = user + } + + const input = Object.keys(users).join(" , ") + const result = await processInputBBReferences(input, FieldSubtype.USER) + + expect(result).toEqual(Object.values(users)) + expect(mockedCacheGetUser).toBeCalledTimes(5) + Object.keys(users).forEach(userId => { + expect(mockedCacheGetUser).toBeCalledWith(userId) + }) + }) + }) + }) +})