import path from 'node:path'; import { beforeEach, describe, expect, test, vi } from 'vitest'; import { loadCommonJsModule } from '../test-utils/loadCommonJsModule.js'; const TEST_TEMPLATE_ID = 'm5z7BkkBhJGbcH0cdDeHaeRU2tViDEguP38XdrRRCdU'; const subscribeBridgePath = path.resolve( process.cwd(), 'miniprogram/host-bridge/subscribeMessage.js', ); describe('subscribe-message mini program bridge', () => { let subscribeMessageBridge; beforeEach(() => { vi.spyOn(console, 'error').mockImplementation(() => {}); globalThis.wx = { requestSubscribeMessage: vi.fn(), setStorageSync: vi.fn(), navigateBack: vi.fn(), }; globalThis.getCurrentPages = vi.fn(() => []); subscribeMessageBridge = loadCommonJsModule(subscribeBridgePath); }); test('requests subscribe message and stores result before returning', () => { const { SUBSCRIBE_RESULT_STORAGE_KEY, createSubscribeMessagePageController, } = subscribeMessageBridge; const previousPage = { data: { webViewUrl: 'https://web.test/#tab=create' }, setData: vi.fn(), }; globalThis.getCurrentPages = vi.fn(() => [previousPage, {}]); globalThis.wx.requestSubscribeMessage.mockImplementationOnce((options) => { options.success?.({ m5z7BkkBhJGbcH0cdDeHaeRU2tViDEguP38XdrRRCdU: 'accept', }); }); const page = createSubscribeMessagePageController( { setData: vi.fn(), }, { templateId: TEST_TEMPLATE_ID }, ); page.onLoad({ requestId: 'request-1' }); page.requestSubscribe(); expect(globalThis.wx.requestSubscribeMessage).toHaveBeenCalledWith({ tmplIds: [TEST_TEMPLATE_ID], success: expect.any(Function), fail: expect.any(Function), }); expect(globalThis.wx.setStorageSync).toHaveBeenCalledWith( SUBSCRIBE_RESULT_STORAGE_KEY, 'request-1:success', ); expect(previousPage.setData).not.toHaveBeenCalled(); expect(globalThis.wx.navigateBack).toHaveBeenCalled(); }); test('hides requestSubscribeMessage native failure details from H5 result', () => { const { SUBSCRIBE_RESULT_STORAGE_KEY, createSubscribeMessagePageController, } = subscribeMessageBridge; const subscribeError = { errMsg: 'requestSubscribeMessage:fail private native detail', }; globalThis.wx.requestSubscribeMessage.mockImplementationOnce((options) => { options.fail?.(subscribeError); }); const page = createSubscribeMessagePageController( { setData: vi.fn(), }, { templateId: TEST_TEMPLATE_ID }, ); page.onLoad({ requestId: 'request-fail' }); page.requestSubscribe(); expect(globalThis.wx.setStorageSync).toHaveBeenCalledWith( SUBSCRIBE_RESULT_STORAGE_KEY, 'request-fail:skip:wechat%20subscribe%20unavailable', ); expect(console.error).toHaveBeenCalledWith('[subscribe-message] request failed'); expect(console.error.mock.calls.flat()).not.toContain(subscribeError); expect(globalThis.wx.navigateBack).toHaveBeenCalled(); }); test('skip action notifies previous web-view', () => { const { SUBSCRIBE_RESULT_STORAGE_KEY, createSubscribeMessagePageController, } = subscribeMessageBridge; const previousPage = { data: { webViewUrl: 'https://web.test/' }, setData: vi.fn(), }; globalThis.getCurrentPages = vi.fn(() => [previousPage, {}]); const page = createSubscribeMessagePageController( { setData: vi.fn(), }, { templateId: TEST_TEMPLATE_ID }, ); page.onLoad({ requestId: 'request-skip' }); page.handleSkip(); expect(globalThis.wx.setStorageSync).toHaveBeenCalledWith( SUBSCRIBE_RESULT_STORAGE_KEY, 'request-skip:skip:user_skip', ); expect(previousPage.setData).not.toHaveBeenCalled(); expect(globalThis.wx.navigateBack).toHaveBeenCalled(); }); test('appendSubscribeResult replaces stale subscribe hash', () => { const { appendSubscribeResult, buildSubscribeResultValue } = subscribeMessageBridge; expect( appendSubscribeResult( 'https://web.test/#old=1&wx_subscribe_result=old', 'req:skip', ), ).toBe('https://web.test/#old=1&wx_subscribe_result=req%3Askip'); expect(buildSubscribeResultValue('req-1', 'skip', 'user_cancel')).toBe( 'req-1:skip:user_cancel', ); }); });