Skip to content

Commit 1c9697a

Browse files
yfrancisgreghuels
authored andcommitted
Better test for assignment cache behavior with overrides
1 parent 2c2db42 commit 1c9697a

File tree

1 file changed

+54
-6
lines changed

1 file changed

+54
-6
lines changed

src/client/eppo-client.spec.ts

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
validateTestAssignments,
1515
} from '../../test/testHelpers';
1616
import { IAssignmentLogger } from '../assignment-logger';
17+
import { AssignmentCache } from '../cache/abstract-assignment-cache';
1718
import {
1819
IConfigurationWire,
1920
IObfuscatedPrecomputedConfigurationResponse,
@@ -1029,6 +1030,11 @@ describe('EppoClient E2E test', () => {
10291030
});
10301031

10311032
it('does not update assignment cache when override is applied', () => {
1033+
const mockAssignmentCache = td.object<AssignmentCache>();
1034+
td.when(mockAssignmentCache.has(td.matchers.anything())).thenReturn(false);
1035+
td.when(mockAssignmentCache.set(td.matchers.anything())).thenReturn();
1036+
client.useCustomAssignmentCache(mockAssignmentCache);
1037+
10321038
overrideStore.setEntries({
10331039
[flagKey]: {
10341040
key: 'override-variation',
@@ -1039,17 +1045,17 @@ describe('EppoClient E2E test', () => {
10391045
// First call with override
10401046
client.getStringAssignment(flagKey, 'subject-10', {}, 'default');
10411047

1048+
// Verify cache was not used at all
1049+
expect(td.explain(mockAssignmentCache.set).callCount).toBe(0);
1050+
10421051
// Remove override
10431052
overrideStore.setEntries({});
10441053

1045-
// Second call without override should trigger logging since cache wasn't updated
1054+
// Second call without override
10461055
client.getStringAssignment(flagKey, 'subject-10', {}, 'default');
10471056

1048-
expect(td.explain(mockLogger.logAssignment).callCount).toBe(1);
1049-
expect(td.explain(mockLogger.logAssignment).calls[0].args[0]).toMatchObject({
1050-
featureFlag: flagKey,
1051-
subject: 'subject-10',
1052-
});
1057+
// Now cache should be used
1058+
expect(td.explain(mockAssignmentCache.set).callCount).toBe(1);
10531059
});
10541060

10551061
it('uses normal assignment when no override exists for flag', () => {
@@ -1086,5 +1092,47 @@ describe('EppoClient E2E test', () => {
10861092
expect(result).toBe(variationA.value);
10871093
expect(td.explain(mockLogger.logAssignment).callCount).toBe(1);
10881094
});
1095+
1096+
it('respects override after initial assignment without override', () => {
1097+
// First call without override
1098+
const initialAssignment = client.getStringAssignment(flagKey, 'subject-10', {}, 'default');
1099+
expect(initialAssignment).toBe(variationA.value);
1100+
expect(td.explain(mockLogger.logAssignment).callCount).toBe(1);
1101+
1102+
// Set override and make second call
1103+
overrideStore.setEntries({
1104+
[flagKey]: {
1105+
key: 'override-variation',
1106+
value: 'override-value',
1107+
},
1108+
});
1109+
1110+
const overriddenAssignment = client.getStringAssignment(flagKey, 'subject-10', {}, 'default');
1111+
expect(overriddenAssignment).toBe('override-value');
1112+
// No additional logging should occur when using override
1113+
expect(td.explain(mockLogger.logAssignment).callCount).toBe(1);
1114+
});
1115+
1116+
it('reverts to normal assignment after removing override', () => {
1117+
// Set initial override
1118+
overrideStore.setEntries({
1119+
[flagKey]: {
1120+
key: 'override-variation',
1121+
value: 'override-value',
1122+
},
1123+
});
1124+
1125+
const overriddenAssignment = client.getStringAssignment(flagKey, 'subject-10', {}, 'default');
1126+
expect(overriddenAssignment).toBe('override-value');
1127+
expect(td.explain(mockLogger.logAssignment).callCount).toBe(0);
1128+
1129+
// Remove override and make second call
1130+
overrideStore.setEntries({});
1131+
1132+
const normalAssignment = client.getStringAssignment(flagKey, 'subject-10', {}, 'default');
1133+
expect(normalAssignment).toBe(variationA.value);
1134+
// Should log the normal assignment
1135+
expect(td.explain(mockLogger.logAssignment).callCount).toBe(1);
1136+
});
10891137
});
10901138
});

0 commit comments

Comments
 (0)