Skip to content

Commit aa15ac6

Browse files
authored
Test/#381-C: trackSetter 모듈 테스트 (#382)
* test: trackSetter 모듈 * chore: test 스크립트 추가
1 parent 609b225 commit aa15ac6

File tree

4 files changed

+161
-17
lines changed

4 files changed

+161
-17
lines changed

client/jest.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module.exports = {
2+
preset: 'ts-jest', // to use typescript
3+
verbose: true,
4+
modulePathIgnorePatterns: ['<rootDir>/dist/'],
5+
collectCoverage: true,
6+
};

client/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"scripts": {
66
"dev": "vite",
77
"build": "tsc && vite build",
8+
"test": "jest",
89
"preview": "vite preview"
910
},
1011
"dependencies": {
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import { setTrack, getTrack } from './';
2+
3+
const MediaStream = jest.fn().mockImplementation((tracks) => {
4+
return new MediaStreamMock(tracks);
5+
});
6+
7+
let stream: any;
8+
9+
describe('getTrack()', () => {
10+
describe('스트림에 트랙이 있을 때', () => {
11+
beforeEach(() => {
12+
stream = new MediaStream();
13+
});
14+
15+
it('audio 트랙을 성공적으로 가져온다.', async () => {
16+
// act
17+
const track = await getTrack(stream, 'audio');
18+
19+
// assert
20+
expect(track).not.toBe(undefined);
21+
});
22+
23+
it('video 트랙을 성공적으로 가져온다.', async () => {
24+
// act
25+
const track = await getTrack(stream, 'video');
26+
27+
// assert
28+
expect(track).not.toBe(undefined);
29+
});
30+
});
31+
32+
describe('스트림에 트랙이 없을 때', () => {
33+
beforeEach(() => {
34+
stream = new MediaStream([]); // empty track
35+
});
36+
37+
it('audio 트랙을 가져오면 리턴 값이 없다.', async () => {
38+
// act
39+
const track = await getTrack(stream, 'audio');
40+
41+
// assert
42+
expect(track).toBe(undefined);
43+
});
44+
45+
it('video 트랙을 가져오면 리턴 값이 없다.', async () => {
46+
// act
47+
const track = await getTrack(stream, 'video');
48+
49+
// assert
50+
expect(track).toBe(undefined);
51+
});
52+
});
53+
});
54+
55+
describe('setTrack()', () => {
56+
describe('스트림에 트랙이 있을 때', () => {
57+
beforeEach(() => {
58+
stream = new MediaStream();
59+
});
60+
61+
it('audio 트랙을 비활성화 시킬 수 있다.', async () => {
62+
// act
63+
setTrack(stream, 'audio', false);
64+
65+
// assert
66+
const track = await getTrack(stream, 'audio');
67+
expect(track!.enabled).toBe(false);
68+
});
69+
70+
it('video 트랙을 비활성화 시킬 수 있다.', async () => {
71+
// act
72+
setTrack(stream, 'video', false);
73+
74+
// assert
75+
const track = await getTrack(stream, 'video');
76+
expect(track!.enabled).toBe(false);
77+
});
78+
79+
it('비활성화 된 audio 트랙을 활성화 시킬 수 있다.', async () => {
80+
// arrange
81+
setTrack(stream, 'audio', false);
82+
83+
// act
84+
setTrack(stream, 'audio', true);
85+
86+
// assert
87+
const track = await getTrack(stream, 'audio');
88+
expect(track!.enabled).toBe(true);
89+
});
90+
91+
it('비활성화 된 video 트랙을 활성화 시킬 수 있다.', async () => {
92+
// arrange
93+
setTrack(stream, 'video', false);
94+
95+
// act
96+
setTrack(stream, 'video', true);
97+
98+
// assert
99+
const track = await getTrack(stream, 'video');
100+
expect(track!.enabled).toBe(true);
101+
});
102+
});
103+
104+
describe('스트림에 트랙이 없을 때', () => {
105+
beforeEach(() => {
106+
stream = new MediaStream([]); // empty tracks
107+
});
108+
109+
it('audio 트랙을 비활성화하면 조용히 무시된다.', async () => {
110+
// assert
111+
expect(() => setTrack(stream, 'audio', false)).not.toThrow();
112+
});
113+
114+
it('video 트랙을 비활성화하면 조용히 무시된다.', async () => {
115+
// assert
116+
expect(() => setTrack(stream, 'video', false)).not.toThrow();
117+
});
118+
});
119+
});
120+
121+
// mock
122+
class MediaStreamMock {
123+
private tracks: TrackMock[];
124+
125+
// 기본적으로 'audio', 'video' 트랙을 두 개 갖도록 만든다.
126+
constructor(tracks = [new TrackMock('video'), new TrackMock('audio')]) {
127+
this.tracks = tracks;
128+
}
129+
130+
getTracks() {
131+
return this.tracks;
132+
}
133+
}
134+
135+
class TrackMock {
136+
kind: string;
137+
enabled: boolean;
138+
139+
constructor(kind: string) {
140+
this.kind = kind;
141+
this.enabled = true;
142+
}
143+
}
Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,27 @@
11
export type TrackKind = 'audio' | 'video';
22

33
const getAllTracks = async (stream: MediaStream) => {
4-
if (!stream) {
5-
return;
6-
}
7-
84
const tracks = stream.getTracks();
5+
96
return tracks;
10-
}
7+
};
118

12-
const getTrack = async (stream: MediaStream, kind: TrackKind) => {
9+
export const getTrack = async (stream: MediaStream, kind: TrackKind) => {
1310
const tracks = await getAllTracks(stream);
14-
if (!tracks) {
15-
return;
16-
}
11+
const track = tracks.find((track) => track.kind === kind);
1712

18-
const track = tracks.find(track => track.kind === kind);
1913
return track;
20-
}
21-
22-
export const setTrack = async (stream: MediaStream, kind: TrackKind, turnOn: boolean) => {
23-
if (!stream) {
24-
return;
25-
}
14+
};
2615

16+
export const setTrack = async (
17+
stream: MediaStream,
18+
kind: TrackKind,
19+
turnOn: boolean,
20+
) => {
2721
const track = await getTrack(stream, kind);
2822
if (!track) {
2923
return;
3024
}
3125

3226
track.enabled = turnOn;
33-
}
27+
};

0 commit comments

Comments
 (0)