From 5eb3fbce6937d7a7def181ac6e39c4986cb5c919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferenc=20S=C3=A1rai?= Date: Mon, 16 Feb 2026 13:45:52 +0100 Subject: [PATCH 1/2] fix: improve error handling to display API error messages with status codes --- src/utils/error.ts | 9 ++++++++- test/misc/top-level-error-handler.spec.ts | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/utils/error.ts b/src/utils/error.ts index 8f98d849..8ae91aca 100644 --- a/src/utils/error.ts +++ b/src/utils/error.ts @@ -37,7 +37,14 @@ export function errorHandler(error: any, options?: BeeErrorOptions): void { process.exitCode = 1 } // grab error.message, or error if it is a string - const message: string | null = typeof error === 'string' ? error : error?.response?.data?.message || error?.message + let message: string | null + const responseBody = error?.responseBody + + if (responseBody?.code && responseBody?.message) { + message = `${responseBody.message} (HTTP ${responseBody.code})` + } else { + message = typeof error === 'string' ? error : error?.response?.data?.message || error?.message + } const type: string | null = getFieldOrNull(error, 'type') // write custom message for 500 diff --git a/test/misc/top-level-error-handler.spec.ts b/test/misc/top-level-error-handler.spec.ts index 549afae7..264087bf 100644 --- a/test/misc/top-level-error-handler.spec.ts +++ b/test/misc/top-level-error-handler.spec.ts @@ -102,4 +102,18 @@ describeCommand('Top-Level Error Handler', ({ consoleMessages }) => { 'There may be additional information in the Bee logs.', ]) }) + + it('should handle API errors with responseBody', async () => { + jest.spyOn(Utils, 'getSourcemap').mockImplementation(() => { + const error: any = new Error('Request failed') + error.responseBody = { message: 'out of funds', code: 400 } + throw error + }) + await invokeTestCli(['status']) + expectErrorsToDeepEqual(consoleMessages, [ + FORMATTED_ERROR + ' out of funds (HTTP 400)', + '', + 'There may be additional information in the Bee logs.', + ]) + }) }) From 8e297eb8017e1d68163fce12c35f14c6ea560aac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Feb 2026 13:30:06 +0000 Subject: [PATCH 2/2] test: update test coverage --- test/coverage/coverage-summary.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/coverage/coverage-summary.json b/test/coverage/coverage-summary.json index 6eee43bf..e6a5db0f 100644 --- a/test/coverage/coverage-summary.json +++ b/test/coverage/coverage-summary.json @@ -1,4 +1,4 @@ -{"total": {"lines":{"total":2682,"covered":1960,"skipped":0,"pct":73.07},"statements":{"total":2702,"covered":1973,"skipped":0,"pct":73.01},"functions":{"total":319,"covered":242,"skipped":0,"pct":75.86},"branches":{"total":569,"covered":302,"skipped":0,"pct":53.07},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} +{"total": {"lines":{"total":2685,"covered":1963,"skipped":0,"pct":73.1},"statements":{"total":2705,"covered":1976,"skipped":0,"pct":73.04},"functions":{"total":319,"covered":242,"skipped":0,"pct":75.86},"branches":{"total":573,"covered":306,"skipped":0,"pct":53.4},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/application.ts": {"lines":{"total":2,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":2,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/config.ts": {"lines":{"total":32,"covered":31,"skipped":0,"pct":96.87},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":32,"covered":31,"skipped":0,"pct":96.87},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/curl.ts": {"lines":{"total":24,"covered":24,"skipped":0,"pct":100},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":25,"covered":25,"skipped":0,"pct":100},"branches":{"total":13,"covered":12,"skipped":0,"pct":92.3}} @@ -92,7 +92,7 @@ ,"/home/runner/work/swarm-cli/swarm-cli/src/utils/bzz-address.ts": {"lines":{"total":30,"covered":24,"skipped":0,"pct":80},"functions":{"total":3,"covered":2,"skipped":0,"pct":66.66},"statements":{"total":30,"covered":24,"skipped":0,"pct":80},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} ,"/home/runner/work/swarm-cli/swarm-cli/src/utils/chainsync.ts": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/utils/contracts.ts": {"lines":{"total":3,"covered":3,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":3,"covered":3,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} -,"/home/runner/work/swarm-cli/swarm-cli/src/utils/error.ts": {"lines":{"total":41,"covered":36,"skipped":0,"pct":87.8},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":41,"covered":36,"skipped":0,"pct":87.8},"branches":{"total":28,"covered":25,"skipped":0,"pct":89.28}} +,"/home/runner/work/swarm-cli/swarm-cli/src/utils/error.ts": {"lines":{"total":44,"covered":39,"skipped":0,"pct":88.63},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":44,"covered":39,"skipped":0,"pct":88.63},"branches":{"total":32,"covered":29,"skipped":0,"pct":90.62}} ,"/home/runner/work/swarm-cli/swarm-cli/src/utils/hex.ts": {"lines":{"total":14,"covered":10,"skipped":0,"pct":71.42},"functions":{"total":4,"covered":2,"skipped":0,"pct":50},"statements":{"total":16,"covered":11,"skipped":0,"pct":68.75},"branches":{"total":5,"covered":1,"skipped":0,"pct":20}} ,"/home/runner/work/swarm-cli/swarm-cli/src/utils/index.ts": {"lines":{"total":83,"covered":51,"skipped":0,"pct":61.44},"functions":{"total":18,"covered":11,"skipped":0,"pct":61.11},"statements":{"total":83,"covered":51,"skipped":0,"pct":61.44},"branches":{"total":25,"covered":14,"skipped":0,"pct":56}} ,"/home/runner/work/swarm-cli/swarm-cli/src/utils/message.ts": {"lines":{"total":12,"covered":3,"skipped":0,"pct":25},"functions":{"total":11,"covered":2,"skipped":0,"pct":18.18},"statements":{"total":12,"covered":3,"skipped":0,"pct":25},"branches":{"total":2,"covered":0,"skipped":0,"pct":0}}