Skip to content

Commit 7a0d5a1

Browse files
author
Philipp Molitor
committed
rework UnityRenderer tests (WIP)
1 parent 44f5776 commit 7a0d5a1

File tree

1 file changed

+94
-19
lines changed

1 file changed

+94
-19
lines changed
Lines changed: 94 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,110 @@
1-
import { mount, ReactWrapper } from 'enzyme';
1+
/// <reference path="../../../typings/unity.d.ts" />
2+
3+
import { mount } from 'enzyme';
4+
import { act, fireEvent } from '@testing-library/react';
5+
import { UnityContext } from '../../lib/context';
26

37
import { UnityRenderer } from '../UnityRenderer';
48

5-
describe('<UnityRenderer /> (unconfigured)', () => {
6-
let renderer: ReactWrapper<typeof UnityRenderer>;
7-
let progress = 0;
8-
let ready = false;
9-
let error = false;
9+
type CreateUnityFn = typeof window.createUnityInstance;
10+
11+
describe('<UnityRenderer>', () => {
12+
const MockUnityInstance = jest
13+
.fn<UnityInstance, []>()
14+
.mockImplementation(() => ({
15+
SendMessage: jest.fn(),
16+
Quit: jest
17+
.fn()
18+
.mockImplementation(() => new Promise((reject, resolve) => resolve())),
19+
SetFullscreen: jest.fn(),
20+
}));
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;
1030

1131
beforeEach(() => {
12-
renderer = mount<typeof UnityRenderer>(
13-
<UnityRenderer
14-
onUnityProgressChange={(p) => (progress = p)}
15-
onUnityReadyStateChange={(r) => (ready = r)}
16-
onUnityError={() => (error = true)}
17-
className="test"
18-
/>
19-
);
32+
createUnityValid = jest
33+
.fn<ReturnType<CreateUnityFn>, Parameters<CreateUnityFn>>()
34+
.mockImplementation(
35+
() =>
36+
new Promise<UnityInstance>((resolve) =>
37+
resolve(new MockUnityInstance())
38+
)
39+
);
40+
createUnityInvalid = jest
41+
.fn<ReturnType<CreateUnityFn>, Parameters<CreateUnityFn>>()
42+
.mockImplementation(
43+
() =>
44+
new Promise<UnityInstance>((resolve, reject) =>
45+
reject(new Error('unit test'))
46+
)
47+
);
48+
const baseUrl = 'https://example.com/';
49+
unityContext = new UnityContext({
50+
loaderUrl: baseUrl + 'loader.js',
51+
codeUrl: baseUrl + 'Build/code.js',
52+
dataUrl: baseUrl + 'Build/data.gzip',
53+
frameworkUrl: baseUrl + 'Build/framework.js',
54+
});
2055
});
2156

22-
it('renders with minimal configuration', async () => {
23-
expect(renderer).toBeDefined();
57+
afterEach(() => {
58+
jest.clearAllMocks();
59+
});
60+
61+
function completeLoader(error: boolean = false) {
62+
const script = document.querySelector(
63+
`script[src="${unityContext.getConfig().loaderUrl}"]`
64+
) as HTMLScriptElement;
65+
66+
act(() => {
67+
if (error) {
68+
fireEvent.error(script);
69+
} else {
70+
fireEvent.load(script);
71+
}
72+
});
73+
}
74+
75+
it('renders without configuration', async () => {
76+
const wrapper = mount(<UnityRenderer />);
77+
expect(wrapper).toBeDefined();
2478
});
2579

26-
it('uses the className prop', async () => {
27-
expect(renderer.prop('className')).toBe('test');
80+
it('creates a canvas element', async () => {
81+
expect(document.querySelector('canvas')).toBeNull();
82+
const wrapper = mount(<UnityRenderer />);
2883
});
2984

30-
it('does not trigger callbacks yet', async () => {
85+
it('does not trigger callbacks after initial mounting', async () => {
86+
let progress = 0;
87+
let ready = false;
88+
let error = false;
89+
90+
mount(
91+
<UnityRenderer
92+
onUnityError={() => (error = true)}
93+
onUnityProgressChange={(p) => (progress = p)}
94+
onUnityReadyStateChange={(s) => (ready = s)}
95+
/>
96+
);
3197
expect(progress).toBe(0);
3298
expect(ready).toBe(false);
3399
expect(error).toBe(false);
34100
});
101+
102+
it('uses the loader script', async () => {
103+
window.createUnityInstance = createUnityValid;
104+
mount(<UnityRenderer context={unityContext} />);
105+
106+
expect(createUnityValid).not.toHaveBeenCalled();
107+
completeLoader();
108+
expect(createUnityValid).toHaveBeenCalled();
109+
});
35110
});

0 commit comments

Comments
 (0)