Skip to content

Commit 442cb62

Browse files
Merge pull request #118 from Flagsmith/release/3.0.0
Release 3.0.0
2 parents 4ec2467 + 521ce18 commit 442cb62

File tree

5 files changed

+56
-13
lines changed

5 files changed

+56
-13
lines changed

flagsmith-engine/identities/models.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,16 @@ export class IdentityModel {
1919
identityFeatures: IdentityFeaturesList,
2020
environmentApiKey: string,
2121
identifier: string,
22-
identityUuid?: string
22+
identityUuid?: string,
23+
djangoID?: number
2324
) {
2425
this.identityUuid = identityUuid || uuidv4();
2526
this.createdDate = Date.parse(created_date) || Date.now();
2627
this.identityTraits = identityTraits;
2728
this.identityFeatures = new IdentityFeaturesList(...identityFeatures);
2829
this.environmentApiKey = environmentApiKey;
2930
this.identifier = identifier;
31+
this.djangoID = djangoID;
3032
}
3133

3234
get compositeKey() {

flagsmith-engine/segments/evaluators.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export function evaluateIdentityInSegment(
2727
overrideTraits || identity.identityTraits,
2828
rule,
2929
segment.id,
30-
identity.compositeKey
30+
identity.djangoID || identity.compositeKey
3131
)
3232
).length === segment.rules.length
3333
);
@@ -62,7 +62,8 @@ export function traitsMatchSegmentCondition(
6262
identityId: number | string
6363
): boolean {
6464
if (condition.operator == PERCENTAGE_SPLIT) {
65-
return getHashedPercentateForObjIds([segmentId, identityId]) <= parseFloat(String(condition.value));
65+
var hashedPercentage = getHashedPercentateForObjIds([segmentId, identityId]);
66+
return hashedPercentage <= parseFloat(String(condition.value));
6667
}
6768
const traits = identityTraits.filter(t => t.traitKey === condition.property_);
6869
const trait = traits.length > 0 ? traits[0] : undefined;
@@ -73,4 +74,4 @@ export function traitsMatchSegmentCondition(
7374
}
7475
return trait ? condition.matchesTraitValue(trait.traitValue) : false;
7576

76-
}
77+
}

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "flagsmith-nodejs",
3-
"version": "2.5.2",
3+
"version": "3.0.0",
44
"description": "Flagsmith lets you manage features flags and remote config across web, mobile and server side applications. Deliver true Continuous Integration. Get builds out faster. Control who has access to new features.",
55
"main": "build/index.js",
66
"repository": {

tests/engine/unit/segments/segment_evaluators.test.ts

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
import {
2+
ALL_RULE,
23
CONDITION_OPERATORS,
4+
PERCENTAGE_SPLIT,
35
} from '../../../../flagsmith-engine/segments/constants';
4-
import {
5-
SegmentConditionModel,
6-
} from '../../../../flagsmith-engine/segments/models';
7-
import {traitsMatchSegmentCondition} from "../../../../flagsmith-engine/segments/evaluators";
8-
import {TraitModel} from "../../../../flagsmith-engine";
6+
import {SegmentConditionModel} from '../../../../flagsmith-engine/segments/models';
7+
import {traitsMatchSegmentCondition, evaluateIdentityInSegment} from "../../../../flagsmith-engine/segments/evaluators";
8+
import {TraitModel, IdentityModel} from "../../../../flagsmith-engine";
9+
import {environment} from "../utils";
10+
import { buildSegmentModel } from '../../../../flagsmith-engine/segments/util';
11+
import { getHashedPercentateForObjIds } from '../../../../flagsmith-engine/utils/hashing';
12+
13+
14+
// todo: work out how to implement this in a test function or before hook
15+
jest.mock('../../../../flagsmith-engine/utils/hashing', () => ({
16+
getHashedPercentateForObjIds: jest.fn(() => 1)
17+
}));
18+
919

1020
let traitExistenceTestCases: [string, string | null | undefined, string | null | undefined, TraitModel [],boolean][] = [
1121
[CONDITION_OPERATORS.IS_SET,'foo', null,[] , false],
@@ -24,4 +34,34 @@ test('test_traits_match_segment_condition_for_trait_existence_operators', () =>
2434
traitsMatchSegmentCondition (traits, segmentModel, 'any','any')
2535
).toBe(expectedResult);
2636
}
27-
});
37+
});
38+
39+
40+
test('evaluateIdentityInSegment uses django ID for hashed percentage when present', () => {
41+
var identityModel = new IdentityModel(Date.now().toString(), [], [], environment().apiKey, 'identity_1', undefined, 1);
42+
const segmentDefinition = {
43+
id: 1,
44+
name: 'percentage_split_segment',
45+
rules: [
46+
{
47+
type: ALL_RULE,
48+
conditions: [
49+
{
50+
operator: PERCENTAGE_SPLIT,
51+
property_: null,
52+
value: "10"
53+
}
54+
],
55+
rules: []
56+
}
57+
],
58+
feature_states: []
59+
};
60+
const segmentModel = buildSegmentModel(segmentDefinition);
61+
62+
var result = evaluateIdentityInSegment(identityModel, segmentModel);
63+
64+
expect(result).toBe(true);
65+
expect(getHashedPercentateForObjIds).toHaveBeenCalledTimes(1)
66+
expect(getHashedPercentateForObjIds).toHaveBeenCalledWith([segmentModel.id, identityModel.djangoID])
67+
});

0 commit comments

Comments
 (0)