1
1
/** @babel */
2
2
3
- const os = require ( 'os' ) ;
4
3
const path = require ( 'path' ) ;
5
- const temp = require ( 'temp' ) ;
4
+ const temp = require ( 'temp' ) . track ( ) ;
6
5
const fs = require ( 'fs-plus' ) ;
7
6
const { TextBuffer} = require ( 'atom' ) ;
8
7
const { PathReplacer, PathSearcher} = require ( 'scandal' ) ;
@@ -34,17 +33,17 @@ describe('OpenFilesFindView', () => {
34
33
return getExistingResultsPane ( ) . refs . resultsView ;
35
34
}
36
35
37
- beforeEach ( async ( ) => {
36
+ beforeEach ( ( ) => {
38
37
pathSearcher = new PathSearcher ( ) ;
39
38
workspaceElement = atom . views . getView ( atom . workspace ) ;
40
39
atom . config . set ( 'core.excludeVcsIgnoredPaths' , false ) ;
41
40
atom . project . setPaths ( [ path . join ( __dirname , 'fixtures' ) ] ) ;
42
- await atom . workspace . open ( path . join ( __dirname , 'fixtures' , 'one-long-line.coffee' ) ) ;
43
- await atom . workspace . open ( path . join ( __dirname , 'fixtures' , 'sample.js' ) ) ;
44
41
jasmine . attachToDOM ( workspaceElement ) ;
45
42
46
- activationPromise = atom . packages . activatePackage ( "find-and-replace" ) . then ( function ( { mainModule} ) {
43
+ activationPromise = atom . packages . activatePackage ( "find-and-replace" ) . then ( async function ( { mainModule} ) {
47
44
mainModule . createViews ( ) ;
45
+ await atom . workspace . open ( path . join ( __dirname , 'fixtures' , 'one-long-line.coffee' ) ) ;
46
+ await atom . workspace . open ( path . join ( __dirname , 'fixtures' , 'sample.js' ) ) ;
48
47
( { findView, openFilesFindView} = mainModule ) ;
49
48
const spy = spyOn ( openFilesFindView , 'search' ) . andCallFake ( ( options ) => {
50
49
return searchPromise = spy . originalValue . call ( openFilesFindView , options ) ;
@@ -53,7 +52,7 @@ describe('OpenFilesFindView', () => {
53
52
} ) ;
54
53
55
54
describe ( "when open-files-find:show is triggered" , ( ) => {
56
- it ( "attaches openFilesFindView to the root view" , async ( ) => {
55
+ it ( "attaches OpenFilesFindView to the root view" , async ( ) => {
57
56
atom . commands . dispatch ( workspaceElement , 'open-files-find:show' ) ;
58
57
await activationPromise ;
59
58
@@ -147,6 +146,7 @@ describe('OpenFilesFindView', () => {
147
146
beforeEach ( async ( ) => {
148
147
editor = await atom . workspace . open ( 'sample.js' ) ;
149
148
editorElement = atom . views . getView ( editor ) ;
149
+ await atom . workspace . open ( 'sample.coffee' ) ;
150
150
atom . commands . dispatch ( workspaceElement , 'open-files-find:show' ) ;
151
151
await activationPromise ;
152
152
workspaceElement . style . height = '800px'
@@ -156,7 +156,6 @@ describe('OpenFilesFindView', () => {
156
156
beforeEach ( async ( ) => {
157
157
let projectPath = temp . mkdirSync ( "atom" ) ;
158
158
fs . writeFileSync ( path . join ( projectPath , "tabs.txt" ) , "\t\n\\\t\n\\\\t" ) ;
159
- await atom . workspace . open ( path . join ( projectPath , "tabs.txt" ) ) ;
160
159
atom . project . setPaths ( [ projectPath ] ) ;
161
160
atom . commands . dispatch ( workspaceElement , 'open-files-find:show' ) ;
162
161
} ) ;
@@ -172,7 +171,7 @@ describe('OpenFilesFindView', () => {
172
171
const resultsView = getResultsView ( ) ;
173
172
await resultsView . heightInvalidationPromise
174
173
expect ( resultsView . element ) . toBeVisible ( ) ;
175
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result " ) ) . toHaveLength ( 2 ) ;
174
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match-row " ) ) . toHaveLength ( 2 ) ;
176
175
} )
177
176
} ) ;
178
177
@@ -186,7 +185,7 @@ describe('OpenFilesFindView', () => {
186
185
const resultsView = getResultsView ( ) ;
187
186
await resultsView . heightInvalidationPromise
188
187
expect ( resultsView . element ) . toBeVisible ( ) ;
189
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result " ) ) . toHaveLength ( 1 ) ;
188
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match-row " ) ) . toHaveLength ( 1 ) ;
190
189
} ) ;
191
190
192
191
it ( "finds a backslash" , async ( ) => {
@@ -198,7 +197,8 @@ describe('OpenFilesFindView', () => {
198
197
const resultsView = getResultsView ( ) ;
199
198
await resultsView . heightInvalidationPromise
200
199
expect ( resultsView . element ) . toBeVisible ( ) ;
201
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result" ) ) . toHaveLength ( 3 ) ;
200
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match-row" ) ) . toHaveLength ( 2 ) ;
201
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match.highlight-info" ) ) . toHaveLength ( 3 ) ;
202
202
} ) ;
203
203
204
204
it ( "doesn't insert a escaped char if there are multiple backslashs in front of the char" , async ( ) => {
@@ -210,7 +210,7 @@ describe('OpenFilesFindView', () => {
210
210
const resultsView = getResultsView ( ) ;
211
211
await resultsView . heightInvalidationPromise
212
212
expect ( resultsView . element ) . toBeVisible ( ) ;
213
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result " ) ) . toHaveLength ( 1 ) ;
213
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match-row " ) ) . toHaveLength ( 1 ) ;
214
214
} ) ;
215
215
} ) ;
216
216
} ) ;
@@ -297,7 +297,7 @@ describe('OpenFilesFindView', () => {
297
297
} ) ;
298
298
299
299
it ( "does not split when option is false" , async ( ) => {
300
- const initialPane = atom . workspace . getActivePane ( ) ;
300
+ const initialPane = atom . workspace . getCenter ( ) . getActivePane ( ) ;
301
301
openFilesFindView . findEditor . setText ( 'items' ) ;
302
302
303
303
atom . commands . dispatch ( openFilesFindView . element , 'core:confirm' ) ;
@@ -314,20 +314,23 @@ describe('OpenFilesFindView', () => {
314
314
await searchPromise ;
315
315
316
316
const resultsPaneView1 = atom . views . getView ( getExistingResultsPane ( ) ) ;
317
- const pane1 = atom . workspace . getActivePane ( ) ;
317
+ const pane1 = atom . workspace . getCenter ( ) . getActivePane ( ) ;
318
318
const resultsView1 = pane1 . getItems ( ) [ 0 ] . refs . resultsView
319
319
pane1 . splitRight ( { copyActiveItem : true } ) ;
320
320
321
- const pane2 = atom . workspace . getActivePane ( ) ;
321
+ const pane2 = atom . workspace . getCenter ( ) . getActivePane ( ) ;
322
322
const resultsView2 = pane2 . getItems ( ) [ 0 ] . refs . resultsView
323
323
const resultsPaneView2 = atom . views . getView ( pane2 . itemForURI ( ResultsPaneView . URI ) ) ;
324
324
expect ( pane1 ) . not . toBe ( pane2 ) ;
325
325
expect ( resultsPaneView1 ) . not . toBe ( resultsPaneView2 ) ;
326
326
simulateResizeEvent ( resultsView2 . element ) ;
327
327
328
- const { length : resultCount } = resultsPaneView1 . querySelectorAll ( '.search-result' ) ;
328
+ await etch . update ( resultsView1 ) ;
329
+ await etch . update ( resultsView2 ) ;
330
+
331
+ const resultCount = resultsPaneView1 . querySelectorAll ( '.match-row' ) . length ;
329
332
expect ( resultCount ) . toBeGreaterThan ( 0 ) ;
330
- expect ( resultsPaneView2 . querySelectorAll ( '.search-result ' ) ) . toHaveLength ( resultCount ) ;
333
+ expect ( resultsPaneView2 . querySelectorAll ( '.match-row ' ) ) . toHaveLength ( resultCount ) ;
331
334
expect ( resultsPaneView2 . querySelector ( '.preview-count' ) . innerHTML ) . toEqual ( resultsPaneView1 . querySelector ( '.preview-count' ) . innerHTML ) ;
332
335
} ) ;
333
336
@@ -339,21 +342,25 @@ describe('OpenFilesFindView', () => {
339
342
await searchPromise ;
340
343
341
344
const resultsPaneView1 = atom . views . getView ( getExistingResultsPane ( ) ) ;
342
- const pane1 = atom . workspace . getActivePane ( ) ;
345
+ const pane1 = atom . workspace . getCenter ( ) . getActivePane ( ) ;
343
346
const resultsView1 = pane1 . getItems ( ) [ 0 ] . refs . resultsView
344
347
345
348
pane1 . splitDown ( { copyActiveItem : true } ) ;
346
- const pane2 = atom . workspace . getActivePane ( ) ;
349
+ const pane2 = atom . workspace . getCenter ( ) . getActivePane ( ) ;
347
350
const resultsView2 = pane2 . getItems ( ) [ 0 ] . refs . resultsView
348
351
const resultsPaneView2 = atom . views . getView ( pane2 . itemForURI ( ResultsPaneView . URI ) ) ;
349
352
expect ( pane1 ) . not . toBe ( pane2 ) ;
350
353
expect ( resultsPaneView1 ) . not . toBe ( resultsPaneView2 ) ;
354
+
355
+ await etch . update ( resultsView1 ) ;
356
+ await etch . update ( resultsView2 ) ;
357
+
351
358
expect ( resultsPaneView2 . querySelector ( '.preview-count' ) . innerHTML ) . toEqual ( resultsPaneView1 . querySelector ( '.preview-count' ) . innerHTML ) ;
352
359
} ) ;
353
360
} ) ;
354
361
355
362
describe ( "serialization" , ( ) => {
356
- it ( "serializes if the case, regex and whole word options" , async ( ) => {
363
+ it ( "serializes the case, regex and whole word options" , async ( ) => {
357
364
atom . commands . dispatch ( editorElement , 'open-files-find:show' ) ;
358
365
expect ( openFilesFindView . refs . caseOptionButton ) . not . toHaveClass ( 'selected' ) ;
359
366
openFilesFindView . refs . caseOptionButton . click ( ) ;
@@ -398,13 +405,14 @@ describe('OpenFilesFindView', () => {
398
405
399
406
await searchPromise ;
400
407
408
+ // Would not expect these assertions to pass without first opening 2 files
401
409
expect ( openFilesFindView . refs . descriptionLabel . textContent ) . toContain ( '13 results found in 2 open files' ) ;
402
410
atom . commands . dispatch ( openFilesFindView . element , 'core:confirm' ) ;
403
411
expect ( openFilesFindView . refs . descriptionLabel . textContent ) . toContain ( '13 results found in 2 open files' ) ;
404
412
} ) ;
405
413
406
414
it ( "shows an error when the pattern is invalid and clears when no error" , async ( ) => {
407
- spyOn ( pathSearcher , 'searchPaths' ) . andReturn ( Promise . resolve ( ) ) ; // TODO: Remove?
415
+ spyOn ( pathSearcher , 'searchPaths' ) . andReturn ( Promise . resolve ( ) ) ;
408
416
atom . commands . dispatch ( openFilesFindView . element , 'open-files-find:toggle-regex-option' ) ;
409
417
openFilesFindView . findEditor . setText ( '[' ) ;
410
418
atom . commands . dispatch ( openFilesFindView . element , 'core:confirm' ) ;
@@ -501,7 +509,7 @@ describe('OpenFilesFindView', () => {
501
509
await searchPromise ;
502
510
} ) ;
503
511
504
- it ( "runs a case insensitive search by default" , ( ) => expect ( String ( PathSearcher . searchPaths . argsForCall [ 0 ] [ 0 ] ) ) . toEqual ( String ( / I T E M S / gi) ) ) ;
512
+ it ( "runs a case insensitive search by default" , ( ) => expect ( PathSearcher . searchPaths . argsForCall [ 0 ] [ 0 ] ) . toEqual ( / I T E M S / gi) ) ;
505
513
506
514
it ( "toggles case sensitive option via an event and finds files matching the pattern" , async ( ) => {
507
515
expect ( openFilesFindView . refs . caseOptionButton ) . not . toHaveClass ( 'selected' ) ;
@@ -568,7 +576,8 @@ describe('OpenFilesFindView', () => {
568
576
const resultsView = getResultsView ( ) ;
569
577
await resultsView . heightInvalidationPromise
570
578
expect ( resultsView . element ) . toBeVisible ( ) ;
571
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result" ) ) . toHaveLength ( 13 ) ;
579
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match-row" ) ) . toHaveLength ( 11 ) ;
580
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match.highlight-info" ) ) . toHaveLength ( 13 ) ;
572
581
} )
573
582
} ) ;
574
583
@@ -577,8 +586,8 @@ describe('OpenFilesFindView', () => {
577
586
atom . commands . dispatch ( workspaceElement , 'open-files-find:show' )
578
587
} ) ;
579
588
580
- describe ( "when the there search field is empty" , ( ) => {
581
- it ( "does not run the seach but clears the model" , ( ) => {
589
+ describe ( "when the search field is empty" , ( ) => {
590
+ it ( "does not run the search but clears the model" , ( ) => {
582
591
spyOn ( pathSearcher , 'searchPaths' ) ;
583
592
spyOn ( openFilesFindView . model , 'clear' ) ;
584
593
atom . commands . dispatch ( openFilesFindView . element , 'core:confirm' ) ;
@@ -628,37 +637,50 @@ describe('OpenFilesFindView', () => {
628
637
629
638
await resultsView . heightInvalidationPromise
630
639
expect ( resultsView . element ) . toBeVisible ( ) ;
631
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result" ) ) . toHaveLength ( 13 ) ;
640
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match-row" ) ) . toHaveLength ( 11 ) ;
641
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match.highlight-info" ) ) . toHaveLength ( 13 ) ;
632
642
633
643
expect ( resultsPaneView . refs . previewCount . textContent ) . toBe ( "13 results found in 2 files for items" ) ;
634
- expect ( openFilesFindView . errorMessages ) . not . toBeVisible ( ) ;
644
+ expect ( projectFindView . errorMessages ) . not . toBeVisible ( ) ;
635
645
} ) ;
636
646
637
647
it ( "updates the results list when a buffer changes" , async ( ) => {
638
- const buffer = atom . project . bufferForPathSync ( 'sample.js' ) ;
648
+ const editor = await atom . workspace . open ( 'sample.js' )
639
649
640
650
atom . commands . dispatch ( openFilesFindView . element , 'core:confirm' ) ;
641
651
await searchPromise ;
642
652
643
653
const resultsView = getResultsView ( ) ;
654
+ const listView = resultsView . refs . listView ;
644
655
const resultsPaneView = getExistingResultsPane ( ) ;
645
656
646
657
await resultsView . heightInvalidationPromise
647
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result" ) ) . toHaveLength ( 13 ) ;
658
+ expect ( listView . element . querySelectorAll ( ".match-row" ) ) . toHaveLength ( 11 ) ;
659
+ expect ( listView . element . querySelectorAll ( ".match.highlight-info" ) ) . toHaveLength ( 13 ) ;
660
+ // This assertion should fail until 2 files are open
648
661
expect ( resultsPaneView . refs . previewCount . textContent ) . toBe ( "13 results found in 2 files for items" ) ;
649
662
650
663
resultsView . selectFirstResult ( ) ;
651
- for ( let i = 0 ; i < 7 ; i ++ ) await resultsView . moveDown ( )
652
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".path" ) [ 1 ] ) . toHaveClass ( 'selected' ) ;
664
+ for ( let i = 0 ; i < 6 ; i ++ ) resultsView . moveDown ( ) ;
665
+ await resultsView . moveDown ( ) ;
666
+
667
+ expect ( listView . element . querySelectorAll ( ".path-row" ) [ 1 ] . parentElement ) . toHaveClass ( 'selected' ) ;
653
668
654
- buffer . setText ( 'there is one "items" in this file' ) ;
655
- advanceClock ( buffer . stoppedChangingDelay ) ;
669
+ editor . setText ( 'there is one "items" in this file' ) ;
670
+ advanceClock ( editor . getBuffer ( ) . stoppedChangingDelay ) ;
656
671
await etch . getScheduler ( ) . getNextUpdatePromise ( )
672
+ // This assertion should fail until 2 files are open
657
673
expect ( resultsPaneView . refs . previewCount . textContent ) . toBe ( "8 results found in 2 files for items" ) ;
658
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".path" ) [ 1 ] ) . toHaveClass ( 'selected' ) ;
674
+ expect ( listView . element . querySelectorAll ( ".path-row" ) [ 1 ] . parentElement ) . toHaveClass ( 'selected' ) ;
675
+
676
+ // Ensure the newly added item can be opened.
677
+ await resultsView . moveDown ( )
678
+ atom . commands . dispatch ( resultsView . element , 'core:confirm' ) ;
679
+ await new Promise ( resolve => editor . onDidChangeSelectionRange ( resolve ) ) ;
680
+ expect ( editor . getSelectedText ( ) ) . toBe ( "items" )
659
681
660
- buffer . setText ( 'no matches in this file' ) ;
661
- advanceClock ( buffer . stoppedChangingDelay ) ;
682
+ editor . setText ( 'no matches in this file' ) ;
683
+ advanceClock ( editor . getBuffer ( ) . stoppedChangingDelay ) ;
662
684
await etch . getScheduler ( ) . getNextUpdatePromise ( )
663
685
expect ( resultsPaneView . refs . previewCount . textContent ) . toBe ( "7 results found in 1 file for items" ) ;
664
686
} ) ;
@@ -677,7 +699,7 @@ describe('OpenFilesFindView', () => {
677
699
const resultsView = getResultsView ( ) ;
678
700
expect ( openFilesFindView . refs . errorMessages ) . not . toBeVisible ( ) ;
679
701
expect ( resultsView . element ) . toBeVisible ( ) ;
680
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result " ) ) . toHaveLength ( 0 ) ;
702
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match-row " ) ) . toHaveLength ( 0 ) ;
681
703
} ) ;
682
704
} ) ;
683
705
} ) ;
@@ -775,10 +797,12 @@ describe('OpenFilesFindView', () => {
775
797
expect ( errorList . querySelectorAll ( "li" ) ) . toHaveLength ( 0 ) ;
776
798
777
799
callback ( null , { path : '/some/path.js' , code : 'ENOENT' , message : 'Nope' } ) ;
800
+ await etch . update ( resultsPaneView ) ;
778
801
expect ( errorList ) . toBeVisible ( ) ;
779
802
expect ( errorList . querySelectorAll ( "li" ) ) . toHaveLength ( 1 ) ;
780
803
781
804
callback ( null , { path : '/some/path.js' , code : 'ENOENT' , message : 'Broken' } ) ;
805
+ await etch . update ( resultsPaneView ) ;
782
806
expect ( errorList . querySelectorAll ( "li" ) ) . toHaveLength ( 2 ) ;
783
807
} ) ;
784
808
@@ -870,11 +894,14 @@ describe('OpenFilesFindView', () => {
870
894
871
895
const resultsView = getResultsView ( ) ;
872
896
resultsView . scrollToBottom ( ) ; // To load ALL the results
897
+ await etch . update ( resultsView ) ;
873
898
expect ( resultsView . element ) . toBeVisible ( ) ;
874
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result" ) ) . toHaveLength ( 13 ) ;
899
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match-row" ) ) . toHaveLength ( 11 ) ;
900
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match.highlight-info" ) ) . toHaveLength ( 13 ) ;
875
901
876
902
resultsView . selectFirstResult ( ) ;
877
- for ( let i = 0 ; i < 10 ; i ++ ) await resultsView . moveDown ( ) ;
903
+ for ( let i = 0 ; i < 9 ; i ++ ) resultsView . moveDown ( ) ;
904
+ await resultsView . moveDown ( ) ;
878
905
879
906
atom . commands . dispatch ( resultsView . element , 'core:confirm' ) ;
880
907
await new Promise ( resolve => editor . onDidChangeSelectionRange ( resolve ) )
@@ -904,12 +931,12 @@ describe('OpenFilesFindView', () => {
904
931
} ) ;
905
932
} ) ;
906
933
907
- describe ( "replacing" , ( ) => {
934
+ xdescribe ( "replacing" , ( ) => {
908
935
let testDir , sampleJs , sampleCoffee , replacePromise ;
909
936
910
937
beforeEach ( async ( ) => {
911
938
pathReplacer = new PathReplacer ( ) ;
912
- testDir = path . join ( os . tmpdir ( ) , " atom-find-and-replace" ) ;
939
+ testDir = temp . mkdirSync ( ' atom-find-and-replace' ) ;
913
940
sampleJs = path . join ( testDir , 'sample.js' ) ;
914
941
sampleCoffee = path . join ( testDir , 'sample.coffee' ) ;
915
942
@@ -1192,7 +1219,7 @@ describe('OpenFilesFindView', () => {
1192
1219
1193
1220
const resultsView = getResultsView ( ) ;
1194
1221
expect ( resultsView . element ) . toBeVisible ( ) ;
1195
- expect ( resultsView . refs . listView . element . querySelectorAll ( ".search-result " ) ) . toHaveLength ( 0 ) ;
1222
+ expect ( resultsView . refs . listView . element . querySelectorAll ( ".match-row " ) ) . toHaveLength ( 0 ) ;
1196
1223
1197
1224
expect ( openFilesFindView . refs . descriptionLabel . textContent ) . toContain ( "Replaced items with sunshine 13 times in 2 open files" ) ;
1198
1225
0 commit comments