Skip to content
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

feat(checkout): CHECKOUT-7595 Add client extension service #2056

Merged
merged 14 commits into from
Jul 19, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
feat(checkout): CHECKOUT-7595 Add tests for extension service
  • Loading branch information
animesh1987 committed Jul 17, 2023
commit b800b535259555aa65d589d822193aff5735e59f
12 changes: 3 additions & 9 deletions packages/core/src/extension/create-extension-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export interface CreateExtensionServiceOptions {
parentOrigin: string;
}

export enum ExtensionListenEventType {
export const enum ExtensionListenEventType {
BroadcastCart = 'BROADCAST_CART',
ShippingCountryChange = 'SHIPPING_COUNTRY_CHANGE',
}
Expand All @@ -24,30 +24,24 @@ export interface ExtensionListenEventMap {
};
}

export enum ExtensionPostEventType {
export const enum ExtensionPostEventType {
FRAME_LOADED = 'FRAME_LOADED',
RELOAD_CHECKOUT = 'RELOAD_CHECKOUT',
SHOW_LOADING_INDICATOR = 'SHOW_LOADING_INDICATOR',
}

export interface BaseEventPayload {
payload: {
extensionId: number;
extensionId?: number;
};
}

export interface ExtensionReloadEvent extends BaseEventPayload {
type: ExtensionPostEventType.RELOAD_CHECKOUT;
payload: {
extensionId: number;
};
}

export interface ExtensionShowLoadingIndicatorEvent extends BaseEventPayload {
type: ExtensionPostEventType.SHOW_LOADING_INDICATOR;
payload: {
extensionId: number;
};
}

export interface ExtensionFrameLoadedEvent extends BaseEventPayload {
Expand Down
83 changes: 83 additions & 0 deletions packages/core/src/extension/extension-service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { noop } from 'lodash';

import { IframeEventListener, IframeEventPoster } from '../common/iframe';

import {
ExtensionListenEventMap,
ExtensionListenEventType,
ExtensionPostEvent,
ExtensionPostEventType,
} from './create-extension-service';
import ExtensionService from './extension-service';

describe('ExtensionService', () => {
let extensionService: ExtensionService;
let eventListener: IframeEventListener<ExtensionListenEventMap>;
let eventPoster: IframeEventPoster<ExtensionPostEvent>;

beforeEach(() => {
eventListener = new IframeEventListener('https://mybigcommerce.com');
eventPoster = new IframeEventPoster('https://mybigcommerce.com');

jest.spyOn(eventListener, 'listen');
jest.spyOn(eventListener, 'addListener');
jest.spyOn(eventPoster, 'post');
jest.spyOn(eventPoster, 'post');

extensionService = new ExtensionService(eventListener, eventPoster);
});

it('#initializes success fully', () => {
extensionService.initialize(1);

expect(eventListener.listen).toHaveBeenCalled();
});

it('#initialize throws error if no extension Id is passed', () => {
expect(() => extensionService.initialize(undefined as unknown as number)).toThrow(
new Error('Extension Id not found.'),
);
});

it('#post throws error if extension id is not set', () => {
extensionService.initialize(1);

const event: ExtensionPostEvent = {
type: ExtensionPostEventType.FRAME_LOADED,
payload: {},
};

extensionService.post(event);

expect(eventPoster.post).toHaveBeenCalledWith({
type: ExtensionPostEventType.FRAME_LOADED,
payload: {
extensionId: 1,
},
});
});

it('#addListener adds callback as noop if no callback method is passed', () => {
extensionService.initialize(1);

extensionService.addListener(ExtensionListenEventType.BroadcastCart);

expect(eventListener.addListener).toHaveBeenCalledWith(
ExtensionListenEventType.BroadcastCart,
noop,
);
});

it('#addListener is called correctly with params', () => {
extensionService.initialize(1);

const callbackFn = jest.fn();

extensionService.addListener(ExtensionListenEventType.BroadcastCart, callbackFn);

expect(eventListener.addListener).toHaveBeenCalledWith(
ExtensionListenEventType.BroadcastCart,
callbackFn,
);
});
});
10 changes: 8 additions & 2 deletions packages/core/src/extension/extension-service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// imports types

import { noop } from 'lodash';

import { IframeEventListener, IframeEventPoster } from '../common/iframe';

import {
Expand All @@ -17,14 +19,18 @@ export default class ExtensionService {
) {}

initialize(extensionId: number) {
if (!extensionId) {
throw new Error('Extension Id not found.');
}

this._extensionId = extensionId;

this._eventListener.listen();
}

post(event: ExtensionPostEvent): void {
if (!this._extensionId) {
throw new Error('Extension Id not found.');
return;
}

this._eventPoster.setTarget(window.parent);
Expand All @@ -37,7 +43,7 @@ export default class ExtensionService {
this._eventPoster.post({ ...event, payload });
}

addListener(eventType: ExtensionListenEventType, callback: () => void): void {
addListener(eventType: ExtensionListenEventType, callback: () => void = noop): void {
this._eventListener.addListener(eventType, callback);
}
}