1
0
Fork 0
golang-github-blevesearch-b.../search/sort_test.go
Daniel Baumann 982828099e
Adding upstream version 2.5.1.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-19 00:20:02 +02:00

338 lines
6.5 KiB
Go

package search
import (
"reflect"
"testing"
)
func TestParseSearchSortObj(t *testing.T) {
tests := []struct {
name string
input map[string]interface{}
want SearchSort
wantErr bool
}{
{
name: "sort by id",
input: map[string]interface{}{
"by": "id",
"desc": false,
},
want: &SortDocID{
Desc: false,
},
wantErr: false,
},
{
name: "sort by id descending",
input: map[string]interface{}{
"by": "id",
"desc": true,
},
want: &SortDocID{
Desc: true,
},
wantErr: false,
},
{
name: "sort by score",
input: map[string]interface{}{
"by": "score",
"desc": false,
},
want: &SortScore{
Desc: false,
},
wantErr: false,
},
{
name: "sort by score descending",
input: map[string]interface{}{
"by": "score",
"desc": true,
},
want: &SortScore{
Desc: true,
},
wantErr: false,
},
{
name: "sort by geo_distance",
input: map[string]interface{}{
"by": "geo_distance",
"field": "location",
"location": map[string]interface{}{
"lon": 1.0,
"lat": 2.0,
},
"unit": "km",
"desc": false,
},
want: &SortGeoDistance{
Field: "location",
Desc: false,
Lon: 1.0,
Lat: 2.0,
Unit: "km",
unitMult: 1000.0,
},
wantErr: false,
},
{
name: "sort by field",
input: map[string]interface{}{
"by": "field",
"field": "name",
"desc": false,
"type": "auto",
"mode": "default",
"missing": "last",
},
want: &SortField{
Field: "name",
Desc: false,
Type: SortFieldAuto,
Mode: SortFieldDefault,
Missing: SortFieldMissingLast,
},
wantErr: false,
},
{
name: "sort by field with missing",
input: map[string]interface{}{
"by": "field",
"field": "name",
"desc": false,
"type": "auto",
"mode": "default",
"missing": "first",
},
want: &SortField{
Field: "name",
Desc: false,
Type: SortFieldAuto,
Mode: SortFieldDefault,
Missing: SortFieldMissingFirst,
},
wantErr: false,
},
{
name: "sort by field descending",
input: map[string]interface{}{
"by": "field",
"field": "name",
"desc": true,
"type": "string",
"mode": "min",
"missing": "first",
},
want: &SortField{
Field: "name",
Desc: true,
Type: SortFieldAsString,
Mode: SortFieldMin,
Missing: SortFieldMissingFirst,
},
wantErr: false,
},
{
name: "missing by",
input: map[string]interface{}{
"desc": true,
},
want: nil,
wantErr: true,
},
{
name: "unknown by",
input: map[string]interface{}{
"by": "unknown",
},
want: nil,
wantErr: true,
},
{
name: "missing field for geo_distance",
input: map[string]interface{}{
"by": "geo_distance",
"location": map[string]interface{}{
"lon": 1.0,
"lat": 2.0,
},
},
want: nil,
wantErr: true,
},
{
name: "missing location for geo_distance",
input: map[string]interface{}{
"by": "geo_distance",
"field": "location",
},
want: nil,
wantErr: true,
},
{
name: "invalid unit for geo_distance",
input: map[string]interface{}{
"by": "geo_distance",
"field": "location",
"location": map[string]interface{}{
"lon": 1.0,
"lat": 2.0,
},
"unit": "invalid",
},
want: nil,
wantErr: true,
},
{
name: "missing field for field sort",
input: map[string]interface{}{
"by": "field",
},
want: nil,
wantErr: true,
},
{
name: "unknown type for field sort",
input: map[string]interface{}{
"by": "field",
"field": "name",
"type": "unknown",
},
want: nil,
wantErr: true,
},
{
name: "number type for field sort with desc",
input: map[string]interface{}{
"by": "field",
"field": "name",
"type": "number",
"mode": "default",
"desc": true,
"missing": "last",
},
want: &SortField{
Field: "name",
Desc: true,
Type: SortFieldAsNumber,
Mode: SortFieldDefault,
Missing: SortFieldMissingLast,
},
wantErr: false,
},
{
name: "date type for field sort with desc",
input: map[string]interface{}{
"by": "field",
"field": "name",
"type": "date",
"mode": "default",
"desc": true,
"missing": "last",
},
want: &SortField{
Field: "name",
Desc: true,
Type: SortFieldAsDate,
Mode: SortFieldDefault,
Missing: SortFieldMissingLast,
},
wantErr: false,
},
{
name: "unknown type for field sort with missing",
input: map[string]interface{}{
"by": "field",
"field": "name",
"type": "unknown",
"mode": "default",
"missing": "last",
},
want: nil,
wantErr: true,
},
{
name: "unknown mode for field sort",
input: map[string]interface{}{
"by": "field",
"field": "name",
"mode": "unknown",
},
want: nil,
wantErr: true,
},
{
name: "default mode for field sort",
input: map[string]interface{}{
"by": "field",
"field": "name",
"mode": "default",
},
want: &SortField{
Field: "name",
Desc: false,
Type: SortFieldAuto,
Mode: SortFieldDefault,
Missing: SortFieldMissingLast,
},
wantErr: false,
},
{
name: "max mode for field sort",
input: map[string]interface{}{
"by": "field",
"field": "name",
"mode": "max",
},
want: &SortField{
Field: "name",
Desc: false,
Type: SortFieldAuto,
Mode: SortFieldMax,
Missing: SortFieldMissingLast,
},
wantErr: false,
},
{
name: "min mode for field sort",
input: map[string]interface{}{
"by": "field",
"field": "name",
"mode": "min",
},
want: &SortField{
Field: "name",
Desc: false,
Type: SortFieldAuto,
Mode: SortFieldMin,
Missing: SortFieldMissingLast,
},
wantErr: false,
},
{
name: "unknown missing for field sort",
input: map[string]interface{}{
"by": "field",
"field": "name",
"missing": "unknown",
},
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := ParseSearchSortObj(tt.input)
if (err != nil) != tt.wantErr {
t.Errorf("ParseSearchSortObj() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("ParseSearchSortObj() = %v, want %v", got, tt.want)
}
})
}
}