33import { mount } from 'enzyme' ;
44import { act , fireEvent } from '@testing-library/react' ;
55import { UnityContext } from '../../lib/context' ;
6-
76import { UnityRenderer } from '../UnityRenderer' ;
87
98type CreateUnityFn = typeof window . createUnityInstance ;
109
1110describe ( '<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 ( / f a i l e d t o m o u n t / ) ;
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 ( / u n i t t e s t / ) ;
109145 } ) ;
110146} ) ;
0 commit comments