dsh-api-runner 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -3
- package/client/client.js +518 -26
- package/package.json +4 -4
- package/src/db.js +958 -0
- package/src/main.js +137 -1
- package/src/ops.js +1327 -1257
- package/src/project-store.js +350 -334
- package/test/client.mjs +102 -1
- package/test/db.mjs +346 -0
- package/test/plugin.mjs +123 -0
- package/test/smoke.mjs +114 -0
package/test/smoke.mjs
CHANGED
|
@@ -289,6 +289,120 @@ await ok('面板接口的 tokenPath 会自动写回配置,第二次登录不
|
|
|
289
289
|
service.deleteApiUi(projectDir, 'ui-login');
|
|
290
290
|
});
|
|
291
291
|
|
|
292
|
+
console.log('面板回显与数据保留:');
|
|
293
|
+
await ok('示例参数保存后能回显(不再永远空)', async () => {
|
|
294
|
+
service.saveApiUi(projectDir, {
|
|
295
|
+
id: 'ui-sample',
|
|
296
|
+
name: '回显示例参数',
|
|
297
|
+
method: 'GET',
|
|
298
|
+
url: `${base}/echo`,
|
|
299
|
+
sampleParams: { matterCd: 'SX-202609-0012', page: 1 },
|
|
300
|
+
});
|
|
301
|
+
const state = await service.uiState(projectDir);
|
|
302
|
+
const api = state.apis.find((item) => item.id === 'ui-sample');
|
|
303
|
+
assert.ok(api, '接口应出现在 uiState 里');
|
|
304
|
+
assert.notEqual(api.sampleText, '', 'sampleText 不能为空,否则编辑框回显不出来');
|
|
305
|
+
const parsed = JSON.parse(api.sampleText);
|
|
306
|
+
assert.equal(parsed.matterCd, 'SX-202609-0012');
|
|
307
|
+
assert.equal(parsed.page, 1);
|
|
308
|
+
service.deleteApiUi(projectDir, 'ui-sample');
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
await ok('YAML 里的 query 不会被面板保存抹掉', async () => {
|
|
312
|
+
// 先写进面板(模拟 YAML 已有该接口),再在面板里只改说明后保存
|
|
313
|
+
service.saveApiUi(projectDir, {
|
|
314
|
+
id: 'ui-query',
|
|
315
|
+
name: '带 query 的接口',
|
|
316
|
+
method: 'GET',
|
|
317
|
+
url: `${base}/system/library/matter/billList`,
|
|
318
|
+
query: { matterCd: '{matterCd}' },
|
|
319
|
+
});
|
|
320
|
+
const before = await service.uiState(projectDir);
|
|
321
|
+
const b = before.apis.find((item) => item.id === 'ui-query');
|
|
322
|
+
assert.ok(b.queryText && b.queryText.includes('matterCd'), 'uiState 应返回 queryText 供面板回显');
|
|
323
|
+
|
|
324
|
+
// 面板只改说明,不带 query 字段(真实表单就是这样提交的)
|
|
325
|
+
service.saveApiUi(projectDir, {
|
|
326
|
+
id: 'ui-query',
|
|
327
|
+
name: '带 query 的接口',
|
|
328
|
+
method: 'GET',
|
|
329
|
+
url: `${base}/system/library/matter/billList`,
|
|
330
|
+
description: '只改了说明',
|
|
331
|
+
});
|
|
332
|
+
const stored = service.projectStore.project(projectDir).apis.find((item) => item.id === 'ui-query');
|
|
333
|
+
assert.ok(stored.query && stored.query.matterCd === '{matterCd}', 'query 必须被保留,不能被整体覆盖丢掉');
|
|
334
|
+
assert.equal(stored.description, '只改了说明');
|
|
335
|
+
|
|
336
|
+
// 运行期确实用上了 query
|
|
337
|
+
const config = service.config(projectDir);
|
|
338
|
+
const runtime = config.config.apis.find((item) => item.id === 'ui-query');
|
|
339
|
+
assert.equal(runtime.query.matterCd, '{matterCd}');
|
|
340
|
+
service.deleteApiUi(projectDir, 'ui-query');
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
await ok('显式传 query 时以新值为准(不是只增不减)', async () => {
|
|
344
|
+
service.saveApiUi(projectDir, {
|
|
345
|
+
id: 'ui-query2',
|
|
346
|
+
name: 'q2',
|
|
347
|
+
method: 'GET',
|
|
348
|
+
url: `${base}/echo`,
|
|
349
|
+
query: { a: '1', b: '2' },
|
|
350
|
+
});
|
|
351
|
+
service.saveApiUi(projectDir, {
|
|
352
|
+
id: 'ui-query2',
|
|
353
|
+
name: 'q2',
|
|
354
|
+
method: 'GET',
|
|
355
|
+
url: `${base}/echo`,
|
|
356
|
+
query: { a: '9' },
|
|
357
|
+
});
|
|
358
|
+
const stored = service.projectStore.project(projectDir).apis.find((item) => item.id === 'ui-query2');
|
|
359
|
+
assert.deepEqual(stored.query, { a: '9' }, '显式提交的 query 应整体替换,不被旧值污染');
|
|
360
|
+
service.deleteApiUi(projectDir, 'ui-query2');
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
await ok('面板传空 query 能真正清空(不被旧值粘回来)', async () => {
|
|
364
|
+
service.saveApiUi(projectDir, {
|
|
365
|
+
id: 'ui-query3',
|
|
366
|
+
name: 'q3',
|
|
367
|
+
method: 'GET',
|
|
368
|
+
url: `${base}/echo`,
|
|
369
|
+
query: { a: '1' },
|
|
370
|
+
});
|
|
371
|
+
// 面板把输入框清空后提交的是 {},必须覆盖成空
|
|
372
|
+
service.saveApiUi(projectDir, {
|
|
373
|
+
id: 'ui-query3',
|
|
374
|
+
name: 'q3',
|
|
375
|
+
method: 'GET',
|
|
376
|
+
url: `${base}/echo`,
|
|
377
|
+
query: {},
|
|
378
|
+
});
|
|
379
|
+
const stored = service.projectStore.project(projectDir).apis.find((item) => item.id === 'ui-query3');
|
|
380
|
+
assert.deepEqual(stored.query, {}, '清空 query 必须生效,否则用户没法去掉参数');
|
|
381
|
+
service.deleteApiUi(projectDir, 'ui-query3');
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
await ok('只改说明时示例参数也要保留(不能变成空)', async () => {
|
|
385
|
+
service.saveApiUi(projectDir, {
|
|
386
|
+
id: 'ui-sample2',
|
|
387
|
+
name: 's2',
|
|
388
|
+
method: 'GET',
|
|
389
|
+
url: `${base}/echo`,
|
|
390
|
+
sampleParams: { matterCd: 'SX-1' },
|
|
391
|
+
});
|
|
392
|
+
service.saveApiUi(projectDir, {
|
|
393
|
+
id: 'ui-sample2',
|
|
394
|
+
name: 's2',
|
|
395
|
+
method: 'GET',
|
|
396
|
+
url: `${base}/echo`,
|
|
397
|
+
description: '只改说明',
|
|
398
|
+
});
|
|
399
|
+
const state = await service.uiState(projectDir);
|
|
400
|
+
const api = state.apis.find((item) => item.id === 'ui-sample2');
|
|
401
|
+
assert.notEqual(api.sampleText, '', '只改说明不应把示例参数弄丢');
|
|
402
|
+
assert.equal(JSON.parse(api.sampleText).matterCd, 'SX-1');
|
|
403
|
+
service.deleteApiUi(projectDir, 'ui-sample2');
|
|
404
|
+
});
|
|
405
|
+
|
|
292
406
|
console.log('面板按项目分类:');
|
|
293
407
|
const otherProjectDir = path.join(tmp, 'another-project');
|
|
294
408
|
fs.mkdirSync(otherProjectDir, { recursive: true });
|