master
go 90 lines 2.75 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package proxysql
4
5 import (
6 "testing"
7
8 "github.com/netdata/netdata/go/plugins/pkg/funcapi"
9 "github.com/stretchr/testify/assert"
10 )
11
12 func TestProxySQLMethods(t *testing.T) {
13 methods := proxysqlMethods()
14
15 require := assert.New(t)
16 require.Len(methods, 1)
17 require.Equal("top-queries", methods[0].ID)
18 require.Equal("Top Queries", methods[0].Name)
19 require.NotEmpty(methods[0].RequiredParams)
20
21 var sortParam *funcapi.ParamConfig
22 for i := range methods[0].RequiredParams {
23 if methods[0].RequiredParams[i].ID == "__sort" {
24 sortParam = &methods[0].RequiredParams[i]
25 break
26 }
27 }
28 require.NotNil(sortParam, "expected __sort required param")
29 require.NotEmpty(sortParam.Options)
30 }
31
32 func TestProxySQLAllColumns_HasRequiredColumns(t *testing.T) {
33 required := []string{"digest", "query", "calls", "totalTime"}
34
35 cs := proxysqlColumnSet(proxysqlAllColumns)
36
37 for _, id := range required {
38 assert.True(t, cs.ContainsColumn(id), "column %s should be defined", id)
39 }
40 }
41
42 func TestCollector_mapAndValidateProxySQLSortColumn(t *testing.T) {
43 tests := map[string]struct {
44 columns []proxysqlColumn
45 input string
46 expected string
47 }{
48 "valid totalTime": {
49 columns: []proxysqlColumn{{ColumnMeta: funcapi.ColumnMeta{Name: "totalTime"}}, {ColumnMeta: funcapi.ColumnMeta{Name: "calls"}}},
50 input: "totalTime",
51 expected: "totalTime",
52 },
53 "invalid falls back to totalTime": {
54 columns: []proxysqlColumn{{ColumnMeta: funcapi.ColumnMeta{Name: "totalTime"}}, {ColumnMeta: funcapi.ColumnMeta{Name: "calls"}}},
55 input: "bad",
56 expected: "totalTime",
57 },
58 "fallback to calls": {
59 columns: []proxysqlColumn{{ColumnMeta: funcapi.ColumnMeta{Name: "calls"}}},
60 input: "bad",
61 expected: "calls",
62 },
63 }
64
65 for name, tc := range tests {
66 t.Run(name, func(t *testing.T) {
67 c := &Collector{}
68 cs := proxysqlColumnSet(tc.columns)
69 assert.Equal(t, tc.expected, c.mapAndValidateProxySQLSortColumn(tc.input, cs))
70 })
71 }
72 }
73
74 func TestCollector_buildProxySQLDynamicSQL(t *testing.T) {
75 c := &Collector{}
76
77 cols := []proxysqlColumn{
78 {ColumnMeta: funcapi.ColumnMeta{Name: "digest", Type: funcapi.FieldTypeString}, DBColumn: "digest"},
79 {ColumnMeta: funcapi.ColumnMeta{Name: "query", Type: funcapi.FieldTypeString}, DBColumn: "digest_text"},
80 {ColumnMeta: funcapi.ColumnMeta{Name: "calls", Type: funcapi.FieldTypeInteger}, DBColumn: "count_star"},
81 {ColumnMeta: funcapi.ColumnMeta{Name: "totalTime", Type: funcapi.FieldTypeDuration}, DBColumn: "sum_time", IsMicroseconds: true},
82 }
83
84 sql := c.buildProxySQLDynamicSQL(cols, "totalTime", 500)
85
86 assert.Contains(t, sql, "stats_mysql_query_digest")
87 assert.Contains(t, sql, "ORDER BY `totalTime` DESC")
88 assert.Contains(t, sql, "LIMIT 500")
89 assert.Contains(t, sql, "sum_time/1000 AS `totalTime`")
90 }