Skip to content

feat(rtn-passkeys): modify existing implementation - 2 #14391

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: feat/rtn-passkeys/1-add-new-package
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { getIsNativeError } from '@aws-amplify/react-native';

import {
PasskeyError,
PasskeyErrorCode,
} from '../../../../../src/client/utils/passkey/errors';
import { handlePasskeyAuthenticationError } from '../../../../../src/client/utils/passkey/errors/handlePasskeyAuthenticationError.native';
import { handlePasskeyError } from '../../../../../src/client/utils/passkey/errors/handlePasskeyError';
import { passkeyErrorMap } from '../../../../../src/client/utils/passkey/errors/passkeyError';
import { MockNativeError } from '../../../../mockData';

const mockHandlePasskeyError = jest.mocked(handlePasskeyError);
jest.mock('../../../../../src/client/utils/passkey/errors/handlePasskeyError');

jest.mock('@aws-amplify/react-native', () => ({
getIsNativeError: jest.fn(() => true),
}));

const mockGetIsNativeError = jest.mocked(getIsNativeError);

describe('handlePasskeyAuthenticationError', () => {
it('returns early if err is already instanceof PasskeyError', () => {
const err = new PasskeyError({
name: 'PasskeyErrorName',
message: 'Error Message',
});

expect(handlePasskeyAuthenticationError(err)).toBe(err);
expect(mockGetIsNativeError).not.toHaveBeenCalled();
});

it('returns new instance of PasskeyError with correct attributes when input error code is FAILED', () => {
const err = new MockNativeError();
err.code = 'FAILED';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.PasskeyRetrievalFailed];

expect(handlePasskeyAuthenticationError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.PasskeyRetrievalFailed,
message,
recoverySuggestion,
underlyingError: err,
}),
);
expect(mockGetIsNativeError).toHaveBeenCalledWith(err);
});

it('returns new instance of PasskeyError with correct attributes when input error code is CANCELED', () => {
const err = new MockNativeError();
err.code = 'CANCELED';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.PasskeyAuthenticationCanceled];

expect(handlePasskeyAuthenticationError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.PasskeyAuthenticationCanceled,
message,
recoverySuggestion,
underlyingError: err,
}),
);
expect(mockGetIsNativeError).toHaveBeenCalledWith(err);
});

it('invokes handlePasskeyError when input error does not match expected cases', () => {
const err = new Error();
err.name = 'Unknown';

handlePasskeyAuthenticationError(err);

expect(mockHandlePasskeyError).toHaveBeenCalledWith(err);
expect(mockGetIsNativeError).toHaveBeenCalledWith(err);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import {
PasskeyError,
PasskeyErrorCode,
handlePasskeyAuthenticationError,
} from '../../../../../src/client/utils/passkey/errors';
import { handlePasskeyError } from '../../../../../src/client/utils/passkey/errors/handlePasskeyError';
import { passkeyErrorMap } from '../../../../../src/client/utils/passkey/errors/passkeyError';

const mockHandlePasskeyError = jest.mocked(handlePasskeyError);
jest.mock('../../../../../src/client/utils/passkey/errors/handlePasskeyError');

describe('handlePasskeyAuthenticationError', () => {
it('returns early if err is already instanceof PasskeyError', () => {
const err = new PasskeyError({
name: 'PasskeyErrorName',
message: 'Error Message',
});

expect(handlePasskeyAuthenticationError(err)).toBe(err);
});

it('returns new instance of PasskeyError with correct attributes when input error name is NotAllowedError', () => {
const err = new Error();
err.name = 'NotAllowedError';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.PasskeyAuthenticationCanceled];

expect(handlePasskeyAuthenticationError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.PasskeyAuthenticationCanceled,
message,
recoverySuggestion,
underlyingError: err,
}),
);
});

it('invokes handlePasskeyError when input error does not match expected cases', () => {
const err = new Error();
err.name = 'Unknown';

handlePasskeyAuthenticationError(err);

expect(mockHandlePasskeyError).toHaveBeenCalledWith(err);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { AmplifyErrorCode } from '@aws-amplify/core/internals/utils';

import {
PasskeyError,
PasskeyErrorCode,
} from '../../../../../src/client/utils/passkey/errors';
import { handlePasskeyError } from '../../../../../src/client/utils/passkey/errors/handlePasskeyError.native';
import { passkeyErrorMap } from '../../../../../src/client/utils/passkey/errors/passkeyError';
import { MockNativeError } from '../../../../mockData';

jest.mock('@aws-amplify/react-native', () => ({
getIsNativeError: jest.fn(() => true),
}));

describe('handlePasskeyError', () => {
it('returns new instance of PasskeyError with correct attributes when input error code is RELYING_PARTY_MISMATCH', () => {
const err = new MockNativeError();
err.code = 'RELYING_PARTY_MISMATCH';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.RelyingPartyMismatch];

expect(handlePasskeyError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.RelyingPartyMismatch,
message,
recoverySuggestion,
underlyingError: err,
}),
);
});

it('returns new instance of PasskeyError with correct attributes when input error code is NOT_SUPPORTED', () => {
const err = new MockNativeError();
err.code = 'NOT_SUPPORTED';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.PasskeyNotSupported];

expect(handlePasskeyError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.PasskeyNotSupported,
message,
recoverySuggestion,
underlyingError: err,
}),
);
});

it('returns unknown PasskeyError when input does not match expected cases', () => {
const err = new MockNativeError();
err.name = 'UNKNOWN';

expect(handlePasskeyError(err)).toMatchObject(
new PasskeyError({
name: AmplifyErrorCode.Unknown,
message: 'An unknown error has occurred.',
underlyingError: err,
}),
);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { AmplifyErrorCode } from '@aws-amplify/core/internals/utils';

import {
PasskeyError,
PasskeyErrorCode,
} from '../../../../../src/client/utils/passkey/errors';
import { handlePasskeyError } from '../../../../../src/client/utils/passkey/errors/handlePasskeyError';
import { passkeyErrorMap } from '../../../../../src/client/utils/passkey/errors/passkeyError';

describe('handlePasskeyError', () => {
it('returns new instance of PasskeyError with correct attributes when input error name is AbortError', () => {
const err = new Error();
err.name = 'AbortError';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.PasskeyOperationAborted];

expect(handlePasskeyError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.PasskeyOperationAborted,
message,
recoverySuggestion,
underlyingError: err,
}),
);
});

it('returns new instance of PasskeyError with correct attributes when input error name is SecurityError', () => {
const err = new Error();
err.name = 'SecurityError';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.RelyingPartyMismatch];

expect(handlePasskeyError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.RelyingPartyMismatch,
message,
recoverySuggestion,
underlyingError: err,
}),
);
});

it('returns unknown PasskeyError when input does not match expected cases', () => {
const err = new Error();
err.name = 'Unknown';

expect(handlePasskeyError(err)).toMatchObject(
new PasskeyError({
name: AmplifyErrorCode.Unknown,
message: 'An unknown error has occurred.',
underlyingError: err,
}),
);
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
import { getIsNativeError } from '@aws-amplify/react-native';

import {
PasskeyError,
PasskeyErrorCode,
} from '../../../../../src/client/utils/passkey/errors';
import { handlePasskeyRegistrationError } from '../../../../../src/client/utils/passkey/errors/handlePasskeyRegistrationError.native';
import { handlePasskeyError } from '../../../../../src/client/utils/passkey/errors/handlePasskeyError';
import { passkeyErrorMap } from '../../../../../src/client/utils/passkey/errors/passkeyError';
import { MockNativeError } from '../../../../mockData';

const mockHandlePasskeyError = jest.mocked(handlePasskeyError);
jest.mock('../../../../../src/client/utils/passkey/errors/handlePasskeyError');

jest.mock('@aws-amplify/react-native', () => ({
getIsNativeError: jest.fn(() => true),
}));

const mockGetIsNativeError = jest.mocked(getIsNativeError);

describe('handlePasskeyRegistrationError', () => {
it('returns early if err is already instanceof PasskeyError', () => {
const err = new PasskeyError({
name: 'PasskeyErrorName',
message: 'Error Message',
});

expect(handlePasskeyRegistrationError(err)).toBe(err);
expect(mockGetIsNativeError).not.toHaveBeenCalled();
});

it('returns new instance of PasskeyError with correct attributes when input error code is FAILED', () => {
const err = new MockNativeError();
err.code = 'FAILED';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.PasskeyRegistrationFailed];

expect(handlePasskeyRegistrationError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.PasskeyRegistrationFailed,
message,
recoverySuggestion,
underlyingError: err,
}),
);
expect(mockGetIsNativeError).toHaveBeenCalledWith(err);
});

it('returns new instance of PasskeyError with correct attributes when input error code is DUPLICATE', () => {
const err = new MockNativeError();
err.code = 'DUPLICATE';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.PasskeyAlreadyExists];

expect(handlePasskeyRegistrationError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.PasskeyAlreadyExists,
message,
recoverySuggestion,
underlyingError: err,
}),
);
expect(mockGetIsNativeError).toHaveBeenCalledWith(err);
});

it('returns new instance of PasskeyError with correct attributes when input error code is CANCELED', () => {
const err = new MockNativeError();
err.code = 'CANCELED';

const { message, recoverySuggestion } =
passkeyErrorMap[PasskeyErrorCode.PasskeyRegistrationCanceled];

expect(handlePasskeyRegistrationError(err)).toMatchObject(
new PasskeyError({
name: PasskeyErrorCode.PasskeyRegistrationCanceled,
message,
recoverySuggestion,
underlyingError: err,
}),
);
expect(mockGetIsNativeError).toHaveBeenCalledWith(err);
});

it('invokes handlePasskeyError when input error does not match expected cases', () => {
const err = new Error();
err.name = 'Unknown';

handlePasskeyRegistrationError(err);

expect(mockHandlePasskeyError).toHaveBeenCalledWith(err);
expect(mockGetIsNativeError).toHaveBeenCalledWith(err);
});
});
Loading
Loading