diff --git a/webapp/channels/src/utils/popouts/popout_windows.test.ts b/webapp/channels/src/utils/popouts/popout_windows.test.ts index efe60e6ca78..a9948aab5e0 100644 --- a/webapp/channels/src/utils/popouts/popout_windows.test.ts +++ b/webapp/channels/src/utils/popouts/popout_windows.test.ts @@ -2,6 +2,7 @@ // See LICENSE.txt for license information. import DesktopApp from 'utils/desktop_api'; +import {getBasePath} from 'utils/url'; import {isDesktopApp} from 'utils/user_agent'; import {FOCUS_REPLY_POST, popoutRhsPlugin, popoutThread} from './popout_windows'; @@ -20,6 +21,10 @@ jest.mock('utils/user_agent', () => ({ isDesktopApp: jest.fn(), })); +jest.mock('utils/url', () => ({ + getBasePath: jest.fn(), +})); + jest.mock('./browser_popouts', () => { const mockFn = jest.fn(); (globalThis as typeof globalThis & {mockSetupBrowserPopout: typeof mockFn}).mockSetupBrowserPopout = mockFn; @@ -33,6 +38,7 @@ jest.mock('./browser_popouts', () => { const mockDesktopApp = DesktopApp as jest.Mocked; const mockIsDesktopApp = isDesktopApp as jest.MockedFunction; +const mockGetBasePath = getBasePath as jest.MockedFunction; const getMockSetupBrowserPopout = () => { return (globalThis as typeof globalThis & {mockSetupBrowserPopout: jest.MockedFunction<() => unknown>}).mockSetupBrowserPopout; @@ -42,6 +48,9 @@ describe('popout_windows', () => { beforeEach(() => { jest.clearAllMocks(); getMockSetupBrowserPopout().mockClear(); + + // Default: no subpath + mockGetBasePath.mockReturnValue(''); }); describe('popoutThread', () => { @@ -121,6 +130,23 @@ describe('popout_windows', () => { expect(mockOnFocusPost).toHaveBeenCalledTimes(1); expect(mockOnFocusPost).toHaveBeenCalledWith('post-123', '/team/pl/post-123'); }); + + it('should include subpath in popout URL when basename is set', async () => { + mockIsDesktopApp.mockReturnValue(false); + mockGetBasePath.mockReturnValue('/company/mattermost'); + const mockListeners = { + sendToPopout: jest.fn(), + onMessageFromPopout: jest.fn(), + onClosePopout: jest.fn(), + }; + getMockSetupBrowserPopout().mockReturnValue(mockListeners); + + await popoutThread('Thread - {channelName} - {teamName} - {serverName}', 'thread-123', 'test-team', mockOnFocusPost); + + expect(getMockSetupBrowserPopout()).toHaveBeenCalledWith( + '/company/mattermost/_popout/thread/test-team/thread-123', + ); + }); }); describe('popoutRhsPlugin', () => { @@ -173,6 +199,23 @@ describe('popout_windows', () => { expect(result).toEqual(mockListeners); }); + + it('should include subpath in popout URL when basename is set', async () => { + mockIsDesktopApp.mockReturnValue(false); + mockGetBasePath.mockReturnValue('/company/mattermost'); + const mockListeners = { + sendToPopout: jest.fn(), + onMessageFromPopout: jest.fn(), + onClosePopout: jest.fn(), + }; + getMockSetupBrowserPopout().mockReturnValue(mockListeners); + + await popoutRhsPlugin('{pluginDisplayName} - {serverName}', 'test-plugin-id', 'test-team', 'test-channel'); + + expect(getMockSetupBrowserPopout()).toHaveBeenCalledWith( + '/company/mattermost/_popout/rhs/test-team/test-channel/plugin/test-plugin-id', + ); + }); }); }); diff --git a/webapp/channels/src/utils/popouts/popout_windows.ts b/webapp/channels/src/utils/popouts/popout_windows.ts index 55290eb51e4..4f7988aa47f 100644 --- a/webapp/channels/src/utils/popouts/popout_windows.ts +++ b/webapp/channels/src/utils/popouts/popout_windows.ts @@ -6,6 +6,7 @@ import type {PopoutViewProps} from '@mattermost/desktop-api'; import {Client4} from 'mattermost-redux/client'; import DesktopApp from 'utils/desktop_api'; +import {getBasePath} from 'utils/url'; import {isDesktopApp} from 'utils/user_agent'; import BrowserPopouts from './browser_popouts'; @@ -27,7 +28,7 @@ export async function popoutThread( onFocusPost: (postId: string, returnTo: string) => void, ) { const popoutListeners = await popout( - `/_popout/thread/${teamName}/${threadId}`, + `${getBasePath()}/_popout/thread/${teamName}/${threadId}`, { isRHS: true, titleTemplate, @@ -54,7 +55,7 @@ export async function popoutRhsPlugin( channelName: string, ) { const listeners = await popout( - `/_popout/rhs/${teamName}/${channelName}/plugin/${pluginId}`, + `${getBasePath()}/_popout/rhs/${teamName}/${channelName}/plugin/${pluginId}`, { isRHS: true, titleTemplate,