1313 * See the License for the specific language governing permissions and
1414 * limitations under the License.
1515 */
16- import { beforeEach , afterEach , describe , it , vi , expect , afterAll } from 'vitest' ;
16+ import { beforeEach , afterEach , describe , it , vi , expect , afterAll , MockInstance } from 'vitest' ;
1717
1818import AudienceEvaluator , { createAudienceEvaluator } from './index' ;
1919import * as conditionTreeEvaluator from '../condition_tree_evaluator' ;
@@ -23,6 +23,9 @@ import { getMockLogger } from '../../tests/mock/mock_logger';
2323import { Audience , OptimizelyDecideOption , OptimizelyDecision } from '../../shared_types' ;
2424import { IOptimizelyUserContext } from '../../optimizely_user_context' ;
2525
26+ vi . mock ( '../condition_tree_evaluator' , { spy : true } ) ;
27+ vi . mock ( '../custom_attribute_condition_evaluator' , { spy : true } ) ;
28+
2629let mockLogger = getMockLogger ( ) ;
2730
2831const getMockUserContext = ( attributes ?: unknown , segments ?: string [ ] ) : IOptimizelyUserContext => ( {
@@ -111,7 +114,7 @@ describe('lib/core/audience_evaluator', () => {
111114 } ) ;
112115
113116 afterEach ( ( ) => {
114- vi . restoreAllMocks ( ) ;
117+ vi . resetAllMocks ( ) ;
115118 } ) ;
116119
117120 describe ( 'APIs' , ( ) => {
@@ -207,20 +210,19 @@ describe('lib/core/audience_evaluator', () => {
207210 } ) ;
208211
209212 describe ( 'integration with dependencies' , ( ) => {
213+ const evaluateSpy = conditionTreeEvaluator . evaluate as unknown as MockInstance < typeof conditionTreeEvaluator . evaluate > ;
214+ const getEvaluatorSpy = customAttributeConditionEvaluator . getEvaluator as unknown as MockInstance < typeof customAttributeConditionEvaluator . getEvaluator > ;
215+
210216 beforeEach ( ( ) => {
211217 vi . clearAllMocks ( ) ;
212218 } ) ;
213219
214- afterEach ( ( ) => {
215- vi . resetAllMocks ( ) ;
216- } ) ;
217-
218220 afterAll ( ( ) => {
219221 vi . resetAllMocks ( ) ;
220222 } ) ;
221223
222224 it ( 'returns true if conditionTreeEvaluator.evaluate returns true' , ( ) => {
223- vi . spyOn ( conditionTreeEvaluator , 'evaluate' ) . mockReturnValue ( true ) ;
225+ evaluateSpy . mockReturnValue ( true ) ;
224226 const result = audienceEvaluator . evaluate (
225227 [ 'or' , '0' , '1' ] ,
226228 audiencesById ,
@@ -230,7 +232,7 @@ describe('lib/core/audience_evaluator', () => {
230232 } ) ;
231233
232234 it ( 'returns false if conditionTreeEvaluator.evaluate returns false' , ( ) => {
233- vi . spyOn ( conditionTreeEvaluator , 'evaluate' ) . mockReturnValue ( false ) ;
235+ evaluateSpy . mockReturnValue ( false ) ;
234236 const result = audienceEvaluator . evaluate (
235237 [ 'or' , '0' , '1' ] ,
236238 audiencesById ,
@@ -240,7 +242,7 @@ describe('lib/core/audience_evaluator', () => {
240242 } ) ;
241243
242244 it ( 'returns false if conditionTreeEvaluator.evaluate returns null' , ( ) => {
243- vi . spyOn ( conditionTreeEvaluator , 'evaluate' ) . mockReturnValue ( null ) ;
245+ evaluateSpy . mockReturnValue ( null ) ;
244246 const result = audienceEvaluator . evaluate (
245247 [ 'or' , '0' , '1' ] ,
246248 audiencesById ,
@@ -250,13 +252,13 @@ describe('lib/core/audience_evaluator', () => {
250252 } ) ;
251253
252254 it ( 'calls customAttributeConditionEvaluator.evaluate in the leaf evaluator for audience conditions' , ( ) => {
253- vi . spyOn ( conditionTreeEvaluator , 'evaluate' ) . mockImplementation ( ( conditions : any , leafEvaluator ) => {
255+ evaluateSpy . mockImplementation ( ( conditions : any , leafEvaluator : any ) => {
254256 return leafEvaluator ( conditions [ 1 ] ) ;
255257 } ) ;
256258
257259 const mockCustomAttributeConditionEvaluator = vi . fn ( ) . mockReturnValue ( false ) ;
258260
259- vi . spyOn ( customAttributeConditionEvaluator , 'getEvaluator' ) . mockReturnValue ( {
261+ getEvaluatorSpy . mockReturnValue ( {
260262 evaluate : mockCustomAttributeConditionEvaluator ,
261263 } ) ;
262264
@@ -277,26 +279,28 @@ describe('lib/core/audience_evaluator', () => {
277279 } ) ;
278280
279281 describe ( 'Audience evaluation logging' , ( ) => {
280- let mockCustomAttributeConditionEvaluator : ReturnType < typeof vi . fn > ;
281-
282+ const evaluateSpy = conditionTreeEvaluator . evaluate as unknown as MockInstance < typeof conditionTreeEvaluator . evaluate > ;
283+ const getEvaluatorSpy = customAttributeConditionEvaluator . getEvaluator as unknown as MockInstance < typeof customAttributeConditionEvaluator . getEvaluator > ;
284+
282285 beforeEach ( ( ) => {
283- mockCustomAttributeConditionEvaluator = vi . fn ( ) ;
284- vi . spyOn ( conditionTreeEvaluator , 'evaluate' ) ;
285- vi . spyOn ( customAttributeConditionEvaluator , 'getEvaluator' ) . mockReturnValue ( {
286- evaluate : mockCustomAttributeConditionEvaluator ,
287- } ) ;
286+ vi . clearAllMocks ( ) ;
288287 } ) ;
289288
290- afterEach ( ( ) => {
291- vi . restoreAllMocks ( ) ;
289+ afterAll ( ( ) => {
290+ vi . resetAllMocks ( ) ;
292291 } ) ;
293292
294293 it ( 'logs correctly when conditionTreeEvaluator.evaluate returns null' , ( ) => {
295- vi . spyOn ( conditionTreeEvaluator , 'evaluate' ) . mockImplementationOnce ( ( conditions : any , leafEvaluator ) => {
294+ evaluateSpy . mockImplementationOnce ( ( conditions : any , leafEvaluator ) => {
296295 return leafEvaluator ( conditions [ 1 ] ) ;
297296 } ) ;
298297
299- mockCustomAttributeConditionEvaluator . mockReturnValue ( null ) ;
298+ const mockCustomAttributeConditionEvaluator = vi . fn ( ) . mockReturnValue ( null ) ;
299+
300+ getEvaluatorSpy . mockReturnValue ( {
301+ evaluate : mockCustomAttributeConditionEvaluator ,
302+ } ) ;
303+
300304 const userAttributes = { device_model : 5.5 } ;
301305 const user = getMockUserContext ( userAttributes ) ;
302306
@@ -319,11 +323,15 @@ describe('lib/core/audience_evaluator', () => {
319323 } ) ;
320324
321325 it ( 'logs correctly when conditionTreeEvaluator.evaluate returns true' , ( ) => {
322- vi . spyOn ( conditionTreeEvaluator , 'evaluate' ) . mockImplementationOnce ( ( conditions : any , leafEvaluator ) => {
326+ evaluateSpy . mockImplementationOnce ( ( conditions : any , leafEvaluator ) => {
323327 return leafEvaluator ( conditions [ 1 ] ) ;
324328 } ) ;
325329
326- mockCustomAttributeConditionEvaluator . mockReturnValue ( true ) ;
330+ const mockCustomAttributeConditionEvaluator = vi . fn ( ) . mockReturnValue ( true ) ;
331+
332+ getEvaluatorSpy . mockReturnValue ( {
333+ evaluate : mockCustomAttributeConditionEvaluator ,
334+ } ) ;
327335
328336 const userAttributes = { device_model : 'iphone' } ;
329337 const user = getMockUserContext ( userAttributes ) ;
@@ -345,11 +353,16 @@ describe('lib/core/audience_evaluator', () => {
345353 } ) ;
346354
347355 it ( 'logs correctly when conditionTreeEvaluator.evaluate returns false' , ( ) => {
348- vi . spyOn ( conditionTreeEvaluator , 'evaluate' ) . mockImplementationOnce ( ( conditions : any , leafEvaluator ) => {
356+ evaluateSpy . mockImplementationOnce ( ( conditions : any , leafEvaluator ) => {
349357 return leafEvaluator ( conditions [ 1 ] ) ;
350358 } ) ;
351359
352- mockCustomAttributeConditionEvaluator . mockReturnValue ( false ) ;
360+ const mockCustomAttributeConditionEvaluator = vi . fn ( ) . mockReturnValue ( false ) ;
361+
362+ getEvaluatorSpy . mockReturnValue ( {
363+ evaluate : mockCustomAttributeConditionEvaluator ,
364+ } ) ;
365+
353366
354367 const userAttributes = { device_model : 'android' } ;
355368 const user = getMockUserContext ( userAttributes ) ;
0 commit comments