52 lines
1.7 KiB
JavaScript
52 lines
1.7 KiB
JavaScript
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 }
|
||
)
|
||
})
|
||
})
|