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 }