From dbc12ac2be880257bd440ad1b1337add3155404d Mon Sep 17 00:00:00 2001 From: Shubham Singh Date: Mon, 22 Apr 2024 17:42:08 +0530 Subject: [PATCH] [Bug] Enabling many-to-one comparisons for `AnyNotIn` operator (#9462) * added cases for int, float Signed-off-by: Shubham Singh * added bool as well Signed-off-by: Shubham Singh * added tests Signed-off-by: Shubham Singh * some more tests Signed-off-by: Shubham Singh * go fmt Signed-off-by: Shubham Singh * fixed the failing test cases Signed-off-by: Shubham Singh --------- Signed-off-by: Shubham Singh Co-authored-by: shuting --- pkg/engine/variables/operator/anyin.go | 8 ++ .../variables/operator/anynotin_test.go | 89 ++++++++++++++++++- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/pkg/engine/variables/operator/anyin.go b/pkg/engine/variables/operator/anyin.go index 5bb5d791bf..451b7893af 100644 --- a/pkg/engine/variables/operator/anyin.go +++ b/pkg/engine/variables/operator/anyin.go @@ -134,6 +134,14 @@ func anySetExistsInArray(key []string, value interface{}, log logr.Logger, anyNo } return false, isAnyIn(key, valueSlice) + case int, int32, int64, float32, float64, bool: + var valueSlice []string + valueSlice = append(valueSlice, fmt.Sprint(value)) + if anyNotIn { + return false, isAnyNotIn(key, valueSlice) + } + return false, isAnyIn(key, valueSlice) + case string: if len(key) == 1 && key[0] == valuesAvailable { if anyNotIn { diff --git a/pkg/engine/variables/operator/anynotin_test.go b/pkg/engine/variables/operator/anynotin_test.go index 2d014c891a..b0bbfda28a 100644 --- a/pkg/engine/variables/operator/anynotin_test.go +++ b/pkg/engine/variables/operator/anynotin_test.go @@ -46,7 +46,6 @@ func TestAnyNotInHandler_Evaluate(t *testing.T) { }, want: true, }, - { name: "key is int and in value", args: args{ @@ -55,6 +54,14 @@ func TestAnyNotInHandler_Evaluate(t *testing.T) { }, want: false, }, + { + name: "key is int and in value", + args: args{ + key: 1, + value: []interface{}{1, 2, 3}, + }, + want: false, + }, { name: "key is int and not in value", args: args{ @@ -63,6 +70,38 @@ func TestAnyNotInHandler_Evaluate(t *testing.T) { }, want: true, }, + { + name: "key is float and in value", + args: args{ + key: 3.14, + value: "3.14", + }, + want: false, + }, + { + name: "key is float and in value", + args: args{ + key: 2.2, + value: []interface{}{1.1, 2.2, 3.3}, + }, + want: false, + }, + { + name: "key is float and not in value", + args: args{ + key: 3.14, + value: "default", + }, + want: true, + }, + { + name: "key is boolean and in value", + args: args{ + key: true, + value: true, + }, + want: false, + }, { name: "key is array and in value", args: args{ @@ -87,6 +126,54 @@ func TestAnyNotInHandler_Evaluate(t *testing.T) { }, want: true, }, + { + name: "key is array of int and partially in value", + args: args{ + key: []interface{}{1, 2, 3}, + value: 2, + }, + want: true, + }, + { + name: "key is array of int and not in value", + args: args{ + key: []interface{}{1, 2, 3}, + value: 4, + }, + want: true, + }, + { + name: "key is array of float and partially in value", + args: args{ + key: []interface{}{1.1, 2.2, 3.3}, + value: 1.1, + }, + want: true, + }, + { + name: "key is array of float and not in value", + args: args{ + key: []interface{}{1.1, 2.2, 3.3}, + value: 4.4, + }, + want: true, + }, + { + name: "key is array of bool and partially in value", + args: args{ + key: []interface{}{true, false}, + value: true, + }, + want: true, + }, + { + name: "key is an array of bool and not in value", + args: args{ + key: []interface{}{true}, + value: false, + }, + want: true, + }, { name: "key and value are array and not in value", args: args{