woocommerce/plugins/woocommerce-admin/client/mobile-banner/test/index.js

112 lines
2.9 KiB
JavaScript
Raw Normal View History

Add WooCommerce Mobile App Banner Ad for Android and iOS (https://github.com/woocommerce/woocommerce-admin/pull/5037) Fixes woocommerce/woocommerce-admin#4654 The feature calls for a mobile app ad banner to be displayed to users on mobile devices. Based on the discussion in woocommerce/woocommerce-admin#4654 this implements the following: 1. [an iOS Smart App Banner](https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html). This banner is a meta tag that is generated in PHP. It will only display on iOS devices. One note about this: **This tag is not directly trackable like the implemented Android banner. If we would like to track its success then I believe [these instructions are relevant](https://stackoverflow.com/questions/12906502/is-it-possible-to-track-click-throughs-from-iphone-smart-banner/20422334woocommerce/woocommerce-admin#20422334)**. 2. A mobile app banner ad that **only displays on Android** and only displays at the `738px` breakpoint specified in the issue. To only display this banner ad on Android, we use basic checking of the user agent string. I weighed this up against other approaches and for this kind of niche use case a simple UA string check is (imho) still the best way to do this. 3. The banner ad makes use of user preferences to retain a per user setting that determines if that user has dismissed the Android banner. We don't/can't do anything like this for the iOS Smart App Banner (but in theory we shouldn't need to).
2020-08-27 01:46:53 +00:00
jest.mock( '../../lib/platform', () => ( {
...jest.requireActual( '../../lib/platform' ),
platform: jest.fn(),
} ) );
jest.mock( '@woocommerce/tracks', () => ( {
...jest.requireActual( '@woocommerce/tracks' ),
recordEvent: jest.fn(),
} ) );
jest.mock( '../constants', () => ( {
...jest.requireActual( '../constants' ),
PLAY_STORE_LINK: '',
} ) );
/**
* External dependencies
*/
import { fireEvent, render } from '@testing-library/react';
import { recordEvent } from '@woocommerce/tracks';
/**
* Internal dependencies
*/
import { MobileAppBanner } from '../index';
import { platform } from '../../lib/platform';
import { TRACKING_EVENT_NAME } from '../constants';
describe( 'MobileAppBanner', () => {
beforeEach( () => {
platform.mockReturnValue( 'android' );
} );
it( 'closes if the user dismisses it', () => {
const { container, getByTestId } = render(
<MobileAppBanner onInstall={ () => {} } onDismiss={ () => {} } />
);
fireEvent.click( getByTestId( 'dismiss-btn' ) );
expect( container ).toBeEmptyDOMElement();
} );
it( 'closes if the user clicks install', () => {
const { queryByRole, container } = render(
<MobileAppBanner onInstall={ () => {} } onDismiss={ () => {} } />
);
fireEvent.click( queryByRole( 'link' ) );
expect( container ).toBeEmptyDOMElement();
} );
it( 'records a tracking event for install', () => {
const { queryByRole } = render(
<MobileAppBanner onInstall={ () => {} } onDismiss={ () => {} } />
);
fireEvent.click( queryByRole( 'link' ) );
expect( recordEvent ).toHaveBeenCalledWith( TRACKING_EVENT_NAME, {
action: 'install',
} );
} );
it( 'records a dismiss event for dismiss', () => {
const { container, getByTestId } = render(
<MobileAppBanner onInstall={ () => {} } onDismiss={ () => {} } />
);
fireEvent.click( getByTestId( 'dismiss-btn' ) );
expect( container ).toBeEmptyDOMElement();
expect( recordEvent ).toHaveBeenCalledWith( TRACKING_EVENT_NAME, {
action: 'dismiss',
} );
} );
it( 'calls the onDismiss handler when dismiss is clicked', () => {
const dismissHandler = jest.fn();
const { getByTestId } = render(
<MobileAppBanner
onInstall={ () => {} }
onDismiss={ dismissHandler }
/>
);
fireEvent.click( getByTestId( 'dismiss-btn' ) );
expect( dismissHandler ).toHaveBeenCalled();
} );
it( 'calls the onInstall handler when install is clicked', () => {
const installHandler = jest.fn();
const { queryByRole } = render(
<MobileAppBanner
onInstall={ installHandler }
onDismiss={ () => {} }
/>
);
fireEvent.click( queryByRole( 'link' ) );
expect( installHandler ).toHaveBeenCalled();
} );
it( 'does not display unless the platform is android', () => {
platform.mockReturnValue( 'ios' );
const { container } = render(
<MobileAppBanner onInstall={ () => {} } onDismiss={ () => {} } />
);
expect( container ).toBeEmptyDOMElement();
} );
} );