import "reflect-metadata"; import { afterAll, beforeAll, describe, expect, it } from "@jest/globals"; import { init, TestPlatform } from "../setup"; import { createMessage, createParticipant, e2e_createThread } from "./utils"; import { MessageFile } from "../../../src/services/messages/entities/message-files"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import fs from "fs"; import formAutoContent from "form-auto-content"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import uuid from "node-uuid"; import { ChannelUtils, get as getChannelUtils } from "../channels/utils"; import gr from "../../../src/services/global-resolver"; import User from "../../../src/services/user/entities/user"; import { WorkspaceExecutionContext } from "../../../src/services/channels/types"; describe("Search files", () => { const filesUrl = "/internal/services/files/v1"; const messagesUrl = "/internal/services/messages/v1"; let platform: TestPlatform; let channelUtils: ChannelUtils; beforeAll(async () => { platform = await init({ services: ["webserver", "database", "storage", "message-queue", "files", "previews"], }); await platform.database.getConnector().drop(); channelUtils = getChannelUtils(platform); }); afterAll(async done => { await platform?.tearDown(); platform = null; done(); }); const files = [ "../files/assets/sample.png", "../files/assets/sample.gif", "../files/assets/sample.pdf", "../files/assets/sample.doc", "../files/assets/sample.zip", ].map(p => `${__dirname}/${p}`); function getContext(user?: User): WorkspaceExecutionContext { return { workspace: platform.workspace, user: user || platform.currentUser, }; } it("should return uploaded files", async done => { let channel = channelUtils.getChannel(); channel = (await gr.services.channels.channels.save(channel, {}, getContext())).entity; const channelId = channel.id; const uploadedFiles = []; for (const i in files) { const file = files[i]; const form = formAutoContent({ file: fs.createReadStream(file) }); form.headers["authorization"] = `Bearer ${await platform.auth.getJWTToken()}`; const uploadedFile = await platform.app.inject({ method: "POST", url: `${filesUrl}/companies/${platform.workspace.company_id}/files?thumbnail_sync=1`, ...form, }); const resource = uploadedFile.json().resource; const messageFile: Partial = { id: uuid.v1(), company_id: platform.workspace.company_id, metadata: { source: "internal", external_id: { company_id: platform.workspace.company_id, id: resource.id, }, ...resource.metadata, }, }; await e2e_createThread( platform, [ createParticipant( { type: "channel", id: channelId, }, platform, ), ], createMessage({ text: "Some message", files: [messageFile] }), ); uploadedFiles.push(uploadedFile.json().resource); } await new Promise(r => setTimeout(r, 2000)); let resources = await search("sample"); expect(resources.length).toEqual(5); resources = await search("sample", { extension: "png" }); expect(resources.length).toEqual(1); resources = await search("sample", { is_file: true }); expect(resources.length).toEqual(3); resources = await search("sample", { is_media: true }); expect(resources.length).toEqual(2); resources = await search("sam"); expect(resources.length).toEqual(5); done(); }); async function search( searchString: string, options?: { company_id?: string; workspace_id?: string; channel_id?: string; limit?: number; sender?: string; is_file?: boolean; is_media?: boolean; extension?: string; }, ): Promise { const jwtToken = await platform.auth.getJWTToken(); const query: any = options || {}; const response = await platform.app.inject({ method: "GET", url: `${messagesUrl}/companies/${platform.workspace.company_id}/files/search`, headers: { authorization: `Bearer ${jwtToken}`, }, query: { ...query, q: searchString, }, }); expect(response.statusCode).toBe(200); const json = response.json(); expect(json).toMatchObject({ resources: expect.any(Array) }); const resources = json.resources; return resources; } }); function getContext(platform: TestPlatform) { return { company: { id: platform.workspace.company_id }, user: { id: platform.currentUser.id }, }; }