diff --git a/__tests__/member-message-role.test.ts b/__tests__/member-message-role.test.ts new file mode 100644 index 0000000..bd5d834 --- /dev/null +++ b/__tests__/member-message-role.test.ts @@ -0,0 +1,98 @@ +import 'dotenv/config'; +import { beforeAll, afterAll, describe, it, expect } from 'vitest'; +import { v4 as uuidv4 } from 'uuid'; + +import { createTestClient } from './create-test-client'; +import { StreamClient } from '../src/StreamClient'; +import { StreamChannel } from '../src/StreamChannel'; + +describe('member message role propagation', () => { + let client: StreamClient; + let channel: StreamChannel; + const channelId = 'streamnodetest-role-' + uuidv4(); + + const user1 = { + id: 'stream-node-role-user1-' + uuidv4(), + name: 'Stream Node Role User 1', + channel_role: 'custom_role', + }; + + const user2 = { + id: 'stream-node-role-user2-' + uuidv4(), + name: 'Stream Node Role User 2', + }; + + let messageId1: string | undefined; + let messageId2: string | undefined; + + beforeAll(async () => { + client = createTestClient(); + + await client.upsertUsers([user1, user2]); + + channel = client.chat.channel('messaging', channelId); + + await channel.getOrCreate({ + data: { + created_by: { id: user1.id }, + members: [ + { + user: user1, + channel_role: user1.channel_role, + }, + { + user: user2, + }, + ], + }, + }); + }); + + it('should include the creator role in message response', async () => { + // user1 sends a message + const resp1 = await channel.sendMessage({ + message: { + text: 'Message from user1', + user_id: user1.id, + }, + }); + + messageId1 = resp1.message.id; + + expect(resp1.message?.user?.id).toBe(user1.id); + expect(resp1.message?.member?.channel_role).toBe(user1.channel_role); + + const resp2 = await channel.sendMessage({ + message: { + text: 'Message from user2', + user_id: user2.id, + }, + }); + + messageId2 = resp2.message.id; + + expect(resp2.message?.user?.id).toBe(user2.id); + expect(resp2.message?.member?.channel_role).toBe('channel_member'); + }); + + it('channel state messages should include creator role', async () => { + const queryResp = await client.chat.queryChannels({ + filter_conditions: { id: channelId }, + limit: 1, + message_limit: 10, + state: true, + }); + + const messages = queryResp.channels[0].messages; + const msg1 = messages.find((m) => m.id === messageId1); + const msg2 = messages.find((m) => m.id === messageId2); + + expect(msg1?.member?.channel_role).toBe(user1.channel_role); + expect(msg2?.member?.channel_role).toBe('channel_member'); + }); + + afterAll(async () => { + // Clean up the channel after test run + await channel.delete({ hard_delete: true }); + }); +}); diff --git a/src/gen/models/index.ts b/src/gen/models/index.ts index 4f0243c..193f2ed 100644 --- a/src/gen/models/index.ts +++ b/src/gen/models/index.ts @@ -7487,6 +7487,8 @@ export interface MessageResponse { reminder?: ReminderResponseData; shared_location?: SharedLocationResponseData; + + member?: ChannelMemberResponse; } export interface MessageStatsResponse {