// 已读取AGENTS.md import * as fs from 'fs'; import * as path from 'path'; /** * 第一百一十九批闸门:小程序全页面分享到好友与朋友圈闸门 */ describe('第一百一十九批全页面分享到好友与朋友圈闸门', () => { const rootDir = path.resolve(__dirname, '../../'); const shareJsPath = path.join(rootDir, 'pwuniapp/common/share.js'); const mainJsPath = path.join(rootDir, 'pwuniapp/main.js'); it('pwuniapp/common/share.js 必须存在并提供完备的分享生命周期与工具函数', () => { expect(fs.existsSync(shareJsPath)).toBe(true); const content = fs.readFileSync(shareJsPath, 'utf-8'); expect(content).toContain('onShareAppMessage'); expect(content).toContain('onShareTimeline'); expect(content).toContain('showShareMenu'); expect(content).toContain('shareAppMessage'); expect(content).toContain('shareTimeline'); expect(content).toContain('export function useShare'); expect(content).toContain('export const shareMixin'); expect(content).toContain('export function buildSharePath'); expect(content).toContain('export function buildTimelineQuery'); }); it('main.js 必须全局混入 shareMixin 作为全页面兜底', () => { const content = fs.readFileSync(mainJsPath, 'utf-8'); expect(content).toContain("import { shareMixin } from './common/share.js'"); expect(content).toContain('app.mixin(shareMixin)'); }); it('核心公共与业务页面均需显式配置 useShare 并具备邀请分销与上下文参数', () => { const keyPages = [ 'pwuniapp/pages/index/index.vue', 'pwuniapp/pages/activity/list.vue', 'pwuniapp/pages/activity/detail.vue', 'pwuniapp/pages/activity/my-ticket.vue', 'pwuniapp/pages/activity/create.vue', 'pwuniapp/pages/expert/detail.vue', 'pwuniapp/pages/expert/apply.vue', 'pwuniapp/pages/expert/hall.vue', 'pwuniapp/pages/expert/radar.vue', 'pwuniapp/pages/expert/workspace.vue', 'pwuniapp/pages/community/index.vue', 'pwuniapp/pages/community/detail.vue', 'pwuniapp/pages/user/index.vue', 'pwuniapp/pages/user/promote.vue', 'pwuniapp/pages/user/coupons.vue', 'pwuniapp/pages/user/help-faq.vue', 'pwuniapp/pages/common/protocol.vue', 'pwuniapp/pages/order/list.vue', ]; for (const relPath of keyPages) { const fullPath = path.join(rootDir, relPath); expect(fs.existsSync(fullPath)).toBe(true); const content = fs.readFileSync(fullPath, 'utf-8'); expect(content).toContain("useShare"); } }); it('分享代码及所有更新页面必须严格遵循零 Emoji 门禁规范', () => { const content = fs.readFileSync(shareJsPath, 'utf-8'); const emojiRegex = /[\u{1F300}-\u{1F9FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/u; expect(emojiRegex.test(content)).toBe(false); }); });