@@ -35,4 +35,92 @@ test.describe('Pinned Messages', () => {
3535 // The pinned message should appear in the pins panel
3636 await expect ( page . getByTestId ( 'pins-panel' ) . getByText ( uniqueText ) ) . toBeVisible ( { timeout : 5000 } ) ;
3737 } ) ;
38+
39+ test ( 'pinning a message updates in real-time for another user in the same channel' , async ( { browser } ) => {
40+ // User 1 sends and pins a message; user 2 (in another browser context) should
41+ // see the pin indicator appear without refreshing.
42+ const email1 = uniqueEmail ( ) ;
43+ const email2 = uniqueEmail ( ) ;
44+
45+ // Set up user 1
46+ const context1 = await browser . newContext ( ) ;
47+ const page1 = await context1 . newPage ( ) ;
48+ await register ( page1 , 'PinnerUser' , email1 , 'password123' ) ;
49+ await clickChannel ( page1 , 'general' ) ;
50+ await waitForChannelReady ( page1 ) ;
51+
52+ // Set up user 2 (observer)
53+ const context2 = await browser . newContext ( ) ;
54+ const page2 = await context2 . newPage ( ) ;
55+ await register ( page2 , 'ObserverUser' , email2 , 'password123' ) ;
56+ await clickChannel ( page2 , 'general' ) ;
57+ await waitForChannelReady ( page2 ) ;
58+
59+ // User 1 sends a message
60+ const uniqueText = `RealTimePin ${ Date . now ( ) } ` ;
61+ await sendMessage ( page1 , uniqueText ) ;
62+
63+ // Both users should see the message
64+ await waitForMessage ( page1 , uniqueText ) ;
65+ await waitForMessage ( page2 , uniqueText ) ;
66+
67+ // User 1 pins the message via the dropdown
68+ const messageRow1 = page1 . locator ( '.group.relative.flex.px-5' ) . filter ( { hasText : uniqueText } ) . first ( ) ;
69+ await messageRow1 . hover ( ) ;
70+ const hoverToolbar1 = page1 . locator ( '.absolute.-top-4.right-5' ) ;
71+ await hoverToolbar1 . locator ( 'button' ) . last ( ) . click ( ) ;
72+ await page1 . getByText ( 'Pin message' ) . click ( ) ;
73+
74+ // User 1's view: pin indicator appears (optimistic update)
75+ await expect ( messageRow1 . locator ( '[data-testid="pin-indicator"]' ) ) . toBeVisible ( { timeout : 5000 } ) ;
76+
77+ // User 2's view: pin indicator should appear in real-time via WebSocket (no page refresh)
78+ const messageRow2 = page2 . locator ( '.group.relative.flex.px-5' ) . filter ( { hasText : uniqueText } ) . first ( ) ;
79+ await expect ( messageRow2 . locator ( '[data-testid="pin-indicator"]' ) ) . toBeVisible ( { timeout : 10000 } ) ;
80+
81+ await context1 . close ( ) ;
82+ await context2 . close ( ) ;
83+ } ) ;
84+
85+ test ( 'pinned messages panel updates in real-time when a message is pinned' , async ( { browser } ) => {
86+ const email1 = uniqueEmail ( ) ;
87+ const email2 = uniqueEmail ( ) ;
88+
89+ // Set up user 1 (pinner)
90+ const context1 = await browser . newContext ( ) ;
91+ const page1 = await context1 . newPage ( ) ;
92+ await register ( page1 , 'PinnerB' , email1 , 'password123' ) ;
93+ await clickChannel ( page1 , 'general' ) ;
94+ await waitForChannelReady ( page1 ) ;
95+
96+ // Set up user 2 (observer with pins panel open)
97+ const context2 = await browser . newContext ( ) ;
98+ const page2 = await context2 . newPage ( ) ;
99+ await register ( page2 , 'ObserverB' , email2 , 'password123' ) ;
100+ await clickChannel ( page2 , 'general' ) ;
101+ await waitForChannelReady ( page2 ) ;
102+
103+ // User 2 opens the pins panel
104+ await page2 . getByRole ( 'button' , { name : 'Pins' } ) . click ( ) ;
105+ await expect ( page2 . getByTestId ( 'pins-panel' ) ) . toBeVisible ( { timeout : 5000 } ) ;
106+
107+ // User 1 sends a message
108+ const uniqueText = `PinsPanel ${ Date . now ( ) } ` ;
109+ await sendMessage ( page1 , uniqueText ) ;
110+ await waitForMessage ( page1 , uniqueText ) ;
111+ await waitForMessage ( page2 , uniqueText ) ;
112+
113+ // User 1 pins the message
114+ const messageRow1 = page1 . locator ( '.group.relative.flex.px-5' ) . filter ( { hasText : uniqueText } ) . first ( ) ;
115+ await messageRow1 . hover ( ) ;
116+ const hoverToolbar1 = page1 . locator ( '.absolute.-top-4.right-5' ) ;
117+ await hoverToolbar1 . locator ( 'button' ) . last ( ) . click ( ) ;
118+ await page1 . getByText ( 'Pin message' ) . click ( ) ;
119+
120+ // User 2's pins panel should update in real-time to show the newly pinned message
121+ await expect ( page2 . getByTestId ( 'pins-panel' ) . getByText ( uniqueText ) ) . toBeVisible ( { timeout : 10000 } ) ;
122+
123+ await context1 . close ( ) ;
124+ await context2 . close ( ) ;
125+ } ) ;
38126} ) ;
0 commit comments