3
3
import { mount } from 'enzyme' ;
4
4
import { act , fireEvent } from '@testing-library/react' ;
5
5
import { UnityContext } from '../../lib/context' ;
6
-
7
6
import { UnityRenderer } from '../UnityRenderer' ;
8
7
9
8
type CreateUnityFn = typeof window . createUnityInstance ;
10
9
11
10
describe ( '<UnityRenderer>' , ( ) => {
12
- const MockUnityInstance = jest
13
- . fn < UnityInstance , [ ] > ( )
14
- . mockImplementation ( ( ) => ( {
11
+ const MockUnityInstance = ( ) =>
12
+ jest . fn < UnityInstance , [ ] > ( ) . mockImplementation ( ( ) => ( {
15
13
SendMessage : jest . fn ( ) ,
16
14
Quit : jest
17
15
. fn ( )
18
16
. mockImplementation ( ( ) => new Promise ( ( reject , resolve ) => resolve ( ) ) ) ,
19
17
SetFullscreen : jest . fn ( ) ,
20
18
} ) ) ;
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
33
21
. 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
41
31
. fn < ReturnType < CreateUnityFn > , Parameters < CreateUnityFn > > ( )
42
32
. mockImplementation (
43
33
( ) =>
44
34
new Promise < UnityInstance > ( ( resolve , reject ) =>
45
35
reject ( new Error ( 'unit test' ) )
46
36
)
47
37
) ;
38
+ let unityContext : UnityContext ;
39
+
40
+ beforeEach ( ( ) => {
48
41
const baseUrl = 'https://example.com/' ;
49
42
unityContext = new UnityContext ( {
50
43
loaderUrl : baseUrl + 'loader.js' ,
@@ -56,9 +49,13 @@ describe('<UnityRenderer>', () => {
56
49
57
50
afterEach ( ( ) => {
58
51
jest . clearAllMocks ( ) ;
52
+
53
+ document . body . innerHTML = '' ;
54
+ // @ts -ignore
55
+ window . createUnityInstance = undefined ;
59
56
} ) ;
60
57
61
- function completeLoader ( error : boolean = false ) {
58
+ function completeLoader ( error ? : boolean ) {
62
59
const script = document . querySelector (
63
60
`script[src="${ unityContext . getConfig ( ) . loaderUrl } "]`
64
61
) as HTMLScriptElement ;
@@ -73,13 +70,13 @@ describe('<UnityRenderer>', () => {
73
70
}
74
71
75
72
it ( 'renders without configuration' , async ( ) => {
76
- const wrapper = mount ( < UnityRenderer /> ) ;
77
- expect ( wrapper ) . toBeDefined ( ) ;
73
+ const component = mount ( < UnityRenderer /> ) ;
74
+ expect ( component ) . toBeDefined ( ) ;
78
75
} ) ;
79
76
80
77
it ( 'creates a canvas element' , async ( ) => {
81
78
expect ( document . querySelector ( 'canvas' ) ) . toBeNull ( ) ;
82
- const wrapper = mount ( < UnityRenderer /> ) ;
79
+ mount ( < UnityRenderer /> ) ;
83
80
} ) ;
84
81
85
82
it ( 'does not trigger callbacks after initial mounting' , async ( ) => {
@@ -89,6 +86,7 @@ describe('<UnityRenderer>', () => {
89
86
90
87
mount (
91
88
< UnityRenderer
89
+ context = { unityContext }
92
90
onUnityError = { ( ) => ( error = true ) }
93
91
onUnityProgressChange = { ( p ) => ( progress = p ) }
94
92
onUnityReadyStateChange = { ( s ) => ( ready = s ) }
@@ -99,12 +97,50 @@ describe('<UnityRenderer>', () => {
99
97
expect ( error ) . toBe ( false ) ;
100
98
} ) ;
101
99
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 ) ;
105
142
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 / ) ;
109
145
} ) ;
110
146
} ) ;
0 commit comments