1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Make higher order function for logging errors support asynchronous rejecting with non error instance

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-05-25 08:29:00 +03:00
parent 18d13a23ac
commit de8d5eef37
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
2 changed files with 40 additions and 7 deletions

View File

@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable";
import loggerInjectable from "../../logger.injectable";
export type WithErrorLoggingFor = (
getErrorMessage: (error: Error) => string
getErrorMessage: (error: unknown) => string
) => <T extends (...args: any[]) => any>(
toBeDecorated: T
) => (...args: Parameters<T>) => ReturnType<T>;
@ -24,14 +24,19 @@ const withErrorLoggingInjectable = getInjectable({
const returnValue = toBeDecorated(...args);
if (isPromise(returnValue)) {
returnValue.catch((e: Error) => {
logger.error(getErrorMessage(e as Error), e);
returnValue.catch((e) => {
const errorMessage = getErrorMessage(e);
logger.error(errorMessage, e);
});
}
return returnValue;
} catch (e) {
logger.error(getErrorMessage(e as Error), e);
const errorMessage = getErrorMessage(e);
logger.error(errorMessage, e);
throw e;
}
};

View File

@ -33,7 +33,7 @@ describe("with-error-logging", () => {
decorated = pipeline(
toBeDecorated,
withErrorLoggingFor((error: Error) => `some-error-message-for-${error.message}`),
withErrorLoggingFor((error: any) => `some-error-message-for-${error.message}`),
);
});
@ -133,7 +133,11 @@ describe("with-error-logging", () => {
decorated = pipeline(
toBeDecorated,
withErrorLoggingFor((error: Error) => `some-error-message-for-${error.message}`),
withErrorLoggingFor(
(error: any) =>
`some-error-message-for-${error.message || error.someProperty}`,
),
);
});
@ -158,7 +162,7 @@ describe("with-error-logging", () => {
expect(promiseStatus.fulfilled).toBe(false);
});
describe("when call rejects", () => {
describe("when call rejects with error instance", () => {
let error: Error;
beforeEach(async () => {
@ -179,6 +183,30 @@ describe("with-error-logging", () => {
});
});
describe("when call rejects with something else than error instance", () => {
let error: unknown;
beforeEach(async () => {
try {
await toBeDecorated.reject({ someProperty: "some-rejection" });
await returnValuePromise;
} catch (e) {
error = e;
}
});
it("logs the rejection", () => {
expect(loggerStub.error).toHaveBeenCalledWith(
"some-error-message-for-some-rejection",
error,
);
});
it("rejects", () => {
return expect(() => returnValuePromise).rejects.toEqual({ someProperty: "some-rejection" });
});
});
describe("when call resolves with value", () => {
beforeEach(async () => {
await toBeDecorated.resolve(42);