github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_kv_test.go (about)

     1  // Unless explicitly stated otherwise all files in this repository are licensed
     2  // under the MIT License.
     3  // This product includes software developed at Guance Cloud (https://www.guance.com/).
     4  // Copyright 2021-present Guance, Inc.
     5  
     6  package funcs
     7  
     8  import (
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/GuanceCloud/cliutils/pipeline/ptinput"
    13  	"github.com/GuanceCloud/cliutils/point"
    14  	tu "github.com/GuanceCloud/cliutils/testutil"
    15  )
    16  
    17  func TestKV(t *testing.T) {
    18  	cases := []struct {
    19  		name, pl, in string
    20  		expected     []interface{}
    21  		fail         bool
    22  		outkey       []string
    23  	}{
    24  		{
    25  			name:     "normal",
    26  			pl:       `kv_split(_)`,
    27  			in:       `a=1 b=2 c=3`,
    28  			expected: []any{nil, nil, nil},
    29  			outkey:   []string{"a", "b", "c"},
    30  		},
    31  		{
    32  			name: "normal1",
    33  			pl: `kv_split(_,
    34  				include_keys=["a", "b","c"])`,
    35  			in:       `a=1, b=2 c=3`,
    36  			expected: []any{"1,", "2", "3"},
    37  			outkey:   []string{"a", "b", "c"},
    38  		},
    39  		{
    40  			name: "trim_value",
    41  			pl: `kv_split(_, trim_value=",",
    42  			include_keys=["a", "b","c"])`,
    43  			in:       `a=1, b=2 c=3`,
    44  			expected: []any{"1", "2", "3"},
    45  			outkey:   []string{"a", "b", "c"},
    46  		},
    47  		{
    48  			name: "trim_key_skip_empty_str_key",
    49  			pl: `kv_split(_, trim_value=",", trim_key="a",
    50  			include_keys=["a", "b","c"])`,
    51  			in:       `a=1, b=2 c=3`,
    52  			expected: []any{nil, nil, "2", "3"},
    53  			outkey:   []string{"", "a", "b", "c"},
    54  		},
    55  		{
    56  			name: "prefix",
    57  			pl: `kv_split(_, prefix="prefix_",trim_value=",", trim_key="a",
    58  			include_keys=["a", "b","c"])`,
    59  			in:       `a=1, b=2 c=3`,
    60  			expected: []any{nil, nil, "2", "3"},
    61  			outkey:   []string{"", "prefix_", "prefix_b", "prefix_c"},
    62  		},
    63  		{
    64  			name:     "prefix",
    65  			pl:       `kv_split(_, include_keys= ["b", ],prefix="prefix_",trim_value=",", trim_key="a")`,
    66  			in:       `a=1, b=2 c=3`,
    67  			expected: []any{nil, nil, "2", nil},
    68  			outkey:   []string{"", "prefix_", "prefix_b", "prefix_c"},
    69  		},
    70  		{
    71  			name: "value_split_pattern",
    72  			pl: `kv_split(_, include_keys= ["b", ], field_split_pattern="\\+", value_split_pattern="::",
    73  						prefix="prefix_",trim_value=",", trim_key="a")`,
    74  			in:       `a::1,+b::2+c::3`,
    75  			expected: []any{nil, nil, "2", nil},
    76  			outkey:   []string{"", "prefix_", "prefix_b", "prefix_c"},
    77  		},
    78  	}
    79  
    80  	for idx, tc := range cases {
    81  		t.Run(tc.name, func(t *testing.T) {
    82  			runner, err := NewTestingRunner(tc.pl)
    83  			if err != nil {
    84  				if tc.fail {
    85  					t.Logf("[%d]expect error: %s", idx, err)
    86  				} else {
    87  					t.Errorf("[%d] failed: %s", idx, err)
    88  				}
    89  				return
    90  			}
    91  			pt := ptinput.NewPlPoint(
    92  				point.Logging, "test", nil, map[string]any{"message": tc.in}, time.Now())
    93  			errR := runScript(runner, pt)
    94  
    95  			if errR != nil {
    96  				t.Fatal(errR.Error())
    97  			}
    98  
    99  			for i := range tc.outkey {
   100  				// tu.Equals(t, nil, err)
   101  				t.Log(tc.outkey[i])
   102  				v, _, _ := pt.Get(tc.outkey[i])
   103  				tu.Equals(t, tc.expected[i], v)
   104  				t.Logf("[%d] PASS", idx)
   105  			}
   106  		})
   107  	}
   108  }