github.com/GuanceCloud/cliutils@v1.1.21/pipeline/ptinput/funcs/fn_useragent_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 TestUserAgent(t *testing.T) {
    18  	cases := []struct {
    19  		name     string
    20  		pl, in   string
    21  		expected map[string]interface{}
    22  		fail     bool
    23  	}{
    24  		{
    25  			name: "normal",
    26  			pl: `json(_, userAgent) 
    27  			user_agent(userAgent)`,
    28  			in: `
    29  {
    30     "userAgent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36",
    31     "second"    : 2,
    32     "third"     : "abc",
    33     "forth"     : true
    34  }
    35  `,
    36  			expected: map[string]interface{}{
    37  				"isMobile":   false,
    38  				"isBot":      false,
    39  				"os":         "Windows 7",
    40  				"browser":    "Chrome",
    41  				"browserVer": "36.0.1985.125",
    42  				"engine":     "AppleWebKit",
    43  				"engineVer":  "537.36",
    44  				"ua":         "Windows",
    45  			},
    46  			fail: false,
    47  		},
    48  		{
    49  			name: "normal",
    50  			pl: `json(_, userAgent) 
    51  			user_agent(userAgent)`,
    52  			in: `
    53  {
    54      "userAgent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15"
    55  }
    56  `,
    57  			expected: map[string]interface{}{
    58  				"isMobile":   false,
    59  				"isBot":      false,
    60  				"os":         "Intel Mac OS X 10_15_7",
    61  				"browser":    "Safari",
    62  				"browserVer": "15.1",
    63  				"engine":     "AppleWebKit",
    64  				"engineVer":  "605.1.15",
    65  				"ua":         "Macintosh",
    66  			},
    67  			fail: false,
    68  		},
    69  
    70  		{
    71  			name: "normal",
    72  			pl: `json(_, userAgent) 
    73  			user_agent(agent)`,
    74  			in: `
    75  {
    76      "userAgent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15"
    77  }
    78  `,
    79  			expected: map[string]interface{}{},
    80  			fail:     false,
    81  		},
    82  
    83  		{
    84  			name: "invalid arg type",
    85  			pl: `json(_, userAgent) 
    86  			user_agent("userAgent")`,
    87  			in: `
    88  		{
    89  		   "userAgent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15"
    90  		}
    91  		`,
    92  			expected: map[string]interface{}{},
    93  			fail:     false,
    94  		},
    95  
    96  		{
    97  			name: "too many args",
    98  			pl: `json(_, userAgent) 
    99  			user_agent(userAgent, someArg)`,
   100  			in: `
   101  		{
   102  		   "userAgent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15"
   103  		}
   104  		`,
   105  			fail: true,
   106  		},
   107  	}
   108  	for idx, tc := range cases {
   109  		t.Run(tc.name, func(t *testing.T) {
   110  			runner, err := NewTestingRunner(tc.pl)
   111  			if err != nil {
   112  				if tc.fail {
   113  					t.Logf("[%d]expect error: %s", idx, err)
   114  				} else {
   115  					t.Errorf("[%d] failed: %s", idx, err)
   116  				}
   117  				return
   118  			}
   119  
   120  			pt := ptinput.NewPlPoint(
   121  				point.Logging, "test", nil, map[string]any{"message": tc.in}, time.Now())
   122  			errR := runScript(runner, pt)
   123  
   124  			if errR != nil {
   125  				if tc.fail {
   126  					t.Logf("[%d]expect error: %s", idx, err)
   127  				} else {
   128  					t.Fatal(errR)
   129  				}
   130  			} else {
   131  				fieldsToCompare := make(map[string]interface{})
   132  				for k := range tc.expected {
   133  					fieldsToCompare[k], _, _ = pt.Get(k)
   134  				}
   135  				tu.Equals(t, tc.expected, fieldsToCompare)
   136  				t.Logf("[%d] PASS", idx)
   137  			}
   138  		})
   139  	}
   140  }