Skip to content

Commit be93651

Browse files
committed
working update
1 parent 5bebab9 commit be93651

File tree

9 files changed

+77
-121
lines changed

9 files changed

+77
-121
lines changed

lib/core/decision_service/index.spec.ts

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { getMockLogger } from '../../tests/mock/mock_logger';
2828
import { getTestProjectConfig, getTestProjectConfigWithFeatures } from '../../tests/test_data';
2929
import { CONTROL_ATTRIBUTES, DECISION_SOURCES } from '../../utils/enums';
3030
import { Value } from '../../utils/promise/operation_value';
31-
import { bucket } from '../bucketer';
31+
import { bucket } from '../bucketer/index';
3232
import {
3333
AUDIENCE_EVALUATION_RESULT_COMBINED,
3434
EVALUATING_AUDIENCES_COMBINED,
@@ -98,11 +98,7 @@ const getDecisionService = (opt: DecisionServiceInstanceOpt = {}): DecisionServi
9898
};
9999
};
100100

101-
const mockBucket: MockInstance<typeof bucket> = vi.hoisted(() => vi.fn());
102-
103-
vi.mock('../bucketer', () => ({
104-
bucket: mockBucket,
105-
}));
101+
vi.mock('../bucketer/index', { spy: true });
106102

107103
const cloneDeep = (d: any) => JSON.parse(JSON.stringify(d));
108104

@@ -165,6 +161,7 @@ const getHoldoutTestDatafile = () => {
165161
};
166162

167163
const verifyBucketCall = (
164+
mockBucket: MockInstance<typeof bucket>,
168165
call: number,
169166
projectConfig: ProjectConfig,
170167
experiment: Experiment,
@@ -202,6 +199,8 @@ const verifyBucketCall = (
202199
};
203200

204201
describe('DecisionService', () => {
202+
const mockBucket: MockInstance<typeof bucket> = bucket as any;
203+
205204
describe('getVariation', function() {
206205
beforeEach(() => {
207206
mockBucket.mockClear();
@@ -231,7 +230,7 @@ describe('DecisionService', () => {
231230
expect(variation.result).toBe('control');
232231

233232
expect(mockBucket).toHaveBeenCalledTimes(1);
234-
verifyBucketCall(0, config, experiment, user);
233+
verifyBucketCall(mockBucket, 0, config, experiment, user);
235234
});
236235

237236
it('should use $opt_bucketing_id attribute as bucketing id if provided', () => {
@@ -261,7 +260,7 @@ describe('DecisionService', () => {
261260
expect(variation.result).toBe('control');
262261

263262
expect(mockBucket).toHaveBeenCalledTimes(1);
264-
verifyBucketCall(0, config, experiment, user, true);
263+
verifyBucketCall(mockBucket, 0, config, experiment, user, true);
265264
});
266265

267266
it('should return the whitelisted variation if the user is whitelisted', function() {
@@ -482,7 +481,7 @@ describe('DecisionService', () => {
482481
expect(userProfileService?.lookup).toHaveBeenCalledWith('decision_service_user');
483482

484483
expect(mockBucket).toHaveBeenCalledTimes(1);
485-
verifyBucketCall(0, config, experiment, user);
484+
verifyBucketCall(mockBucket, 0, config, experiment, user);
486485

487486
expect(userProfileService?.save).toHaveBeenCalledTimes(1);
488487
expect(userProfileService?.save).toHaveBeenCalledWith({
@@ -520,7 +519,7 @@ describe('DecisionService', () => {
520519
expect(userProfileService?.lookup).toHaveBeenCalledWith('decision_service_user');
521520

522521
expect(mockBucket).toHaveBeenCalledTimes(1);
523-
verifyBucketCall(0, config, experiment, user);
522+
verifyBucketCall(mockBucket, 0, config, experiment, user);
524523

525524
expect(userProfileService?.save).toHaveBeenCalledTimes(1);
526525
expect(userProfileService?.save).toHaveBeenCalledWith({
@@ -565,7 +564,7 @@ describe('DecisionService', () => {
565564
expect(userProfileService?.lookup).toHaveBeenCalledWith('decision_service_user');
566565

567566
expect(mockBucket).toHaveBeenCalledTimes(1);
568-
verifyBucketCall(0, config, experiment, user);
567+
verifyBucketCall(mockBucket, 0, config, experiment, user);
569568

570569
expect(logger?.debug).toHaveBeenCalledWith(USER_HAS_NO_FORCED_VARIATION, 'decision_service_user');
571570
expect(logger?.info).toHaveBeenCalledWith(SAVED_VARIATION_NOT_FOUND, 'decision_service_user', 'not valid variation', 'testExperiment');
@@ -609,7 +608,7 @@ describe('DecisionService', () => {
609608
expect(userProfileService?.lookup).toHaveBeenCalledWith('decision_service_user');
610609

611610
expect(mockBucket).toHaveBeenCalledTimes(1);
612-
verifyBucketCall(0, config, experiment, user);
611+
verifyBucketCall(mockBucket, 0, config, experiment, user);
613612

614613
expect(userProfileService?.save).toHaveBeenCalledTimes(1);
615614
expect(userProfileService?.save).toHaveBeenCalledWith({
@@ -650,7 +649,7 @@ describe('DecisionService', () => {
650649
expect(userProfileService?.lookup).toHaveBeenCalledWith('decision_service_user');
651650

652651
expect(mockBucket).toHaveBeenCalledTimes(1);
653-
verifyBucketCall(0, config, experiment, user);
652+
verifyBucketCall(mockBucket, 0, config, experiment, user);
654653

655654
expect(logger?.debug).toHaveBeenCalledWith(USER_HAS_NO_FORCED_VARIATION, 'decision_service_user');
656655
expect(logger?.error).toHaveBeenCalledWith(USER_PROFILE_LOOKUP_ERROR, 'decision_service_user', 'I am an error');
@@ -694,7 +693,7 @@ describe('DecisionService', () => {
694693
expect(userProfileService?.lookup).toHaveBeenCalledWith('decision_service_user');
695694

696695
expect(mockBucket).toHaveBeenCalledTimes(1);
697-
verifyBucketCall(0, config, experiment, user);
696+
verifyBucketCall(mockBucket, 0, config, experiment, user);
698697

699698
expect(userProfileService?.save).toHaveBeenCalledTimes(1);
700699
expect(userProfileService?.save).toHaveBeenCalledWith({
@@ -1080,7 +1079,7 @@ describe('DecisionService', () => {
10801079
'sync', config, config.experimentKeyMap['exp_3'], user, expect.anything(), expect.anything());
10811080

10821081
expect(mockBucket).toHaveBeenCalledTimes(1);
1083-
verifyBucketCall(0, config, config.experimentIdMap['3002'], user);
1082+
verifyBucketCall(mockBucket, 0, config, config.experimentIdMap['3002'], user);
10841083
});
10851084

10861085
it('should return variation from the target delivery and use $opt_bucketing_id attribute as bucketing id', () => {
@@ -1135,7 +1134,7 @@ describe('DecisionService', () => {
11351134
'sync', config, config.experimentKeyMap['exp_3'], user, expect.anything(), expect.anything());
11361135

11371136
expect(mockBucket).toHaveBeenCalledTimes(1);
1138-
verifyBucketCall(0, config, config.experimentIdMap['3002'], user, true);
1137+
verifyBucketCall(mockBucket, 0, config, config.experimentIdMap['3002'], user, true);
11391138
});
11401139

11411140
it('should skip to everyone else targeting rule if the user is not bucketed \
@@ -1190,8 +1189,8 @@ describe('DecisionService', () => {
11901189
'sync', config, config.experimentKeyMap['exp_3'], user, expect.anything(), expect.anything());
11911190

11921191
expect(mockBucket).toHaveBeenCalledTimes(2);
1193-
verifyBucketCall(0, config, config.experimentIdMap['3002'], user);
1194-
verifyBucketCall(1, config, config.experimentIdMap['default-rollout-id'], user);
1192+
verifyBucketCall(mockBucket, 0, config, config.experimentIdMap['3002'], user);
1193+
verifyBucketCall(mockBucket, 1, config, config.experimentIdMap['default-rollout-id'], user);
11951194
});
11961195
});
11971196

@@ -1289,7 +1288,7 @@ describe('DecisionService', () => {
12891288
'sync', config, config.experimentKeyMap['exp_3'], user, expect.anything(), expect.anything());
12901289

12911290
expect(mockBucket).toHaveBeenCalledTimes(1);
1292-
verifyBucketCall(0, config, config.experimentIdMap['default-rollout-id'], user);
1291+
verifyBucketCall(mockBucket, 0, config, config.experimentIdMap['default-rollout-id'], user);
12931292
});
12941293

12951294
it('should return null if no variation is found for any experiment, targeted delivery, or everyone else targeting rule', () => {
@@ -1413,7 +1412,7 @@ describe('DecisionService', () => {
14131412
decisionSource: DECISION_SOURCES.ROLLOUT,
14141413
});
14151414

1416-
verifyBucketCall(0, config, config.experimentKeyMap['exp_3'], user);
1415+
verifyBucketCall(mockBucket, 0, config, config.experimentKeyMap['exp_3'], user);
14171416
expect(cmabService.getDecision).not.toHaveBeenCalled();
14181417
});
14191418

@@ -1459,7 +1458,7 @@ describe('DecisionService', () => {
14591458
decisionSource: DECISION_SOURCES.FEATURE_TEST,
14601459
});
14611460

1462-
verifyBucketCall(0, config, config.experimentKeyMap['exp_3'], user);
1461+
verifyBucketCall(mockBucket, 0, config, config.experimentKeyMap['exp_3'], user);
14631462

14641463
expect(cmabService.getDecision).toHaveBeenCalledTimes(1);
14651464
expect(cmabService.getDecision).toHaveBeenCalledWith(
@@ -1937,11 +1936,6 @@ describe('DecisionService', () => {
19371936

19381937

19391938
describe('holdout', () => {
1940-
beforeEach(async() => {
1941-
const actualBucketModule = (await vi.importActual('../bucketer')) as { bucket: typeof bucket };
1942-
mockBucket.mockImplementation(actualBucketModule.bucket);
1943-
});
1944-
19451939
it('should return holdout variation when user is bucketed into running holdout', async () => {
19461940
const { decisionService } = getDecisionService();
19471941
const config = createProjectConfig(getHoldoutTestDatafile());
@@ -2332,9 +2326,9 @@ describe('DecisionService', () => {
23322326
});
23332327

23342328
expect(mockBucket).toHaveBeenCalledTimes(3);
2335-
verifyBucketCall(0, config, config.experimentKeyMap['exp_1'], user);
2336-
verifyBucketCall(1, config, config.experimentKeyMap['exp_2'], user);
2337-
verifyBucketCall(2, config, config.experimentKeyMap['delivery_1'], user);
2329+
verifyBucketCall(mockBucket, 0, config, config.experimentKeyMap['exp_1'], user);
2330+
verifyBucketCall(mockBucket, 1, config, config.experimentKeyMap['exp_2'], user);
2331+
verifyBucketCall(mockBucket, 2, config, config.experimentKeyMap['delivery_1'], user);
23382332

23392333
expect(cmabService.getDecision).not.toHaveBeenCalled();
23402334
});

lib/core/decision_service/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616
import { LoggerFacade } from '../../logging/logger'
17-
import { bucket } from '../bucketer';
17+
import { bucket } from '../bucketer/index';
1818
import {
1919
AUDIENCE_EVALUATION_TYPES,
2020
CONTROL_ATTRIBUTES,

lib/logging/logger_factory.spec.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,6 @@ describe('createLogger', () => {
118118
logHandler: mockLogHandler,
119119
}));
120120

121-
console.log(OptimizelyLogger);
122-
123121
expect(logger).toBe(MockedOptimizelyLogger.mock.instances[0]);
124122
const { name, level, infoMsgResolver, errorMsgResolver, logHandler } = MockedOptimizelyLogger.mock.calls[0][0];
125123
expect(name).toBe('Optimizely');

lib/project_config/project_config_manager.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,6 @@ export class ProjectConfigManagerImpl extends BaseService implements ProjectConf
227227
}
228228

229229
this.datafileManager.stop();
230-
console.log('stopping datafile manager', this.datafileManager.onTerminated);
231230

232231
this.datafileManager.onTerminated().then(() => {
233232
this.state = ServiceState.Terminated;

package-lock.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@
134134
"@typescript-eslint/eslint-plugin": "^5.33.0",
135135
"@typescript-eslint/parser": "^5.33.0",
136136
"@vitest/browser": "3.2.4",
137-
"acorn": "^8.15.0",
138137
"chai": "^4.2.0",
139138
"coveralls-next": "^4.2.0",
140139
"dotenv": "^17.2.3",

scripts/patch-vitest-viewport.js

Lines changed: 33 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
const fs = require('fs');
2020
const path = require('path');
21-
const acorn = require('acorn');
21+
const ts = require('typescript');
2222

2323
console.log('[VIEWPORT PATCH] Verifying @vitest/browser version...');
2424

@@ -60,78 +60,68 @@ if (!fs.existsSync(backupPath)) {
6060
// Read the file
6161
const code = fs.readFileSync(vitestIndexPath, 'utf8');
6262

63-
let ast;
64-
try {
65-
ast = acorn.parse(code, {
66-
ecmaVersion: 2022,
67-
sourceType: 'module',
68-
});
69-
} catch (error) {
70-
console.error('[VIEWPORT PATCH] Failed to parse index.js:', error.message);
71-
process.exit(1);
72-
}
63+
// Parse using TypeScript compiler
64+
const sourceFile = ts.createSourceFile(
65+
'index.js',
66+
code,
67+
ts.ScriptTarget.ES2022,
68+
true,
69+
ts.ScriptKind.JS
70+
);
7371

7472
// Find the viewport variable declaration
7573
let viewportNode = null;
7674

77-
function walk(node, callback) {
78-
callback(node);
79-
for (const key in node) {
80-
if (key === 'type' || key === 'loc' || key === 'range') continue;
81-
const child = node[key];
82-
if (Array.isArray(child)) {
83-
child.forEach(c => c && typeof c === 'object' && walk(c, callback));
84-
} else if (child && typeof child === 'object') {
85-
walk(child, callback);
86-
}
87-
}
88-
}
89-
90-
walk(ast, (node) => {
75+
function visit(node) {
9176
// Look for: const viewport = async (context, options) => { ... }
9277
if (
93-
node.type === 'VariableDeclaration' &&
94-
node.kind === 'const' &&
95-
node.declarations &&
96-
node.declarations.length > 0
78+
ts.isVariableStatement(node) &&
79+
node.declarationList.flags & ts.NodeFlags.Const
9780
) {
98-
const decl = node.declarations[0];
81+
const declaration = node.declarationList.declarations[0];
9982
if (
100-
decl.id &&
101-
decl.id.type === 'Identifier' &&
102-
decl.id.name === 'viewport' &&
103-
decl.init &&
104-
decl.init.type === 'ArrowFunctionExpression' &&
105-
decl.init.async === true
83+
declaration &&
84+
ts.isIdentifier(declaration.name) &&
85+
declaration.name.text === 'viewport' &&
86+
declaration.initializer &&
87+
ts.isArrowFunction(declaration.initializer) &&
88+
declaration.initializer.modifiers?.some(m => m.kind === ts.SyntaxKind.AsyncKeyword)
10689
) {
10790
viewportNode = node;
91+
return;
10892
}
10993
}
110-
});
94+
95+
ts.forEachChild(node, visit);
96+
}
97+
98+
visit(sourceFile);
11199

112100
if (!viewportNode) {
113-
console.error('[VIEWPORT PATCH] ERROR: Could not find viewport function declaration in AST');
101+
console.error('[VIEWPORT PATCH] ERROR: Could not find viewport function declaration');
114102
process.exit(1);
115103
}
116104

117-
console.log(`[VIEWPORT PATCH] Found viewport function at position ${viewportNode.start}-${viewportNode.end}`);
105+
const start = viewportNode.getStart(sourceFile);
106+
const end = viewportNode.getEnd();
107+
108+
console.log(`[VIEWPORT PATCH] Found viewport function at position ${start}-${end}`);
118109

119110
// Extract the original function for logging
120-
const originalFunction = code.substring(viewportNode.start, viewportNode.end);
111+
const originalFunction = code.substring(start, end);
121112
console.log('[VIEWPORT PATCH] Original function:');
122113
console.log(originalFunction);
123114

124115
// Create the replacement
125116
const replacement = `const viewport = async (context, options) => {
126-
console.log('[VIEWPORT PATCH] Viewport command intercepted and ignored', options);
127117
return Promise.resolve();
128118
};`;
129119

130120
// Replace the function using string manipulation
131121
const patchedCode =
132-
code.substring(0, viewportNode.start) +
122+
code.substring(0, start) +
133123
replacement +
134-
code.substring(viewportNode.end);
124+
code.substring(end);
135125

136126
// Write the patched code
137127
fs.writeFileSync(vitestIndexPath, patchedCode, 'utf8');

scripts/run-browser-tests.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,6 @@ async function runTests() {
173173
TEST_BROWSER_VERSION: config.browserVersion || '',
174174
TEST_OS_NAME: config.os,
175175
TEST_OS_VERSION: config.osVersion,
176-
WDIO_LOG_LEVEL: 'info', // Enable WebdriverIO logging
177176
};
178177

179178

0 commit comments

Comments
 (0)