diff --git a/src/components/BackgroundImage/BackgroundImage.tsx b/src/components/BackgroundImage/BackgroundImage.tsx index 58c7e7fe9..26e65960d 100644 --- a/src/components/BackgroundImage/BackgroundImage.tsx +++ b/src/components/BackgroundImage/BackgroundImage.tsx @@ -6,13 +6,15 @@ import Image from '../Image/Image'; import './BackgroundImage.scss'; +export const qaIdByDefault = 'qa-background-image'; + const b = block('storage-background-image'); const BackgroundImage = (props: WithChildren) => { const {children, src, desktop, className, imageClassName, style, hide, qa} = props; return ( -
+
{(src || desktop) && !hide && } {children &&
{children}
}
diff --git a/src/components/BackgroundMedia/BackgroundMedia.tsx b/src/components/BackgroundMedia/BackgroundMedia.tsx index 428a02543..5fb2d63f0 100644 --- a/src/components/BackgroundMedia/BackgroundMedia.tsx +++ b/src/components/BackgroundMedia/BackgroundMedia.tsx @@ -18,6 +18,7 @@ const BackgroundMedia = ({ video, mediaClassName, fullWidthMedia, + qa, ...props }: BackgroundMediaProps) => { const isMobile = useContext(MobileContext); @@ -27,6 +28,7 @@ const BackgroundMedia = ({ className={b(null, className)} style={{backgroundColor: color}} animate={animated} + qa={qa} > { + test('render component by default', async () => { + render(); + const component = screen.getByTestId(qaId); + + expect(component).toBeInTheDocument(); + }); + + test('add className', () => { + testCustomClassName({ + component: BackgroundMedia, + props: {qa: qaId}, + }); + }); + + test('render with animated', async () => { + testAnimated({ + component: BackgroundMedia, + props: {qa: qaId}, + }); + }); + + test('render with passed color', () => { + const style = {backgroundColor: 'red'}; + + render(); + const component = screen.getByTestId(qaId); + + expect(component).toHaveStyle(style); + }); + + test('add className to media component', () => { + const className = 'my-class'; + + render(); + const component = screen.getByTestId(qaIdOfMedia); + + expect(component).toHaveClass(className); + }); + + test('render video', () => { + render(); + const component = screen.getByRole('media-video-source'); + + expect(component).toBeInTheDocument(); + }); + + test('render video with videoClassName', () => { + render(); + const component = screen.getByRole('media-video'); + + expect(component).toHaveClass('pc-BackgroundMedia__video'); + }); + + test('render video with default height', () => { + const style = {height: '720px'}; + render(); + const component = screen.getByRole('media-video'); + + expect(component).toHaveStyle(style); + }); + + test('render video with defined height', () => { + const height = 300; + const style = {height: `${height}px`}; + + render(); + const component = screen.getByRole('media-video'); + expect(component).toHaveStyle(style); + }); + + test('render with fullWidthMedia prop', () => { + render(); + const component = screen.getByTestId(qaIdOfMedia); + + expect(component).toHaveClass('pc-BackgroundMedia__media_full-width-media'); + }); + + test('render image', () => { + render(); + const component = screen.getByTestId(qaIdOfBackgroundImage); + + expect(component).toBeInTheDocument(); + }); + + test('render image with imageClassName', () => { + render(); + const component = screen.getByTestId(qaIdOfBackgroundImage); + + expect(component).toHaveClass('pc-BackgroundMedia__image'); + }); + + test('render image with default height', () => { + const style = {height: '720px'}; + render(); + const component = screen.getByTestId(qaIdOfBackgroundImage); + + expect(component).toHaveStyle(style); + }); + + test('render image with defined height', () => { + const height = 300; + const style = {height: `${height}px`}; + + render(); + const component = screen.getByTestId(qaIdOfBackgroundImage); + + expect(component).toHaveStyle(style); + }); + + test('do not render image when video is provided', () => { + render(); + const component = screen.getByTestId(qaIdOfBackgroundImage); + + expect(component).toHaveClass('pc-media-component-image__item_withVideo'); + }); + + test('render image with parallax', () => { + const style = {transform: 'translateY(0px)'}; + + render(); + const component = screen.getByRole('animated-div'); + + expect(component).toHaveStyle(style); + }); +}); diff --git a/src/components/Media/Image/Image.tsx b/src/components/Media/Image/Image.tsx index 9a99999c0..bec311f47 100644 --- a/src/components/Media/Image/Image.tsx +++ b/src/components/Media/Image/Image.tsx @@ -84,7 +84,7 @@ const Image = (props: ImageAllProps) => { const imageBackground = (oneImage: ImageProps) => { const imageData = getMediaImage(oneImage); return ( - + ); diff --git a/src/components/Media/Media.tsx b/src/components/Media/Media.tsx index 22556b993..42cf2cc33 100644 --- a/src/components/Media/Media.tsx +++ b/src/components/Media/Media.tsx @@ -11,11 +11,14 @@ import Video, {VideoAdditionProps} from './Video/Video'; import './Media.scss'; +export const qaIdByDefault = 'qa-media'; + const b = block('Media'); export interface MediaAllProps extends MediaProps, VideoAdditionProps, ImageAdditionProps { className?: string; youtubeClassName?: string; + qa?: string; } // TODO delete along with fullScreen props @@ -46,6 +49,7 @@ export const Media = (props: MediaAllProps) => { isBackground, playButton, customBarControlsClassName, + qa = qaIdByDefault, } = props; const [hasVideoFallback, setHasVideoFallback] = useState(false); @@ -133,7 +137,7 @@ export const Media = (props: MediaAllProps) => { ]); return ( -
+
{content}
); diff --git a/src/components/Media/Video/Video.tsx b/src/components/Media/Video/Video.tsx index 5f43e1559..7cee772d0 100644 --- a/src/components/Media/Video/Video.tsx +++ b/src/components/Media/Video/Video.tsx @@ -103,7 +103,7 @@ const Video = (props: VideoAllProps) => { const defaultVideoBlock = useMemo(() => { return video.src.length && !hasVideoFallback ? ( -
+
diff --git a/src/models/constructor-items/common.ts b/src/models/constructor-items/common.ts index 8cbcd08ad..147a0386d 100644 --- a/src/models/constructor-items/common.ts +++ b/src/models/constructor-items/common.ts @@ -259,6 +259,7 @@ export interface BackgroundMediaProps extends MediaProps, Animatable { fullWidthMedia?: boolean; className?: string; mediaClassName?: string; + qa?: string; } export type Coordinate = number[]; diff --git a/test-utils/custom-environment.ts b/test-utils/custom-environment.ts index 0d8aa4351..00fd5a02a 100644 --- a/test-utils/custom-environment.ts +++ b/test-utils/custom-environment.ts @@ -13,6 +13,8 @@ class CustomEnvironment extends JsDomEnvironmetn { constructor(config: JestEnvironmentConfig, context: EnvironmentContext) { super(config, context); this.global.matchMedia = matchMedia; + this.global.HTMLMediaElement.prototype.pause = () => {}; + this.global.HTMLMediaElement.prototype.play = () => Promise.resolve(); } } diff --git a/test-utils/shared/common.tsx b/test-utils/shared/common.tsx index 03166f8e8..ce2284ef9 100644 --- a/test-utils/shared/common.tsx +++ b/test-utils/shared/common.tsx @@ -1,4 +1,5 @@ import {render, screen} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import React, {ElementType} from 'react'; type QA = { @@ -32,3 +33,18 @@ export const testCustomStyle = ({ expect(component).toHaveStyle(style); }; + +export const testAnimated = async ({ + component: Component, + props, +}: { + component: ElementType; + props: T & QA; +}) => { + const user = userEvent.setup(); + render(); + const component = screen.getByTestId(props.qa); + await user.hover(component); + + expect(component).toHaveClass('animate'); +};