{
"specVersion": "0.7.1",
"evalCondition": [
[
"$not - pass",
{
"$not": {
"name": "hello"
}
},
{
"name": "world"
},
true
],
[
"$not - fail",
{
"$not": {
"name": "hello"
}
},
{
"name": "hello"
},
false
],
[
"$and/$or - all true",
{
"$and": [
{
"father.age": {
"$gt": 65
}
},
{
"$or": [
{
"bday": {
"$regex": "-12-25$"
}
},
{
"name": "santa"
}
]
}
]
},
{
"name": "santa",
"bday": "1980-12-25",
"father": {
"age": 70
}
},
true
],
[
"$groups - match",
{
"$and": [
{
"$groups": {
"$elemMatch": {
"$eq": "a"
}
}
},
{
"$groups": {
"$elemMatch": {
"$eq": "b"
}
}
},
{
"$or": [
{
"$groups": {
"$elemMatch": {
"$eq": "c"
}
}
},
{
"$groups": {
"$elemMatch": {
"$eq": "e"
}
}
}
]
},
{
"$not": {
"$groups": {
"$elemMatch": {
"$eq": "f"
}
}
}
},
{
"$not": {
"$groups": {
"$elemMatch": {
"$eq": "g"
}
}
}
}
]
},
{
"$groups": [
"a",
"b",
"c",
"d"
]
},
true
],
[
"$groups - no match",
{
"$and": [
{
"$groups": {
"$elemMatch": {
"$eq": "a"
}
}
},
{
"$groups": {
"$elemMatch": {
"$eq": "b"
}
}
},
{
"$or": [
{
"$groups": {
"$elemMatch": {
"$eq": "c"
}
}
},
{
"$groups": {
"$elemMatch": {
"$eq": "e"
}
}
}
]
},
{
"$not": {
"$groups": {
"$elemMatch": {
"$eq": "d"
}
}
}
},
{
"$not": {
"$groups": {
"$elemMatch": {
"$eq": "g"
}
}
}
}
]
},
{
"$groups": [
"a",
"b",
"c",
"d"
]
},
false
],
[
"$and/$or - first or true",
{
"$and": [
{
"father.age": {
"$gt": 65
}
},
{
"$or": [
{
"bday": {
"$regex": "-12-25$"
}
},
{
"name": "santa"
}
]
}
]
},
{
"name": "santa",
"bday": "1980-12-20",
"father": {
"age": 70
}
},
true
],
[
"$and/$or - second or true",
{
"$and": [
{
"father.age": {
"$gt": 65
}
},
{
"$or": [
{
"bday": {
"$regex": "-12-25$"
}
},
{
"name": "santa"
}
]
}
]
},
{
"name": "barbara",
"bday": "1980-12-25",
"father": {
"age": 70
}
},
true
],
[
"$and/$or - first and false",
{
"$and": [
{
"father.age": {
"$gt": 65
}
},
{
"$or": [
{
"bday": {
"$regex": "-12-25$"
}
},
{
"name": "santa"
}
]
}
]
},
{
"name": "santa",
"bday": "1980-12-25",
"father": {
"age": 65
}
},
false
],
[
"$and/$or - both or false",
{
"$and": [
{
"father.age": {
"$gt": 65
}
},
{
"$or": [
{
"bday": {
"$regex": "-12-25$"
}
},
{
"name": "santa"
}
]
}
]
},
{
"name": "barbara",
"bday": "1980-11-25",
"father": {
"age": 70
}
},
false
],
[
"$and/$or - both and false",
{
"$and": [
{
"father.age": {
"$gt": 65
}
},
{
"$or": [
{
"bday": {
"$regex": "-12-25$"
}
},
{
"name": "santa"
}
]
}
]
},
{
"name": "john smith",
"bday": "1956-12-20",
"father": {
"age": 40
}
},
false
],
[
"$exists - false pass",
{
"pets.dog.name": {
"$exists": false
}
},
{
"hello": "world"
},
true
],
[
"$exists - false fail",
{
"pets.dog.name": {
"$exists": false
}
},
{
"pets": {
"dog": {
"name": "fido"
}
}
},
false
],
[
"$exists - true fail",
{
"pets.dog.name": {
"$exists": true
}
},
{
"hello": "world"
},
false
],
[
"$exists - true pass",
{
"pets.dog.name": {
"$exists": true
}
},
{
"pets": {
"dog": {
"name": "fido"
}
}
},
true
],
[
"equals - multiple datatypes",
{
"str": "str",
"num": 10,
"flag": false
},
{
"str": "str",
"num": 10,
"flag": false
},
true
],
[
"$in - pass",
{
"num": {
"$in": [
1,
2,
3
]
}
},
{
"num": 2
},
true
],
[
"$in - fail",
{
"num": {
"$in": [
1,
2,
3
]
}
},
{
"num": 4
},
false
],
[
"$in - not array",
{
"num": {
"$in": 1
}
},
{
"num": 1
},
false
],
[
"$in - array pass 1",
{
"tags": {
"$in": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"e",
"a"
]
},
true
],
[
"$in - array pass 2",
{
"tags": {
"$in": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"b",
"f"
]
},
true
],
[
"$in - array pass 3",
{
"tags": {
"$in": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"b",
"a"
]
},
true
],
[
"$in - array fail 1",
{
"tags": {
"$in": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"e",
"f"
]
},
false
],
[
"$in - array fail 2",
{
"tags": {
"$in": [
"a",
"b"
]
}
},
{
"tags": []
},
false
],
[
"$nin - pass",
{
"num": {
"$nin": [
1,
2,
3
]
}
},
{
"num": 4
},
true
],
[
"$nin - fail",
{
"num": {
"$nin": [
1,
2,
3
]
}
},
{
"num": 2
},
false
],
[
"$nin - not array",
{
"num": {
"$nin": 1
}
},
{
"num": 1
},
false
],
[
"$nin - array fail 1",
{
"tags": {
"$nin": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"e",
"a"
]
},
false
],
[
"$nin - array fail 2",
{
"tags": {
"$nin": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"b",
"f"
]
},
false
],
[
"$nin - array fail 3",
{
"tags": {
"$nin": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"b",
"a"
]
},
false
],
[
"$nin - array pass 1",
{
"tags": {
"$nin": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"e",
"f"
]
},
true
],
[
"$nin - array pass 2",
{
"tags": {
"$nin": [
"a",
"b"
]
}
},
{
"tags": []
},
true
],
[
"$elemMatch - pass - flat arrays",
{
"nums": {
"$elemMatch": {
"$gt": 10
}
}
},
{
"nums": [
0,
5,
-20,
15
]
},
true
],
[
"$elemMatch - fail - flat arrays",
{
"nums": {
"$elemMatch": {
"$gt": 10
}
}
},
{
"nums": [
0,
5,
-20,
8
]
},
false
],
[
"missing attribute - fail",
{
"pets.dog.name": {
"$in": [
"fido"
]
}
},
{
"hello": "world"
},
false
],
[
"missing attribute with comparison operators",
{
"age": {
"$gt": -10,
"$lt": 10,
"$gte": -9,
"$lte": 9,
"$ne": 10
}
},
{},
true
],
[
"comparing numbers and strings",
{
"n": {
"$gt": 5,
"$lt": 10
}
},
{
"n": "8"
},
true
],
[
"comparing numbers and strings - v2",
{
"n": {
"$gt": "5",
"$lt": "10"
}
},
{
"n": 8
},
true
],
[
"empty $or - pass",
{
"$or": []
},
{
"hello": "world"
},
true
],
[
"empty $and - pass",
{
"$and": []
},
{
"hello": "world"
},
true
],
[
"empty - pass",
{},
{
"hello": "world"
},
true
],
[
"$eq - pass",
{
"occupation": {
"$eq": "engineer"
}
},
{
"occupation": "engineer"
},
true
],
[
"$eq - fail",
{
"occupation": {
"$eq": "engineer"
}
},
{
"occupation": "civil engineer"
},
false
],
[
"$ne - pass",
{
"level": {
"$ne": "senior"
}
},
{
"level": "junior"
},
true
],
[
"$ne - fail",
{
"level": {
"$ne": "senior"
}
},
{
"level": "senior"
},
false
],
[
"$regex - pass",
{
"userAgent": {
"$regex": "(Mobile|Tablet)"
}
},
{
"userAgent": "Android Mobile Browser"
},
true
],
[
"$regex - fail",
{
"userAgent": {
"$regex": "(Mobile|Tablet)"
}
},
{
"userAgent": "Chrome Desktop Browser"
},
false
],
[
"$regexi - pass (case insensitive match)",
{
"userAgent": {
"$regexi": "(mobile|tablet)"
}
},
{
"userAgent": "Android Mobile Browser"
},
true
],
[
"$regexi - pass (uppercase pattern, lowercase value)",
{
"userAgent": {
"$regexi": "(MOBILE|TABLET)"
}
},
{
"userAgent": "android mobile browser"
},
true
],
[
"$regexi - fail",
{
"userAgent": {
"$regexi": "(mobile|tablet)"
}
},
{
"userAgent": "Chrome Desktop Browser"
},
false
],
[
"$notRegex - pass",
{
"userAgent": {
"$notRegex": "(Mobile|Tablet)"
}
},
{
"userAgent": "Chrome Desktop Browser"
},
true
],
[
"$notRegex - fail",
{
"userAgent": {
"$notRegex": "(Mobile|Tablet)"
}
},
{
"userAgent": "Android Mobile Browser"
},
false
],
[
"$notRegexi - pass",
{
"userAgent": {
"$notRegexi": "(mobile|tablet)"
}
},
{
"userAgent": "Chrome Desktop Browser"
},
true
],
[
"$notRegexi - fail",
{
"userAgent": {
"$notRegexi": "(mobile|tablet)"
}
},
{
"userAgent": "Android Mobile Browser"
},
false
],
[
"$ini - pass",
{
"tags": {
"$ini": [
"A",
"B"
]
}
},
{
"tags": "a"
},
true
],
[
"$ini - fail",
{
"tags": {
"$ini": [
"a",
"b"
]
}
},
{
"tags": "c"
},
false
],
[
"$ini - array pass",
{
"tags": {
"$ini": [
"A",
"B"
]
}
},
{
"tags": [
"d",
"a"
]
},
true
],
[
"$nini - pass",
{
"tags": {
"$nini": [
"A",
"B"
]
}
},
{
"tags": "c"
},
true
],
[
"$nini - fail",
{
"tags": {
"$nini": [
"A",
"B"
]
}
},
{
"tags": "a"
},
false
],
[
"$alli - pass",
{
"tags": {
"$alli": [
"A",
"B"
]
}
},
{
"tags": [
"a",
"b",
"c"
]
},
true
],
[
"$alli - fail",
{
"tags": {
"$alli": [
"A",
"B"
]
}
},
{
"tags": [
"a",
"c"
]
},
false
],
[
"$gt/$lt numbers - pass",
{
"age": {
"$gt": 30,
"$lt": 60
}
},
{
"age": 50
},
true
],
[
"$gt/$lt numbers - fail $lt",
{
"age": {
"$gt": 30,
"$lt": 60
}
},
{
"age": 60
},
false
],
[
"$gt/$lt numbers - fail $gt",
{
"age": {
"$gt": 30,
"$lt": 60
}
},
{
"age": 30
},
false
],
[
"$gte/$lte numbers - pass",
{
"age": {
"$gte": 30,
"$lte": 60
}
},
{
"age": 50
},
true
],
[
"$gte/$lte numbers - pass $gte",
{
"age": {
"$gte": 30,
"$lte": 60
}
},
{
"age": 30
},
true
],
[
"$gte/$lte numbers - pass $lte",
{
"age": {
"$gte": 30,
"$lte": 60
}
},
{
"age": 60
},
true
],
[
"$gte/$lte numbers - fail $lte",
{
"age": {
"$gte": 30,
"$lte": 60
}
},
{
"age": 61
},
false
],
[
"$gte/$lte numbers - fail $gte",
{
"age": {
"$gt": 30,
"$lt": 60
}
},
{
"age": 29
},
false
],
[
"$gt/$lt strings - fail $gt",
{
"word": {
"$gt": "alphabet",
"$lt": "zebra"
}
},
{
"word": "alphabet"
},
false
],
[
"$gt/$lt strings - fail $lt",
{
"word": {
"$gt": "alphabet",
"$lt": "zebra"
}
},
{
"word": "zebra"
},
false
],
[
"$gt/$lt strings - pass",
{
"word": {
"$gt": "alphabet",
"$lt": "zebra"
}
},
{
"word": "always"
},
true
],
[
"$gt/$lt strings - fail uppercase",
{
"word": {
"$gt": "alphabet",
"$lt": "zebra"
}
},
{
"word": "AZL"
},
false
],
[
"nested value is null",
{
"address.state": "CA"
},
{
"address": null
},
false
],
[
"nested value is integer",
{
"address.state": "CA"
},
{
"address": 123
},
false
],
[
"$type string - pass",
{
"a": {
"$type": "string"
}
},
{
"a": "a"
},
true
],
[
"$type string - fail",
{
"a": {
"$type": "string"
}
},
{
"a": 1
},
false
],
[
"$type null - pass",
{
"a": {
"$type": "null"
}
},
{
"a": null
},
true
],
[
"$type null - fail",
{
"a": {
"$type": "null"
}
},
{
"a": 1
},
false
],
[
"$type boolean - pass",
{
"a": {
"$type": "boolean"
}
},
{
"a": false
},
true
],
[
"$type boolean - fail",
{
"a": {
"$type": "boolean"
}
},
{
"a": 1
},
false
],
[
"$type number - pass",
{
"a": {
"$type": "number"
}
},
{
"a": 1
},
true
],
[
"$type number - fail",
{
"a": {
"$type": "number"
}
},
{
"a": "a"
},
false
],
[
"$type object - pass",
{
"a": {
"$type": "object"
}
},
{
"a": {
"a": "b"
}
},
true
],
[
"$type object - fail",
{
"a": {
"$type": "object"
}
},
{
"a": 1
},
false
],
[
"$type array - pass",
{
"a": {
"$type": "array"
}
},
{
"a": [
1,
2
]
},
true
],
[
"$type array - fail",
{
"a": {
"$type": "array"
}
},
{
"a": 1
},
false
],
[
"unknown operator - pass",
{
"name": {
"$regx": "hello"
}
},
{
"name": "hello"
},
false
],
[
"$regex invalid - pass",
{
"name": {
"$regex": "/???***[)"
}
},
{
"name": "hello"
},
false
],
[
"$regex invalid - fail",
{
"name": {
"$regex": "/???***[)"
}
},
{
"hello": "hello"
},
false
],
[
"$size empty - pass",
{
"tags": {
"$size": 0
}
},
{
"tags": []
},
true
],
[
"$size empty - fail",
{
"tags": {
"$size": 0
}
},
{
"tags": [
10
]
},
false
],
[
"$size number - pass",
{
"tags": {
"$size": 3
}
},
{
"tags": [
"a",
"b",
"c"
]
},
true
],
[
"$size number - fail small",
{
"tags": {
"$size": 3
}
},
{
"tags": [
"a",
"b"
]
},
false
],
[
"$size number - fail large",
{
"tags": {
"$size": 3
}
},
{
"tags": [
"a",
"b",
"c",
"d"
]
},
false
],
[
"$size number - fail not array",
{
"tags": {
"$size": 3
}
},
{
"tags": "abc"
},
false
],
[
"$size nested - pass",
{
"tags": {
"$size": {
"$gt": 2
}
}
},
{
"tags": [
0,
1,
2
]
},
true
],
[
"$size nested - fail equal",
{
"tags": {
"$size": {
"$gt": 2
}
}
},
{
"tags": [
0,
1
]
},
false
],
[
"$size nested - fail less than",
{
"tags": {
"$size": {
"$gt": 2
}
}
},
{
"tags": [
0
]
},
false
],
[
"$elemMatch contains - pass",
{
"tags": {
"$elemMatch": {
"$eq": "bar"
}
}
},
{
"tags": [
"foo",
"bar",
"baz"
]
},
true
],
[
"$elemMatch contains - false",
{
"tags": {
"$elemMatch": {
"$eq": "bar"
}
}
},
{
"tags": [
"foo",
"baz"
]
},
false
],
[
"$elemMatch intersection - pass",
{
"tags": {
"$elemMatch": {
"$in": [
"a",
"b"
]
}
}
},
{
"tags": [
"d",
"e",
"b"
]
},
true
],
[
"$elemMatch intersection - fail",
{
"tags": {
"$elemMatch": {
"$in": [
"a",
"b"
]
}
}
},
{
"tags": [
"d",
"e",
"f"
]
},
false
],
[
"$elemMatch not contains - pass",
{
"tags": {
"$not": {
"$elemMatch": {
"$eq": "bar"
}
}
}
},
{
"tags": [
"foo",
"baz"
]
},
true
],
[
"$elemMatch not contains - fail",
{
"tags": {
"$not": {
"$elemMatch": {
"$eq": "bar"
}
}
}
},
{
"tags": [
"foo",
"bar",
"baz"
]
},
false
],
[
"$elemMatch nested - pass",
{
"hobbies": {
"$elemMatch": {
"name": {
"$regex": "^ping"
}
}
}
},
{
"hobbies": [
{
"name": "bowling"
},
{
"name": "pingpong"
},
{
"name": "tennis"
}
]
},
true
],
[
"$elemMatch nested - fail",
{
"hobbies": {
"$elemMatch": {
"name": {
"$regex": "^ping"
}
}
}
},
{
"hobbies": [
{
"name": "bowling"
},
{
"name": "tennis"
}
]
},
false
],
[
"$elemMatch nested - fail not array",
{
"hobbies": {
"$elemMatch": {
"name": {
"$regex": "^ping"
}
}
}
},
{
"hobbies": "all"
},
false
],
[
"$not - pass",
{
"name": {
"$not": {
"$regex": "^hello"
}
}
},
{
"name": "world"
},
true
],
[
"$not - fail",
{
"name": {
"$not": {
"$regex": "^hello"
}
}
},
{
"name": "hello world"
},
false
],
[
"$all - pass",
{
"tags": {
"$all": [
"one",
"three"
]
}
},
{
"tags": [
"one",
"two",
"three"
]
},
true
],
[
"$all - fail",
{
"tags": {
"$all": [
"one",
"three"
]
}
},
{
"tags": [
"one",
"two",
"four"
]
},
false
],
[
"$all - fail not array",
{
"tags": {
"$all": [
"one",
"three"
]
}
},
{
"tags": "hello"
},
false
],
[
"$nor - pass",
{
"$nor": [
{
"name": "john"
},
{
"age": {
"$lt": 30
}
}
]
},
{
"name": "jim",
"age": 40
},
true
],
[
"$nor - fail both",
{
"$nor": [
{
"name": "john"
},
{
"age": {
"$lt": 30
}
}
]
},
{
"name": "john",
"age": 20
},
false
],
[
"$nor - fail first",
{
"$nor": [
{
"name": "john"
},
{
"age": {
"$lt": 30
}
}
]
},
{
"name": "john",
"age": 40
},
false
],
[
"$nor - fail second",
{
"$nor": [
{
"name": "john"
},
{
"age": {
"$lt": 30
}
}
]
},
{
"name": "jim",
"age": 20
},
false
],
[
"equals array - pass",
{
"tags": [
"hello",
"world"
]
},
{
"tags": [
"hello",
"world"
]
},
true
],
[
"equals array - fail order",
{
"tags": [
"hello",
"world"
]
},
{
"tags": [
"world",
"hello"
]
},
false
],
[
"equals array - fail missing item",
{
"tags": [
"hello",
"world"
]
},
{
"tags": [
"hello"
]
},
false
],
[
"equals array - fail extra item",
{
"tags": [
"hello",
"world"
]
},
{
"tags": [
"hello",
"world",
"foo"
]
},
false
],
[
"equals array - fail type mismatch",
{
"tags": [
"hello",
"world"
]
},
{
"tags": "hello world"
},
false
],
[
"equals object - pass",
{
"tags": {
"hello": "world"
}
},
{
"tags": {
"hello": "world"
}
},
true
],
[
"equals object - fail extra property",
{
"tags": {
"hello": "world"
}
},
{
"tags": {
"hello": "world",
"yes": "please"
}
},
false
],
[
"equals object - fail missing property",
{
"tags": {
"hello": "world"
}
},
{
"tags": {}
},
false
],
[
"equals object - fail type mismatch",
{
"tags": {
"hello": "world"
}
},
{
"tags": "hello world"
},
false
],
[
"null condition - null attribute",
{
"userId": null
},
{
"userId": null
},
true
],
[
"null condition - missing attribute",
{
"userId": null
},
{},
true
],
[
"null condition - string attribute",
{
"userId": null
},
{
"userId": "123"
},
false
],
[
"null condition - zero attribute",
{
"userId": null
},
{
"userId": 0
},
false
],
[
"null condition - empty string attribute",
{
"userId": null
},
{
"userId": ""
},
false
],
[
"null condition - false attribute",
{
"userId": null
},
{
"userId": false
},
false
],
[
"false condition - missing attribute",
{
"userId": false
},
{},
false
],
[
"false strict condition - missing attribute",
{
"userId": {
"$eq": false
}
},
{},
false
],
[
"$vgt/$vlt - pass - major",
{
"version": {
"$vgt": "9.99.8",
"$vlt": "11.0.1"
}
},
{
"version": "10.12.13"
},
true
],
[
"$vgt/$vlt - pass - minor",
{
"version": {
"$vgt": "10.2.11",
"$vlt": "10.20.11"
}
},
{
"version": "10.12.11"
},
true
],
[
"$vgt/$vlt - pass - patch",
{
"version": {
"$vgt": "10.0.2",
"$vlt": "10.0.20"
}
},
{
"version": "10.0.12"
},
true
],
[
"$vgt/$vlt - fail $vlt - major",
{
"version": {
"$vgt": "30.0.0",
"$vlt": "50.0.0"
}
},
{
"version": "60.0.0"
},
false
],
[
"$vgt/$vlt - fail $vlt - minor",
{
"version": {
"$vgt": "10.30.0",
"$vlt": "10.50.0"
}
},
{
"version": "10.60.0"
},
false
],
[
"$vgt/$vlt - fail $vlt - patch",
{
"version": {
"$vgt": "10.2.30",
"$vlt": "10.2.50"
}
},
{
"version": "10.2.60"
},
false
],
[
"$vgt/$vlt - fail $vgt - major",
{
"version": {
"$vgt": "30.0.16",
"$vlt": "50.0.16"
}
},
{
"version": "20.0.16"
},
false
],
[
"$vgt/$vlt - fail $vgt - minor",
{
"version": {
"$vgt": "10.30.0",
"$vlt": "10.50.0"
}
},
{
"version": "10.20.0"
},
false
],
[
"$vgt/$vlt - fail $vgt - patch",
{
"version": {
"$vgt": "10.30.10",
"$vlt": "10.30.20"
}
},
{
"version": "10.30.2"
},
false
],
[
"$vgte/$vlte - pass $vgte - major",
{
"version": {
"$vgte": "30.1.2",
"$vlte": "60.1.2"
}
},
{
"version": "30.1.2"
},
true
],
[
"$vgte/$vlte - pass $vgte - minor",
{
"version": {
"$vgte": "5.30.2",
"$vlte": "5.60.2"
}
},
{
"version": "5.30.2"
},
true
],
[
"$vgte/$vlte - pass $vgte - patch",
{
"version": {
"$vgte": "5.10.30",
"$vlte": "5.10.60"
}
},
{
"version": "5.10.30"
},
true
],
[
"$vgte/$vlte - pass $vlte - major",
{
"version": {
"$vgte": "30.1.2",
"$vlte": "60.1.2"
}
},
{
"version": "60.1.2"
},
true
],
[
"$vgte/$vlte - pass $vlte - minor",
{
"version": {
"$vgte": "1.30.2",
"$vlte": "1.60.2"
}
},
{
"version": "1.60.2"
},
true
],
[
"$vgte/$vlte - pass $vlte - patch",
{
"version": {
"$vgte": "1.2.30",
"$vlte": "1.2.60"
}
},
{
"version": "1.2.60"
},
true
],
[
"$vgte/$vlte - fail $vlte - major",
{
"version": {
"$vgte": "30.1.2",
"$vlte": "60.1.2"
}
},
{
"version": "61.1.2"
},
false
],
[
"$vgte/$vlte - fail $vgt - minor",
{
"version": {
"$vgte": "30.1.2",
"$vlte": "60.1.2"
}
},
{
"version": "29.1.2"
},
false
],
[
"$vgte/$vlte - fail $vgt - patch",
{
"version": {
"$vgte": "1.2.30",
"$vlte": "1.2.60"
}
},
{
"version": "1.2.29"
},
false
],
[
"$vgt/$vlt prerelease - fail $vgt",
{
"v": {
"$vgt": "1.0.0-alpha",
"$vlt": "1.0.0-beta"
}
},
{
"v": "1.0.0-alpha"
},
false
],
[
"$vgt/$vlt prerelease w/ multiple fields - fail $vgt",
{
"v": {
"$vgt": "1.0.0-alpha.2",
"$vlt": "1.0.0-beta.1"
}
},
{
"v": "1.0.0-alpha.1"
},
false
],
[
"$vgt/$vlt prerelease - fail $vlt",
{
"v": {
"$vgt": "1.0.0-alpha",
"$vlt": "1.0.0-beta"
}
},
{
"v": "1.0.0-beta"
},
false
],
[
"$vgt/$vlt prerelease - pass",
{
"v": {
"$vgt": "1.0.0-alpha",
"$vlt": "1.0.0-beta"
}
},
{
"v": "1.0.0-alpha.10"
},
true
],
[
"$vgt/$vlt prerelease - fail uppercase",
{
"v": {
"$vgt": "1.0.0-alpha",
"$vlt": "1.0.0-beta"
}
},
{
"v": "1.0.0-ALPHA"
},
false
],
[
"$veq - pass",
{
"v": {
"$veq": "1.2.3"
}
},
{
"v": "1.2.3"
},
true
],
[
"$veq - pass (with build)",
{
"v": {
"$veq": "1.2.3"
}
},
{
"v": "1.2.3+build.abc.123"
},
true
],
[
"$vne - pass",
{
"v": {
"$vne": "1.2.3"
}
},
{
"v": "2.2.3"
},
true
],
[
"$vne - pass (prerelease)",
{
"v": {
"$vne": "1.2.3"
}
},
{
"v": "1.2.3-alpha"
},
true
],
[
"version 0.9.99 < 1.0.0",
{
"version": {
"$vlt": "1.0.0"
}
},
{
"version": "0.9.99"
},
true
],
[
"version 0.9.0 < 0.10.0",
{
"version": {
"$vlt": "0.10.0"
}
},
{
"version": "0.9.0"
},
true
],
[
"version 1.0.0-0.0 < 1.0.0-0.0.0",
{
"version": {
"$vlt": "1.0.0-0.0.0"
}
},
{
"version": "1.0.0-0.0"
},
true
],
[
"version 1.0.0-9999 < 1.0.0--",
{
"version": {
"$vlt": "1.0.0--"
}
},
{
"version": "1.0.0-9999"
},
true
],
[
"version 1.0.0-99 < 1.0.0-100",
{
"version": {
"$vlt": "1.0.0-100"
}
},
{
"version": "1.0.0-99"
},
true
],
[
"version 1.0.0-alpha < 1.0.0-alpha.1",
{
"version": {
"$vlt": "1.0.0-alpha.1"
}
},
{
"version": "1.0.0-alpha"
},
true
],
[
"version 1.0.0-alpha.1 < 1.0.0-alpha.beta",
{
"version": {
"$vlt": "1.0.0-alpha.beta"
}
},
{
"version": "1.0.0-alpha.1"
},
true
],
[
"version 1.0.0-alpha.beta < 1.0.0-beta",
{
"version": {
"$vlt": "1.0.0-beta"
}
},
{
"version": "1.0.0-alpha.beta"
},
true
],
[
"version 1.0.0-beta < 1.0.0-beta.2",
{
"version": {
"$vlt": "1.0.0-beta.2"
}
},
{
"version": "1.0.0-beta"
},
true
],
[
"version 1.0.0-beta.2 < 1.0.0-beta.11",
{
"version": {
"$vlt": "1.0.0-beta.11"
}
},
{
"version": "1.0.0-beta.2"
},
true
],
[
"version 1.0.0-beta.11 < 1.0.0-rc.1",
{
"version": {
"$vlt": "1.0.0-rc.1"
}
},
{
"version": "1.0.0-beta.11"
},
true
],
[
"version 1.0.0-rc.1 < 1.0.0",
{
"version": {
"$vlt": "1.0.0"
}
},
{
"version": "1.0.0-rc.1"
},
true
],
[
"version 1.0.0-0 < 1.0.0--1",
{
"version": {
"$vlt": "1.0.0--1"
}
},
{
"version": "1.0.0-0"
},
true
],
[
"version 1.0.0-0 < 1.0.0-1",
{
"version": {
"$vlt": "1.0.0-1"
}
},
{
"version": "1.0.0-0"
},
true
],
[
"version 1.0.0-1.0 < 1.0.0-1.-1",
{
"version": {
"$vlt": "1.0.0-1.-1"
}
},
{
"version": "1.0.0-1.0"
},
true
],
[
"version 1.2.3-a.b.c < 1.2.3-a.b.c.d",
{
"version": {
"$vlt": "1.2.3-a.b.c.d"
}
},
{
"version": "1.2.3-a.b.c"
},
true
],
[
"version 0.0.0 > 0.0.0-foo",
{
"version": {
"$vgt": "0.0.0-foo"
}
},
{
"version": "0.0.0"
},
true
],
[
"version 0.0.1 > 0.0.0",
{
"version": {
"$vgt": "0.0.0"
}
},
{
"version": "0.0.1"
},
true
],
[
"version 1.0.0 > 0.9.9",
{
"version": {
"$vgt": "0.9.9"
}
},
{
"version": "1.0.0"
},
true
],
[
"version 0.10.0 > 0.9.0",
{
"version": {
"$vgt": "0.9.0"
}
},
{
"version": "0.10.0"
},
true
],
[
"version 0.99.0 > 0.10.0",
{
"version": {
"$vgt": "0.10.0"
}
},
{
"version": "0.99.0"
},
true
],
[
"version 2.0.0 > 1.2.3",
{
"version": {
"$vgt": "1.2.3"
}
},
{
"version": "2.0.0"
},
true
],
[
"version v0.0.0 > 0.0.0-foo",
{
"version": {
"$vgt": "0.0.0-foo"
}
},
{
"version": "v0.0.0"
},
true
],
[
"version v0.0.1 > 0.0.0",
{
"version": {
"$vgt": "0.0.0"
}
},
{
"version": "v0.0.1"
},
true
],
[
"version v1.0.0 > 0.9.9",
{
"version": {
"$vgt": "0.9.9"
}
},
{
"version": "v1.0.0"
},
true
],
[
"version v0.10.0 > 0.9.0",
{
"version": {
"$vgt": "0.9.0"
}
},
{
"version": "v0.10.0"
},
true
],
[
"version v0.99.0 > 0.10.0",
{
"version": {
"$vgt": "0.10.0"
}
},
{
"version": "v0.99.0"
},
true
],
[
"version v2.0.0 > 1.2.3",
{
"version": {
"$vgt": "1.2.3"
}
},
{
"version": "v2.0.0"
},
true
],
[
"version 0.0.0 > v0.0.0-foo",
{
"version": {
"$vgt": "v0.0.0-foo"
}
},
{
"version": "0.0.0"
},
true
],
[
"version 0.0.1 > v0.0.0",
{
"version": {
"$vgt": "v0.0.0"
}
},
{
"version": "0.0.1"
},
true
],
[
"version 1.0.0 > v0.9.9",
{
"version": {
"$vgt": "v0.9.9"
}
},
{
"version": "1.0.0"
},
true
],
[
"version 0.10.0 > v0.9.0",
{
"version": {
"$vgt": "v0.9.0"
}
},
{
"version": "0.10.0"
},
true
],
[
"version 0.99.0 > v0.10.0",
{
"version": {
"$vgt": "v0.10.0"
}
},
{
"version": "0.99.0"
},
true
],
[
"version 2.0.0 > v1.2.3",
{
"version": {
"$vgt": "v1.2.3"
}
},
{
"version": "2.0.0"
},
true
],
[
"version 1.2.3 > 1.2.3-asdf",
{
"version": {
"$vgt": "1.2.3-asdf"
}
},
{
"version": "1.2.3"
},
true
],
[
"version 1.2.3 > 1.2.3-4",
{
"version": {
"$vgt": "1.2.3-4"
}
},
{
"version": "1.2.3"
},
true
],
[
"version 1.2.3 > 1.2.3-4-foo",
{
"version": {
"$vgt": "1.2.3-4-foo"
}
},
{
"version": "1.2.3"
},
true
],
[
"version 1.2.3-5-foo > 1.2.3-5",
{
"version": {
"$vgt": "1.2.3-5"
}
},
{
"version": "1.2.3-5-foo"
},
true
],
[
"version 1.2.3-5 > 1.2.3-4",
{
"version": {
"$vgt": "1.2.3-4"
}
},
{
"version": "1.2.3-5"
},
true
],
[
"version 1.2.3-5-foo > 1.2.3-5-Foo",
{
"version": {
"$vgt": "1.2.3-5-Foo"
}
},
{
"version": "1.2.3-5-foo"
},
true
],
[
"version 3.0.0 > 2.7.2+asdf",
{
"version": {
"$vgt": "2.7.2+asdf"
}
},
{
"version": "3.0.0"
},
true
],
[
"version 1.2.3-a.10 > 1.2.3-a.5",
{
"version": {
"$vgt": "1.2.3-a.5"
}
},
{
"version": "1.2.3-a.10"
},
true
],
[
"version 1.2.3-a.b > 1.2.3-a.5",
{
"version": {
"$vgt": "1.2.3-a.5"
}
},
{
"version": "1.2.3-a.b"
},
true
],
[
"version 1.2.3-a.b > 1.2.3-a",
{
"version": {
"$vgt": "1.2.3-a"
}
},
{
"version": "1.2.3-a.b"
},
true
],
[
"version 1.2.3-a.b.c.10.d.5 > 1.2.3-a.b.c.5.d.100",
{
"version": {
"$vgt": "1.2.3-a.b.c.5.d.100"
}
},
{
"version": "1.2.3-a.b.c.10.d.5"
},
true
],
[
"version 1.2.3-r2 > 1.2.3-r100",
{
"version": {
"$vgt": "1.2.3-r100"
}
},
{
"version": "1.2.3-r2"
},
true
],
[
"version 1.2.3-r100 > 1.2.3-R2",
{
"version": {
"$vgt": "1.2.3-R2"
}
},
{
"version": "1.2.3-r100"
},
true
],
[
"version a.b.c.d.e.f > 1.2.3",
{
"version": {
"$vgt": "1.2.3"
}
},
{
"version": "a.b.c.d.e.f"
},
true
],
[
"version 10.0.0 > 9.0.0",
{
"version": {
"$vgt": "9.0.0"
}
},
{
"version": "10.0.0"
},
true
],
[
"version 10000.0.0 > 9999.0.0",
{
"version": {
"$vgt": "9999.0.0"
}
},
{
"version": "10000.0.0"
},
true
],
[
"version 1.2.3 == 1.2.3",
{
"version": {
"$veq": "1.2.3"
}
},
{
"version": "1.2.3"
},
true
],
[
"version 1.2.3 == v1.2.3",
{
"version": {
"$veq": "v1.2.3"
}
},
{
"version": "1.2.3"
},
true
],
[
"version 1.2.3-0 == v1.2.3-0",
{
"version": {
"$veq": "v1.2.3-0"
}
},
{
"version": "1.2.3-0"
},
true
],
[
"version 1.2.3-1 == 1.2.3-1",
{
"version": {
"$veq": "1.2.3-1"
}
},
{
"version": "1.2.3-1"
},
true
],
[
"version 1.2.3-1 == v1.2.3-1",
{
"version": {
"$veq": "v1.2.3-1"
}
},
{
"version": "1.2.3-1"
},
true
],
[
"version 1.2.3-beta == 1.2.3-beta",
{
"version": {
"$veq": "1.2.3-beta"
}
},
{
"version": "1.2.3-beta"
},
true
],
[
"version 1.2.3-beta == v1.2.3-beta",
{
"version": {
"$veq": "v1.2.3-beta"
}
},
{
"version": "1.2.3-beta"
},
true
],
[
"version 1.2.3-beta+build == 1.2.3-beta+otherbuild",
{
"version": {
"$veq": "1.2.3-beta+otherbuild"
}
},
{
"version": "1.2.3-beta+build"
},
true
],
[
"version 1.2.3-beta+build == v1.2.3-beta+otherbuild",
{
"version": {
"$veq": "v1.2.3-beta+otherbuild"
}
},
{
"version": "1.2.3-beta+build"
},
true
],
[
"version 1-2-3 == 1.2.3",
{
"version": {
"$veq": "1.2.3"
}
},
{
"version": "1-2-3"
},
true
],
[
"version 1-2-3 == 1-2.3+build99",
{
"version": {
"$veq": "1-2.3+build99"
}
},
{
"version": "1-2-3"
},
true
],
[
"version 1-2-3 == v1.2.3",
{
"version": {
"$veq": "v1.2.3"
}
},
{
"version": "1-2-3"
},
true
],
[
"version 1.2.3.4 == 1.2.3-4",
{
"version": {
"$veq": "1.2.3-4"
}
},
{
"version": "1.2.3.4"
},
true
],
[
"$or pass but second condition fail",
{
"$or": [
{
"foo": 1
},
{
"bar": 1
}
],
"baz": 2
},
{
"foo": 1,
"bar": 2,
"baz": 1
},
false
],
[
"$or and second condition both pass",
{
"$or": [
{
"foo": 1
},
{
"bar": 1
}
],
"baz": 2
},
{
"foo": 1,
"bar": 2,
"baz": 2
},
true
],
[
"$and condition pass but $or fail",
{
"$and": [
{
"foo": 1
},
{
"bar": 1
}
],
"$or": [
{
"baz": 1
},
{
"empty": 1
}
]
},
{
"foo": 1,
"bar": 1,
"baz": 2
},
false
],
[
"$and and $or both pass",
{
"$and": [
{
"foo": 1
},
{
"bar": 1
}
],
"$or": [
{
"baz": 1
},
{
"empty": 1
}
]
},
{
"foo": 1,
"bar": 1,
"baz": 2,
"empty": 1
},
true
],
[
"$inGroup passes for member of known group id",
{
"id": {
"$inGroup": "group_id"
}
},
{
"id": 1
},
true,
{
"group_id": [
1,
2,
3
]
}
],
[
"$inGroup fails for non-member of known group id",
{
"id": {
"$inGroup": "group_id"
}
},
{
"id": 5
},
false,
{
"group_id": [
1,
2,
3
]
}
],
[
"$inGroup fails for unknown group id",
{
"id": {
"$inGroup": "unknowngroup_id"
}
},
{
"id": 1
},
false,
{
"group_id": [
1,
2,
3
]
}
],
[
"$notInGroup fails for member of known group id",
{
"id": {
"$notInGroup": "group_id"
}
},
{
"id": 1
},
false,
{
"group_id": [
1,
2,
3
]
}
],
[
"$notInGroup passes for non-member of known group id",
{
"id": {
"$notInGroup": "group_id"
}
},
{
"id": 5
},
true,
{
"group_id": [
1,
2,
3
]
}
],
[
"$notInGroup passes for unknown group id",
{
"id": {
"$notInGroup": "unknowngroup_id"
}
},
{
"id": 1
},
true,
{
"group_id": [
1,
2,
3
]
}
],
[
"$inGroup passes for properly typed data",
{
"id": {
"$inGroup": "group_id"
}
},
{
"id": "2"
},
true,
{
"group_id": [
1,
"2",
3
]
}
],
[
"$inGroup fails for improperly typed data",
{
"id": {
"$inGroup": "group_id"
}
},
{
"id": "3"
},
false,
{
"group_id": [
1,
"2",
3
]
}
],
[
"$in - fail (case sensitive mismatch)",
{
"country": {
"$in": [
"us",
"uk"
]
}
},
{
"country": "US"
},
false
],
[
"$nin - pass (case sensitive mismatch)",
{
"country": {
"$nin": [
"us",
"uk"
]
}
},
{
"country": "US"
},
true
],
[
"$ini - pass (case insensitive match)",
{
"country": {
"$ini": [
"us",
"uk"
]
}
},
{
"country": "US"
},
true
],
[
"$ini - pass (uppercase pattern, lowercase value)",
{
"country": {
"$ini": [
"US",
"UK"
]
}
},
{
"country": "us"
},
true
],
[
"$ini - pass (mixed case)",
{
"country": {
"$ini": [
"Us",
"Uk"
]
}
},
{
"country": "US"
},
true
],
[
"$ini - fail (no match)",
{
"country": {
"$ini": [
"us",
"uk"
]
}
},
{
"country": "CA"
},
false
],
[
"$ini - array pass 1",
{
"tags": {
"$ini": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"e",
"A"
]
},
true
],
[
"$ini - array pass 2",
{
"tags": {
"$ini": [
"A",
"B"
]
}
},
{
"tags": [
"d",
"b",
"f"
]
},
true
],
[
"$ini - array fail",
{
"tags": {
"$ini": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"e",
"f"
]
},
false
],
[
"$ini - not array",
{
"num": {
"$ini": 1
}
},
{
"num": 1
},
false
],
[
"$nini - pass (case insensitive match)",
{
"country": {
"$nini": [
"us",
"uk"
]
}
},
{
"country": "CA"
},
true
],
[
"$nini - fail (case insensitive match)",
{
"country": {
"$nini": [
"us",
"uk"
]
}
},
{
"country": "US"
},
false
],
[
"$nini - fail (uppercase pattern, lowercase value)",
{
"country": {
"$nini": [
"US",
"UK"
]
}
},
{
"country": "us"
},
false
],
[
"$nini - array pass",
{
"tags": {
"$nini": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"e",
"f"
]
},
true
],
[
"$nini - array fail 1",
{
"tags": {
"$nini": [
"a",
"b"
]
}
},
{
"tags": [
"d",
"e",
"A"
]
},
false
],
[
"$nini - array fail 2",
{
"tags": {
"$nini": [
"A",
"B"
]
}
},
{
"tags": [
"d",
"b",
"f"
]
},
false
],
[
"$nini - not array",
{
"num": {
"$nini": 1
}
},
{
"num": 1
},
false
],
[
"$regex - fail (case sensitive mismatch)",
{
"userAgent": {
"$regex": "(mobile|tablet)"
}
},
{
"userAgent": "Android Mobile Browser"
},
false
],
[
"$all - fail (case sensitive mismatch)",
{
"tags": {
"$all": [
"one",
"three"
]
}
},
{
"tags": [
"ONE",
"two",
"THREE"
]
},
false
],
[
"$alli - pass (case insensitive match)",
{
"tags": {
"$alli": [
"one",
"three"
]
}
},
{
"tags": [
"ONE",
"two",
"THREE"
]
},
true
],
[
"$alli - pass (uppercase pattern, lowercase value)",
{
"tags": {
"$alli": [
"ONE",
"THREE"
]
}
},
{
"tags": [
"one",
"two",
"three"
]
},
true
],
[
"$alli - pass (mixed case)",
{
"tags": {
"$alli": [
"One",
"Three"
]
}
},
{
"tags": [
"ONE",
"two",
"three"
]
},
true
],
[
"$alli - fail (case insensitive, missing value)",
{
"tags": {
"$alli": [
"one",
"three"
]
}
},
{
"tags": [
"ONE",
"two",
"four"
]
},
false
],
[
"$alli - fail not array",
{
"tags": {
"$alli": [
"one",
"three"
]
}
},
{
"tags": "hello"
},
false
]
],
"hash": [
[
"",
"a",
1,
0.22
],
[
"",
"b",
1,
0.077
],
[
"b",
"a",
1,
0.946
],
[
"ef",
"d",
1,
0.652
],
[
"asdf",
"8952klfjas09ujk",
1,
0.549
],
[
"",
"123",
1,
0.011
],
[
"",
"___)((*\":&",
1,
0.563
],
[
"seed",
"a",
2,
0.0505
],
[
"seed",
"b",
2,
0.2696
],
[
"foo",
"ab",
2,
0.2575
],
[
"foo",
"def",
2,
0.2019
],
[
"89123klj",
"8952klfjas09ujkasdf",
2,
0.124
],
[
"90850943850283058242805",
"123",
2,
0.7516
],
[
"()**(%$##$%#$#",
"___)((*\":&",
2,
0.0128
],
[
"abc",
"def",
99,
null
]
],
"getBucketRange": [
[
"normal 50/50",
[
2,
1,
null
],
[
[
0,
0.5
],
[
0.5,
1
]
]
],
[
"reduced coverage",
[
2,
0.5,
null
],
[
[
0,
0.25
],
[
0.5,
0.75
]
]
],
[
"zero coverage",
[
2,
0,
null
],
[
[
0,
0
],
[
0.5,
0.5
]
]
],
[
"4 variations",
[
4,
1,
null
],
[
[
0,
0.25
],
[
0.25,
0.5
],
[
0.5,
0.75
],
[
0.75,
1
]
]
],
[
"uneven weights",
[
2,
1,
[
0.4,
0.6
]
],
[
[
0,
0.4
],
[
0.4,
1
]
]
],
[
"uneven weights, 3 variations",
[
3,
1,
[
0.2,
0.3,
0.5
]
],
[
[
0,
0.2
],
[
0.2,
0.5
],
[
0.5,
1
]
]
],
[
"uneven weights, reduced coverage, 3 variations",
[
3,
0.2,
[
0.2,
0.3,
0.5
]
],
[
[
0,
0.04
],
[
0.2,
0.26
],
[
0.5,
0.6
]
]
],
[
"negative coverage",
[
2,
-0.2,
null
],
[
[
0,
0
],
[
0.5,
0.5
]
]
],
[
"coverage above 1",
[
2,
1.5,
null
],
[
[
0,
0.5
],
[
0.5,
1
]
]
],
[
"weights sum below 1",
[
2,
1,
[
0.4,
0.1
]
],
[
[
0,
0.5
],
[
0.5,
1
]
]
],
[
"weights sum above 1",
[
2,
1,
[
0.7,
0.6
]
],
[
[
0,
0.5
],
[
0.5,
1
]
]
],
[
"weights.length not equal to num variations",
[
4,
1,
[
0.4,
0.4,
0.2
]
],
[
[
0,
0.25
],
[
0.25,
0.5
],
[
0.5,
0.75
],
[
0.75,
1
]
]
],
[
"weights sum almost equals 1",
[
2,
1,
[
0.4,
0.5999
]
],
[
[
0,
0.4
],
[
0.4,
0.9999
]
]
]
],
"feature": [
[
"unknown feature key",
{},
"my-feature",
{
"value": null,
"on": false,
"off": true,
"source": "unknownFeature",
"ruleId": ""
}
],
[
"defaults when empty",
{
"features": {
"feature": {}
}
},
"feature",
{
"value": null,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"uses defaultValue - number",
{
"features": {
"feature": {
"defaultValue": 1
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"uses custom values - string",
{
"features": {
"feature": {
"defaultValue": "yes"
}
}
},
"feature",
{
"value": "yes",
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules",
{
"features": {
"feature": {
"defaultValue": 2,
"rules": [
{
"force": 1
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rule with rule id",
{
"features": {
"feature": {
"defaultValue": 2,
"rules": [
{
"id": "a",
"force": 1
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": "a"
}
],
[
"force rules - force false",
{
"features": {
"feature": {
"defaultValue": true,
"rules": [
{
"force": false
}
]
}
}
},
"feature",
{
"value": false,
"on": false,
"off": true,
"source": "force",
"ruleId": ""
}
],
[
"force rules - coverage included",
{
"attributes": {
"id": "3"
},
"features": {
"feature": {
"defaultValue": 2,
"rules": [
{
"force": 1,
"coverage": 0.5
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rule - coverage with integer hash attribute",
{
"attributes": {
"id": 3
},
"features": {
"feature": {
"defaultValue": 2,
"rules": [
{
"force": 1,
"coverage": 0.5
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rules - coverage excluded",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 2,
"rules": [
{
"id": "a",
"force": 1,
"coverage": 0.5
}
]
}
}
},
"feature",
{
"value": 2,
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - coverage missing hashAttribute",
{
"attributes": {},
"features": {
"feature": {
"defaultValue": 2,
"rules": [
{
"force": 1,
"coverage": 0.5
}
]
}
}
},
"feature",
{
"value": 2,
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - coverage 0",
{
"attributes": {
"id": "d0bc0a5a"
},
"features": {
"8d156": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0,
"hashVersion": 2
}
]
}
}
},
"8d156",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - condition pass",
{
"attributes": {
"country": "US",
"browser": "firefox"
},
"features": {
"feature": {
"defaultValue": 2,
"rules": [
{
"force": 1,
"condition": {
"country": {
"$in": [
"US",
"CA"
]
},
"browser": "firefox"
}
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rules - condition fail",
{
"attributes": {
"country": "US",
"browser": "chrome"
},
"features": {
"feature": {
"defaultValue": 2,
"rules": [
{
"force": 1,
"condition": {
"country": {
"$in": [
"US",
"CA"
]
},
"browser": "firefox"
}
}
]
}
}
},
"feature",
{
"value": 2,
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - coverage with bad hash version",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 2,
"rules": [
{
"force": 1,
"coverage": 1.0,
"hashVersion": 99
}
]
}
}
},
"feature",
{
"value": 2,
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"ignores empty rules",
{
"features": {
"feature": {
"rules": [
{}
]
}
}
},
"feature",
{
"value": null,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"empty experiment rule - c",
{
"attributes": {
"id": "123"
},
"features": {
"feature": {
"rules": [
{
"variations": [
"a",
"b",
"c"
]
}
]
}
}
},
"feature",
{
"value": "c",
"on": true,
"off": false,
"experiment": {
"key": "feature",
"variations": [
"a",
"b",
"c"
]
},
"experimentResult": {
"featureId": "feature",
"value": "c",
"variationId": 2,
"inExperiment": true,
"hashUsed": true,
"hashAttribute": "id",
"hashValue": "123",
"bucket": 0.863,
"key": "2",
"stickyBucketUsed": false
},
"source": "experiment",
"ruleId": ""
}
],
[
"empty experiment rule - a",
{
"attributes": {
"id": "456"
},
"features": {
"feature": {
"rules": [
{
"id": "id",
"variations": [
"a",
"b",
"c"
]
}
]
}
}
},
"feature",
{
"value": "a",
"on": true,
"off": false,
"experiment": {
"key": "feature",
"variations": [
"a",
"b",
"c"
]
},
"experimentResult": {
"featureId": "feature",
"value": "a",
"variationId": 0,
"inExperiment": true,
"hashUsed": true,
"hashAttribute": "id",
"hashValue": "456",
"bucket": 0.178,
"key": "0",
"stickyBucketUsed": false
},
"source": "experiment",
"ruleId": "id"
}
],
[
"empty experiment rule - b",
{
"attributes": {
"id": "fds"
},
"features": {
"feature": {
"rules": [
{
"variations": [
"a",
"b",
"c"
]
}
]
}
}
},
"feature",
{
"value": "b",
"on": true,
"off": false,
"experiment": {
"key": "feature",
"variations": [
"a",
"b",
"c"
]
},
"experimentResult": {
"featureId": "feature",
"value": "b",
"variationId": 1,
"inExperiment": true,
"hashUsed": true,
"hashAttribute": "id",
"hashValue": "fds",
"bucket": 0.514,
"key": "1",
"stickyBucketUsed": false
},
"source": "experiment",
"ruleId": ""
}
],
[
"creates experiments properly",
{
"attributes": {
"anonId": "123",
"premium": true
},
"features": {
"feature": {
"rules": [
{
"coverage": 0.99,
"hashAttribute": "anonId",
"seed": "feature",
"hashVersion": 2,
"name": "Test",
"phase": "1",
"ranges": [
[
0,
0.1
],
[
0.1,
1.0
]
],
"meta": [
{
"key": "v0",
"name": "variation 0"
},
{
"key": "v1",
"name": "variation 1"
}
],
"filters": [
{
"attribute": "anonId",
"seed": "pricing",
"ranges": [
[
0,
1
]
]
}
],
"namespace": [
"pricing",
0,
1
],
"key": "hello",
"variations": [
true,
false
],
"weights": [
0.1,
0.9
],
"condition": {
"premium": true
},
"foo": "bar"
}
]
}
}
},
"feature",
{
"value": false,
"on": false,
"off": true,
"source": "experiment",
"experiment": {
"coverage": 0.99,
"ranges": [
[
0,
0.1
],
[
0.1,
1.0
]
],
"meta": [
{
"key": "v0",
"name": "variation 0"
},
{
"key": "v1",
"name": "variation 1"
}
],
"filters": [
{
"attribute": "anonId",
"seed": "pricing",
"ranges": [
[
0,
1
]
]
}
],
"name": "Test",
"phase": "1",
"seed": "feature",
"hashVersion": 2,
"hashAttribute": "anonId",
"namespace": [
"pricing",
0,
1
],
"key": "hello",
"variations": [
true,
false
],
"weights": [
0.1,
0.9
],
"condition": {
"premium": true
}
},
"experimentResult": {
"featureId": "feature",
"value": false,
"variationId": 1,
"inExperiment": true,
"hashUsed": true,
"hashAttribute": "anonId",
"hashValue": "123",
"bucket": 0.5231,
"key": "v1",
"name": "variation 1",
"stickyBucketUsed": false
},
"ruleId": ""
}
],
[
"rule orders - skip 1",
{
"attributes": {
"browser": "firefox"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"condition": {
"browser": "chrome"
}
},
{
"force": 2,
"condition": {
"browser": "firefox"
}
},
{
"force": 3,
"condition": {
"browser": "safari"
}
}
]
}
}
},
"feature",
{
"value": 2,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"rule orders - skip 1,2",
{
"attributes": {
"browser": "safari"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"id": "1",
"condition": {
"browser": "chrome"
}
},
{
"id": "2",
"force": 2,
"condition": {
"browser": "firefox"
}
},
{
"id": "3",
"force": 3,
"condition": {
"browser": "safari"
}
}
]
}
}
},
"feature",
{
"value": 3,
"on": true,
"off": false,
"source": "force",
"ruleId": "3"
}
],
[
"rule orders - skip all",
{
"attributes": {
"browser": "ie"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"condition": {
"browser": "chrome"
}
},
{
"force": 2,
"condition": {
"browser": "firefox"
}
},
{
"force": 3,
"condition": {
"browser": "safari"
}
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"skips experiment on coverage",
{
"attributes": {
"id": "123"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"variations": [
0,
1,
2,
3
],
"coverage": 0.01
},
{
"force": 3
}
]
}
}
},
"feature",
{
"value": 3,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"skips experiment on namespace",
{
"attributes": {
"id": "123"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"variations": [
0,
1,
2,
3
],
"namespace": [
"pricing",
0,
0.01
]
},
{
"force": 3
}
]
}
}
},
"feature",
{
"value": 3,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"handles integer hashAttribute",
{
"attributes": {
"id": 123
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"variations": [
0,
1
]
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "experiment",
"experiment": {
"key": "feature",
"variations": [
0,
1
]
},
"experimentResult": {
"featureId": "feature",
"hashAttribute": "id",
"hashValue": 123,
"hashUsed": true,
"inExperiment": true,
"value": 1,
"variationId": 1,
"key": "1",
"bucket": 0.863,
"stickyBucketUsed": false
},
"ruleId": ""
}
],
[
"skip experiment on missing hashAttribute",
{
"attributes": {
"id": "123"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"variations": [
0,
1,
2,
3
],
"hashAttribute": "company"
},
{
"force": 3
}
]
}
}
},
"feature",
{
"value": 3,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"include experiments when forced",
{
"attributes": {
"id": "123"
},
"forcedVariations": {
"feature": 1
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"variations": [
0,
1,
2,
3
]
},
{
"force": 3
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "experiment",
"experiment": {
"key": "feature",
"variations": [
0,
1,
2,
3
]
},
"experimentResult": {
"featureId": "feature",
"value": 1,
"variationId": 1,
"inExperiment": true,
"hashUsed": false,
"hashAttribute": "id",
"hashValue": "123",
"key": "1",
"stickyBucketUsed": false
},
"ruleId": ""
}
],
[
"Force rule with range, ignores coverage",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 2,
"coverage": 0.01,
"range": [
0,
0.99
]
}
]
}
}
},
"feature",
{
"value": 2,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"Force rule, hash version 2",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 2,
"hashVersion": 2,
"range": [
0.96,
0.97
]
}
]
}
}
},
"feature",
{
"value": 2,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"Force rule, skip due to range",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 2,
"range": [
0,
0.01
]
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"Force rule, skip due to filter",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 2,
"filters": [
{
"seed": "seed",
"ranges": [
[
0,
0.01
]
]
}
]
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"Force rule, use seed with range",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 2,
"range": [
0,
0.5
],
"seed": "fjdslafdsa",
"hashVersion": 2
}
]
}
}
},
"feature",
{
"value": 2,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"Support passthrough variations",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"key": "holdout",
"variations": [
1,
2
],
"hashVersion": 2,
"ranges": [
[
0,
0.01
],
[
0.01,
1.0
]
],
"meta": [
{},
{
"passthrough": true
}
]
},
{
"key": "experiment",
"variations": [
3,
4
],
"hashVersion": 2,
"ranges": [
[
0,
0.5
],
[
0.5,
1.0
]
]
}
]
}
}
},
"feature",
{
"value": 3,
"on": true,
"off": false,
"source": "experiment",
"experiment": {
"key": "experiment",
"hashVersion": 2,
"variations": [
3,
4
],
"ranges": [
[
0,
0.5
],
[
0.5,
1.0
]
]
},
"experimentResult": {
"featureId": "feature",
"hashAttribute": "id",
"hashUsed": true,
"hashValue": "1",
"inExperiment": true,
"key": "0",
"value": 3,
"variationId": 0,
"bucket": 0.4413,
"stickyBucketUsed": false
},
"ruleId": ""
}
],
[
"Support holdout groups",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"key": "holdout",
"hashVersion": 2,
"variations": [
1,
2
],
"ranges": [
[
0,
0.99
],
[
0.99,
1.0
]
],
"meta": [
{},
{
"passthrough": true
}
]
},
{
"key": "experiment",
"hashVersion": 2,
"variations": [
3,
4
],
"ranges": [
[
0,
0.5
],
[
0.5,
1.0
]
]
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "experiment",
"experiment": {
"hashVersion": 2,
"ranges": [
[
0,
0.99
],
[
0.99,
1.0
]
],
"meta": [
{},
{
"passthrough": true
}
],
"key": "holdout",
"variations": [
1,
2
]
},
"experimentResult": {
"featureId": "feature",
"hashAttribute": "id",
"hashUsed": true,
"hashValue": "1",
"inExperiment": true,
"key": "0",
"value": 1,
"variationId": 0,
"bucket": 0.8043,
"stickyBucketUsed": false
},
"ruleId": ""
}
],
[
"Prerequisite flag off, block dependent flag",
{
"attributes": {
"id": "123",
"memberType": "basic",
"country": "Canada"
},
"features": {
"parentFlag": {
"defaultValue": "silver",
"rules": [
{
"condition": {
"country": "Canada"
},
"force": "red"
},
{
"condition": {
"country": {
"$in": [
"USA",
"Mexico"
]
}
},
"force": "green"
}
]
},
"childFlag": {
"defaultValue": "default",
"rules": [
{
"parentConditions": [
{
"id": "parentFlag",
"condition": {
"value": "green"
},
"gate": true
}
]
},
{
"condition": {
"memberType": "basic"
},
"force": "success"
}
]
}
}
},
"childFlag",
{
"value": null,
"on": false,
"off": true,
"source": "prerequisite",
"ruleId": ""
}
],
[
"Prerequisite flag missing, block dependent flag",
{
"attributes": {
"id": "123",
"memberType": "basic",
"country": "Canada"
},
"features": {
"childFlag": {
"defaultValue": "default",
"rules": [
{
"parentConditions": [
{
"id": "parentFlag",
"condition": {
"value": "green"
},
"gate": true
}
]
},
{
"condition": {
"memberType": "basic"
},
"force": "success"
}
]
}
}
},
"childFlag",
{
"value": null,
"on": false,
"off": true,
"source": "prerequisite",
"ruleId": ""
}
],
[
"Prerequisite flag on, evaluate dependent flag",
{
"attributes": {
"id": "123",
"memberType": "basic",
"country": "USA"
},
"features": {
"parentFlag": {
"defaultValue": "silver",
"rules": [
{
"condition": {
"country": "Canada"
},
"force": "red"
},
{
"condition": {
"country": {
"$in": [
"USA",
"Mexico"
]
}
},
"force": "green"
}
]
},
"childFlag": {
"defaultValue": "default",
"rules": [
{
"parentConditions": [
{
"id": "parentFlag",
"condition": {
"value": "green"
},
"gate": true
}
]
},
{
"condition": {
"memberType": "basic"
},
"force": "success"
}
]
}
}
},
"childFlag",
{
"value": "success",
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"Multiple parallel prerequisite flags on, evaluate dependent flag",
{
"attributes": {
"id": "123",
"memberType": "basic",
"country": "USA"
},
"features": {
"parentFlag1": {
"defaultValue": "silver",
"rules": [
{
"condition": {
"country": "Canada"
},
"force": "red"
},
{
"condition": {
"country": {
"$in": [
"USA",
"Mexico"
]
}
},
"force": "green"
}
]
},
"parentFlag2": {
"defaultValue": 0,
"rules": [
{
"condition": {
"id": "123"
},
"force": 2
}
]
},
"childFlag": {
"defaultValue": "default",
"rules": [
{
"parentConditions": [
{
"id": "parentFlag1",
"condition": {
"value": "green"
},
"gate": true
}
]
},
{
"parentConditions": [
{
"id": "parentFlag2",
"condition": {
"value": {
"$gt": 1
}
},
"gate": true
}
]
},
{
"condition": {
"memberType": "basic"
},
"force": "success"
}
]
}
}
},
"childFlag",
{
"value": "success",
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"Multiple nested prerequisite flags on, evaluate dependent flag",
{
"attributes": {
"id": "123",
"memberType": "basic",
"country": "USA"
},
"features": {
"parentFlag1": {
"defaultValue": "silver",
"rules": [
{
"parentConditions": [
{
"id": "parentFlag2",
"condition": {
"value": {
"$gt": 1
}
},
"gate": true
}
]
},
{
"condition": {
"country": "Canada"
},
"force": "red"
},
{
"condition": {
"country": {
"$in": [
"USA",
"Mexico"
]
}
},
"force": "green"
}
]
},
"parentFlag2": {
"defaultValue": 0,
"rules": [
{
"condition": {
"id": "123"
},
"force": 2
}
]
},
"childFlag": {
"defaultValue": "default",
"rules": [
{
"parentConditions": [
{
"id": "parentFlag1",
"condition": {
"value": "green"
},
"gate": true
}
]
},
{
"condition": {
"memberType": "basic"
},
"force": "success"
}
]
}
}
},
"childFlag",
{
"value": "success",
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"Prerequisite experiment flag in target bucket, evaluate dependent flag",
{
"attributes": {
"id": "1234",
"memberType": "basic",
"country": "USA"
},
"features": {
"parentExperimentFlag": {
"defaultValue": 0,
"rules": [
{
"key": "experiment",
"variations": [
0,
1
],
"hashAttribute": "id",
"hashVersion": 2,
"ranges": [
[
0,
0.5
],
[
0.5,
1.0
]
]
}
]
},
"childFlag": {
"defaultValue": "default",
"rules": [
{
"parentConditions": [
{
"id": "parentExperimentFlag",
"condition": {
"value": 1
},
"gate": true
}
]
},
{
"condition": {
"memberType": "basic"
},
"force": "success"
}
]
}
}
},
"childFlag",
{
"value": "success",
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"Prerequisite experiment flag in target bucket, evaluate skip dependent flag if not bucketed",
{
"attributes": {
"id": "1234",
"memberType": "basic",
"country": "USA"
},
"features": {
"parentExperimentFlag": {
"defaultValue": 0,
"rules": [
{
"key": "experiment",
"variations": [
0,
1
],
"hashAttribute": "id",
"hashVersion": 2,
"ranges": [
[
0,
0.5
],
[
0.5,
1.0
]
]
}
]
},
"childFlag": {
"defaultValue": "default",
"rules": [
{
"parentConditions": [
{
"id": "parentExperimentFlag",
"condition": {
"value": 0
},
"gate": true
}
]
},
{
"condition": {
"memberType": "basic"
},
"force": "success"
}
]
}
}
},
"childFlag",
{
"value": null,
"on": false,
"off": true,
"source": "prerequisite",
"ruleId": ""
}
],
[
"Prerequisite cycle detected, break",
{
"attributes": {
"id": "123"
},
"features": {
"flag1": {
"defaultValue": true,
"rules": [
{
"parentConditions": [
{
"id": "flag2",
"condition": {
"value": true
},
"gate": true
}
]
}
]
},
"flag2": {
"defaultValue": true,
"rules": [
{
"parentConditions": [
{
"id": "flag1",
"condition": {
"value": true
},
"gate": true
}
]
}
]
}
}
},
"flag1",
{
"value": null,
"on": false,
"off": true,
"source": "cyclicPrerequisite",
"ruleId": ""
}
],
[
"Multiple references to same prerequisite, do not break",
{
"attributes": {
"id": "123",
"browser": "edge"
},
"features": {
"childFlag": {
"defaultValue": true,
"rules": [
{
"parentConditions": [
{
"id": "parentFlag",
"condition": {
"value": {
"$ne": false
}
},
"gate": true
},
{
"id": "parentFlag",
"condition": {
"value": true
},
"gate": true
}
]
},
{
"condition": {
"browser": "safari"
},
"parentConditions": [
{
"id": "parentFlag",
"condition": {
"value": true
}
}
],
"force": "C"
},
{
"condition": {
"browser": {
"$ne": "safari"
}
},
"parentConditions": [
{
"id": "parentFlag",
"condition": {
"value": true
}
}
],
"force": "T"
}
]
},
"parentFlag": {
"defaultValue": true
}
}
},
"childFlag",
{
"value": "T",
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"SavedGroups correctly pulled from context for force rule",
{
"attributes": {
"id": 123
},
"features": {
"inGroup_force_rule": {
"defaultValue": false,
"rules": [
{
"force": true,
"condition": {
"id": {
"$inGroup": "group_id"
}
}
}
]
}
},
"savedGroups": {
"group_id": [
123,
456
]
}
},
"inGroup_force_rule",
{
"value": true,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"SavedGroups correctly pulled from context for experiment rule",
{
"attributes": {
"id": 123
},
"features": {
"inGroup_experiment_rule": {
"defaultValue": 0,
"rules": [
{
"key": "experiment",
"condition": {
"id": {
"$inGroup": "group_id"
}
},
"hashVersion": 2,
"variations": [
1,
2
],
"ranges": [
[
0,
0.5
],
[
0.5,
1.0
]
]
}
]
}
},
"savedGroups": {
"group_id": [
123,
456
]
}
},
"inGroup_experiment_rule",
{
"value": 1,
"on": true,
"off": false,
"source": "experiment",
"experiment": {
"hashVersion": 2,
"condition": {
"id": {
"$inGroup": "group_id"
}
},
"variations": [
1,
2
],
"ranges": [
[
0,
0.5
],
[
0.5,
1.0
]
],
"key": "experiment"
},
"experimentResult": {
"featureId": "inGroup_experiment_rule",
"hashAttribute": "id",
"hashUsed": true,
"hashValue": 123,
"inExperiment": true,
"key": "0",
"value": 1,
"variationId": 0,
"bucket": 0.1736,
"stickyBucketUsed": false
},
"ruleId": ""
}
],
[
"force rules - hashVersion 2 includes user",
{
"attributes": {
"id": "user2"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.5,
"hashVersion": 2
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rules - hashVersion 2 excludes user that v1 would include",
{
"attributes": {
"id": "user3"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.5,
"hashVersion": 2
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - coverage rollout uses seed (included)",
{
"attributes": {
"id": "2"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.5,
"seed": "s1"
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rules - coverage rollout uses seed (excluded)",
{
"attributes": {
"id": "5"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.5,
"seed": "s1"
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - coverage rollout respects filters (filtered out)",
{
"attributes": {
"id": "5"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.5,
"filters": [
{
"seed": "s2",
"ranges": [
[
0,
0.5
]
]
}
]
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - coverage rollout respects filters (in filter range)",
{
"attributes": {
"id": "3"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.5,
"filters": [
{
"seed": "s2",
"ranges": [
[
0,
0.5
]
]
}
]
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rules - coverage boundary is inclusive (n == coverage)",
{
"attributes": {
"id": "3152"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.5
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rules - skip if hashAttribute missing and no sticky bucketing (fallbackAttribute set)",
{
"attributes": {
"id": "1",
"deviceId": "d123"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 1,
"hashAttribute": "email",
"fallbackAttribute": "deviceId"
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - skip if hashAttribute missing (no fallback to id)",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 1,
"hashAttribute": "email"
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - hashAttribute present is used for coverage",
{
"attributes": {
"id": "1",
"email": "a@b.c"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 1,
"hashAttribute": "email"
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rules - empty seed falls back to feature key (included)",
{
"attributes": {
"id": "3"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.5,
"seed": ""
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"force rules - empty seed falls back to feature key (excluded)",
{
"attributes": {
"id": "2"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.5,
"seed": ""
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - empty hashAttribute falls back to id",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 1,
"hashAttribute": ""
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "force",
"ruleId": ""
}
],
[
"experiment rules - empty key falls back to feature key for hashing",
{
"attributes": {
"id": "1"
},
"features": {
"feature": {
"defaultValue": 9,
"rules": [
{
"variations": [
0,
1
],
"key": ""
}
]
}
}
},
"feature",
{
"value": 1,
"on": true,
"off": false,
"source": "experiment",
"ruleId": ""
}
],
[
"experiment rules - hashAttribute value of 0 is falsy, experiment skipped",
{
"attributes": {
"id": 0
},
"features": {
"feature": {
"defaultValue": "def",
"rules": [
{
"variations": [
"a",
"b"
]
}
]
}
}
},
"feature",
{
"value": "def",
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"experiment rules - hashAttribute value of false is falsy, experiment skipped",
{
"attributes": {
"id": false
},
"features": {
"feature": {
"defaultValue": "def",
"rules": [
{
"variations": [
"a",
"b"
]
}
]
}
}
},
"feature",
{
"value": "def",
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"experiment rules - hashAttribute value of empty string is falsy, experiment skipped",
{
"attributes": {
"id": ""
},
"features": {
"feature": {
"defaultValue": "def",
"rules": [
{
"variations": [
"a",
"b"
]
}
]
}
}
},
"feature",
{
"value": "def",
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"experiment rules - hashAttribute value of null is falsy, experiment skipped",
{
"attributes": {
"id": null
},
"features": {
"feature": {
"defaultValue": "def",
"rules": [
{
"variations": [
"a",
"b"
]
}
]
}
}
},
"feature",
{
"value": "def",
"on": true,
"off": false,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - coverage rollout skipped when hashAttribute value is 0 (falsy)",
{
"attributes": {
"id": 0
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"coverage": 0.99
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
],
[
"force rules - filter with falsy hashAttribute value filters the user out",
{
"attributes": {
"id": 0
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"force": 1,
"filters": [
{
"seed": "seed",
"attribute": "id",
"ranges": [
[
0,
1
]
]
}
]
}
]
}
}
},
"feature",
{
"value": 0,
"on": false,
"off": true,
"source": "defaultValue",
"ruleId": ""
}
]
],
"run": [
[
"default weights - 1",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
1,
true,
true
],
[
"default weights - 2",
{
"attributes": {
"id": "2"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
true,
true
],
[
"default weights - 3",
{
"attributes": {
"id": "3"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
true,
true
],
[
"default weights - 4",
{
"attributes": {
"id": "4"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
1,
true,
true
],
[
"default weights - 5",
{
"attributes": {
"id": "5"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
1,
true,
true
],
[
"default weights - 6",
{
"attributes": {
"id": "6"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
1,
true,
true
],
[
"default weights - 7",
{
"attributes": {
"id": "7"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
true,
true
],
[
"default weights - 8",
{
"attributes": {
"id": "8"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
1,
true,
true
],
[
"default weights - 9",
{
"attributes": {
"id": "9"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
true,
true
],
[
"uneven weights - 1",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"weights": [
0.1,
0.9
]
},
1,
true,
true
],
[
"uneven weights - 2",
{
"attributes": {
"id": "2"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"weights": [
0.1,
0.9
]
},
1,
true,
true
],
[
"uneven weights - 3",
{
"attributes": {
"id": "3"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"weights": [
0.1,
0.9
]
},
0,
true,
true
],
[
"uneven weights - 4",
{
"attributes": {
"id": "4"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"weights": [
0.1,
0.9
]
},
1,
true,
true
],
[
"uneven weights - 5",
{
"attributes": {
"id": "5"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"weights": [
0.1,
0.9
]
},
1,
true,
true
],
[
"uneven weights - 6",
{
"attributes": {
"id": "6"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"weights": [
0.1,
0.9
]
},
1,
true,
true
],
[
"uneven weights - 7",
{
"attributes": {
"id": "7"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"weights": [
0.1,
0.9
]
},
0,
true,
true
],
[
"uneven weights - 8",
{
"attributes": {
"id": "8"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"weights": [
0.1,
0.9
]
},
1,
true,
true
],
[
"uneven weights - 9",
{
"attributes": {
"id": "9"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"weights": [
0.1,
0.9
]
},
1,
true,
true
],
[
"coverage - 1",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"coverage": 0.4
},
0,
false,
false
],
[
"coverage - 2",
{
"attributes": {
"id": "2"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"coverage": 0.4
},
0,
true,
true
],
[
"coverage - 3",
{
"attributes": {
"id": "3"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"coverage": 0.4
},
0,
true,
true
],
[
"coverage - 4",
{
"attributes": {
"id": "4"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"coverage": 0.4
},
0,
false,
false
],
[
"coverage - 5",
{
"attributes": {
"id": "5"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"coverage": 0.4
},
1,
true,
true
],
[
"coverage - 6",
{
"attributes": {
"id": "6"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"coverage": 0.4
},
0,
false,
false
],
[
"coverage - 7",
{
"attributes": {
"id": "7"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"coverage": 0.4
},
0,
true,
true
],
[
"coverage - 8",
{
"attributes": {
"id": "8"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"coverage": 0.4
},
1,
true,
true
],
[
"coverage - 9",
{
"attributes": {
"id": "9"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"coverage": 0.4
},
0,
false,
false
],
[
"three way test - 1",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1,
2
]
},
2,
true,
true
],
[
"three way test - 2",
{
"attributes": {
"id": "2"
}
},
{
"key": "my-test",
"variations": [
0,
1,
2
]
},
0,
true,
true
],
[
"three way test - 3",
{
"attributes": {
"id": "3"
}
},
{
"key": "my-test",
"variations": [
0,
1,
2
]
},
0,
true,
true
],
[
"three way test - 4",
{
"attributes": {
"id": "4"
}
},
{
"key": "my-test",
"variations": [
0,
1,
2
]
},
2,
true,
true
],
[
"three way test - 5",
{
"attributes": {
"id": "5"
}
},
{
"key": "my-test",
"variations": [
0,
1,
2
]
},
1,
true,
true
],
[
"three way test - 6",
{
"attributes": {
"id": "6"
}
},
{
"key": "my-test",
"variations": [
0,
1,
2
]
},
2,
true,
true
],
[
"three way test - 7",
{
"attributes": {
"id": "7"
}
},
{
"key": "my-test",
"variations": [
0,
1,
2
]
},
0,
true,
true
],
[
"three way test - 8",
{
"attributes": {
"id": "8"
}
},
{
"key": "my-test",
"variations": [
0,
1,
2
]
},
1,
true,
true
],
[
"three way test - 9",
{
"attributes": {
"id": "9"
}
},
{
"key": "my-test",
"variations": [
0,
1,
2
]
},
0,
true,
true
],
[
"test name - my-test",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
1,
true,
true
],
[
"test name - my-test-3",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test-3",
"variations": [
0,
1
]
},
0,
true,
true
],
[
"empty id",
{
"attributes": {
"id": ""
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
false,
false
],
[
"null id",
{
"attributes": {
"id": null
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
false,
false
],
[
"missing id",
{
"attributes": {}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
false,
false
],
[
"missing attributes",
{},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
false,
false
],
[
"single variation",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0
]
},
0,
false,
false
],
[
"negative forced variation",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"force": -8
},
0,
false,
false
],
[
"high forced variation",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"force": 25
},
0,
false,
false
],
[
"evaluates conditions - pass",
{
"attributes": {
"id": "1",
"browser": "firefox"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"condition": {
"browser": "firefox"
}
},
1,
true,
true
],
[
"evaluates conditions - fail",
{
"attributes": {
"id": "1",
"browser": "chrome"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"condition": {
"browser": "firefox"
}
},
0,
false,
false
],
[
"custom hashAttribute",
{
"attributes": {
"id": "2",
"companyId": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"hashAttribute": "companyId"
},
1,
true,
true
],
[
"globally disabled",
{
"attributes": {
"id": "1"
},
"enabled": false
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
false,
false
],
[
"querystring force",
{
"attributes": {
"id": "1"
},
"url": "http://example.com?forced-test-qs=1#someanchor"
},
{
"key": "forced-test-qs",
"variations": [
0,
1
]
},
1,
true,
false
],
[
"run active experiments",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"active": true,
"variations": [
0,
1
]
},
1,
true,
true
],
[
"skip inactive experiments",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"active": false,
"variations": [
0,
1
]
},
0,
false,
false
],
[
"querystring force with inactive",
{
"attributes": {
"id": "1"
},
"url": "http://example.com/?my-test=1"
},
{
"key": "my-test",
"active": false,
"variations": [
0,
1
]
},
1,
true,
false
],
[
"coverage take precendence over forced",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"force": 1,
"coverage": 0.01,
"variations": [
0,
1
]
},
0,
false,
false
],
[
"JSON values for experiments",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
{
"color": "blue",
"size": "small"
},
{
"color": "green",
"size": "large"
}
]
},
{
"color": "green",
"size": "large"
},
true,
true
],
[
"Force variation from context",
{
"attributes": {
"id": "1"
},
"forcedVariations": {
"my-test": 0
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
true,
false
],
[
"Skips experiments in QA mode",
{
"attributes": {
"id": "1"
},
"qaMode": true
},
{
"key": "my-test",
"variations": [
0,
1
]
},
0,
false,
false
],
[
"Works in QA mode if forced in context",
{
"attributes": {
"id": "1"
},
"qaMode": true,
"forcedVariations": {
"my-test": 1
}
},
{
"key": "my-test",
"variations": [
0,
1
]
},
1,
true,
false
],
[
"Works in QA mode if forced in experiment",
{
"attributes": {
"id": "1"
},
"qaMode": true
},
{
"key": "my-test",
"variations": [
0,
1
],
"force": 1
},
1,
true,
false
],
[
"Experiment namespace - pass",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"namespace": [
"namespace",
0.1,
1
]
},
1,
true,
true
],
[
"Experiment namespace - fail",
{
"attributes": {
"id": "1"
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"namespace": [
"namespace",
0,
0.1
]
},
0,
false,
false
],
[
"Experiment coverage - Works when 0",
{
"attributes": {
"id": "1"
}
},
{
"key": "no-coverage",
"variations": [
0,
1
],
"coverage": 0
},
0,
false,
false
],
[
"Filtered, included",
{
"attributes": {
"id": "1",
"anonId": "fsdafsda"
}
},
{
"key": "filtered",
"variations": [
0,
1
],
"filters": [
{
"seed": "seed",
"ranges": [
[
0,
0.1
],
[
0.2,
0.4
]
]
},
{
"seed": "seed",
"attribute": "anonId",
"ranges": [
[
0.8,
1.0
]
]
}
]
},
1,
true,
true
],
[
"Filtered, excluded",
{
"attributes": {
"id": "1",
"anonId": "fsdafsda"
}
},
{
"key": "filtered",
"variations": [
0,
1
],
"filters": [
{
"seed": "seed",
"ranges": [
[
0,
0.1
],
[
0.2,
0.4
]
]
},
{
"seed": "seed",
"attribute": "anonId",
"ranges": [
[
0.6,
0.8
]
]
}
]
},
0,
false,
false
],
[
"Filtered, ignore namespace",
{
"attributes": {
"id": "1"
}
},
{
"key": "filtered",
"variations": [
0,
1
],
"filters": [
{
"seed": "seed",
"ranges": [
[
0,
0.1
],
[
0.2,
0.4
]
]
}
],
"namespace": [
"test",
0,
0.001
]
},
1,
true,
true
],
[
"Ranges, ignore coverage and weights",
{
"attributes": {
"id": "1"
}
},
{
"key": "ranges",
"variations": [
0,
1
],
"ranges": [
[
0.99,
1.0
],
[
0.0,
0.99
]
],
"coverage": 0.01,
"weights": [
0.99,
0.01
]
},
1,
true,
true
],
[
"Ranges, partial coverage",
{
"attributes": {
"id": "1"
}
},
{
"key": "configs",
"variations": [
0,
1
],
"ranges": [
[
0,
0.1
],
[
0.9,
1.0
]
]
},
0,
false,
false
],
[
"Uses seed and hash version",
{
"attributes": {
"id": "1"
}
},
{
"key": "key",
"seed": "foo",
"hashVersion": 2,
"variations": [
0,
1
],
"ranges": [
[
0,
0.5
],
[
0.5,
1.0
]
]
},
1,
true,
true
],
[
"Uses seed with default weights/coverage",
{
"attributes": {
"id": "1"
}
},
{
"key": "key",
"seed": "foo",
"hashVersion": 2,
"variations": [
0,
1
]
},
1,
true,
true
],
[
"Uses seed with weights/coverage",
{
"attributes": {
"id": "1"
}
},
{
"key": "key",
"seed": "foo",
"hashVersion": 2,
"variations": [
0,
1
],
"weights": [
0.5,
0.5
],
"coverage": 0.99
},
1,
true,
true
],
[
"Prerequisite condition passes",
{
"attributes": {
"id": "1"
},
"features": {
"parentFlag": {
"defaultValue": true
}
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"parentConditions": [
{
"id": "parentFlag",
"condition": {
"value": true
}
}
]
},
1,
true,
true
],
[
"Prerequisite condition fails",
{
"attributes": {
"id": "1"
},
"features": {
"parentFlag": {
"defaultValue": false
}
}
},
{
"key": "my-test",
"variations": [
0,
1
],
"parentConditions": [
{
"id": "parentFlag",
"condition": {
"value": true
}
}
]
},
0,
false,
false
],
[
"SavedGroups correctly pulled from context for experiment",
{
"attributes": {
"id": "4"
},
"savedGroups": {
"group_id": [
"4",
"5",
"6"
]
}
},
{
"key": "group-filtered-test",
"condition": {
"id": {
"$inGroup": "group_id"
}
},
"variations": [
0,
1,
2
]
},
0,
true,
true
]
],
"chooseVariation": [
[
"even range, 0.2",
0.2,
[
[
0,
0.5
],
[
0.5,
1
]
],
0
],
[
"even range, 0.4",
0.4,
[
[
0,
0.5
],
[
0.5,
1
]
],
0
],
[
"even range, 0.6",
0.6,
[
[
0,
0.5
],
[
0.5,
1
]
],
1
],
[
"even range, 0.8",
0.8,
[
[
0,
0.5
],
[
0.5,
1
]
],
1
],
[
"even range, 0",
0,
[
[
0,
0.5
],
[
0.5,
1
]
],
0
],
[
"even range, 0.5",
0.5,
[
[
0,
0.5
],
[
0.5,
1
]
],
1
],
[
"reduced range, 0.2",
0.2,
[
[
0,
0.25
],
[
0.5,
0.75
]
],
0
],
[
"reduced range, 0.4",
0.4,
[
[
0,
0.25
],
[
0.5,
0.75
]
],
-1
],
[
"reduced range, 0.6",
0.6,
[
[
0,
0.25
],
[
0.5,
0.75
]
],
1
],
[
"reduced range, 0.8",
0.8,
[
[
0,
0.25
],
[
0.5,
0.75
]
],
-1
],
[
"reduced range, 0.25",
0.25,
[
[
0,
0.25
],
[
0.5,
0.75
]
],
-1
],
[
"reduced range, 0.5",
0.5,
[
[
0,
0.25
],
[
0.5,
0.75
]
],
1
],
[
"zero range",
0.5,
[
[
0,
0.5
],
[
0.5,
0.5
],
[
0.5,
1
]
],
2
]
],
"getQueryStringOverride": [
[
"empty url",
"my-test",
"",
2,
null
],
[
"no query string",
"my-test",
"http://example.com",
2,
null
],
[
"empty query string",
"my-test",
"http://example.com?",
2,
null
],
[
"no query string match",
"my-test",
"http://example.com?somequery",
2,
null
],
[
"invalid query string",
"my-test",
"http://example.com??&&&?#",
2,
null
],
[
"simple match 0",
"my-test",
"http://example.com?my-test=0",
2,
0
],
[
"simple match 1",
"my-test",
"http://example.com?my-test=1",
2,
1
],
[
"negative variation",
"my-test",
"http://example.com?my-test=-1",
2,
null
],
[
"float",
"my-test",
"http://example.com?my-test=2.054",
2,
null
],
[
"string",
"my-test",
"http://example.com?my-test=foo",
2,
null
],
[
"variation too high",
"my-test",
"http://example.com?my-test=5",
2,
null
],
[
"high numVariations",
"my-test",
"http://example.com?my-test=5",
6,
5
],
[
"equal to numVariations",
"my-test",
"http://example.com?my-test=5",
5,
null
],
[
"other query string before",
"my-test",
"http://example.com?foo=bar&my-test=1",
2,
1
],
[
"other query string after",
"my-test",
"http://example.com?foo=bar&my-test=1&bar=baz",
2,
1
],
[
"anchor",
"my-test",
"http://example.com?my-test=1#foo",
2,
1
]
],
"inNamespace": [
[
"user 1, namespace1, 1",
"1",
[
"namespace1",
0,
0.4
],
false
],
[
"user 1, namespace1, 2",
"1",
[
"namespace1",
0.4,
1
],
true
],
[
"user 1, namespace2, 1",
"1",
[
"namespace2",
0,
0.4
],
false
],
[
"user 1, namespace2, 2",
"1",
[
"namespace2",
0.4,
1
],
true
],
[
"user 2, namespace1, 1",
"2",
[
"namespace1",
0,
0.4
],
false
],
[
"user 2, namespace1, 2",
"2",
[
"namespace1",
0.4,
1
],
true
],
[
"user 2, namespace2, 1",
"2",
[
"namespace2",
0,
0.4
],
false
],
[
"user 2, namespace2, 2",
"2",
[
"namespace2",
0.4,
1
],
true
],
[
"user 3, namespace1, 1",
"3",
[
"namespace1",
0,
0.4
],
false
],
[
"user 3, namespace1, 2",
"3",
[
"namespace1",
0.4,
1
],
true
],
[
"user 3, namespace2, 1",
"3",
[
"namespace2",
0,
0.4
],
true
],
[
"user 3, namespace2, 2",
"3",
[
"namespace2",
0.4,
1
],
false
],
[
"user 4, namespace1, 1",
"4",
[
"namespace1",
0,
0.4
],
false
],
[
"user 4, namespace1, 2",
"4",
[
"namespace1",
0.4,
1
],
true
],
[
"user 4, namespace2, 1",
"4",
[
"namespace2",
0,
0.4
],
true
],
[
"user 4, namespace2, 2",
"4",
[
"namespace2",
0.4,
1
],
false
]
],
"getEqualWeights": [
[
-1,
[]
],
[
0,
[]
],
[
1,
[
1
]
],
[
2,
[
0.5,
0.5
]
],
[
3,
[
0.33333333,
0.33333333,
0.33333333
]
],
[
4,
[
0.25,
0.25,
0.25,
0.25
]
]
],
"decrypt": [
[
"Valid feature",
"m5ylFM6ndyOJA2OPadubkw==.Uu7ViqgKEt/dWvCyhI46q088PkAEJbnXKf3KPZjf9IEQQ+A8fojNoxw4wIbPX3aj",
"Zvwv/+uhpFDznZ6SX28Yjg==",
"{\"feature\":{\"defaultValue\":true}}"
],
[
"Broken JSON",
"SVZIM2oKD1JoHNIeeoW3Uw==.AGbRiGAHf2f6/ziVr9UTIy+bVFmVli6+bHZ2jnCm9N991ITv1ROvOEjxjLSmgEpv",
"UQD0Qqw7fM1bhfKKPH8TGw==",
"{\"feature\":{\"defaultValue\":true?5%"
],
[
"Wrong key",
"m5ylFM6ndyOJA2OPadubkw==.Uu7ViqgKEt/dWvCyhI46q088PkAEJbnXKf3KPZjf9IEQQ+A8fojNoxw4wIbPX3aj",
"Zvwv/+uhpFDznZ6SX39Yjg==",
null
],
[
"Invalid key length",
"m5ylFM6ndyOJA2OPadubkw==.Uu7ViqgKEt/dWvCyhI46q088PkAEJbnXKf3KPZjf9IEQQ+A8fojNoxw4wIbPX3aj",
"Zvwv/+uhpFDznSX39Yjg==",
null
],
[
"Invalid key characters",
"m5ylFM6ndyOJA2OPadubkw==.Uu7ViqgKEt/dWvCyhI46q088PkAEJbnXKf3KPZjf9IEQQ+A8fojNoxw4wIbPX3aj",
"Zvwv/%!(pFDznZ6SX39Yjg==",
null
],
[
"Invalid body",
"m5ylFM6ndyOJA2OPadubkw==.Uu7ViqgKEt/dWvCyhI46q0!*&()f3KPZjf9IEQQ+A8fojNoxw4wIbPX3aj",
"Zvwv/+uhpFDznZ6SX28Yjg==",
null
],
[
"Invalid iv length",
"m5ylFM6ndyOPadubkw==.Uu7ViqgKEt/dWvCyhI46q088PkAEJbnXKf3KPZjf9IEQQ+A8fojNoxw4wIbPX3aj",
"Zvwv/+uhpFDznZ6SX28Yjg==",
null
],
[
"Invalid iv",
"m5ylFM6*&(OJA2OPadubkw==.Uu7ViqgKEt/dWvCyhI46q088PkAEJbnXKf3KPZjf9IEQQ+A8fojNoxw4wIbPX3aj",
"Zvwv/+uhpFDznZ6SX28Yjg==",
null
],
[
"Missing delimiter",
"m5ylFM6ndyOJA2OPadubkw==Uu7ViqgKEt/dWvCyhI46q088PkAEJbnXKf3KPZjf9IEQQ+A8fojNoxw4wIbPX3aj",
"Zvwv/+uhpFDznZ6SX28Yjg==",
null
],
[
"Corrupted payload",
"fsa*(&(SF*&F&SF^SD&*FS&*6fsdkajfd",
"Zvwv/+uhpFDznZ6SX28Yjg==",
null
]
],
"stickyBucket": [
[
"use fallbackAttribute when missing hashAttribute",
{
"attributes": {
"anonymousId": "123"
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"variations": [
0,
1,
2,
3
],
"hashAttribute": "id",
"fallbackAttribute": "anonymousId"
}
]
}
}
},
[],
"feature",
{
"bucket": 0.863,
"featureId": "feature",
"hashAttribute": "anonymousId",
"hashUsed": true,
"hashValue": "123",
"inExperiment": true,
"key": "3",
"stickyBucketUsed": false,
"value": 3,
"variationId": 3
},
{
"anonymousId||123": {
"assignments": {
"feature__0": "3"
},
"attributeName": "anonymousId",
"attributeValue": "123"
}
}
],
[
"performs evaluation without sticky bucket",
{
"attributes": {
"deviceId": "d123",
"anonymousId": "ses123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 0,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
},
"stickyBucketAssignmentDocs": {}
},
[],
"exp1",
{
"bucket": 0.6468,
"featureId": "exp1",
"hashAttribute": "deviceId",
"hashUsed": true,
"hashValue": "d123",
"inExperiment": true,
"key": "1",
"stickyBucketUsed": false,
"value": "red",
"variationId": 1
},
{
"deviceId||d123": {
"assignments": {
"feature-exp__0": "1"
},
"attributeName": "deviceId",
"attributeValue": "d123"
}
}
],
[
"evaluates based on stored sticky bucket",
{
"attributes": {
"deviceId": "d123",
"anonymousId": "ses123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 0,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"attributeName": "deviceId",
"attributeValue": "d123",
"assignments": {
"feature-exp__0": "2"
}
}
],
"exp1",
{
"bucket": 0.6468,
"featureId": "exp1",
"hashAttribute": "deviceId",
"hashUsed": true,
"hashValue": "d123",
"inExperiment": true,
"key": "2",
"stickyBucketUsed": true,
"value": "blue",
"variationId": 2
},
{
"deviceId||d123": {
"assignments": {
"feature-exp__0": "2"
},
"attributeName": "deviceId",
"attributeValue": "d123"
}
}
],
[
"does not consume a sticky bucket not belonging to the user",
{
"attributes": {
"deviceId": "d123",
"anonymousId": "ses123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 0,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"attributeName": "deviceId",
"attributeValue": "d456",
"assignments": {
"feature-exp__0": "2"
}
}
],
"exp1",
{
"bucket": 0.6468,
"featureId": "exp1",
"hashAttribute": "deviceId",
"hashUsed": true,
"hashValue": "d123",
"inExperiment": true,
"key": "1",
"stickyBucketUsed": false,
"value": "red",
"variationId": 1
},
{
"deviceId||d123": {
"assignments": {
"feature-exp__0": "1"
},
"attributeName": "deviceId",
"attributeValue": "d123"
}
}
],
[
"upgrades a sticky bucket doc from a fallbackAttribute to a hashAttribute",
{
"attributes": {
"id": "i123",
"anonymousId": "ses123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "anonymousId",
"hashVersion": 2,
"bucketVersion": 0,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"attributeName": "anonymousId",
"attributeValue": "ses123",
"assignments": {
"feature-exp__0": "1"
}
}
],
"exp1",
{
"bucket": 0.9943,
"featureId": "exp1",
"hashAttribute": "id",
"hashUsed": true,
"hashValue": "i123",
"inExperiment": true,
"key": "1",
"stickyBucketUsed": true,
"value": "red",
"variationId": 1
},
{
"anonymousId||ses123": {
"assignments": {
"feature-exp__0": "1"
},
"attributeName": "anonymousId",
"attributeValue": "ses123"
},
"id||i123": {
"assignments": {
"feature-exp__0": "1"
},
"attributeName": "id",
"attributeValue": "i123"
}
}
],
[
"favors a sticky bucket doc based on hashAttribute over fallbackAttribute",
{
"attributes": {
"id": "i123",
"anonymousId": "ses123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "anonymousId",
"hashVersion": 2,
"bucketVersion": 0,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"attributeName": "anonymousId",
"attributeValue": "ses123",
"assignments": {
"feature-exp__0": "2"
}
},
{
"attributeName": "id",
"attributeValue": "i123",
"assignments": {
"feature-exp__0": "1"
}
}
],
"exp1",
{
"bucket": 0.9943,
"featureId": "exp1",
"hashAttribute": "id",
"hashUsed": true,
"hashValue": "i123",
"inExperiment": true,
"key": "1",
"stickyBucketUsed": true,
"value": "red",
"variationId": 1
},
{
"anonymousId||ses123": {
"assignments": {
"feature-exp__0": "2"
},
"attributeName": "anonymousId",
"attributeValue": "ses123"
},
"id||i123": {
"assignments": {
"feature-exp__0": "1"
},
"attributeName": "id",
"attributeValue": "i123"
}
}
],
[
"resets sticky bucketing when the bucketVersion changes",
{
"attributes": {
"id": "i123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 3,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"assignments": {
"feature-exp__0": "1"
},
"attributeName": "id",
"attributeValue": "i123"
}
],
"exp1",
{
"bucket": 0.9943,
"featureId": "exp1",
"hashAttribute": "id",
"hashUsed": true,
"hashValue": "i123",
"inExperiment": true,
"key": "2",
"stickyBucketUsed": false,
"value": "blue",
"variationId": 2
},
{
"id||i123": {
"assignments": {
"feature-exp__0": "1",
"feature-exp__3": "2"
},
"attributeName": "id",
"attributeValue": "i123"
}
}
],
[
"stops test enrollment when and existing sticky bucket is blocked by version",
{
"attributes": {
"id": "i123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 3,
"minBucketVersion": 3,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"assignments": {
"feature-exp__0": "1"
},
"attributeName": "id",
"attributeValue": "i123"
}
],
"exp1",
null,
{
"id||i123": {
"assignments": {
"feature-exp__0": "1"
},
"attributeName": "id",
"attributeValue": "i123"
}
}
],
[
"uses a sticky bucket when sticky bucket version == experiment.minBucketVersion === experiment.bucketVersion",
{
"attributes": {
"deviceId": "d123",
"anonymousId": "ses123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 3,
"minBucketVersion": 3,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"attributeName": "deviceId",
"attributeValue": "d123",
"assignments": {
"feature-exp__3": "2"
}
}
],
"exp1",
{
"bucket": 0.6468,
"featureId": "exp1",
"hashAttribute": "deviceId",
"hashUsed": true,
"hashValue": "d123",
"inExperiment": true,
"key": "2",
"stickyBucketUsed": true,
"value": "blue",
"variationId": 2
},
{
"deviceId||d123": {
"assignments": {
"feature-exp__3": "2"
},
"attributeName": "deviceId",
"attributeValue": "d123"
}
}
],
[
"skips assignment when sticky bucket version < experiment.minBucketVersion",
{
"attributes": {
"deviceId": "d123",
"anonymousId": "ses123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 3,
"minBucketVersion": 3,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"attributeName": "deviceId",
"attributeValue": "d123",
"assignments": {
"feature-exp__2": "2"
}
}
],
"exp1",
null,
{
"deviceId||d123": {
"assignments": {
"feature-exp__2": "2"
},
"attributeName": "deviceId",
"attributeValue": "d123"
}
}
],
[
"resets sticky bucketing when bucket version > experiment.bucketVersion (invalid version)",
{
"attributes": {
"deviceId": "d123",
"anonymousId": "ses123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 3,
"minBucketVersion": 3,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"attributeName": "deviceId",
"attributeValue": "d123",
"assignments": {
"feature-exp__4": "2"
}
}
],
"exp1",
{
"bucket": 0.6468,
"featureId": "exp1",
"hashAttribute": "deviceId",
"hashUsed": true,
"hashValue": "d123",
"inExperiment": true,
"key": "1",
"stickyBucketUsed": false,
"value": "red",
"variationId": 1
},
{
"deviceId||d123": {
"assignments": {
"feature-exp__3": "1",
"feature-exp__4": "2"
},
"attributeName": "deviceId",
"attributeValue": "d123"
}
}
],
[
"resets sticky bucketing when bucket version < experiment.bucketVersion (invalid version)",
{
"attributes": {
"deviceId": "d123",
"anonymousId": "ses123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 4,
"minBucketVersion": 3,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"attributeName": "deviceId",
"attributeValue": "d123",
"assignments": {
"feature-exp__3": "2"
}
}
],
"exp1",
{
"bucket": 0.6468,
"featureId": "exp1",
"hashAttribute": "deviceId",
"hashUsed": true,
"hashValue": "d123",
"inExperiment": true,
"key": "1",
"stickyBucketUsed": false,
"value": "red",
"variationId": 1
},
{
"deviceId||d123": {
"assignments": {
"feature-exp__3": "2",
"feature-exp__4": "1"
},
"attributeName": "deviceId",
"attributeValue": "d123"
}
}
],
[
"disables sticky bucketing when disabled by experiment",
{
"attributes": {
"id": "i123",
"foo": "bar",
"country": "USA"
},
"features": {
"exp1": {
"defaultValue": "control",
"rules": [
{
"key": "feature-exp",
"seed": "feature-exp",
"hashAttribute": "id",
"fallbackAttribute": "deviceId",
"hashVersion": 2,
"bucketVersion": 1,
"disableStickyBucketing": true,
"condition": {
"country": "USA"
},
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1,
"weights": [
0.3334,
0.3333,
0.3333
],
"phase": "0"
}
]
}
}
},
[
{
"attributeName": "id",
"attributeValue": "i123",
"assignments": {
"feature-exp__0": "1"
}
}
],
"exp1",
{
"bucket": 0.9943,
"featureId": "exp1",
"hashAttribute": "id",
"hashUsed": true,
"hashValue": "i123",
"inExperiment": true,
"key": "2",
"stickyBucketUsed": false,
"value": "blue",
"variationId": 2
},
{
"id||i123": {
"attributeName": "id",
"attributeValue": "i123",
"assignments": {
"feature-exp__0": "1"
}
}
}
],
[
"uses stored id assignment when fallbackAttribute is omitted",
{
"attributes": {
"id": "1",
"email": "a@b.c"
},
"features": {
"exp2": {
"defaultValue": "control",
"rules": [
{
"key": "exp2-key",
"hashAttribute": "email",
"hashVersion": 2,
"variations": [
"control",
"red",
"blue"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"coverage": 1
}
]
},
"other": {
"defaultValue": 0,
"rules": [
{
"key": "other-key",
"variations": [
0,
1
]
}
]
}
}
},
[
{
"attributeName": "id",
"attributeValue": "1",
"assignments": {
"exp2-key__0": "2"
}
}
],
"exp2",
{
"bucket": 0.4303,
"featureId": "exp2",
"hashAttribute": "email",
"hashUsed": true,
"hashValue": "a@b.c",
"inExperiment": true,
"key": "2",
"stickyBucketUsed": true,
"value": "blue",
"variationId": 2
},
{
"id||1": {
"assignments": {
"exp2-key__0": "2"
},
"attributeName": "id",
"attributeValue": "1"
},
"email||a@b.c": {
"assignments": {
"exp2-key__0": "2"
},
"attributeName": "email",
"attributeValue": "a@b.c"
}
}
],
[
"falsy fallbackAttribute value is not hashed even with sticky bucketing",
{
"attributes": {
"anonymousId": 0
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"variations": [
0,
1,
2,
3
],
"hashAttribute": "id",
"fallbackAttribute": "anonymousId"
}
]
}
}
},
[],
"feature",
null,
{}
],
[
"ignores assignment doc stored under a falsy fallbackAttribute value",
{
"attributes": {
"id": "1",
"anonymousId": 0
},
"features": {
"feature": {
"defaultValue": 0,
"rules": [
{
"variations": [
"a",
"b",
"c"
],
"meta": [
{
"key": "0"
},
{
"key": "1"
},
{
"key": "2"
}
],
"hashAttribute": "id",
"fallbackAttribute": "anonymousId",
"coverage": 1
}
]
}
}
},
[
{
"attributeName": "anonymousId",
"attributeValue": "0",
"assignments": {
"feature__0": "1"
}
}
],
"feature",
{
"bucket": 0.906,
"featureId": "feature",
"hashAttribute": "id",
"hashUsed": true,
"hashValue": "1",
"inExperiment": true,
"key": "2",
"stickyBucketUsed": false,
"value": "c",
"variationId": 2
},
{
"id||1": {
"assignments": {
"feature__0": "2"
},
"attributeName": "id",
"attributeValue": "1"
}
}
]
],
"urlRedirect": [
[
"redirects correctly without query strings",
{
"attributes": {
"id": "1"
},
"url": "http://www.example.com/home",
"experiments": [
{
"key": "my-experiment",
"urlPatterns": [
{
"type": "simple",
"include": true,
"pattern": "http://www.example.com/home"
}
],
"weights": [
0.1,
0.9
],
"variations": [
{},
{
"urlRedirect": "http://www.example.com/home-new"
}
]
}
]
},
[
{
"inExperiment": true,
"urlRedirect": "http://www.example.com/home-new",
"urlWithParams": "http://www.example.com/home-new"
}
]
],
[
"redirects with query string on original url and persistQueryString enabled",
{
"attributes": {
"id": "1"
},
"url": "http://www.example.com/home?color=blue&food=sushi",
"experiments": [
{
"key": "my-experiment",
"urlPatterns": [
{
"type": "simple",
"include": true,
"pattern": "http://www.example.com/home"
}
],
"weights": [
0.1,
0.9
],
"variations": [
{},
{
"urlRedirect": "http://www.example.com/home-new"
}
],
"persistQueryString": true
}
]
},
[
{
"inExperiment": true,
"urlRedirect": "http://www.example.com/home-new",
"urlWithParams": "http://www.example.com/home-new?color=blue&food=sushi"
}
]
],
[
"merges query strings on original url & redirect url with param conflicts correctly when persistQueryString enabled",
{
"attributes": {
"id": "1"
},
"url": "http://www.example.com/home?color=blue&food=sushi&title=original",
"experiments": [
{
"key": "my-experiment",
"urlPatterns": [
{
"type": "simple",
"include": true,
"pattern": "http://www.example.com/home"
}
],
"weights": [
0.1,
0.9
],
"variations": [
{},
{
"urlRedirect": "http://www.example.com/home-new?name=test&color=red&food=lasagna"
}
],
"persistQueryString": true
}
]
},
[
{
"inExperiment": true,
"urlRedirect": "http://www.example.com/home-new?name=test&color=red&food=lasagna",
"urlWithParams": "http://www.example.com/home-new?name=test&color=red&food=lasagna&title=original"
}
]
],
[
"only performs a redirect for first eligible experiment when there are multiple eligible experiments",
{
"attributes": {
"id": "1"
},
"url": "http://www.example.com/home",
"experiments": [
{
"key": "my-experiment",
"urlPatterns": [
{
"type": "simple",
"include": true,
"pattern": "http://www.example.com/"
}
],
"weights": [
0.1,
0.9
],
"variations": [
{},
{
"urlRedirect": "http://www.example.com/home-new"
}
]
},
{
"key": "my-experiment-2",
"urlPatterns": [
{
"type": "simple",
"include": true,
"pattern": "http://www.example.com/home"
}
],
"weights": [
0.1,
0.9
],
"variations": [
{},
{
"urlRedirect": "http://www.example.com/home-new-new"
}
]
},
{
"key": "my-experiment-3",
"urlPatterns": [
{
"type": "simple",
"include": true,
"pattern": "http://www.example.com/home"
}
],
"weights": [
0.1,
0.9
],
"variations": [
{},
{
"urlRedirect": "http://www.example.com/home-es"
}
]
}
]
},
[
{
"inExperiment": true,
"urlRedirect": "http://www.example.com/home-new-new",
"urlWithParams": "http://www.example.com/home-new-new"
}
]
]
]
}