11import { describe , test , expect , it } from "vitest" ;
2- import { GenericDocument } from "convex/server" ;
2+ import { GenericDocument , SearchIndex } from "convex/server" ;
33import {
44 Filter ,
55 FilterByIndex ,
@@ -21,7 +21,6 @@ import {
2121 validateIndexFilter ,
2222 validateSearchIndexFilter ,
2323} from "./filters" ;
24- import { SearchIndex } from "../../../../../convex/dist/internal-cjs-types/server" ;
2524
2625const samplePage : GenericDocument [ ] = [
2726 { variableType : "stringValue" } ,
@@ -572,6 +571,86 @@ describe("filters", () => {
572571 ] ) ;
573572 } ) ;
574573
574+ it ( "should apply search index filters with undefined values" , ( ) => {
575+ const mockBuilder = new MockSearchBuilder ( ) ;
576+ const searchString = "test search" ;
577+ const searchIndexFilters = [
578+ { field : "organizationId" , enabled : true , value : undefined } ,
579+ ] ;
580+ const selectedIndex : SearchIndex = {
581+ indexDescriptor : "testSearchIndex" ,
582+ searchField : "description" ,
583+ filterFields : [ "userId" , "organizationId" ] ,
584+ } ;
585+
586+ applySearchIndexFilters (
587+ mockBuilder as any ,
588+ searchString ,
589+ searchIndexFilters ,
590+ selectedIndex ,
591+ ) ;
592+
593+ expect ( mockBuilder . operations ) . toEqual ( [
594+ { op : "search" , field : "description" , value : "test search" } ,
595+ { op : "eq" , field : "organizationId" , value : undefined } ,
596+ ] ) ;
597+ } ) ;
598+
599+ it ( "should apply search index filters with JSON-serialized values" , ( ) => {
600+ const mockBuilder = new MockSearchBuilder ( ) ;
601+ const searchString = "test search" ;
602+ const searchIndexFilters = [
603+ { field : "userId" , enabled : true , value : { $integer : "AQAAAAAAAAA=" } } ,
604+ ] ;
605+ const selectedIndex : SearchIndex = {
606+ indexDescriptor : "testSearchIndex" ,
607+ searchField : "description" ,
608+ filterFields : [ "userId" , "organizationId" ] ,
609+ } ;
610+
611+ applySearchIndexFilters (
612+ mockBuilder as any ,
613+ searchString ,
614+ searchIndexFilters ,
615+ selectedIndex ,
616+ ) ;
617+
618+ expect ( mockBuilder . operations ) . toEqual ( [
619+ { op : "search" , field : "description" , value : "test search" } ,
620+ { op : "eq" , field : "userId" , value : BigInt ( 1 ) } ,
621+ ] ) ;
622+ } ) ;
623+
624+ it ( "should apply search index filters with value = undefined" , ( ) => {
625+ const mockBuilder = new MockSearchBuilder ( ) ;
626+ const searchString = "test search" ;
627+ const searchIndexFilters = [
628+ {
629+ field : "userId" ,
630+ enabled : true ,
631+ value :
632+ "__CONVEX_PLACEHOLDER_undefined_I23atX0jcndVbFgXoQZffsih7eAqktCyFjgUuAeNBtfr3ySOljPSPSEOPFgprkdBO3zXNiGEJxmJ5ZFPc5C5qKesG80QRPvlJe8vgSxAt9feLTwxTg4PHfVwUaTEJU67FDwldWmTxp1guMPwxQ2jOuhEryTBf3mQ" ,
633+ } ,
634+ ] ;
635+ const selectedIndex : SearchIndex = {
636+ indexDescriptor : "testSearchIndex" ,
637+ searchField : "description" ,
638+ filterFields : [ "userId" , "organizationId" ] ,
639+ } ;
640+
641+ applySearchIndexFilters (
642+ mockBuilder as any ,
643+ searchString ,
644+ searchIndexFilters ,
645+ selectedIndex ,
646+ ) ;
647+
648+ expect ( mockBuilder . operations ) . toEqual ( [
649+ { op : "search" , field : "description" , value : "test search" } ,
650+ { op : "eq" , field : "userId" , value : undefined } ,
651+ ] ) ;
652+ } ) ;
653+
575654 it ( "should only apply filters for fields that exist in the filter" , ( ) => {
576655 const mockBuilder = new MockSearchBuilder ( ) ;
577656 const searchString = "test search" ;
@@ -782,7 +861,7 @@ describe("filters", () => {
782861 const result = validateSearchIndexFilter (
783862 indexName ,
784863 [
785- { field : "userId" , enabled : true , value : BigInt ( 123 ) } ,
864+ { field : "userId" , enabled : true , value : 123 } ,
786865 { field : "organization" , enabled : true , value : "exampleOrg" } ,
787866 ] ,
788867 selectedIndex ,
@@ -818,7 +897,7 @@ describe("filters", () => {
818897 const result = validateSearchIndexFilter (
819898 indexName ,
820899 [
821- { field : "userId" , enabled : true , value : BigInt ( 123 ) } ,
900+ { field : "userId" , enabled : true , value : 123 } ,
822901 { field : "organization" , enabled : true , value : "exampleOrg" } ,
823902 ] ,
824903 selectedIndex ,
@@ -842,7 +921,7 @@ describe("filters", () => {
842921 const result = validateSearchIndexFilter (
843922 indexName ,
844923 [
845- { field : "userId" , enabled : true , value : BigInt ( 123 ) } ,
924+ { field : "userId" , enabled : true , value : 123 } ,
846925 { field : "organization" , enabled : false , value : "exampleOrg" } ,
847926 ] ,
848927 selectedIndex ,
@@ -889,8 +968,8 @@ describe("filters", () => {
889968 const result = validateSearchIndexFilter (
890969 indexName ,
891970 [
892- { field : "userId" , enabled : true , value : BigInt ( 123 ) } ,
893- { field : "userId" , enabled : true , value : BigInt ( 123 ) } ,
971+ { field : "userId" , enabled : true , value : 123 } ,
972+ { field : "userId" , enabled : true , value : 123 } ,
894973 ] ,
895974 selectedIndex ,
896975 "asc" ,
@@ -912,8 +991,8 @@ describe("filters", () => {
912991 const result = validateSearchIndexFilter (
913992 indexName ,
914993 [
915- { field : "userId" , enabled : true , value : BigInt ( 123 ) } ,
916- { field : "userId" , enabled : false , value : BigInt ( 456 ) } ,
994+ { field : "userId" , enabled : true , value : 123 } ,
995+ { field : "userId" , enabled : false , value : 456 } ,
917996 ] ,
918997 selectedIndex ,
919998 "asc" ,
0 commit comments