tag filter supports selecting both included and excluded tags simultaneously

This commit is contained in:
MaysWind
2025-11-24 02:12:44 +08:00
parent 45be96cf68
commit 6430a52027
45 changed files with 1151 additions and 706 deletions
+26
View File
@@ -0,0 +1,26 @@
package validators
import (
"github.com/go-playground/validator/v10"
"github.com/mayswind/ezbookkeeping/pkg/models"
)
// ValidTagFilter returns whether the given tag filter is valid
func ValidTagFilter(fl validator.FieldLevel) bool {
if value, ok := fl.Field().Interface().(string); ok {
if value == "" {
return true
}
if value == models.TransactionNoTagFilterValue {
return true
}
_, err := models.ParseTransactionTagFilter(value)
return err == nil
}
return false
}
+104
View File
@@ -0,0 +1,104 @@
package validators
import (
"testing"
"github.com/go-playground/validator/v10"
"github.com/stretchr/testify/assert"
)
func TestEmptyTagFilter(t *testing.T) {
validate := validator.New()
err := validate.RegisterValidation("validTagFilter", ValidTagFilter)
assert.Nil(t, err)
err = validate.Var("", "validTagFilter")
assert.Nil(t, err)
}
func TestNoTag(t *testing.T) {
validate := validator.New()
err := validate.RegisterValidation("validTagFilter", ValidTagFilter)
assert.Nil(t, err)
err = validate.Var("none", "validTagFilter")
assert.Nil(t, err)
}
func TestNoValidFilter(t *testing.T) {
validate := validator.New()
err := validate.RegisterValidation("validTagFilter", ValidTagFilter)
assert.Nil(t, err)
err = validate.Var(";", "validTagFilter")
assert.NotNil(t, err)
err = validate.Var(";;", "validTagFilter")
assert.NotNil(t, err)
}
func TestValidOneFilterInTagFilters(t *testing.T) {
validate := validator.New()
err := validate.RegisterValidation("validTagFilter", ValidTagFilter)
assert.Nil(t, err)
err = validate.Var("0:1", "validTagFilter")
assert.Nil(t, err)
err = validate.Var("0:1,2,3", "validTagFilter")
assert.Nil(t, err)
err = validate.Var("1:1,2,3", "validTagFilter")
assert.Nil(t, err)
err = validate.Var("2:1,2,3", "validTagFilter")
assert.Nil(t, err)
err = validate.Var("3:1,2,3", "validTagFilter")
assert.Nil(t, err)
}
func TestInvalidTagFilterType(t *testing.T) {
validate := validator.New()
err := validate.RegisterValidation("validTagFilter", ValidTagFilter)
assert.Nil(t, err)
err = validate.Var("a:1,2,3", "validTagFilter")
assert.NotNil(t, err)
err = validate.Var("-1:1,2,3", "validTagFilter")
assert.NotNil(t, err)
err = validate.Var("4:1,2,3", "validTagFilter")
assert.NotNil(t, err)
}
func TestNoTagIdsInFilter(t *testing.T) {
validate := validator.New()
err := validate.RegisterValidation("validTagFilter", ValidTagFilter)
assert.Nil(t, err)
err = validate.Var("0", "validTagFilter")
assert.NotNil(t, err)
err = validate.Var("0:", "validTagFilter")
assert.NotNil(t, err)
}
func TestInvalidTagIdsInFilter(t *testing.T) {
validate := validator.New()
err := validate.RegisterValidation("validTagFilter", ValidTagFilter)
assert.Nil(t, err)
err = validate.Var("0:abc", "validTagFilter")
assert.NotNil(t, err)
}
func TestValidTwoFilterInTagFilters(t *testing.T) {
validate := validator.New()
err := validate.RegisterValidation("validTagFilter", ValidTagFilter)
assert.Nil(t, err)
err = validate.Var("0:1,2,3;2:4,5,6", "validTagFilter")
assert.Nil(t, err)
}