From eb6c88cc27d47bd1b6749f7f829ed56794b45853 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 08:52:16 +0200 Subject: [PATCH 1/6] Added member to message response --- __tests__/member-message-role.test.ts | 90 +++++++++++++++++++++++++++ src/gen/models/index.ts | 2 + 2 files changed, 92 insertions(+) create mode 100644 __tests__/member-message-role.test.ts diff --git a/__tests__/member-message-role.test.ts b/__tests__/member-message-role.test.ts new file mode 100644 index 0000000..9240142 --- /dev/null +++ b/__tests__/member-message-role.test.ts @@ -0,0 +1,90 @@ +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', + role: 'custom_role', + }; + + const user2 = { + id: 'stream-node-role-user2-' + uuidv4(), + name: 'Stream Node Role User 2', + role: 'user', + }; + + let messageId1: string | undefined; + let messageId2: string | undefined; + + beforeAll(async () => { + client = createTestClient(); + + // upsert both users with their roles + await client.upsertUsers([user1, user2]); + + // create channel with both members + channel = client.chat.channel('messaging', channelId); + + await channel.getOrCreate({ + data: { + created_by: { id: user1.id }, + members: [{ user: user1 }, { 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?.user?.role).toBe(user1.role); + + // user2 sends a message + 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?.user?.role).toBe(user2.role); + }); + + it('channel state messages should include creator role', async () => { + const state = await channel.getOrCreate(); + + // Ensure both messages are present with correct roles. + const msg1 = state.messages.find((m) => m.id === messageId1); + const msg2 = state.messages.find((m) => m.id === messageId2); + + expect(msg1?.user?.role).toBe(user1.role); + expect(msg2?.user?.role).toBe(user2.role); + }); + + 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 { From 17aab142ea5c1707041a84754b15d610e2653739 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 16:16:24 +0200 Subject: [PATCH 2/6] Use channel role --- __tests__/member-message-role.test.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/__tests__/member-message-role.test.ts b/__tests__/member-message-role.test.ts index 9240142..284b2ef 100644 --- a/__tests__/member-message-role.test.ts +++ b/__tests__/member-message-role.test.ts @@ -15,13 +15,12 @@ describe('member message role propagation', () => { const user1 = { id: 'stream-node-role-user1-' + uuidv4(), name: 'Stream Node Role User 1', - role: 'custom_role', + channel_role: 'custom_role', }; const user2 = { id: 'stream-node-role-user2-' + uuidv4(), name: 'Stream Node Role User 2', - role: 'user', }; let messageId1: string | undefined; @@ -30,10 +29,8 @@ describe('member message role propagation', () => { beforeAll(async () => { client = createTestClient(); - // upsert both users with their roles await client.upsertUsers([user1, user2]); - // create channel with both members channel = client.chat.channel('messaging', channelId); await channel.getOrCreate({ From 9a09a0c26b25b06e43f5d84e022d7a55eb039e44 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 16:27:57 +0200 Subject: [PATCH 3/6] Updated test --- __tests__/member-message-role.test.ts | 29 +++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/__tests__/member-message-role.test.ts b/__tests__/member-message-role.test.ts index 284b2ef..5ce2450 100644 --- a/__tests__/member-message-role.test.ts +++ b/__tests__/member-message-role.test.ts @@ -21,6 +21,7 @@ describe('member message role propagation', () => { const user2 = { id: 'stream-node-role-user2-' + uuidv4(), name: 'Stream Node Role User 2', + channel_role: 'channel_member', }; let messageId1: string | undefined; @@ -36,7 +37,24 @@ describe('member message role propagation', () => { await channel.getOrCreate({ data: { created_by: { id: user1.id }, - members: [{ user: user1 }, { user: user2 }], + members: [{ + user_id: user1.id, channel_role: user1.channel_role, + banned: false, + created_at: new Date(), + notifications_muted: false, + shadow_banned: false, + updated_at: new Date(), + custom: [] + }, { + user_id: user2.id, + banned: false, + channel_role: '', + created_at: new Date(), + notifications_muted: false, + shadow_banned: false, + updated_at: new Date(), + custom: [] + }], }, }); }); @@ -53,9 +71,8 @@ describe('member message role propagation', () => { messageId1 = resp1.message.id; expect(resp1.message?.user?.id).toBe(user1.id); - expect(resp1.message?.user?.role).toBe(user1.role); + expect(resp1.message?.member?.channel_role).toBe(); - // user2 sends a message const resp2 = await channel.sendMessage({ message: { text: 'Message from user2', @@ -66,7 +83,7 @@ describe('member message role propagation', () => { messageId2 = resp2.message.id; expect(resp2.message?.user?.id).toBe(user2.id); - expect(resp2.message?.user?.role).toBe(user2.role); + expect(resp2.message?.member?.channel_role).toBe(user2.channel_role); }); it('channel state messages should include creator role', async () => { @@ -76,8 +93,8 @@ describe('member message role propagation', () => { const msg1 = state.messages.find((m) => m.id === messageId1); const msg2 = state.messages.find((m) => m.id === messageId2); - expect(msg1?.user?.role).toBe(user1.role); - expect(msg2?.user?.role).toBe(user2.role); + expect(msg1?.member?.channel_role).toBe(user1.channel_role); + expect(msg2?.member?.channel_role).toBe(user2.channel_role); }); afterAll(async () => { From 3d6e2620b70bebf756e3c6de4a91b78b4691a05f Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 17:30:55 +0200 Subject: [PATCH 4/6] Fixed test --- __tests__/member-message-role.test.ts | 58 +++++++++++++++------------ 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/__tests__/member-message-role.test.ts b/__tests__/member-message-role.test.ts index 5ce2450..49a08f5 100644 --- a/__tests__/member-message-role.test.ts +++ b/__tests__/member-message-role.test.ts @@ -6,7 +6,6 @@ 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; @@ -37,24 +36,28 @@ describe('member message role propagation', () => { await channel.getOrCreate({ data: { created_by: { id: user1.id }, - members: [{ - user_id: user1.id, channel_role: user1.channel_role, - banned: false, - created_at: new Date(), - notifications_muted: false, - shadow_banned: false, - updated_at: new Date(), - custom: [] - }, { - user_id: user2.id, - banned: false, - channel_role: '', - created_at: new Date(), - notifications_muted: false, - shadow_banned: false, - updated_at: new Date(), - custom: [] - }], + members: [ + { + user_id: user1.id, + channel_role: user1.channel_role, + banned: false, + created_at: new Date(), + notifications_muted: false, + shadow_banned: false, + updated_at: new Date(), + custom: [], + }, + { + user_id: user2.id, + banned: false, + channel_role: '', + created_at: new Date(), + notifications_muted: false, + shadow_banned: false, + updated_at: new Date(), + custom: [], + }, + ], }, }); }); @@ -71,7 +74,7 @@ describe('member message role propagation', () => { messageId1 = resp1.message.id; expect(resp1.message?.user?.id).toBe(user1.id); - expect(resp1.message?.member?.channel_role).toBe(); + expect(resp1.message?.member?.channel_role).toBe(user1.channel_role); const resp2 = await channel.sendMessage({ message: { @@ -87,11 +90,16 @@ describe('member message role propagation', () => { }); it('channel state messages should include creator role', async () => { - const state = await channel.getOrCreate(); + const queryResp = await client.chat.queryChannels({ + filter_conditions: { id: channelId }, + limit: 1, + message_limit: 10, + state: true, + }); - // Ensure both messages are present with correct roles. - const msg1 = state.messages.find((m) => m.id === messageId1); - const msg2 = state.messages.find((m) => m.id === messageId2); + 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(user2.channel_role); @@ -99,6 +107,6 @@ describe('member message role propagation', () => { afterAll(async () => { // Clean up the channel after test run - await channel.delete({ hard_delete: true }); + // await channel.delete({ hard_delete: true }); }); }); From a50b85ca2631e5bcb6ee8677d26624f5298e6a69 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 17:41:25 +0200 Subject: [PATCH 5/6] Fixed test --- __tests__/member-message-role.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/member-message-role.test.ts b/__tests__/member-message-role.test.ts index 49a08f5..e9d772d 100644 --- a/__tests__/member-message-role.test.ts +++ b/__tests__/member-message-role.test.ts @@ -107,6 +107,6 @@ describe('member message role propagation', () => { afterAll(async () => { // Clean up the channel after test run - // await channel.delete({ hard_delete: true }); + await channel.delete({ hard_delete: true }); }); }); From 4f3172d8a8546e35c59fd16ec101793db64560bb Mon Sep 17 00:00:00 2001 From: javierdfm Date: Mon, 1 Sep 2025 11:01:45 +0200 Subject: [PATCH 6/6] Update --- __tests__/member-message-role.test.ts | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/__tests__/member-message-role.test.ts b/__tests__/member-message-role.test.ts index e9d772d..bd5d834 100644 --- a/__tests__/member-message-role.test.ts +++ b/__tests__/member-message-role.test.ts @@ -20,7 +20,6 @@ describe('member message role propagation', () => { const user2 = { id: 'stream-node-role-user2-' + uuidv4(), name: 'Stream Node Role User 2', - channel_role: 'channel_member', }; let messageId1: string | undefined; @@ -38,24 +37,11 @@ describe('member message role propagation', () => { created_by: { id: user1.id }, members: [ { - user_id: user1.id, + user: user1, channel_role: user1.channel_role, - banned: false, - created_at: new Date(), - notifications_muted: false, - shadow_banned: false, - updated_at: new Date(), - custom: [], }, { - user_id: user2.id, - banned: false, - channel_role: '', - created_at: new Date(), - notifications_muted: false, - shadow_banned: false, - updated_at: new Date(), - custom: [], + user: user2, }, ], }, @@ -86,7 +72,7 @@ describe('member message role propagation', () => { messageId2 = resp2.message.id; expect(resp2.message?.user?.id).toBe(user2.id); - expect(resp2.message?.member?.channel_role).toBe(user2.channel_role); + expect(resp2.message?.member?.channel_role).toBe('channel_member'); }); it('channel state messages should include creator role', async () => { @@ -102,7 +88,7 @@ describe('member message role propagation', () => { const msg2 = messages.find((m) => m.id === messageId2); expect(msg1?.member?.channel_role).toBe(user1.channel_role); - expect(msg2?.member?.channel_role).toBe(user2.channel_role); + expect(msg2?.member?.channel_role).toBe('channel_member'); }); afterAll(async () => {