2022-04-18 14:02:16 +02:00
import React from 'react' ;
import { render , fireEvent , waitFor } from '@testing-library/react' ;
2023-05-03 18:26:45 +02:00
import {
MetaMetricsEventCategory ,
MetaMetricsEventKeyType ,
MetaMetricsEventName ,
} from '../../../../shared/constants/metametrics' ;
2022-04-18 14:02:16 +02:00
import HoldToRevealButton from './hold-to-reveal-button' ;
2023-05-03 18:26:45 +02:00
const mockTrackEvent = jest . fn ( ) ;
jest . mock ( 'react' , ( ) => ( {
... jest . requireActual ( 'react' ) ,
useContext : ( ) => mockTrackEvent ,
} ) ) ;
2022-04-18 14:02:16 +02:00
describe ( 'HoldToRevealButton' , ( ) => {
let props = { } ;
beforeEach ( ( ) => {
const mockOnLongPressed = jest . fn ( ) ;
props = {
onLongPressed : mockOnLongPressed ,
buttonText : 'Hold to reveal SRP' ,
} ;
} ) ;
2023-05-03 18:26:45 +02:00
afterEach ( ( ) => {
jest . resetAllMocks ( ) ;
} ) ;
2022-04-18 14:02:16 +02:00
it ( 'should render a button with label' , ( ) => {
const { getByText } = render ( < HoldToRevealButton { ... props } / > ) ;
expect ( getByText ( 'Hold to reveal SRP' ) ) . toBeInTheDocument ( ) ;
} ) ;
it ( 'should render a button when mouse is down and up' , ( ) => {
const { getByText } = render ( < HoldToRevealButton { ... props } / > ) ;
const button = getByText ( 'Hold to reveal SRP' ) ;
fireEvent . mouseDown ( button ) ;
expect ( button ) . toBeDefined ( ) ;
fireEvent . mouseUp ( button ) ;
expect ( button ) . toBeDefined ( ) ;
} ) ;
2023-05-03 18:26:45 +02:00
it ( 'should show the locked padlock when a button is long pressed and then should show it after it was lifted off before the animation concludes' , async ( ) => {
const { getByText , queryByLabelText } = render (
< HoldToRevealButton { ... props } / > ,
) ;
2022-04-18 14:02:16 +02:00
const button = getByText ( 'Hold to reveal SRP' ) ;
fireEvent . mouseDown ( button ) ;
2023-05-03 18:26:45 +02:00
const circleLocked = queryByLabelText ( 'circle-locked' ) ;
2022-04-18 14:02:16 +02:00
2023-05-03 18:26:45 +02:00
await waitFor ( ( ) => {
expect ( circleLocked ) . toBeInTheDocument ( ) ;
2022-04-18 14:02:16 +02:00
} ) ;
fireEvent . mouseUp ( button ) ;
2023-05-03 18:26:45 +02:00
const circleUnlocked = queryByLabelText ( 'circle-unlocked' ) ;
2022-04-18 14:02:16 +02:00
2023-05-03 18:26:45 +02:00
await waitFor ( ( ) => {
expect ( circleUnlocked ) . not . toBeInTheDocument ( ) ;
2022-04-18 14:02:16 +02:00
} ) ;
} ) ;
2023-05-03 18:26:45 +02:00
it ( 'should show the unlocked padlock when a button is long pressed for the duration of the animation' , async ( ) => {
const { getByText , queryByLabelText } = render (
< HoldToRevealButton { ... props } / > ,
) ;
2022-04-18 14:02:16 +02:00
const button = getByText ( 'Hold to reveal SRP' ) ;
fireEvent . mouseDown ( button ) ;
2023-05-03 18:26:45 +02:00
const circleLocked = queryByLabelText ( 'circle-locked' ) ;
fireEvent . transitionEnd ( circleLocked ) ;
const circleUnlocked = queryByLabelText ( 'circle-unlocked' ) ;
fireEvent . animationEnd ( circleUnlocked ) ;
await waitFor ( ( ) => {
expect ( circleUnlocked ) . toBeInTheDocument ( ) ;
expect ( mockTrackEvent ) . toHaveBeenNthCalledWith ( 2 , {
category : MetaMetricsEventCategory . Keys ,
event : MetaMetricsEventName . SrpHoldToRevealClickStarted ,
properties : {
key _type : MetaMetricsEventKeyType . Srp ,
} ,
} ) ;
expect ( mockTrackEvent ) . toHaveBeenNthCalledWith ( 5 , {
category : MetaMetricsEventCategory . Keys ,
event : MetaMetricsEventName . SrpHoldToRevealCompleted ,
properties : {
key _type : MetaMetricsEventKeyType . Srp ,
} ,
} ) ;
expect ( mockTrackEvent ) . toHaveBeenNthCalledWith ( 6 , {
category : MetaMetricsEventCategory . Keys ,
event : MetaMetricsEventName . SrpRevealViewed ,
properties : {
key _type : MetaMetricsEventKeyType . Srp ,
} ,
} ) ;
2022-04-18 14:02:16 +02:00
} ) ;
} ) ;
} ) ;