1616import sinon from 'sinon' ;
1717import { assert } from 'chai' ;
1818import { sprintf } from '../../utils/fns' ;
19- import { getLogger } from '../../modules/logging' ;
2019
2120import AudienceEvaluator , { createAudienceEvaluator } from './index' ;
2221import * as conditionTreeEvaluator from '../condition_tree_evaluator' ;
2322import * as customAttributeConditionEvaluator from '../custom_attribute_condition_evaluator' ;
23+ import { AUDIENCE_EVALUATION_RESULT , EVALUATING_AUDIENCE } from '../../log_messages' ;
24+ // import { getEvaluator } from '../custom_attribute_condition_evaluator';
2425
2526var buildLogMessageFromArgs = args => sprintf ( args [ 1 ] , ...args . splice ( 2 ) ) ;
26- var mockLogger = getLogger ( ) ;
27+ var mockLogger = {
28+ debug : ( ) => { } ,
29+ info : ( ) => { } ,
30+ warn : ( ) => { } ,
31+ error : ( ) => { } ,
32+ }
2733
2834var getMockUserContext = ( attributes , segments ) => ( {
2935 getAttributes : ( ) => ( { ... ( attributes || { } ) } ) ,
@@ -82,11 +88,17 @@ describe('lib/core/audience_evaluator', function() {
8288 var audienceEvaluator ;
8389
8490 beforeEach ( function ( ) {
85- sinon . stub ( mockLogger , 'log' ) ;
91+ sinon . stub ( mockLogger , 'info' ) ;
92+ sinon . stub ( mockLogger , 'debug' ) ;
93+ sinon . stub ( mockLogger , 'warn' ) ;
94+ sinon . stub ( mockLogger , 'error' ) ;
8695 } ) ;
8796
8897 afterEach ( function ( ) {
89- mockLogger . log . restore ( ) ;
98+ mockLogger . info . restore ( ) ;
99+ mockLogger . debug . restore ( ) ;
100+ mockLogger . warn . restore ( ) ;
101+ mockLogger . error . restore ( ) ;
90102 } ) ;
91103
92104 describe ( 'APIs' , function ( ) {
@@ -170,7 +182,6 @@ describe('lib/core/audience_evaluator', function() {
170182
171183 beforeEach ( function ( ) {
172184 sandbox . stub ( conditionTreeEvaluator , 'evaluate' ) ;
173- sandbox . stub ( customAttributeConditionEvaluator , 'evaluate' ) ;
174185 } ) ;
175186
176187 afterEach ( function ( ) {
@@ -199,26 +210,40 @@ describe('lib/core/audience_evaluator', function() {
199210 conditionTreeEvaluator . evaluate . callsFake ( function ( conditions , leafEvaluator ) {
200211 return leafEvaluator ( conditions [ 1 ] ) ;
201212 } ) ;
202- customAttributeConditionEvaluator . evaluate . returns ( false ) ;
213+
214+ const mockCustomAttributeConditionEvaluator = sinon . stub ( ) . returns ( false ) ;
215+
216+ sinon . stub ( customAttributeConditionEvaluator , 'getEvaluator' ) . returns ( {
217+ evaluate : mockCustomAttributeConditionEvaluator ,
218+ } ) ;
219+
220+ const audienceEvaluator = createAudienceEvaluator ( ) ;
221+
203222 var userAttributes = { device_model : 'android' } ;
204223 var user = getMockUserContext ( userAttributes ) ;
205224 var result = audienceEvaluator . evaluate ( [ 'or' , '1' ] , audiencesById , user ) ;
206- sinon . assert . calledOnce ( customAttributeConditionEvaluator . evaluate ) ;
225+ sinon . assert . calledOnce ( mockCustomAttributeConditionEvaluator ) ;
207226 sinon . assert . calledWithExactly (
208- customAttributeConditionEvaluator . evaluate ,
227+ mockCustomAttributeConditionEvaluator ,
209228 iphoneUserAudience . conditions [ 1 ] ,
210229 user ,
211230 ) ;
212231 assert . isFalse ( result ) ;
232+
233+ customAttributeConditionEvaluator . getEvaluator . restore ( ) ;
213234 } ) ;
214235 } ) ;
215236
216237 describe ( 'Audience evaluation logging' , function ( ) {
217238 var sandbox = sinon . sandbox . create ( ) ;
239+ var mockCustomAttributeConditionEvaluator ;
218240
219241 beforeEach ( function ( ) {
242+ mockCustomAttributeConditionEvaluator = sinon . stub ( ) ;
220243 sandbox . stub ( conditionTreeEvaluator , 'evaluate' ) ;
221- sandbox . stub ( customAttributeConditionEvaluator , 'evaluate' ) ;
244+ sandbox . stub ( customAttributeConditionEvaluator , 'getEvaluator' ) . returns ( {
245+ evaluate : mockCustomAttributeConditionEvaluator ,
246+ } ) ;
222247 } ) ;
223248
224249 afterEach ( function ( ) {
@@ -229,69 +254,110 @@ describe('lib/core/audience_evaluator', function() {
229254 conditionTreeEvaluator . evaluate . callsFake ( function ( conditions , leafEvaluator ) {
230255 return leafEvaluator ( conditions [ 1 ] ) ;
231256 } ) ;
232- customAttributeConditionEvaluator . evaluate . returns ( null ) ;
257+
258+ mockCustomAttributeConditionEvaluator . returns ( null ) ;
233259 var userAttributes = { device_model : 5.5 } ;
234260 var user = getMockUserContext ( userAttributes ) ;
261+
262+ const audienceEvaluator = createAudienceEvaluator ( { } , mockLogger ) ;
263+
235264 var result = audienceEvaluator . evaluate ( [ 'or' , '1' ] , audiencesById , user ) ;
236- sinon . assert . calledOnce ( customAttributeConditionEvaluator . evaluate ) ;
265+
266+ sinon . assert . calledOnce ( mockCustomAttributeConditionEvaluator ) ;
237267 sinon . assert . calledWithExactly (
238- customAttributeConditionEvaluator . evaluate ,
268+ mockCustomAttributeConditionEvaluator ,
239269 iphoneUserAudience . conditions [ 1 ] ,
240270 user
241271 ) ;
242272 assert . isFalse ( result ) ;
243- assert . strictEqual ( 2 , mockLogger . log . callCount ) ;
244- assert . strictEqual (
245- buildLogMessageFromArgs ( mockLogger . log . args [ 0 ] ) ,
246- 'AUDIENCE_EVALUATOR: Starting to evaluate audience "1" with conditions: ["and",{"name":"device_model","value":"iphone","type":"custom_attribute"}].'
247- ) ;
248- assert . strictEqual ( buildLogMessageFromArgs ( mockLogger . log . args [ 1 ] ) , 'AUDIENCE_EVALUATOR: Audience "1" evaluated to UNKNOWN.' ) ;
273+ assert . strictEqual ( 2 , mockLogger . debug . callCount ) ;
274+
275+ sinon . assert . calledWithExactly (
276+ mockLogger . debug ,
277+ EVALUATING_AUDIENCE ,
278+ '1' ,
279+ JSON . stringify ( [ 'and' , iphoneUserAudience . conditions [ 1 ] ] )
280+ )
281+
282+ sinon . assert . calledWithExactly (
283+ mockLogger . debug ,
284+ AUDIENCE_EVALUATION_RESULT ,
285+ '1' ,
286+ 'UNKNOWN'
287+ )
249288 } ) ;
250289
251290 it ( 'logs correctly when conditionTreeEvaluator.evaluate returns true' , function ( ) {
252291 conditionTreeEvaluator . evaluate . callsFake ( function ( conditions , leafEvaluator ) {
253292 return leafEvaluator ( conditions [ 1 ] ) ;
254293 } ) ;
255- customAttributeConditionEvaluator . evaluate . returns ( true ) ;
294+
295+ mockCustomAttributeConditionEvaluator . returns ( true ) ;
296+
256297 var userAttributes = { device_model : 'iphone' } ;
257298 var user = getMockUserContext ( userAttributes ) ;
299+
300+ const audienceEvaluator = createAudienceEvaluator ( { } , mockLogger ) ;
301+
258302 var result = audienceEvaluator . evaluate ( [ 'or' , '1' ] , audiencesById , user ) ;
259- sinon . assert . calledOnce ( customAttributeConditionEvaluator . evaluate ) ;
303+ sinon . assert . calledOnce ( mockCustomAttributeConditionEvaluator ) ;
260304 sinon . assert . calledWithExactly (
261- customAttributeConditionEvaluator . evaluate ,
305+ mockCustomAttributeConditionEvaluator ,
262306 iphoneUserAudience . conditions [ 1 ] ,
263307 user ,
264308 ) ;
265309 assert . isTrue ( result ) ;
266- assert . strictEqual ( 2 , mockLogger . log . callCount ) ;
267- assert . strictEqual (
268- buildLogMessageFromArgs ( mockLogger . log . args [ 0 ] ) ,
269- 'AUDIENCE_EVALUATOR: Starting to evaluate audience "1" with conditions: ["and",{"name":"device_model","value":"iphone","type":"custom_attribute"}].'
270- ) ;
271- assert . strictEqual ( buildLogMessageFromArgs ( mockLogger . log . args [ 1 ] ) , 'AUDIENCE_EVALUATOR: Audience "1" evaluated to TRUE.' ) ;
310+ assert . strictEqual ( 2 , mockLogger . debug . callCount ) ;
311+ sinon . assert . calledWithExactly (
312+ mockLogger . debug ,
313+ EVALUATING_AUDIENCE ,
314+ '1' ,
315+ JSON . stringify ( [ 'and' , iphoneUserAudience . conditions [ 1 ] ] )
316+ )
317+
318+ sinon . assert . calledWithExactly (
319+ mockLogger . debug ,
320+ AUDIENCE_EVALUATION_RESULT ,
321+ '1' ,
322+ 'TRUE'
323+ )
272324 } ) ;
273325
274326 it ( 'logs correctly when conditionTreeEvaluator.evaluate returns false' , function ( ) {
275327 conditionTreeEvaluator . evaluate . callsFake ( function ( conditions , leafEvaluator ) {
276328 return leafEvaluator ( conditions [ 1 ] ) ;
277329 } ) ;
278- customAttributeConditionEvaluator . evaluate . returns ( false ) ;
330+
331+ mockCustomAttributeConditionEvaluator . returns ( false ) ;
332+
279333 var userAttributes = { device_model : 'android' } ;
280334 var user = getMockUserContext ( userAttributes ) ;
335+
336+ const audienceEvaluator = createAudienceEvaluator ( { } , mockLogger ) ;
337+
281338 var result = audienceEvaluator . evaluate ( [ 'or' , '1' ] , audiencesById , user ) ;
282- sinon . assert . calledOnce ( customAttributeConditionEvaluator . evaluate ) ;
339+ sinon . assert . calledOnce ( mockCustomAttributeConditionEvaluator ) ;
283340 sinon . assert . calledWithExactly (
284- customAttributeConditionEvaluator . evaluate ,
341+ mockCustomAttributeConditionEvaluator ,
285342 iphoneUserAudience . conditions [ 1 ] ,
286343 user ,
287344 ) ;
288345 assert . isFalse ( result ) ;
289- assert . strictEqual ( 2 , mockLogger . log . callCount ) ;
290- assert . strictEqual (
291- buildLogMessageFromArgs ( mockLogger . log . args [ 0 ] ) ,
292- 'AUDIENCE_EVALUATOR: Starting to evaluate audience "1" with conditions: ["and",{"name":"device_model","value":"iphone","type":"custom_attribute"}].'
293- ) ;
294- assert . strictEqual ( buildLogMessageFromArgs ( mockLogger . log . args [ 1 ] ) , 'AUDIENCE_EVALUATOR: Audience "1" evaluated to FALSE.' ) ;
346+ assert . strictEqual ( 2 , mockLogger . debug . callCount ) ;
347+
348+ sinon . assert . calledWithExactly (
349+ mockLogger . debug ,
350+ EVALUATING_AUDIENCE ,
351+ '1' ,
352+ JSON . stringify ( [ 'and' , iphoneUserAudience . conditions [ 1 ] ] )
353+ )
354+
355+ sinon . assert . calledWithExactly (
356+ mockLogger . debug ,
357+ AUDIENCE_EVALUATION_RESULT ,
358+ '1' ,
359+ 'FALSE'
360+ )
295361 } ) ;
296362 } ) ;
297363 } ) ;
0 commit comments