master
go 141 lines 3.67 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package sqlquery
4
5 import (
6 "context"
7 "errors"
8 "strings"
9 "testing"
10
11 "github.com/DATA-DOG/go-sqlmock"
12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14 )
15
16 func TestFetchTableColumns(t *testing.T) {
17 t.Run("without transform", func(t *testing.T) {
18 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
19 require.NoError(t, err)
20 defer func() { _ = db.Close() }()
21
22 query, err := tableColumnsQuery(PlaceholderQuestion)
23 require.NoError(t, err)
24 mock.ExpectQuery(query).
25 WithArgs("performance_schema", "events_statements_summary_by_digest").
26 WillReturnRows(sqlmock.NewRows([]string{"COLUMN_NAME"}).
27 AddRow("DIGEST").
28 AddRow("COUNT_STAR"))
29
30 cols, err := FetchTableColumns(
31 context.Background(),
32 db,
33 "performance_schema",
34 "events_statements_summary_by_digest",
35 PlaceholderQuestion,
36 nil,
37 )
38 require.NoError(t, err)
39 assert.Equal(t, map[string]bool{
40 "DIGEST": true,
41 "COUNT_STAR": true,
42 }, cols)
43 assert.NoError(t, mock.ExpectationsWereMet())
44 })
45
46 t.Run("with transform", func(t *testing.T) {
47 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
48 require.NoError(t, err)
49 defer func() { _ = db.Close() }()
50
51 query, err := tableColumnsQuery(PlaceholderQuestion)
52 require.NoError(t, err)
53 mock.ExpectQuery(query).
54 WithArgs("performance_schema", "events_statements_history_long").
55 WillReturnRows(sqlmock.NewRows([]string{"COLUMN_NAME"}).
56 AddRow("digest").
57 AddRow("mysql_errno"))
58
59 cols, err := FetchTableColumns(
60 context.Background(),
61 db,
62 "performance_schema",
63 "events_statements_history_long",
64 PlaceholderQuestion,
65 strings.ToUpper,
66 )
67 require.NoError(t, err)
68 assert.Equal(t, map[string]bool{
69 "DIGEST": true,
70 "MYSQL_ERRNO": true,
71 }, cols)
72 assert.NoError(t, mock.ExpectationsWereMet())
73 })
74
75 t.Run("query error", func(t *testing.T) {
76 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
77 require.NoError(t, err)
78 defer func() { _ = db.Close() }()
79
80 query, err := tableColumnsQuery(PlaceholderQuestion)
81 require.NoError(t, err)
82 mock.ExpectQuery(query).
83 WithArgs("performance_schema", "events_statements_history").
84 WillReturnError(errors.New("boom"))
85
86 cols, err := FetchTableColumns(
87 context.Background(),
88 db,
89 "performance_schema",
90 "events_statements_history",
91 PlaceholderQuestion,
92 nil,
93 )
94 require.Error(t, err)
95 assert.Nil(t, cols)
96 assert.NoError(t, mock.ExpectationsWereMet())
97 })
98
99 t.Run("dollar placeholders", func(t *testing.T) {
100 db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
101 require.NoError(t, err)
102 defer func() { _ = db.Close() }()
103
104 query, err := tableColumnsQuery(PlaceholderDollar)
105 require.NoError(t, err)
106 mock.ExpectQuery(query).
107 WithArgs("public", "pg_stat_statements").
108 WillReturnRows(sqlmock.NewRows([]string{"COLUMN_NAME"}).
109 AddRow("userid"))
110
111 cols, err := FetchTableColumns(
112 context.Background(),
113 db,
114 "public",
115 "pg_stat_statements",
116 PlaceholderDollar,
117 nil,
118 )
119 require.NoError(t, err)
120 assert.Equal(t, map[string]bool{"userid": true}, cols)
121 assert.NoError(t, mock.ExpectationsWereMet())
122 })
123
124 t.Run("invalid style", func(t *testing.T) {
125 db, _, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
126 require.NoError(t, err)
127 defer func() { _ = db.Close() }()
128
129 cols, err := FetchTableColumns(
130 context.Background(),
131 db,
132 "public",
133 "pg_stat_statements",
134 PlaceholderStyle(100),
135 nil,
136 )
137 require.Error(t, err)
138 assert.Nil(t, cols)
139 assert.Contains(t, err.Error(), "unsupported placeholder style")
140 })
141 }