2024-02-19 16:55:34 +02:00
package dbutils_test
import (
"testing"
"github.com/pocketbase/pocketbase/tools/dbutils"
)
2024-09-29 19:23:19 +03:00
func TestJSONEach ( t * testing . T ) {
result := dbutils . JSONEach ( "a.b" )
2024-02-19 16:55:34 +02:00
expected := "json_each(CASE WHEN json_valid([[a.b]]) THEN [[a.b]] ELSE json_array([[a.b]]) END)"
if result != expected {
t . Fatalf ( "Expected\n%v\ngot\n%v" , expected , result )
}
}
2024-09-29 19:23:19 +03:00
func TestJSONArrayLength ( t * testing . T ) {
result := dbutils . JSONArrayLength ( "a.b" )
2024-02-19 16:55:34 +02:00
expected := "json_array_length(CASE WHEN json_valid([[a.b]]) THEN [[a.b]] ELSE (CASE WHEN [[a.b]] = '' OR [[a.b]] IS NULL THEN json_array() ELSE json_array([[a.b]]) END) END)"
if result != expected {
t . Fatalf ( "Expected\n%v\ngot\n%v" , expected , result )
}
}
2024-09-29 19:23:19 +03:00
func TestJSONExtract ( t * testing . T ) {
2024-02-19 16:55:34 +02:00
scenarios := [ ] struct {
name string
column string
path string
expected string
} {
{
"empty path" ,
"a.b" ,
"" ,
"(CASE WHEN json_valid([[a.b]]) THEN JSON_EXTRACT([[a.b]], '$') ELSE JSON_EXTRACT(json_object('pb', [[a.b]]), '$.pb') END)" ,
} ,
{
"starting with array index" ,
"a.b" ,
"[1].a[2]" ,
"(CASE WHEN json_valid([[a.b]]) THEN JSON_EXTRACT([[a.b]], '$[1].a[2]') ELSE JSON_EXTRACT(json_object('pb', [[a.b]]), '$.pb[1].a[2]') END)" ,
} ,
{
"starting with key" ,
"a.b" ,
"a.b[2].c" ,
"(CASE WHEN json_valid([[a.b]]) THEN JSON_EXTRACT([[a.b]], '$.a.b[2].c') ELSE JSON_EXTRACT(json_object('pb', [[a.b]]), '$.pb.a.b[2].c') END)" ,
} ,
}
for _ , s := range scenarios {
t . Run ( s . name , func ( t * testing . T ) {
2024-09-29 19:23:19 +03:00
result := dbutils . JSONExtract ( s . column , s . path )
2024-02-19 16:55:34 +02:00
if result != s . expected {
t . Fatalf ( "Expected\n%v\ngot\n%v" , s . expected , result )
}
} )
}
}