2
2
3
3
import { expect , test , describe } from "vitest" ;
4
4
import Fastify from "fastify" ;
5
- import fastifyPlugin from "../src/pluginApi " ;
5
+ import qs from "qs " ;
6
6
import * as path from "node:path" ;
7
+ import fastifyPlugin from "../src/pluginApi" ;
7
8
import { MykomapRouterConfig } from "../src/routes" ;
8
9
9
10
const opts : MykomapRouterConfig = {
@@ -12,7 +13,7 @@ const opts: MykomapRouterConfig = {
12
13
} ,
13
14
} ;
14
15
15
- const fastify = Fastify ( ) ;
16
+ const fastify = Fastify ( { querystringParser : ( str ) => qs . parse ( str ) } ) ;
16
17
fastify . register ( fastifyPlugin , opts ) ;
17
18
18
19
// Note: see src/api/contract.ts in the @mykomap /common module for definitions
@@ -30,6 +31,7 @@ describe("getDatasetLocations", () => {
30
31
expect ( res . json ( ) ) . toStrictEqual ( [
31
32
[ - 0.12783 , 51.50748 ] ,
32
33
[ 3.92473 , 46.85045 ] ,
34
+ null ,
33
35
] ) ;
34
36
} ) ;
35
37
} ) ;
@@ -89,8 +91,6 @@ describe("searchDataset", () => {
89
91
} ) ;
90
92
91
93
test . each ( [
92
- "filter=country_id:GB" ,
93
- "filter=country_id:GB&filter=typology:BMT20" ,
94
94
"filter=country_id:GB&filter=typology:BMT20" ,
95
95
"text=1+West+Street" ,
96
96
"filter=country_id:GB&text=1+West+Street" ,
@@ -127,6 +127,71 @@ describe("searchDataset", () => {
127
127
expect ( res . json ( ) ) . toStrictEqual ( [ "@0" , "@1" ] ) ;
128
128
} ,
129
129
) ;
130
+
131
+ test . each ( [ "returnProps[]=name&page=0&pageSize=2" ] ) (
132
+ "Paginated search query '%s' returns the first 2 items" ,
133
+ async ( query ) => {
134
+ const res = await fastify . inject ( {
135
+ method : "GET" ,
136
+ url : `/dataset/dataset-A/search?${ query } ` ,
137
+ } ) ;
138
+ expect ( res . statusCode ) . toBe ( 200 ) ;
139
+ expect ( res . json ( ) ) . toStrictEqual ( [
140
+ { index : "@0" , name : "Apples Co-op" } ,
141
+ { index : "@1" , name : "Pears United" } ,
142
+ ] ) ;
143
+ } ,
144
+ ) ;
145
+
146
+ test . each ( [ "returnProps[]=name&page=1&pageSize=2" ] ) (
147
+ "Paginated search query '%s' returns the final item" ,
148
+ async ( query ) => {
149
+ const res = await fastify . inject ( {
150
+ method : "GET" ,
151
+ url : `/dataset/dataset-A/search?${ query } ` ,
152
+ } ) ;
153
+ expect ( res . statusCode ) . toBe ( 200 ) ;
154
+ expect ( res . json ( ) ) . toStrictEqual ( [
155
+ { index : "@2" , name : "Invisible Collab" } ,
156
+ ] ) ;
157
+ } ,
158
+ ) ;
159
+
160
+ test . each ( [
161
+ "returnProps[]=name" ,
162
+ "returnProps[]=name&pageSize=2" ,
163
+ "returnProps[]=name&page=0" ,
164
+ ] ) (
165
+ "Search query '%s' with unspecified pagination params returns all items" ,
166
+ async ( query ) => {
167
+ const res = await fastify . inject ( {
168
+ method : "GET" ,
169
+ url : `/dataset/dataset-A/search?${ query } ` ,
170
+ } ) ;
171
+ expect ( res . statusCode ) . toBe ( 200 ) ;
172
+ expect ( res . json ( ) ) . toStrictEqual ( [
173
+ { index : "@0" , name : "Apples Co-op" } ,
174
+ { index : "@1" , name : "Pears United" } ,
175
+ { index : "@2" , name : "Invisible Collab" } ,
176
+ ] ) ;
177
+ } ,
178
+ ) ;
179
+
180
+ test . each ( [
181
+ "page=-1&pageSize=2" ,
182
+ "page=1&pageSize=0" ,
183
+ "page=0.5&pageSize=2" ,
184
+ "page=1&pageSize=1.5" ,
185
+ ] ) (
186
+ "Paginated search query '%s' with bad params returns status code 400" ,
187
+ async ( query ) => {
188
+ const res = await fastify . inject ( {
189
+ method : "GET" ,
190
+ url : `/dataset/dataset-A/search?${ query } ` ,
191
+ } ) ;
192
+ expect ( res . statusCode ) . toBe ( 400 ) ;
193
+ } ,
194
+ ) ;
130
195
} ) ;
131
196
132
197
describe ( "dataset does not exist" , ( ) => {
0 commit comments