github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_xml_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  	"github.com/GuanceCloud/platypus/pkg/ast"
    16  )
    17  
    18  func TestXML(t *testing.T) {
    19  	testCases := []struct {
    20  		name     string
    21  		in       string
    22  		script   string
    23  		expected string
    24  		key      string
    25  		fail     bool
    26  	}{
    27  		{
    28  			name: "normal",
    29  			in: `<entry>
    30          <fieldx>valuex</fieldx>
    31          <fieldy>...</fieldy>
    32          <fieldz>...</fieldz>
    33          <fieldarray>
    34              <fielda>element_a_1</fielda>
    35              <fielda>element_a_2</fielda>
    36          </fieldarray>
    37      </entry>`,
    38  			script:   `xml(_, '/entry/fieldx/text()', new_name)`,
    39  			expected: "valuex",
    40  			key:      "new_name",
    41  		},
    42  		{
    43  			name: "select array field",
    44  			in: `<entry>
    45          <fieldx>valuex</fieldx>
    46          <fieldy>...</fieldy>
    47          <fieldz>...</fieldz>
    48          <fieldarray>
    49              <fielda>element_a_1</fielda>
    50              <fielda>element_a_2</fielda>
    51          </fieldarray>
    52      </entry>`,
    53  			script:   `xml(_, '/entry/fieldarray//fielda[1]/text()', field_a_1)`,
    54  			expected: "element_a_1",
    55  			key:      "field_a_1",
    56  		},
    57  		{
    58  			name: "select attribute",
    59  			in: ` <OrderEvent actionCode = "5">
    60   <OrderNumber>ORD12345</OrderNumber>
    61   <VendorNumber>V11111</VendorNumber>
    62   </OrderEvent>`,
    63  			script:   `xml(_, '/OrderEvent/@actionCode', action_code)`,
    64  			expected: "5",
    65  			key:      "action_code",
    66  		},
    67  		{
    68  			name: "node OrderNumber",
    69  			in: ` <OrderEvent actionCode = "5">
    70   <OrderNumber>ORD12345</OrderNumber>
    71   <VendorNumber>V11111</VendorNumber>
    72   </OrderEvent>`,
    73  			script:   `xml(_, '/OrderEvent/OrderNumber/text()', OrderNumber)`,
    74  			expected: "ORD12345",
    75  			key:      "OrderNumber",
    76  		},
    77  		{
    78  			name: "node VendorNumber",
    79  			in: ` <OrderEvent actionCode = "5">
    80   <OrderNumber>ORD12345</OrderNumber>
    81   <VendorNumber>V11111</VendorNumber>
    82   </OrderEvent>`,
    83  			script:   `xml(_, '/OrderEvent/VendorNumber/text()', VendorNumber)`,
    84  			expected: "V11111",
    85  			key:      "VendorNumber",
    86  		},
    87  		{
    88  			name:     "not a valid XML",
    89  			in:       `Not a valid XML`,
    90  			script:   `xml(_, '/OrderEvent/VendorNumber/text()', VendorNumber)`,
    91  			expected: "V11111",
    92  			key:      "VendorNumber",
    93  			fail:     true,
    94  		},
    95  		{
    96  			name: "not a valid xpath expr",
    97  			in: ` <OrderEvent actionCode = "5">
    98   <OrderNumber>ORD12345</OrderNumber>
    99   <VendorNumber>V11111</VendorNumber>
   100   </OrderEvent>`,
   101  			script:   `xml(_, 'invalid xpath expr', VendorNumber)`,
   102  			expected: "V11111",
   103  			key:      "VendorNumber",
   104  			fail:     true,
   105  		},
   106  	}
   107  
   108  	for idx, tc := range testCases {
   109  		t.Run(tc.name, func(t *testing.T) {
   110  			runner, err := NewTestingRunner(tc.script)
   111  			tu.Equals(t, nil, err)
   112  
   113  			pt := ptinput.NewPlPoint(
   114  				point.Logging, "test", nil, map[string]any{"message": tc.in}, time.Now())
   115  			errR := runScript(runner, pt)
   116  
   117  			if errR != nil {
   118  				t.Fatal(errR)
   119  			}
   120  
   121  			r, dtype, err := pt.Get(tc.key)
   122  			if err != nil && dtype != ast.String && tc.fail {
   123  				t.Logf("[%d] failed as expected", idx)
   124  				return
   125  			}
   126  			tu.Equals(t, nil, err)
   127  			tu.Equals(t, tc.expected, r)
   128  			t.Logf("[%d] PASS", idx)
   129  		})
   130  	}
   131  }