@@ -9,6 +9,17 @@ const pathToApp = resolve(
99 "app.js"
1010) ;
1111
12+ const testServerUrl = "http://localhost:5874" ;
13+
14+ let token ;
15+ t . beforeEach ( async ( ) => {
16+ const response = await fetch ( `${ testServerUrl } /api/runtime/apps` , {
17+ method : "POST" ,
18+ } ) ;
19+ const body = await response . json ( ) ;
20+ token = body . token ;
21+ } ) ;
22+
1223t . test ( "it blocks in blocking mode" , ( t ) => {
1324 const server = spawn ( `node` , [ pathToApp , "4000" ] , {
1425 env : { ...process . env , AIKIDO_DEBUG : "true" , AIKIDO_BLOCKING : "true" } ,
@@ -144,3 +155,86 @@ t.test("it does not block in dry mode", (t) => {
144155 server . kill ( ) ;
145156 } ) ;
146157} ) ;
158+
159+ t . setTimeout ( 80000 ) ;
160+
161+ t . test (
162+ "it increments sqlTokenizationFailures counter for invalid SQL queries" ,
163+ ( t ) => {
164+ const server = spawn ( `node` , [ pathToApp , "4003" ] , {
165+ env : {
166+ ...process . env ,
167+ AIKIDO_DEBUG : "true" ,
168+ AIKIDO_BLOCKING : "true" ,
169+ AIKIDO_TOKEN : token ,
170+ AIKIDO_ENDPOINT : testServerUrl ,
171+ AIKIDO_REALTIME_ENDPOINT : testServerUrl ,
172+ } ,
173+ } ) ;
174+
175+ server . on ( "close" , ( ) => {
176+ t . end ( ) ;
177+ } ) ;
178+
179+ server . on ( "error" , ( err ) => {
180+ t . fail ( err ) ;
181+ } ) ;
182+
183+ let stdout = "" ;
184+ server . stdout . on ( "data" , ( data ) => {
185+ stdout += data . toString ( ) ;
186+ } ) ;
187+
188+ let stderr = "" ;
189+ server . stderr . on ( "data" , ( data ) => {
190+ stderr += data . toString ( ) ;
191+ } ) ;
192+
193+ // Wait for the server to start
194+ timeout ( 2000 )
195+ . then ( ( ) => {
196+ return fetch (
197+ `http://localhost:4003/invalid-query?sql=${ encodeURIComponent ( "SELECT * FROM test" ) } ` ,
198+ {
199+ signal : AbortSignal . timeout ( 5000 ) ,
200+ method : "POST" ,
201+ }
202+ ) ;
203+ } )
204+ . then ( ( response ) => {
205+ return response . text ( ) ;
206+ } )
207+ . then ( ( responseText ) => {
208+ t . match ( responseText , / Y o u h a v e a n e r r o r i n y o u r S Q L s y n t a x / ) ;
209+
210+ // Wait for the heartbeat event to be sent
211+ return timeout ( 60000 ) ;
212+ } )
213+ . then ( ( ) => {
214+ return fetch ( `${ testServerUrl } /api/runtime/events` , {
215+ method : "GET" ,
216+ headers : {
217+ Authorization : token ,
218+ } ,
219+ signal : AbortSignal . timeout ( 5000 ) ,
220+ } ) ;
221+ } )
222+ . then ( ( response ) => {
223+ return response . json ( ) ;
224+ } )
225+ . then ( ( events ) => {
226+ const heartbeatEvents = events . filter (
227+ ( event ) => event . type === "heartbeat"
228+ ) ;
229+ t . same ( heartbeatEvents . length , 1 ) ;
230+ const [ heartbeat ] = heartbeatEvents ;
231+ t . equal ( heartbeat . stats . sqlTokenizationFailures , 1 ) ;
232+ } )
233+ . catch ( ( error ) => {
234+ t . error ( error ) ;
235+ } )
236+ . finally ( ( ) => {
237+ server . kill ( ) ;
238+ } ) ;
239+ }
240+ ) ;
0 commit comments