|
|
@@ -0,0 +1,86 @@
|
|
|
+import { buildListQuery, parseListQuery, sameQuery, DEFAULT_PAGE_SIZE } from '@/utils/listState'
|
|
|
+
|
|
|
+describe('listState utils', () => {
|
|
|
+ describe('buildListQuery', () => {
|
|
|
+ it('默认无变化时返回空对象', () => {
|
|
|
+ const q = buildListQuery(
|
|
|
+ { keyword: '', status: '', productType: '' },
|
|
|
+ { page: 1, size: DEFAULT_PAGE_SIZE, total: 0 },
|
|
|
+ []
|
|
|
+ )
|
|
|
+ expect(q).toEqual({})
|
|
|
+ })
|
|
|
+
|
|
|
+ it('非默认值被写进 query', () => {
|
|
|
+ const q = buildListQuery(
|
|
|
+ { keyword: '儿童', status: 'on_shelf', productType: '' },
|
|
|
+ { page: 3, size: DEFAULT_PAGE_SIZE, total: 42 },
|
|
|
+ [{ column: 'name', order: 'asc' }]
|
|
|
+ )
|
|
|
+ expect(q).toEqual({
|
|
|
+ keyword: '儿童',
|
|
|
+ status: 'on_shelf',
|
|
|
+ page: '3',
|
|
|
+ sort: 'name:asc'
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ it('size 非 20 时写入 size', () => {
|
|
|
+ const q = buildListQuery(
|
|
|
+ {},
|
|
|
+ { page: 1, size: 50, total: 100 },
|
|
|
+ []
|
|
|
+ )
|
|
|
+ expect(q.size).toBe('50')
|
|
|
+ })
|
|
|
+
|
|
|
+ it('sort 序列化与反序列化一致', () => {
|
|
|
+ const sortState = [{ column: 'createdAt', order: 'desc' }, { column: 'name', order: 'asc' }]
|
|
|
+ const q = buildListQuery({}, { page: 1, size: 20, total: 0 }, sortState)
|
|
|
+ const parsed = parseListQuery(q, { filters: {}, size: 20 })
|
|
|
+ expect(parsed.sort).toEqual(sortState)
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ describe('parseListQuery', () => {
|
|
|
+ it('从查询字符串还原筛选/页码/排序', () => {
|
|
|
+ const q = { keyword: '测试', status: 'approved', page: '2', size: '50', sort: 'stock:desc' }
|
|
|
+ const r = parseListQuery(q, { filters: { keyword: '', status: '', productType: '' }, size: 20 })
|
|
|
+ expect(r.filters.keyword).toBe('测试')
|
|
|
+ expect(r.filters.status).toBe('approved')
|
|
|
+ expect(r.page).toBe(2)
|
|
|
+ expect(r.size).toBe(50)
|
|
|
+ expect(r.sort).toEqual([{ column: 'stock', order: 'desc' }])
|
|
|
+ })
|
|
|
+
|
|
|
+ it('缺失字段回退到默认值', () => {
|
|
|
+ const q = { keyword: 'baby' }
|
|
|
+ const r = parseListQuery(q, { filters: { keyword: '', status: '', productType: '' }, size: 10 })
|
|
|
+ expect(r.filters.keyword).toBe('baby')
|
|
|
+ expect(r.filters.status).toBe('')
|
|
|
+ expect(r.page).toBe(1)
|
|
|
+ expect(r.size).toBe(10)
|
|
|
+ expect(r.sort).toEqual([])
|
|
|
+ })
|
|
|
+
|
|
|
+ it('非法 size 回退到默认值', () => {
|
|
|
+ const r = parseListQuery({ size: '99' }, { filters: {}, size: 20 })
|
|
|
+ expect(r.size).toBe(20)
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ describe('sameQuery', () => {
|
|
|
+ it('相同键值返回 true', () => {
|
|
|
+ expect(sameQuery({ a: '1', b: '2' }, { b: '2', a: '1' })).toBe(true)
|
|
|
+ })
|
|
|
+ it('缺少一个 key 返回 false', () => {
|
|
|
+ expect(sameQuery({ a: '1' }, { a: '1', b: '2' })).toBe(false)
|
|
|
+ })
|
|
|
+ it('值不同返回 false', () => {
|
|
|
+ expect(sameQuery({ page: '3' }, { page: '2' })).toBe(false)
|
|
|
+ })
|
|
|
+ it('键集合不同视为不等价', () => {
|
|
|
+ expect(sameQuery({}, { page: undefined })).toBe(false)
|
|
|
+ })
|
|
|
+ })
|
|
|
+})
|