import { describe, it, expect } from 'vitest' import * as fc from 'fast-check' import { resolveBannerNavigation } from '../utils/navigation.js' describe('Property 7: Banner导航正确性', () => { /** * **Feature: mobile-app, Property 7: Banner导航正确性** * **Validates: Requirements 3.2** * * 对于任意Banner配置项,当linkType为"internal"时点击应调用内部页面导航, * 当linkType为"external"时点击应调用外部链接打开, * 且目标URL应等于配置的linkUrl。 */ it('internal类型Banner应返回internal导航,external类型应返回external导航,URL保持一致', () => { const linkTypeArb = fc.constantFrom('internal', 'external') const urlArb = fc.string({ minLength: 1, maxLength: 200 }).filter(s => s.trim().length > 0) fc.assert( fc.property(linkTypeArb, urlArb, (linkType, linkUrl) => { const banner = { id: '1', imageUrl: 'http://img.test/a.png', linkType, linkUrl } const result = resolveBannerNavigation(banner) // 导航结果不为null expect(result).not.toBeNull() // 导航类型与Banner配置一致 expect(result.type).toBe(linkType) // 导航URL与Banner配置一致 expect(result.url).toBe(linkUrl) }), { numRuns: 100 } ) }) it('无效Banner(无linkUrl或null)应返回null', () => { const invalidBannerArb = fc.constantFrom( null, undefined, {}, { linkType: 'internal' }, { linkType: 'external', linkUrl: '' } ) fc.assert( fc.property(invalidBannerArb, (banner) => { const result = resolveBannerNavigation(banner) expect(result).toBeNull() }), { numRuns: 20 } ) }) })