41bf189e6b
* Read local queries from pgweb home directory * Refactor local query functionality * Allow picking local query in the query tab * WIP * Disable local query dropdown during execution * Only allow local queries running in a single session mode * Add middleware to enforce local query endpoint availability * Fix query check * Add query store tests * Make query store errors portable * Skip building specific tests on windows
147 lines
3.1 KiB
Go
147 lines
3.1 KiB
Go
package queries
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func Test_parseFields(t *testing.T) {
|
|
examples := []struct {
|
|
input string
|
|
err error
|
|
vals map[string]string
|
|
}{
|
|
{input: "", err: nil, vals: nil},
|
|
{input: "foobar", err: nil, vals: nil},
|
|
{input: "-- no pgweb meta", err: nil, vals: nil},
|
|
{
|
|
input: `--pgweb: foo=bar`,
|
|
err: nil,
|
|
vals: map[string]string{},
|
|
},
|
|
{
|
|
input: `--pgweb: host="localhost"`,
|
|
err: nil,
|
|
vals: map[string]string{"host": "localhost"},
|
|
},
|
|
{
|
|
input: `--pgweb: host="*" user="admin" database ="mydb"; mode = "readonly"`,
|
|
err: nil,
|
|
vals: map[string]string{
|
|
"host": "*",
|
|
"database": "mydb",
|
|
"user": "admin",
|
|
"mode": "readonly",
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, ex := range examples {
|
|
t.Run(ex.input, func(t *testing.T) {
|
|
fields, err := parseFields(ex.input)
|
|
assert.Equal(t, ex.err, err)
|
|
assert.Equal(t, ex.vals, fields)
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_parseMetadata(t *testing.T) {
|
|
examples := []struct {
|
|
input string
|
|
err string
|
|
check func(meta *Metadata) bool
|
|
}{
|
|
{
|
|
input: `--pgweb: `,
|
|
err: `host field must be set`,
|
|
},
|
|
{
|
|
input: `--pgweb: hello="world"`,
|
|
err: `unknown key: "hello"`,
|
|
},
|
|
{
|
|
input: `--pgweb: host="localhost" user="anyuser" database="anydb" mode="foo"`,
|
|
err: `invalid "mode" field value: "foo"`,
|
|
},
|
|
{
|
|
input: "--pgweb2:",
|
|
check: func(m *Metadata) bool {
|
|
return m == nil
|
|
},
|
|
},
|
|
{
|
|
input: `--pgweb: host="localhost"`,
|
|
check: func(m *Metadata) bool {
|
|
return m.Host.value == "localhost" &&
|
|
m.User.value == "*" &&
|
|
m.Database.value == "*" &&
|
|
m.Mode.value == "*" &&
|
|
m.Timeout == nil
|
|
},
|
|
},
|
|
{
|
|
input: `--pgweb: host="localhost" user="anyuser" database="anydb" mode="*"`,
|
|
check: func(m *Metadata) bool {
|
|
return m.Host.value == "localhost" &&
|
|
m.Host.re == nil &&
|
|
m.User.value == "anyuser" &&
|
|
m.Database.value == "anydb" &&
|
|
m.Mode.value == "*" &&
|
|
m.Timeout == nil
|
|
},
|
|
},
|
|
{
|
|
input: `--pgweb: host="localhost" timeout="foo"`,
|
|
err: `error initializing "timeout" field: strconv.Atoi: parsing "foo": invalid syntax`,
|
|
},
|
|
{
|
|
input: `-- pgweb: host="local(host|dev)"`,
|
|
check: func(m *Metadata) bool {
|
|
return m.Host.value == "local(host|dev)" && m.Host.re != nil &&
|
|
m.Host.matches("localhost") && m.Host.matches("localdev") &&
|
|
!m.Host.matches("localfoo") && !m.Host.matches("superlocaldev")
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, ex := range examples {
|
|
t.Run(ex.input, func(t *testing.T) {
|
|
meta, err := parseMetadata(ex.input)
|
|
if ex.err != "" {
|
|
assert.Contains(t, err.Error(), ex.err)
|
|
}
|
|
if ex.check != nil {
|
|
assert.Equal(t, true, ex.check(meta))
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_sanitizeMetadata(t *testing.T) {
|
|
examples := []struct {
|
|
input string
|
|
output string
|
|
}{
|
|
{input: "", output: ""},
|
|
{input: "foo", output: "foo"},
|
|
{
|
|
input: `
|
|
-- pgweb: metadata
|
|
query1
|
|
-- pgweb: more metadata
|
|
|
|
query2
|
|
|
|
`,
|
|
output: "query1\nquery2",
|
|
},
|
|
}
|
|
|
|
for _, ex := range examples {
|
|
t.Run(ex.input, func(t *testing.T) {
|
|
assert.Equal(t, ex.output, sanitizeMetadata(ex.input))
|
|
})
|
|
}
|
|
}
|