Files
simplex-chat/packages/simplex-chat-nodejs/tests/live.test.ts
EvgenyandEvgeny @ SimpleX Chat 46b2cf9f85 nodejs: add tests to library (#7694)
* nodejs: add tests to library

* new tests

* remove message splitting

* fix race

* docs

* replace extract-zip with yauzl that it wraps (high severity issue)

* fix ci tests

* skip server tests on macos and win unless SMP_SERVER is set

* fix win test

* fix win test

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
2026-10-19 19:49:44 +01:00

69 lines
3.2 KiB
TypeScript

import * as path from "path"
import * as fs from "fs"
import {T} from "@simplex-chat/types"
import {api} from ".."
import {SmpServer, describeIfSmpServerAvailable, startSmpServer} from "./smpServer"
const CT = T.ChatType
describeIfSmpServerAvailable("Live message tests (use local SMP server)", () => {
const tmpDir = "./tests/tmp"
const alicePath = path.join(tmpDir, "alice")
const bobPath = path.join(tmpDir, "bob")
let smpServer: SmpServer
beforeAll(async () => { smpServer = await startSmpServer() }, 120000)
afterAll(() => smpServer?.stop())
beforeEach(() => fs.mkdirSync(tmpDir, {recursive: true}))
afterEach(() => fs.rmSync(tmpDir, {recursive: true, force: true}))
async function useSmpServer(chat: api.ChatApi): Promise<void> {
expect(await chat.sendChatCmd(`/smp ${smpServer.address}`)).toMatchObject({type: "cmdOk"})
}
it("should show, update, finalize and delete live messages", async () => {
const alice = await api.ChatApi.init({type: "sqlite", filePrefix: alicePath})
const bob = await api.ChatApi.init({type: "sqlite", filePrefix: bobPath})
const aliceUser = await alice.apiCreateActiveUser({displayName: "alice", fullName: ""})
await bob.apiCreateActiveUser({displayName: "bob", fullName: ""})
await alice.startChat()
await bob.startChat()
await useSmpServer(alice)
await useSmpServer(bob)
const aliceConnected = alice.wait("contactConnected", 30000)
const bobConnected = bob.wait("contactConnected", 30000)
await bob.apiConnectActiveUser(await alice.apiCreateLink(aliceUser.userId))
const bobContact = (await aliceConnected)!.contact
expect(await bobConnected).toBeDefined()
const timeout = 10000
const received = (check: (meta: T.CIMeta) => boolean) =>
bob.wait("newChatItems", ({chatItems}) => chatItems.some(({chatItem: {meta}}) => check(meta)), timeout)
const updated = (check: (meta: T.CIMeta) => boolean) =>
bob.wait("chatItemUpdated", ({chatItem: {chatItem: {meta}}}) => check(meta), timeout)
const live = new api.LiveMessage(alice, CT.Direct, bobContact.contactId, 500)
const started = received(meta => meta.itemLive === true && meta.itemText === "")
live.update("")
const itemId = (await started)!.chatItems[0].chatItem.meta.itemId
const updatedLive = updated(meta => meta.itemId === itemId && meta.itemLive === true && meta.itemText === "Hello")
live.update("Hel")
live.update("Hello")
expect(await updatedLive).toBeDefined()
const finalized = updated(meta => meta.itemId === itemId && meta.itemLive === false && meta.itemText === "Hello world")
await live.end("Hello world")
expect((await finalized)?.chatItem.chatItem.meta.itemEdited).toBe(false)
const emptyStarted = received(meta => meta.itemLive === true && meta.itemText === "")
live.update("")
const emptyItemId = (await emptyStarted)!.chatItems[0].chatItem.meta.itemId
const deleted = bob.wait("chatItemsDeleted", ({chatItemDeletions}) =>
chatItemDeletions.some(({deletedChatItem}) => deletedChatItem.chatItem.meta.itemId === emptyItemId), timeout)
await live.end()
expect(await deleted).toBeDefined()
await alice.close()
await bob.close()
}, 90000)
})