Skip to content

Commit 991786f

Browse files
tests: improve tests for the UnityRenderer component
1 parent be84af8 commit 991786f

File tree

1 file changed

+69
-33
lines changed

1 file changed

+69
-33
lines changed

src/components/__tests__/UnityRenderer.test.tsx

Lines changed: 69 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,41 @@
33
import { mount } from 'enzyme';
44
import { act, fireEvent } from '@testing-library/react';
55
import { UnityContext } from '../../lib/context';
6-
76
import { UnityRenderer } from '../UnityRenderer';
87

98
type CreateUnityFn = typeof window.createUnityInstance;
109

1110
describe('<UnityRenderer>', () => {
12-
const MockUnityInstance = jest
13-
.fn<UnityInstance, []>()
14-
.mockImplementation(() => ({
11+
const MockUnityInstance = () =>
12+
jest.fn<UnityInstance, []>().mockImplementation(() => ({
1513
SendMessage: jest.fn(),
1614
Quit: jest
1715
.fn()
1816
.mockImplementation(() => new Promise((reject, resolve) => resolve())),
1917
SetFullscreen: jest.fn(),
2018
}));
21-
let createUnityValid: jest.Mock<
22-
ReturnType<CreateUnityFn>,
23-
Parameters<CreateUnityFn>
24-
>;
25-
let createUnityInvalid: jest.Mock<
26-
ReturnType<CreateUnityFn>,
27-
Parameters<CreateUnityFn>
28-
>;
29-
let unityContext: UnityContext;
30-
31-
beforeEach(() => {
32-
createUnityValid = jest
19+
let createUnityValid = (cb?: (p: number) => void) =>
20+
jest
3321
.fn<ReturnType<CreateUnityFn>, Parameters<CreateUnityFn>>()
34-
.mockImplementation(
35-
() =>
36-
new Promise<UnityInstance>((resolve) =>
37-
resolve(new MockUnityInstance())
38-
)
39-
);
40-
createUnityInvalid = jest
22+
.mockImplementation((_canvas, _config, onProgress) => {
23+
if (cb && onProgress) cb = (p: number) => onProgress(p);
24+
25+
return new Promise<UnityInstance>((resolve) =>
26+
resolve(new (MockUnityInstance())())
27+
);
28+
});
29+
let createUnityInvalid = () =>
30+
jest
4131
.fn<ReturnType<CreateUnityFn>, Parameters<CreateUnityFn>>()
4232
.mockImplementation(
4333
() =>
4434
new Promise<UnityInstance>((resolve, reject) =>
4535
reject(new Error('unit test'))
4636
)
4737
);
38+
let unityContext: UnityContext;
39+
40+
beforeEach(() => {
4841
const baseUrl = 'https://example.com/';
4942
unityContext = new UnityContext({
5043
loaderUrl: baseUrl + 'loader.js',
@@ -56,9 +49,13 @@ describe('<UnityRenderer>', () => {
5649

5750
afterEach(() => {
5851
jest.clearAllMocks();
52+
53+
document.body.innerHTML = '';
54+
// @ts-ignore
55+
window.createUnityInstance = undefined;
5956
});
6057

61-
function completeLoader(error: boolean = false) {
58+
function completeLoader(error?: boolean) {
6259
const script = document.querySelector(
6360
`script[src="${unityContext.getConfig().loaderUrl}"]`
6461
) as HTMLScriptElement;
@@ -73,13 +70,13 @@ describe('<UnityRenderer>', () => {
7370
}
7471

7572
it('renders without configuration', async () => {
76-
const wrapper = mount(<UnityRenderer />);
77-
expect(wrapper).toBeDefined();
73+
const component = mount(<UnityRenderer />);
74+
expect(component).toBeDefined();
7875
});
7976

8077
it('creates a canvas element', async () => {
8178
expect(document.querySelector('canvas')).toBeNull();
82-
const wrapper = mount(<UnityRenderer />);
79+
mount(<UnityRenderer />);
8380
});
8481

8582
it('does not trigger callbacks after initial mounting', async () => {
@@ -89,6 +86,7 @@ describe('<UnityRenderer>', () => {
8986

9087
mount(
9188
<UnityRenderer
89+
context={unityContext}
9290
onUnityError={() => (error = true)}
9391
onUnityProgressChange={(p) => (progress = p)}
9492
onUnityReadyStateChange={(s) => (ready = s)}
@@ -99,12 +97,50 @@ describe('<UnityRenderer>', () => {
9997
expect(error).toBe(false);
10098
});
10199

102-
it('uses the loader script', async () => {
103-
window.createUnityInstance = createUnityValid;
104-
mount(<UnityRenderer context={unityContext} />);
100+
it('triggers the error callback when the loader script fails to load', async () => {
101+
let error = false;
102+
let message = '';
103+
window.createUnityInstance = createUnityValid();
104+
105+
mount(
106+
<UnityRenderer
107+
context={unityContext}
108+
onUnityError={(e) => {
109+
error = true;
110+
message = e.message;
111+
}}
112+
/>
113+
);
114+
completeLoader(true);
115+
116+
expect(error).toBe(true);
117+
expect(message).toMatch(/failed to mount/);
118+
});
119+
120+
it('resets and triggers the error callback when the instance fails to initialize', async () => {
121+
let state = true;
122+
let progress = 0.5;
123+
let error = false;
124+
let message = '';
125+
window.createUnityInstance = createUnityInvalid();
126+
127+
mount(
128+
<UnityRenderer
129+
context={unityContext}
130+
onUnityError={(e) => {
131+
error = true;
132+
message = e.message;
133+
}}
134+
onUnityProgressChange={(p) => (progress = p)}
135+
onUnityReadyStateChange={(r) => (state = r)}
136+
/>
137+
);
138+
await act(async () => completeLoader());
139+
140+
expect(progress).toBe(0);
141+
expect(state).toBe(false);
105142

106-
expect(createUnityValid).not.toHaveBeenCalled();
107-
completeLoader();
108-
expect(createUnityValid).toHaveBeenCalled();
143+
expect(error).toBe(true);
144+
expect(message).toMatch(/unit test/);
109145
});
110146
});

0 commit comments

Comments
 (0)