@@ -8,6 +8,7 @@ package com.nextcloud.utils
88
99import junit.framework.TestCase.assertEquals
1010import junit.framework.TestCase.assertTrue
11+ import kotlinx.coroutines.runBlocking
1112import org.junit.After
1213import org.junit.Before
1314import org.junit.Test
@@ -29,176 +30,131 @@ class FileHelperTest {
2930 testDirectory.deleteRecursively()
3031 }
3132
33+ private fun collectPages (directory : File ? , pageSize : Int , fetchFolders : Boolean ): List <List <File >> {
34+ val pages = mutableListOf<List <File >>()
35+
36+ runBlocking {
37+ FileHelper .forEachDirectoryPage(directory, pageSize, fetchFolders) { page ->
38+ pages.add(page)
39+ }
40+ }
41+
42+ return pages
43+ }
44+
3245 @Test
33- fun testListDirectoryEntriesWhenGivenNullDirectoryShouldReturnEmptyList () {
34- val result = FileHelper .listDirectoryEntries(null , 0 , 10 , false )
35- assertTrue(result.isEmpty())
46+ fun testForEachDirectoryPageWhenGivenNullDirectoryShouldReportNoPage () {
47+ assertTrue(collectPages(null , 10 , false ).isEmpty())
3648 }
3749
3850 @Test
39- fun testListDirectoryEntriesWhenGivenNonExistentDirectoryShouldReturnEmptyList () {
51+ fun testForEachDirectoryPageWhenGivenNonExistentDirectoryShouldReportNoPage () {
4052 val nonExistent = File (testDirectory, " does_not_exist" )
41- val result = FileHelper .listDirectoryEntries(nonExistent, 0 , 10 , false )
42- assertTrue(result .isEmpty())
53+
54+ assertTrue(collectPages(nonExistent, 10 , false ) .isEmpty())
4355 }
4456
4557 @Test
46- fun testListDirectoryEntriesWhenGivenFileInsteadOfDirectoryShouldReturnEmptyList () {
58+ fun testForEachDirectoryPageWhenGivenFileInsteadOfDirectoryShouldReportNoPage () {
4759 val file = File (testDirectory, " test.txt" )
4860 file.createNewFile()
49- val result = FileHelper .listDirectoryEntries(file, 0 , 10 , false )
50- assertTrue(result .isEmpty())
61+
62+ assertTrue(collectPages(file, 10 , false ) .isEmpty())
5163 }
5264
5365 @Test
54- fun testListDirectoryEntriesWhenGivenEmptyDirectoryShouldReturnEmptyList () {
55- val result = FileHelper .listDirectoryEntries(testDirectory, 0 , 10 , false )
56- assertTrue(result.isEmpty())
66+ fun testForEachDirectoryPageWhenGivenEmptyDirectoryShouldReportNoPage () {
67+ assertTrue(collectPages(testDirectory, 10 , false ).isEmpty())
5768 }
5869
5970 @Test
60- fun testListDirectoryEntriesWhenFetchingFoldersShouldReturnOnlyFolders () {
71+ fun testForEachDirectoryPageWhenPageSizeIsZeroShouldReportNoPage () {
72+ for (i in 1 .. 5 ) File (testDirectory, " file$i .txt" ).createNewFile()
73+
74+ assertTrue(collectPages(testDirectory, 0 , false ).isEmpty())
75+ }
76+
77+ @Test
78+ fun testForEachDirectoryPageWhenFetchingFoldersShouldReportOnlyFolders () {
6179 File (testDirectory, " folder1" ).mkdir()
6280 File (testDirectory, " folder2" ).mkdir()
6381 File (testDirectory, " file1.txt" ).createNewFile()
6482 File (testDirectory, " file2.txt" ).createNewFile()
6583
66- val result = FileHelper .listDirectoryEntries (testDirectory, 0 , 10 , true )
84+ val entries = collectPages (testDirectory, 10 , true ).flatten( )
6785
68- assertEquals(2 , result .size)
69- assertTrue(result .all { it.isDirectory })
86+ assertEquals(2 , entries .size)
87+ assertTrue(entries .all { it.isDirectory })
7088 }
7189
7290 @Test
73- fun testListDirectoryEntriesWhenFetchingFilesShouldReturnOnlyFiles () {
91+ fun testForEachDirectoryPageWhenFetchingFilesShouldReportOnlyFiles () {
7492 File (testDirectory, " folder1" ).mkdir()
7593 File (testDirectory, " folder2" ).mkdir()
7694 File (testDirectory, " file1.txt" ).createNewFile()
7795 File (testDirectory, " file2.txt" ).createNewFile()
7896
79- val result = FileHelper .listDirectoryEntries (testDirectory, 0 , 10 , false )
97+ val entries = collectPages (testDirectory, 10 , false ).flatten( )
8098
81- assertEquals(2 , result .size)
82- assertTrue(result .all { it.isFile })
99+ assertEquals(2 , entries .size)
100+ assertTrue(entries .all { it.isFile })
83101 }
84102
85103 @Test
86- fun testListDirectoryEntriesWhenStartIndexProvidedShouldSkipCorrectNumberOfItems () {
87- for (i in 1 .. 5 ) File (testDirectory, " file$i .txt" ).createNewFile()
88- val result = FileHelper .listDirectoryEntries(testDirectory, 2 , 10 , false )
89- assertEquals(3 , result.size)
90- }
104+ fun testForEachDirectoryPageWhenGivenOnlyFoldersAndFetchingFilesShouldReportNoPage () {
105+ for (i in 1 .. 5 ) File (testDirectory, " folder$i " ).mkdir()
91106
92- @Test
93- fun testListDirectoryEntriesWhenMaxItemsProvidedShouldLimitResults () {
94- for (i in 1 .. 10 ) File (testDirectory, " file$i .txt" ).createNewFile()
95- val result = FileHelper .listDirectoryEntries(testDirectory, 0 , 5 , false )
96- assertEquals(5 , result.size)
107+ assertTrue(collectPages(testDirectory, 10 , false ).isEmpty())
97108 }
98109
99110 @Test
100- fun testListDirectoryEntriesWhenGivenStartIndexAndMaxItemsShouldReturnCorrectSubset () {
101- for (i in 1 .. 10 ) File (testDirectory, " file$i .txt" ).createNewFile()
102- val result = FileHelper .listDirectoryEntries(testDirectory, 3 , 4 , false )
103- assertEquals(4 , result.size)
104- }
111+ fun testForEachDirectoryPageWhenGivenOnlyFilesAndFetchingFoldersShouldReportNoPage () {
112+ for (i in 1 .. 5 ) File (testDirectory, " file$i .txt" ).createNewFile()
105113
106- @Test
107- fun testListDirectoryEntriesWhenStartIndexBeyondAvailableShouldReturnEmptyList () {
108- for (i in 1 .. 3 ) File (testDirectory, " file$i .txt" ).createNewFile()
109- val result = FileHelper .listDirectoryEntries(testDirectory, 10 , 5 , false )
110- assertTrue(result.isEmpty())
114+ assertTrue(collectPages(testDirectory, 10 , true ).isEmpty())
111115 }
112116
113117 @Test
114- fun testListDirectoryEntriesWhenMaxItemsBeyondAvailableShouldReturnAllItems () {
118+ fun testForEachDirectoryPageWhenPageSizeExceedsContentShouldReportSinglePage () {
115119 for (i in 1 .. 3 ) File (testDirectory, " file$i .txt" ).createNewFile()
116- val result = FileHelper .listDirectoryEntries(testDirectory, 0 , 100 , false )
117- assertEquals(3 , result.size)
118- }
119120
120- @Test
121- fun testListDirectoryEntriesWhenFetchingFoldersWithOffsetShouldSkipCorrectly () {
122- for (i in 1 .. 5 ) File (testDirectory, " folder$i " ).mkdir()
123- for (i in 1 .. 3 ) File (testDirectory, " file$i .txt" ).createNewFile()
121+ val pages = collectPages(testDirectory, 100 , false )
124122
125- val result = FileHelper .listDirectoryEntries(testDirectory, 2 , 10 , true )
126-
127- assertEquals(3 , result.size)
128- assertTrue(result.all { it.isDirectory })
123+ assertEquals(1 , pages.size)
124+ assertEquals(3 , pages.first().size)
129125 }
130126
131127 @Test
132- fun testListDirectoryEntriesWhenFetchingFilesWithOffsetShouldSkipCorrectly () {
133- for (i in 1 .. 3 ) File (testDirectory, " folder$i " ).mkdir()
134- for (i in 1 .. 5 ) File (testDirectory, " file$i .txt" ).createNewFile()
128+ fun testForEachDirectoryPageWhenPaginatingFoldersShouldFillEveryPageButTheLast () {
129+ for (i in 1 .. 10 ) File (testDirectory, " folder$i " ).mkdir()
135130
136- val result = FileHelper .listDirectoryEntries (testDirectory, 2 , 10 , false )
131+ val pages = collectPages (testDirectory, 3 , true )
137132
138- assertEquals(3 , result.size)
139- assertTrue(result.all { it.isFile })
133+ assertEquals(listOf (3 , 3 , 3 , 1 ), pages.map { it.size })
140134 }
141135
142136 @Test
143- fun testListDirectoryEntriesWhenGivenOnlyFoldersAndFetchingFilesShouldReturnEmptyList () {
144- for (i in 1 .. 5 ) File (testDirectory, " folder$i " ).mkdir()
145- val result = FileHelper .listDirectoryEntries(testDirectory, 0 , 10 , false )
146- assertTrue(result.isEmpty())
147- }
137+ fun testForEachDirectoryPageWhenContentIsAMultipleOfPageSizeShouldNotReportAnEmptyPage () {
138+ for (i in 1 .. 9 ) File (testDirectory, " file$i .txt" ).createNewFile()
148139
149- @Test
150- fun testListDirectoryEntriesWhenGivenOnlyFilesAndFetchingFoldersShouldReturnEmptyList () {
151- for (i in 1 .. 5 ) File (testDirectory, " file$i .txt" ).createNewFile()
152- val result = FileHelper .listDirectoryEntries(testDirectory, 0 , 10 , true )
153- assertTrue(result.isEmpty())
154- }
140+ val pages = collectPages(testDirectory, 3 , false )
155141
156- @Test
157- fun testListDirectoryEntriesWhenMaxItemsIsZeroShouldReturnEmptyList () {
158- for (i in 1 .. 5 ) File (testDirectory, " file$i .txt" ).createNewFile()
159- val result = FileHelper .listDirectoryEntries(testDirectory, 0 , 0 , false )
160- assertTrue(result.isEmpty())
142+ assertEquals(listOf (3 , 3 , 3 ), pages.map { it.size })
161143 }
162144
163145 @Test
164- fun testListDirectoryEntriesWhenGivenMixedContentShouldFilterCorrectly () {
146+ fun testForEachDirectoryPageWhenGivenMixedContentShouldReportEveryEntryExactlyOnce () {
165147 for (i in 1 .. 3 ) File (testDirectory, " folder$i " ).mkdir()
166148 for (i in 1 .. 7 ) File (testDirectory, " file$i .txt" ).createNewFile()
167149
168- val folders = FileHelper .listDirectoryEntries (testDirectory, 0 , 10 , true )
169- val files = FileHelper .listDirectoryEntries (testDirectory, 0 , 10 , false )
150+ val folders = collectPages (testDirectory, 2 , true ).flatten( )
151+ val files = collectPages (testDirectory, 2 , false ).flatten( )
170152
171153 assertEquals(3 , folders.size)
172154 assertEquals(7 , files.size)
155+ assertEquals(folders.size, folders.distinct().size)
156+ assertEquals(files.size, files.distinct().size)
173157 assertTrue(folders.all { it.isDirectory })
174158 assertTrue(files.all { it.isFile })
175159 }
176-
177- @Test
178- fun testListDirectoryEntriesWhenPaginatingFoldersShouldWorkCorrectly () {
179- for (i in 1 .. 10 ) File (testDirectory, " folder$i " ).mkdir()
180-
181- val page1 = FileHelper .listDirectoryEntries(testDirectory, 0 , 3 , true )
182- val page2 = FileHelper .listDirectoryEntries(testDirectory, 3 , 3 , true )
183- val page3 = FileHelper .listDirectoryEntries(testDirectory, 6 , 3 , true )
184- val page4 = FileHelper .listDirectoryEntries(testDirectory, 9 , 3 , true )
185-
186- assertEquals(3 , page1.size)
187- assertEquals(3 , page2.size)
188- assertEquals(3 , page3.size)
189- assertEquals(1 , page4.size)
190- }
191-
192- @Test
193- fun testListDirectoryEntriesWhenPaginatingFilesShouldWorkCorrectly () {
194- for (i in 1 .. 10 ) File (testDirectory, " file$i .txt" ).createNewFile()
195-
196- val page1 = FileHelper .listDirectoryEntries(testDirectory, 0 , 4 , false )
197- val page2 = FileHelper .listDirectoryEntries(testDirectory, 4 , 4 , false )
198- val page3 = FileHelper .listDirectoryEntries(testDirectory, 8 , 4 , false )
199-
200- assertEquals(4 , page1.size)
201- assertEquals(4 , page2.size)
202- assertEquals(2 , page3.size)
203- }
204160}
0 commit comments