@@ -157,6 +157,96 @@ describe('ValueDataSource — find', () => {
157157 } ) ;
158158} ) ;
159159
160+ // ---------------------------------------------------------------------------
161+ // AST-format filter support
162+ // ---------------------------------------------------------------------------
163+
164+ describe ( 'ValueDataSource — AST filter' , ( ) => {
165+ it ( 'should filter with simple AST equality condition' , async ( ) => {
166+ const ds = createDS ( ) ;
167+ const result = await ds . find ( 'users' , {
168+ $filter : [ 'role' , '=' , 'admin' ] as any ,
169+ } ) ;
170+ expect ( result . data ) . toHaveLength ( 2 ) ;
171+ expect ( result . data . every ( ( r : any ) => r . role === 'admin' ) ) . toBe ( true ) ;
172+ } ) ;
173+
174+ it ( 'should filter with AST "in" operator' , async ( ) => {
175+ const ds = createDS ( ) ;
176+ const result = await ds . find ( 'users' , {
177+ $filter : [ 'role' , 'in' , [ 'admin' , 'guest' ] ] as any ,
178+ } ) ;
179+ expect ( result . data ) . toHaveLength ( 3 ) ;
180+ } ) ;
181+
182+ it ( 'should filter with AST "and" logical operator' , async ( ) => {
183+ const ds = createDS ( ) ;
184+ const result = await ds . find ( 'users' , {
185+ $filter : [ 'and' , [ 'role' , '=' , 'admin' ] , [ 'age' , '>' , 30 ] ] as any ,
186+ } ) ;
187+ expect ( result . data ) . toHaveLength ( 1 ) ;
188+ expect ( result . data [ 0 ] . name ) . toBe ( 'Charlie' ) ;
189+ } ) ;
190+
191+ it ( 'should filter with AST "or" logical operator' , async ( ) => {
192+ const ds = createDS ( ) ;
193+ const result = await ds . find ( 'users' , {
194+ $filter : [ 'or' , [ 'role' , '=' , 'guest' ] , [ 'name' , '=' , 'Alice' ] ] as any ,
195+ } ) ;
196+ expect ( result . data ) . toHaveLength ( 2 ) ;
197+ } ) ;
198+
199+ it ( 'should filter with AST "!=" operator' , async ( ) => {
200+ const ds = createDS ( ) ;
201+ const result = await ds . find ( 'users' , {
202+ $filter : [ 'role' , '!=' , 'admin' ] as any ,
203+ } ) ;
204+ expect ( result . data ) . toHaveLength ( 3 ) ;
205+ } ) ;
206+
207+ it ( 'should filter with AST "not in" operator' , async ( ) => {
208+ const ds = createDS ( ) ;
209+ const result = await ds . find ( 'users' , {
210+ $filter : [ 'role' , 'not in' , [ 'admin' , 'guest' ] ] as any ,
211+ } ) ;
212+ expect ( result . data ) . toHaveLength ( 2 ) ;
213+ expect ( result . data . every ( ( r : any ) => r . role === 'user' ) ) . toBe ( true ) ;
214+ } ) ;
215+
216+ it ( 'should filter with AST "contains" operator' , async ( ) => {
217+ const ds = createDS ( ) ;
218+ const result = await ds . find ( 'users' , {
219+ $filter : [ 'name' , 'contains' , 'li' ] as any ,
220+ } ) ;
221+ expect ( result . data ) . toHaveLength ( 2 ) ; // Alice, Charlie
222+ } ) ;
223+
224+ it ( 'should filter with nested AST (and with in operator)' , async ( ) => {
225+ const ds = createDS ( ) ;
226+ const result = await ds . find ( 'users' , {
227+ $filter : [ 'and' , [ 'role' , 'in' , [ 'admin' , 'user' ] ] , [ 'age' , '>=' , 28 ] ] as any ,
228+ } ) ;
229+ expect ( result . data ) . toHaveLength ( 3 ) ; // Alice (30, admin), Charlie (35, admin), Diana (28, user)
230+ } ) ;
231+
232+ it ( 'should return all items with empty AST filter' , async ( ) => {
233+ const ds = createDS ( ) ;
234+ const result = await ds . find ( 'users' , { $filter : [ ] as any } ) ;
235+ expect ( result . data ) . toHaveLength ( 5 ) ;
236+ } ) ;
237+
238+ it ( 'should combine AST filter with sort' , async ( ) => {
239+ const ds = createDS ( ) ;
240+ const result = await ds . find ( 'users' , {
241+ $filter : [ 'role' , '=' , 'admin' ] as any ,
242+ $orderby : { age : 'asc' } ,
243+ } ) ;
244+ expect ( result . data ) . toHaveLength ( 2 ) ;
245+ expect ( result . data [ 0 ] . name ) . toBe ( 'Alice' ) ;
246+ expect ( result . data [ 1 ] . name ) . toBe ( 'Charlie' ) ;
247+ } ) ;
248+ } ) ;
249+
160250// ---------------------------------------------------------------------------
161251// findOne
162252// ---------------------------------------------------------------------------
0 commit comments