@@ -209,243 +209,6 @@ describe('GrepSearch', () => {
209209 } )
210210 } )
211211
212- describe ( 'executeRipgrep' , ( ) => {
213- beforeEach ( async ( ) => {
214- // Setup the run method to return a successful result
215- const mockRun = sandbox . stub ( ) . resolves ( { stdout : 'search-results' , stderr : '' , exitCode : 0 } )
216- sandbox . stub ( ChildProcess . prototype , 'run' ) . callsFake ( mockRun )
217- } )
218-
219- it ( 'should use case insensitive search by default' , async ( ) => {
220- const grepSearch = new GrepSearch ( {
221- query : 'test-query' ,
222- path : '/test/path' ,
223- } )
224-
225- // Mock processRipgrepOutput
226- sandbox . stub ( grepSearch as any , 'processRipgrepOutput' ) . returns ( {
227- sanitizedOutput : 'processed-results' ,
228- totalMatchCount : 5 ,
229- } )
230-
231- // Get the existing stub
232- // eslint-disable-next-line @typescript-eslint/unbound-method
233- const runStub = ChildProcess . prototype . run as sinon . SinonStub
234-
235- await ( grepSearch as any ) . executeRipgrep ( )
236-
237- // Check the arguments passed to the stub
238- const args = runStub . getCall ( 0 ) . thisValue . args
239- assert . ok ( args . includes ( '-i' ) , 'Should include -i flag for case insensitive search' )
240- } )
241-
242- it ( 'should use case sensitive search when specified' , async ( ) => {
243- // Create a new sandbox for this test
244- sandbox . restore ( )
245- sandbox = sinon . createSandbox ( )
246-
247- // Setup the stub again for this test
248- const mockRun = sandbox . stub ( ) . resolves ( { stdout : 'search-results' , stderr : '' , exitCode : 0 } )
249- sandbox . stub ( ChildProcess . prototype , 'run' ) . callsFake ( mockRun )
250-
251- const caseSensitiveGrepSearch = new GrepSearch ( {
252- query : 'test-query' ,
253- path : '/test/path' ,
254- caseSensitive : true ,
255- } )
256-
257- // Re-stub processRipgrepOutput for the new instance
258- sandbox . stub ( caseSensitiveGrepSearch as any , 'processRipgrepOutput' ) . returns ( {
259- sanitizedOutput : 'processed-results' ,
260- totalMatchCount : 5 ,
261- } )
262-
263- await ( caseSensitiveGrepSearch as any ) . executeRipgrep ( )
264-
265- // Get the stub after it's been called
266- // eslint-disable-next-line @typescript-eslint/unbound-method
267- const runStub = ChildProcess . prototype . run as sinon . SinonStub
268- const args = runStub . getCall ( 0 ) . thisValue . args
269- assert . ok ( ! args . includes ( '-i' ) , 'Should not include -i flag for case sensitive search' )
270- } )
271-
272- it ( 'should add include pattern when specified' , async ( ) => {
273- // Create a new sandbox for this test
274- sandbox . restore ( )
275- sandbox = sinon . createSandbox ( )
276-
277- // Setup the stub again for this test
278- const mockRun = sandbox . stub ( ) . resolves ( { stdout : 'search-results' , stderr : '' , exitCode : 0 } )
279- sandbox . stub ( ChildProcess . prototype , 'run' ) . callsFake ( mockRun )
280-
281- const includeGrepSearch = new GrepSearch ( {
282- query : 'test-query' ,
283- path : '/test/path' ,
284- includePattern : '*.ts' ,
285- } )
286-
287- // Re-stub processRipgrepOutput for the new instance
288- sandbox . stub ( includeGrepSearch as any , 'processRipgrepOutput' ) . returns ( {
289- sanitizedOutput : 'processed-results' ,
290- totalMatchCount : 5 ,
291- } )
292-
293- await ( includeGrepSearch as any ) . executeRipgrep ( )
294-
295- // Get the stub after it's been called
296- // eslint-disable-next-line @typescript-eslint/unbound-method
297- const runStub = ChildProcess . prototype . run as sinon . SinonStub
298- const args = runStub . getCall ( 0 ) . thisValue . args
299- const globIndex = args . indexOf ( '--glob' )
300- assert . ok ( globIndex !== - 1 , 'Should include --glob flag' )
301- assert . strictEqual ( args [ globIndex + 1 ] , '*.ts' , 'Should include the pattern' )
302- } )
303-
304- it ( 'should add exclude pattern when specified' , async ( ) => {
305- // Create a new sandbox for this test
306- sandbox . restore ( )
307- sandbox = sinon . createSandbox ( )
308-
309- // Setup the stub again for this test
310- const mockRun = sandbox . stub ( ) . resolves ( { stdout : 'search-results' , stderr : '' , exitCode : 0 } )
311- sandbox . stub ( ChildProcess . prototype , 'run' ) . callsFake ( mockRun )
312-
313- const excludeGrepSearch = new GrepSearch ( {
314- query : 'test-query' ,
315- path : '/test/path' ,
316- excludePattern : '*.log' ,
317- } )
318-
319- // Re-stub processRipgrepOutput for the new instance
320- sandbox . stub ( excludeGrepSearch as any , 'processRipgrepOutput' ) . returns ( {
321- sanitizedOutput : 'processed-results' ,
322- totalMatchCount : 5 ,
323- } )
324-
325- await ( excludeGrepSearch as any ) . executeRipgrep ( )
326-
327- // Get the stub after it's been called
328- // eslint-disable-next-line @typescript-eslint/unbound-method
329- const runStub = ChildProcess . prototype . run as sinon . SinonStub
330- const args = runStub . getCall ( 0 ) . thisValue . args
331- const globIndex = args . indexOf ( '--glob' )
332- assert . ok ( globIndex !== - 1 , 'Should include --glob flag' )
333- assert . strictEqual ( args [ globIndex + 1 ] , '!*.log' , 'Should include the negated pattern' )
334- } )
335-
336- it ( 'should handle multiple include patterns' , async ( ) => {
337- // Create a new sandbox for this test
338- sandbox . restore ( )
339- sandbox = sinon . createSandbox ( )
340-
341- // Setup the stub again for this test
342- const mockRun = sandbox . stub ( ) . resolves ( { stdout : 'search-results' , stderr : '' , exitCode : 0 } )
343- sandbox . stub ( ChildProcess . prototype , 'run' ) . callsFake ( mockRun )
344-
345- const multiIncludeGrepSearch = new GrepSearch ( {
346- query : 'test-query' ,
347- path : '/test/path' ,
348- includePattern : '*.ts, *.js' ,
349- } )
350-
351- // Re-stub processRipgrepOutput for the new instance
352- sandbox . stub ( multiIncludeGrepSearch as any , 'processRipgrepOutput' ) . returns ( {
353- sanitizedOutput : 'processed-results' ,
354- totalMatchCount : 5 ,
355- } )
356-
357- await ( multiIncludeGrepSearch as any ) . executeRipgrep ( )
358-
359- // Get the stub after it's been called
360- // eslint-disable-next-line @typescript-eslint/unbound-method
361- const runStub = ChildProcess . prototype . run as sinon . SinonStub
362- const args = runStub . getCall ( 0 ) . thisValue . args
363-
364- // Check for both patterns
365- const globIndices = args . reduce ( ( indices : number [ ] , arg : string , index : number ) => {
366- if ( arg === '--glob' ) {
367- indices . push ( index )
368- }
369- return indices
370- } , [ ] )
371-
372- assert . strictEqual ( globIndices . length , 2 , 'Should have two --glob flags' )
373- assert . strictEqual ( args [ globIndices [ 0 ] + 1 ] , '*.ts' , 'First pattern should be *.ts' )
374- assert . strictEqual ( args [ globIndices [ 1 ] + 1 ] , '*.js' , 'Second pattern should be *.js' )
375- } )
376-
377- it ( 'should handle multiple exclude patterns' , async ( ) => {
378- // Create a new sandbox for this test
379- sandbox . restore ( )
380- sandbox = sinon . createSandbox ( )
381-
382- // Setup the stub again for this test
383- const mockRun = sandbox . stub ( ) . resolves ( { stdout : 'search-results' , stderr : '' , exitCode : 0 } )
384- sandbox . stub ( ChildProcess . prototype , 'run' ) . callsFake ( mockRun )
385-
386- const multiExcludeGrepSearch = new GrepSearch ( {
387- query : 'test-query' ,
388- path : '/test/path' ,
389- excludePattern : '*.log, *.tmp' ,
390- } )
391-
392- // Re-stub processRipgrepOutput for the new instance
393- sandbox . stub ( multiExcludeGrepSearch as any , 'processRipgrepOutput' ) . returns ( {
394- sanitizedOutput : 'processed-results' ,
395- totalMatchCount : 5 ,
396- } )
397-
398- await ( multiExcludeGrepSearch as any ) . executeRipgrep ( )
399-
400- // Get the stub after it's been called
401- // eslint-disable-next-line @typescript-eslint/unbound-method
402- const runStub = ChildProcess . prototype . run as sinon . SinonStub
403- const args = runStub . getCall ( 0 ) . thisValue . args
404-
405- // Check for both patterns
406- const globIndices = args . reduce ( ( indices : number [ ] , arg : string , index : number ) => {
407- if ( arg === '--glob' ) {
408- indices . push ( index )
409- }
410- return indices
411- } , [ ] )
412-
413- assert . strictEqual ( globIndices . length , 2 , 'Should have two --glob flags' )
414- assert . strictEqual ( args [ globIndices [ 0 ] + 1 ] , '!*.log' , 'First pattern should be !*.log' )
415- assert . strictEqual ( args [ globIndices [ 1 ] + 1 ] , '!*.tmp' , 'Second pattern should be !*.tmp' )
416- } )
417-
418- it ( 'should handle ripgrep exit code 1 (no matches)' , async ( ) => {
419- sandbox . restore ( )
420- sandbox = sinon . createSandbox ( )
421-
422- // Setup ChildProcess to simulate exit code 1 (no matches found)
423- const error = new Error ( )
424- error . name = 'ChildProcessError'
425- ; ( error as any ) . code = 1
426-
427- sandbox . stub ( ChildProcess . prototype , 'run' ) . rejects ( error )
428-
429- const grepSearch = new GrepSearch ( {
430- query : 'no-matches-query' ,
431- path : '/test/path' ,
432- } )
433-
434- // Mock processRipgrepOutput for empty results
435- sandbox . stub ( grepSearch as any , 'processRipgrepOutput' ) . returns ( {
436- sanitizedOutput : 'No matches found.' ,
437- totalMatchCount : 0 ,
438- } )
439-
440- // This should not throw an error since code 1 is handled in rejectOnErrorCode
441- const result = await grepSearch . invoke ( )
442-
443- // Should still return a valid output
444- assert . deepStrictEqual ( result . output . kind , OutputKind . Text )
445- assert . deepStrictEqual ( result . output . content , 'No matches found.' )
446- } )
447- } )
448-
449212 describe ( 'processRipgrepOutput' , ( ) => {
450213 let grepSearch : GrepSearch
451214
0 commit comments