diff --git a/src/payment/PageLoadingDynamicPaymentMethods.test.jsx b/src/payment/PageLoadingDynamicPaymentMethods.test.jsx
new file mode 100644
index 000000000..733da7431
--- /dev/null
+++ b/src/payment/PageLoadingDynamicPaymentMethods.test.jsx
@@ -0,0 +1,90 @@
+import React from 'react';
+import { createStore } from 'redux';
+import { Provider } from 'react-redux';
+import { render, act } from '@testing-library/react';
+import { IntlProvider } from '@edx/frontend-platform/i18n';
+import { logInfo } from '@edx/frontend-platform/logging';
+
+import createRootReducer from '../data/reducers';
+import PageLoadingDynamicPaymentMethods from './PageLoadingDynamicPaymentMethods';
+
+jest.mock('@edx/frontend-platform/logging', () => ({
+ logInfo: jest.fn(),
+}));
+
+describe('PageLoadingDynamicPaymentMethods', () => {
+ let store;
+ let location;
+
+ beforeAll(() => {
+ location = global.location;
+ delete global.location;
+ global.location = { assign: jest.fn() };
+ });
+
+ afterAll(() => {
+ global.location = location;
+ });
+
+ beforeEach(() => {
+ store = createStore(createRootReducer());
+ jest.useFakeTimers();
+ jest.clearAllMocks();
+ });
+
+ afterEach(() => {
+ jest.runOnlyPendingTimers();
+ jest.useRealTimers();
+ });
+
+ it('renders ', () => {
+ const component = (
+
+
+
+
+
+ );
+ const { container: tree } = render(component);
+ expect(tree).toMatchSnapshot();
+ });
+
+ it('it redirects to receipt page after 3 seconds delay', () => {
+ const orderNumber = 'EDX-100001';
+ const logMessage = `Dynamic Payment Methods payment succeeded for edX order number ${orderNumber}, redirecting to ecommerce receipt page.`;
+ const queryParams = `order_number=${orderNumber}&disable_back_button=${Number(true)}&dpm_enabled=${true}`;
+ render(
+
+
+
+
+ ,
+ );
+
+ act(() => {
+ jest.advanceTimersByTime(3000);
+ });
+ expect(logInfo).toHaveBeenCalledWith(expect.stringMatching(logMessage));
+ expect(global.location.assign).toHaveBeenCalledWith(expect.stringContaining(`/checkout/receipt/?${queryParams}`));
+ });
+
+ it('cleans up the timer on unmount', () => {
+ const { unmount } = render(
+ ,
+ );
+ unmount();
+ act(() => {
+ jest.advanceTimersByTime(3000);
+ });
+ expect(window.location.assign).not.toHaveBeenCalled();
+ });
+});
diff --git a/src/payment/__snapshots__/PageLoadingDynamicPaymentMethods.test.jsx.snap b/src/payment/__snapshots__/PageLoadingDynamicPaymentMethods.test.jsx.snap
new file mode 100644
index 000000000..c3dda9f75
--- /dev/null
+++ b/src/payment/__snapshots__/PageLoadingDynamicPaymentMethods.test.jsx.snap
@@ -0,0 +1,18 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`PageLoadingDynamicPaymentMethods renders 1`] = `
+
+`;