import { afterEach, describe, expect, it, vi } from 'vitest' import { isEmbeddedInWechatMiniProgram, navigateBackToWechatMiniProgram } from '@/utils/hostEnvironment' const createWindow = (overrides: Record = {}) => ({ location: { search: '', hash: '' }, navigator: { userAgent: '' }, ...overrides }) afterEach(() => { vi.unstubAllGlobals() }) describe('微信小程序宿主环境识别', () => { it('同一模块可以识别延迟注入的微信环境标识', () => { const testWindow = createWindow() vi.stubGlobal('window', testWindow) expect(isEmbeddedInWechatMiniProgram()).toBe(false) Object.assign(testWindow, { __wxjs_environment: 'miniprogram' }) expect(isEmbeddedInWechatMiniProgram()).toBe(true) }) it('支持宿主在普通查询或 hash 查询中显式声明环境', () => { vi.stubGlobal('window', createWindow({ location: { search: '?embedded=weapp', hash: '#/pages/index/index?tab=guide' } })) expect(isEmbeddedInWechatMiniProgram()).toBe(true) vi.stubGlobal('window', createWindow({ location: { search: '', hash: '#/pages/index/index?tab=guide&embedded=wechat-mini-program' } })) expect(isEmbeddedInWechatMiniProgram()).toBe(true) }) it('普通微信 H5 不会被误判为小程序 web-view', () => { vi.stubGlobal('window', createWindow({ navigator: { userAgent: 'Mozilla/5.0 MicroMessenger/8.0.50' } })) expect(isEmbeddedInWechatMiniProgram()).toBe(false) }) }) describe('小程序宿主返回', () => { it('嵌入态调用小程序 navigateBack', () => { const navigateBack = vi.fn() vi.stubGlobal('window', createWindow({ __wxjs_environment: 'miniprogram', wx: { miniProgram: { navigateBack } } })) expect(navigateBackToWechatMiniProgram()).toBe(true) expect(navigateBack).toHaveBeenCalledWith({ delta: 1 }) }) it('非嵌入态不会调用小程序返回桥接', () => { const navigateBack = vi.fn() vi.stubGlobal('window', createWindow({ wx: { miniProgram: { navigateBack } } })) expect(navigateBackToWechatMiniProgram()).toBe(false) expect(navigateBack).not.toHaveBeenCalled() }) })