fix(admin-vue 查询ASIN): 列表筛选/分页参数对齐后端 snake_case,导出 XLSX 带上当前筛选
- query-asin-filter: toQueryAsinQuery 输出 page_size/group_id/shop_name(35bed42b 后端已改显式 snake, camel 参数被静默忽略导致分组/店铺名筛选无作用、pageSize 固定回落 15) - 新增 query-asin-export: 按当前筛选构建导出 URL,页面「导出 XLSX」不再恒为全量 - query-asin-import-api: 导入兜底分组 groupId→group_id(后端 importExcel 已改名,此前同样被丢弃) - query-asin-delete-import-api: 保持 groupId 并加注释(后端仍隐式 camel,统一需两端同步部署) - task-71 测试断言更新为 snake 契约(含 camel 不下发反断言)+ 新增导出 URL 用例 已上线 admin-vue-20260910-145200,线上 chunk 验证含 snake 参数;task-71 10/10 通过,vue-tsc 通过
This commit is contained in:
@@ -15,6 +15,7 @@ import {
|
||||
toQueryAsinParams,
|
||||
toQueryAsinQuery,
|
||||
} from '../src/pages/asin/query-asin-filter.ts'
|
||||
import { buildQueryAsinExportQuery, toQueryAsinExportUrl } from '../src/pages/asin/query-asin-export.ts'
|
||||
|
||||
test('test_task_071_query_asin_list_normal_primary_path', () => {
|
||||
// 正常主路径:Java QueryAsinPageVo(camel) 宽行(每店铺 5 国家 ASIN)解析为前端分页结果。
|
||||
@@ -115,24 +116,26 @@ test('test_task_071_query_asin_list_boundary_limit_or_missing_field', () => {
|
||||
999,
|
||||
))
|
||||
assert.equal(query.page, 1)
|
||||
assert.equal(query.pageSize, 100)
|
||||
assert.equal('groupId' in query, false, '分组 0 不应下发')
|
||||
assert.equal('shopName' in query, false, '空白店铺名不应下发')
|
||||
assert.equal(query.page_size, 100)
|
||||
assert.equal('group_id' in query, false, '分组 0 不应下发')
|
||||
assert.equal('shop_name' in query, false, '空白店铺名不应下发')
|
||||
assert.equal('asin' in query, false)
|
||||
assert.equal('country' in query, false, '不支持的国家码不应下发')
|
||||
// 正常非空值仍以 Java camelCase 参数名下发。
|
||||
// 正常非空值以 Java snake_case 参数名下发(QueryAsinController @RequestParam(page_size/group_id/shop_name) 契约)。
|
||||
const filled = toQueryAsinQuery(toQueryAsinParams(
|
||||
{ groupId: 5, shopName: ' 蓝店 ', asin: 'B0X', country: 'de' },
|
||||
3,
|
||||
25,
|
||||
))
|
||||
assert.equal(filled.page, 3)
|
||||
assert.equal(filled.pageSize, 25)
|
||||
assert.equal(filled.groupId, 5)
|
||||
assert.equal(filled.shopName, '蓝店')
|
||||
assert.equal(filled.page_size, 25)
|
||||
assert.equal(filled.group_id, 5)
|
||||
assert.equal(filled.shop_name, '蓝店')
|
||||
assert.equal(filled.asin, 'B0X')
|
||||
assert.equal(filled.country, 'DE')
|
||||
assert.equal('page_size' in (filled as Record<string, unknown>), false, '不应下发 page_size(snake)')
|
||||
assert.equal('pageSize' in (filled as Record<string, unknown>), false, '不应下发 pageSize(camel):后端收不到会导致筛选/分页失效')
|
||||
assert.equal('groupId' in (filled as Record<string, unknown>), false, '不应下发 groupId(camel)')
|
||||
assert.equal('shopName' in (filled as Record<string, unknown>), false, '不应下发 shopName(camel)')
|
||||
})
|
||||
|
||||
test('test_task_071_query_asin_country_semantics', () => {
|
||||
@@ -174,3 +177,16 @@ test('test_task_071_query_asin_list_dependency_failure_returns_actionable_messag
|
||||
const model = readSource('src/pages/asin/query-asin-model.ts')
|
||||
assert.equal(/axios|http\./.test(model), false, '查询 ASIN 列表解析保持纯逻辑')
|
||||
})
|
||||
|
||||
test('test_task_071_query_asin_export_url_follows_filter', () => {
|
||||
// 导出 URL 跟随当前筛选:非空条件以 snake 参数下发(后端 export @RequestParam 契约),空白/非法条件与无筛选时退回全量。
|
||||
const url = toQueryAsinExportUrl({ groupId: 5, shopName: ' 蓝店 ', asin: ' B0X ', country: 'de' })
|
||||
assert.equal(url.startsWith('/api/admin/query-asins/export?'), true)
|
||||
const params = new URLSearchParams(url.split('?')[1])
|
||||
assert.equal(params.get('group_id'), '5')
|
||||
assert.equal(params.get('shop_name'), '蓝店')
|
||||
assert.equal(params.get('asin'), 'B0X')
|
||||
assert.equal(params.get('country'), 'DE')
|
||||
assert.equal(buildQueryAsinExportQuery({ groupId: 0, shopName: ' ', asin: '', country: 'XX' }), '', '空白/非法条件不下发')
|
||||
assert.equal(toQueryAsinExportUrl({ groupId: null, shopName: '', asin: '', country: '' }), '/api/admin/query-asins/export', '无筛选即全量导出')
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user