Skip to content

Commit 43bef8e

Browse files
committed
validate test size and offset
1 parent 17f450f commit 43bef8e

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed

ab-testing/scripts/validation/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ABTests } from '../../abTest.ts';
22
import { ABTest } from '../../types.ts';
33
import { limitServerSideTests } from './limitServerSide.ts';
44
import { allExpirationsValid } from './validExpiration.ts';
5+
import { validSizeOffset } from './validSizeOffset.ts';
56
import { noVariantOverlap } from './variantOverlap.ts';
67

78
type ValidationFunction = (tests: ABTest[]) => boolean;
@@ -10,6 +11,7 @@ const rules: ValidationFunction[] = [
1011
noVariantOverlap,
1112
limitServerSideTests,
1213
allExpirationsValid,
14+
validSizeOffset,
1315
];
1416

1517
function validateTests(testList: ABTest[]) {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { assertThrows, assertEquals } from 'jsr:@std/assert';
2+
import { ABTest } from '../../types.ts';
3+
import { validSizeOffset } from './validSizeOffset.ts';
4+
5+
const baseTest: ABTest = {
6+
name: 'commercial-future',
7+
description: 'End on a weekday',
8+
owners: ['[email protected]'],
9+
status: 'ON',
10+
expirationDate: new Date(),
11+
type: 'client',
12+
highImpact: false,
13+
audienceSize: 10 / 100,
14+
groups: ['control', 'variant'],
15+
};
16+
Deno.test(
17+
'validSizeOffset - passes when audienceSize is between 0 and 1',
18+
() => {
19+
const test: ABTest = {
20+
...baseTest,
21+
audienceSize: 0.5,
22+
};
23+
24+
assertEquals(validSizeOffset([test]), true);
25+
},
26+
);
27+
28+
Deno.test('validSizeOffset - throws when audienceSize is less than 0', () => {
29+
const test: ABTest = {
30+
...baseTest,
31+
audienceSize: -0.1,
32+
};
33+
34+
assertThrows(
35+
() => validSizeOffset([test]),
36+
Error,
37+
`Invalid audienceSize for test ${test.name}`,
38+
);
39+
});
40+
41+
Deno.test(
42+
'validSizeOffset - throws when audienceSize is greater than 1',
43+
() => {
44+
const test: ABTest = {
45+
...baseTest,
46+
audienceSize: 1.1,
47+
};
48+
49+
assertThrows(
50+
() => validSizeOffset([test]),
51+
Error,
52+
`Invalid audienceSize for test ${test.name}`,
53+
);
54+
},
55+
);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { ABTest } from '../../types.ts';
2+
3+
const _validSizeOffset = (test: ABTest): boolean => {
4+
// Check if audienceSize is defined and is a number between 0 and 1
5+
if (
6+
typeof test.audienceSize !== 'number' ||
7+
test.audienceSize < 0 ||
8+
test.audienceSize > 1
9+
) {
10+
throw new Error(`Invalid audienceSize for test ${test.name}`);
11+
}
12+
13+
// Check if audienceOffset is defined and is a number between 0 and 1
14+
if (
15+
test.audienceOffset !== undefined &&
16+
(typeof test.audienceOffset !== 'number' ||
17+
test.audienceOffset < 0 ||
18+
test.audienceOffset > 1)
19+
) {
20+
throw new Error(`Invalid audienceOffset for test ${test.name}`);
21+
}
22+
23+
return true;
24+
};
25+
26+
const validSizeOffset = (tests: ABTest[]): boolean => {
27+
return tests.every(_validSizeOffset);
28+
};
29+
30+
export { validSizeOffset };

0 commit comments

Comments
 (0)