Skip to content

Commit 66258a5

Browse files
authored
runfix: refactor tests and fix ts strict errors (#13781)
* runfix: fix strict ts errors in AudioSeekBar * refactor: migrate MediaButton test to testing-library * refactor: migrate SeekBar test to testing-library * refactor: migrate CallMessage test to testing-library * refactor: migrate CallTimeoutMessage test to testing-library * refactor: migrate DecryptErrorMessage test to testing-library * refactor: migrate DeleteMessage test to testing-library * fix ts errors in DeleteMessage component * refactor: migrate EphemeralTimer test to testing-library * refactor: migrate FileTypeRestrictedMessage test to testing-library * refactor: migrate LegalHoldMessage test to testing-library * refactor: migrate MemberMessage test to testing-library * refactor: migrate PingMessage test to testing-library * refactor: migrate ReadReceiptStatus test to testing-library * refactor: migrate SystemMessage test to testing-library * refactor: migrate VerificationMessage test to testing-library * refactor: mock icons in call message test
1 parent df86e99 commit 66258a5

17 files changed

+305
-393
lines changed

src/script/components/MessagesList/Message/CallMessage.test.tsx

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,19 @@
1818
*/
1919

2020
import ko from 'knockout';
21-
import TestPage from 'Util/test/TestPage';
2221
import {CallMessage as CallMessageEntity} from 'src/script/entity/message/CallMessage';
23-
import CallMessage, {CallMessageProps} from './CallMessage';
22+
import CallMessage from './CallMessage';
23+
import {render} from '@testing-library/react';
2424

2525
jest.mock('Components/Icon', () => ({
2626
Hangup: function HangupIcon() {
27-
return <span className="hangupicon"></span>;
27+
return <span>hangupIcon</span>;
2828
},
2929
Pickup: function PickupIcon() {
30-
return <span className="pickupicon"></span>;
30+
return <span>pickupIcon</span>;
3131
},
3232
}));
3333

34-
class CallMessagePage extends TestPage<CallMessageProps> {
35-
constructor(props?: CallMessageProps) {
36-
super(CallMessage, props);
37-
}
38-
39-
getCallMessage = (completed: 'completed' | 'not_completed') =>
40-
this.get(`[data-uie-name="element-message-call"]${completed ? `[data-uie-value="${completed}"]` : ''}`);
41-
getPickupIcon = () => this.get('.pickupicon');
42-
getHangupIcon = () => this.get('.hangupicon');
43-
}
44-
4534
const createCallMessage = (partialCallMessage: Partial<CallMessageEntity>) => {
4635
const callMessage: Partial<CallMessageEntity> = {
4736
caption: ko.pureComputed(() => ''),
@@ -56,24 +45,34 @@ const createCallMessage = (partialCallMessage: Partial<CallMessageEntity>) => {
5645

5746
describe('CallMessage', () => {
5847
it('shows green pickup icon for completed calls', async () => {
59-
const callMessagePage = new CallMessagePage({
48+
const props = {
6049
message: createCallMessage({
6150
wasCompleted: () => true,
6251
}),
63-
});
52+
};
53+
54+
const {getByTestId, queryByText} = render(<CallMessage {...props} />);
6455

65-
expect(callMessagePage.getCallMessage('completed')).not.toBeNull();
66-
expect(callMessagePage.getPickupIcon()).not.toBeNull();
56+
const elementMessageCall = getByTestId('element-message-call');
57+
expect(elementMessageCall.getAttribute('data-uie-value')).toEqual('completed');
58+
59+
expect(queryByText('hangupIcon')).toBeNull();
60+
expect(queryByText('pickupIcon')).not.toBeNull();
6761
});
6862

6963
it('shows red hangup icon for incompleted calls', async () => {
70-
const callMessagePage = new CallMessagePage({
64+
const props = {
7165
message: createCallMessage({
7266
wasCompleted: () => false,
7367
}),
74-
});
68+
};
69+
70+
const {getByTestId, queryByText} = render(<CallMessage {...props} />);
71+
72+
const elementMessageCall = getByTestId('element-message-call');
73+
expect(elementMessageCall.getAttribute('data-uie-value')).toEqual('not_completed');
7574

76-
expect(callMessagePage.getCallMessage('not_completed')).not.toBeNull();
77-
expect(callMessagePage.getHangupIcon()).not.toBeNull();
75+
expect(queryByText('pickupIcon')).toBeNull();
76+
expect(queryByText('hangupIcon')).not.toBeNull();
7877
});
7978
});

src/script/components/MessagesList/Message/CallTimeoutMessage.test.tsx

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,10 @@
1818
*/
1919

2020
import ko from 'knockout';
21-
import TestPage from 'Util/test/TestPage';
2221
import {CallingTimeoutMessage as CallTimeoutMessageEntity} from 'src/script/entity/message/CallingTimeoutMessage';
23-
import CallTimeoutMessage, {CallTimeoutMessageProps} from './CallTimeoutMessage';
22+
import CallTimeoutMessage from './CallTimeoutMessage';
2423
import {REASON} from '@wireapp/avs';
25-
26-
class CallTimeoutMessagePage extends TestPage<CallTimeoutMessageProps> {
27-
constructor(props?: CallTimeoutMessageProps) {
28-
super(CallTimeoutMessage, props);
29-
}
30-
31-
getCallTimeoutMessage = (reason: REASON.NOONE_JOINED | REASON.EVERYONE_LEFT) =>
32-
this.get(
33-
`[data-uie-name="element-message-call"][data-uie-value="${
34-
reason === REASON.NOONE_JOINED ? 'no-one-joined' : 'everyone-left'
35-
}"]`,
36-
);
37-
}
24+
import {render} from '@testing-library/react';
3825

3926
const createCallTimeoutMessage = (partialCallTimeoutMessage: Partial<CallTimeoutMessageEntity>) => {
4027
const callMessage: Partial<CallTimeoutMessageEntity> = {
@@ -49,22 +36,24 @@ const createCallTimeoutMessage = (partialCallTimeoutMessage: Partial<CallTimeout
4936

5037
describe('CallTimeoutMessage', () => {
5138
it('shows that nobody joined', async () => {
52-
const callMessagePage = new CallTimeoutMessagePage({
53-
message: createCallTimeoutMessage({
54-
reason: REASON.NOONE_JOINED,
55-
}),
39+
const message = createCallTimeoutMessage({
40+
reason: REASON.NOONE_JOINED,
5641
});
5742

58-
expect(callMessagePage.getCallTimeoutMessage(REASON.NOONE_JOINED)).not.toBeNull();
43+
const {getByTestId} = render(<CallTimeoutMessage message={message} />);
44+
45+
const elementMessageCall = getByTestId('element-message-call');
46+
expect(elementMessageCall.getAttribute('data-uie-value')).toEqual('no-one-joined');
5947
});
6048

6149
it('shows that all participants left', async () => {
62-
const callMessagePage = new CallTimeoutMessagePage({
63-
message: createCallTimeoutMessage({
64-
reason: REASON.EVERYONE_LEFT,
65-
}),
50+
const message = createCallTimeoutMessage({
51+
reason: REASON.EVERYONE_LEFT,
6652
});
6753

68-
expect(callMessagePage.getCallTimeoutMessage(REASON.EVERYONE_LEFT)).not.toBeNull();
54+
const {getByTestId} = render(<CallTimeoutMessage message={message} />);
55+
56+
const elementMessageCall = getByTestId('element-message-call');
57+
expect(elementMessageCall.getAttribute('data-uie-value')).toEqual('everyone-left');
6958
});
7059
});

src/script/components/MessagesList/Message/ContentMessage/asset/controls/AudioSeekBar.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const AudioSeekBar: React.FC<AudioSeekBarProps> = ({asset, audioElement, disable
3737
const [path, setPath] = useState('');
3838
const [loudness, setLoudness] = useState<number[]>([]);
3939
const [position, setPosition] = useState(0);
40-
const svgNode = useRef<SVGSVGElement>();
40+
const svgNode = useRef<SVGSVGElement>(null);
4141
const [clipId] = useState(`clip-${createRandomUuid()}`);
4242

4343
useEffect(() => {
@@ -46,8 +46,10 @@ const AudioSeekBar: React.FC<AudioSeekBarProps> = ({asset, audioElement, disable
4646
}, []);
4747

4848
useEffect(() => {
49-
if (asset.meta?.loudness !== null) {
50-
setLoudness(Array.from(asset.meta.loudness).map(level => level / 256));
49+
const loudness = asset.meta?.loudness;
50+
51+
if (loudness) {
52+
setLoudness(Array.from(loudness).map(level => level / 256));
5153
}
5254
}, [asset]);
5355

@@ -84,6 +86,10 @@ const AudioSeekBar: React.FC<AudioSeekBarProps> = ({asset, audioElement, disable
8486
const updateSvgWidth = () => setSvgWidth(svgNode.current?.clientWidth ?? 0);
8587

8688
const onLevelClick = (event: React.MouseEvent<SVGSVGElement, MouseEvent>) => {
89+
if (!svgNode.current) {
90+
return;
91+
}
92+
8793
const mouse_x = (event.pageX ?? event.clientX) - svgNode.current.getBoundingClientRect().left;
8894
const calculatedTime = (audioElement.duration * mouse_x) / svgNode.current.clientWidth;
8995
const currentTime = isNaN(calculatedTime) ? 0 : calculatedTime;

src/script/components/MessagesList/Message/ContentMessage/asset/controls/MediaButton.test.tsx

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,9 @@
1919

2020
import ko from 'knockout';
2121
import {AssetTransferState} from 'src/script/assets/AssetTransferState';
22-
import TestPage from 'Util/test/TestPage';
2322
import MediaButton, {MediaButtonProps} from './MediaButton';
2423
import {FileAsset} from 'src/script/entity/message/FileAsset';
25-
26-
class MediaButtonTestPage extends TestPage<MediaButtonProps> {
27-
constructor(props?: MediaButtonProps) {
28-
super(MediaButton, props);
29-
}
30-
31-
getPlayButton = () => this.get('[data-uie-name="do-play-media"]');
32-
getPauseButton = () => this.get('[data-uie-name="do-pause-media"]');
33-
getAssetLoader = () => this.get('[data-uie-name="status-loading-media"]');
34-
clickOnPlayButton = () => this.click(this.getPlayButton());
35-
clickOnPauseButton = () => this.click(this.getPauseButton());
36-
}
24+
import {render, fireEvent} from '@testing-library/react';
3725

3826
describe('MediaButton', () => {
3927
const getDefaultProps = (): MediaButtonProps => {
@@ -61,34 +49,30 @@ describe('MediaButton', () => {
6149
jest.spyOn(props, 'play');
6250
jest.spyOn(props, 'pause');
6351

64-
const testPage = new MediaButtonTestPage(props);
65-
66-
testPage.clickOnPlayButton();
52+
const {getByTestId} = render(<MediaButton {...props} />);
6753

54+
const playButton = getByTestId('do-play-media');
55+
fireEvent.click(playButton);
6856
expect(props.play).toHaveBeenCalledTimes(1);
6957

70-
testPage.clickOnPauseButton();
71-
58+
const pauseButton = getByTestId('do-pause-media');
59+
fireEvent.click(pauseButton);
7260
expect(props.pause).toHaveBeenCalledTimes(1);
7361
});
7462

7563
it('displays a loader if the media is being downloaded', () => {
7664
const props: MediaButtonProps = {...getDefaultProps(), transferState: AssetTransferState.DOWNLOADING};
7765

78-
const testPage = new MediaButtonTestPage(props);
79-
80-
const loader = testPage.getAssetLoader();
66+
const {queryByTestId} = render(<MediaButton {...props} />);
8167

82-
expect(loader).not.toBe(null);
68+
expect(queryByTestId('status-loading-media')).not.toBe(null);
8369
});
8470

8571
it('displays a loader if the media is being uploaded', () => {
8672
const props: MediaButtonProps = {...getDefaultProps(), transferState: AssetTransferState.UPLOADING};
8773

88-
const testPage = new MediaButtonTestPage(props);
89-
90-
const loader = testPage.getAssetLoader();
74+
const {queryByTestId} = render(<MediaButton {...props} />);
9175

92-
expect(loader).not.toBe(null);
76+
expect(queryByTestId('status-loading-media')).not.toBe(null);
9377
});
9478
});

src/script/components/MessagesList/Message/ContentMessage/asset/controls/SeekBar.test.tsx

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,53 +17,43 @@
1717
*
1818
*/
1919

20-
import {act} from '@testing-library/react';
21-
import TestPage from 'Util/test/TestPage';
22-
import SeekBar, {SeekBarProps} from './SeekBar';
20+
import SeekBar from './SeekBar';
21+
import {render, act} from '@testing-library/react';
2322

24-
class SeekBarPage extends TestPage<SeekBarProps> {
25-
constructor(props?: SeekBarProps) {
26-
super(SeekBar, props);
27-
}
23+
const createAudioElement = (currentTime: number, maxTime: number) => {
24+
const audioElement = document.createElement('audio');
25+
Object.defineProperty(audioElement, 'duration', {get: () => maxTime});
26+
audioElement.currentTime = currentTime;
27+
return audioElement;
28+
};
2829

29-
getSeekBar = () => this.get('input[data-uie-name="asset-control-media-seek-bar"]');
30-
getProgress = (): string =>
31-
this.getSeekBar()
32-
.getAttribute('style')
33-
.replace(/--seek-bar-progress: (.*);/, '$1');
34-
}
30+
const getProgress = (element: HTMLElement) =>
31+
element.getAttribute('style')?.replace(/--seek-bar-progress: (.*);/, '$1');
3532

3633
describe('SeekBar', () => {
3734
it('shows how much of an audio asset has been already played', async () => {
38-
const createAudioElement = (currentTime: number, maxTime: number) => {
39-
const audioElement = document.createElement('audio');
40-
Object.defineProperty(audioElement, 'duration', {get: () => maxTime});
41-
audioElement.currentTime = currentTime;
42-
return audioElement;
35+
const audioElement = createAudioElement(25, 100);
36+
37+
const props = {
38+
dark: false,
39+
disabled: false,
40+
mediaElement: audioElement,
4341
};
4442

45-
const checkProgress = (currentTime: number, expectation: string) => {
46-
audioElement.currentTime = currentTime;
43+
const {getByTestId, rerender} = render(<SeekBar {...props} />);
44+
45+
const mediaSeekBar = getByTestId('asset-control-media-seek-bar');
4746

47+
const checkProgress = (currentTime: number, expectation: string) => {
48+
props.mediaElement.currentTime = currentTime;
4849
act(() => {
4950
audioElement.dispatchEvent(new Event('timeupdate'));
5051
});
51-
52-
testPage.update();
53-
54-
expect(testPage.getProgress()).toEqual(expectation);
52+
rerender(<SeekBar {...props} />);
53+
expect(getProgress(mediaSeekBar)).toEqual(expectation);
5554
};
5655

57-
const audioElement = createAudioElement(25, 100);
58-
59-
const testPage = new SeekBarPage({
60-
dark: false,
61-
disabled: false,
62-
mediaElement: audioElement,
63-
});
64-
65-
expect(testPage.getProgress()).toEqual('0%');
66-
56+
expect(getProgress(mediaSeekBar)).toEqual('0%');
6757
checkProgress(50, '50%');
6858
checkProgress(75, '75%');
6959
checkProgress(100, '100%');

0 commit comments

Comments
 (0)