@@ -3,8 +3,9 @@ import MEGADomainMock
3
3
@testable import MEGA
4
4
@testable import MEGADomain
5
5
6
+ @MainActor
6
7
final class PhotosViewModelTests : XCTestCase {
7
- var photosViewModel : PhotosViewModel ?
8
+ var sut : PhotosViewModel !
8
9
9
10
override func setUp( ) {
10
11
let publisher = PhotoUpdatePublisher ( photosViewController: PhotosViewController ( ) )
@@ -15,34 +16,10 @@ final class PhotosViewModelTests: XCTestCase {
15
16
allPhotosFromCloudDriveOnly: allPhotosForCloudDrive,
16
17
allPhotosFromCameraUpload: allPhotosForCameraUploads)
17
18
18
- photosViewModel = PhotosViewModel ( photoUpdatePublisher: publisher, photoLibraryUseCase: usecase, mediaUseCase: MockMediaUseCase ( ) )
19
- }
20
-
21
- private func mediaNodesSorted( ) -> [ MEGANode ] {
22
- let today = Date ( )
23
- let yesterday = Calendar . current. date ( byAdding: . day, value: - 1 , to: today)
24
-
25
- return [
26
- MockNode ( handle: 1 , name: " TestImage.png " , nodeType: . file, parentHandle: 0 , modificationTime: today) ,
27
- MockNode ( handle: 2 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 0 ) ,
28
- MockNode ( handle: 2 , name: " TestImage2.jpg " , nodeType: . file, parentHandle: 1 , modificationTime: yesterday)
29
- ]
30
- }
31
-
32
- private func mediaNodesReverseSorted( ) -> [ MEGANode ] {
33
- let today = Date ( )
34
- let yesterday = Calendar . current. date ( byAdding: . day, value: - 1 , to: today)
35
-
36
- return [
37
- MockNode ( handle: 2 , name: " TestImage2.jpg " , nodeType: . file, parentHandle: 1 , modificationTime: yesterday) ,
38
- MockNode ( handle: 1 , name: " TestImage.png " , nodeType: . file, parentHandle: 0 , modificationTime: today) ,
39
- MockNode ( handle: 2 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 0 )
40
- ]
19
+ sut = PhotosViewModel ( photoUpdatePublisher: publisher, photoLibraryUseCase: usecase, mediaUseCase: MockMediaUseCase ( ) )
41
20
}
42
21
43
22
func testLoadSortOrderType( ) throws {
44
- guard let sut = photosViewModel else { return }
45
-
46
23
Helper . save ( . defaultAsc, for: PhotosViewModel . SortingKeys. cameraUploadExplorerFeed. rawValue)
47
24
let sortTypeUnknown = sut. sortOrderType ( forKey: . cameraUploadExplorerFeed)
48
25
XCTAssert ( sortTypeUnknown == . newest)
@@ -56,189 +33,111 @@ final class PhotosViewModelTests: XCTestCase {
56
33
XCTAssert ( sortTypeNewest == . newest)
57
34
}
58
35
59
- func testReorderPhotos( ) throws {
60
- guard let sut = photosViewModel else { return }
61
-
62
- sut. mediaNodesArray = mediaNodesSorted ( )
63
-
64
- sut. cameraUploadExplorerSortOrderType = . nameAscending
65
- XCTAssert ( sut. mediaNodesArray == mediaNodesSorted ( ) )
66
-
67
- sut. cameraUploadExplorerSortOrderType = . newest
68
- XCTAssert ( sut. mediaNodesArray == mediaNodesSorted ( ) )
69
-
70
- sut. cameraUploadExplorerSortOrderType = . oldest
71
- XCTAssert ( sut. mediaNodesArray == mediaNodesReverseSorted ( ) )
72
- }
73
-
74
36
// MARK: - All locations test cases
75
37
76
38
func testLoadingPhotos_withAllMediaAllLocations_shouldReturnTrue( ) async throws {
77
- guard let photoVM = photosViewModel else { return }
78
-
79
39
let expectedPhotos = sampleNodesForAllLocations ( )
80
- photoVM. filterType = . allMedia
81
- photoVM. filterLocation = . allLocations
82
-
83
- do {
84
- let photos = try await photoVM. loadFilteredPhotos ( )
85
- XCTAssertTrue ( photos. count == expectedPhotos. count)
86
- } catch {
87
- assertionFailure ( " Unexpected exception! " )
88
- }
40
+ sut. filterType = . allMedia
41
+ sut. filterLocation = . allLocations
42
+ await sut. loadPhotos ( )
43
+ XCTAssertEqual ( sut. mediaNodesArray, expectedPhotos)
89
44
}
90
45
91
46
func testLoadingPhotos_withImagesAllLocations_shouldReturnTrue( ) async throws {
92
- guard let photoVM = photosViewModel else { return }
93
-
94
47
let expectedImages = sampleNodesForAllLocations ( ) . filter ( { $0. name? . mnz_isImagePathExtension == true } )
95
- photoVM. filterType = . images
96
- photoVM. filterLocation = . allLocations
97
-
98
- do {
99
- let photos = try await photoVM. loadFilteredPhotos ( )
100
- XCTAssertTrue ( photos. count == expectedImages. count)
101
- } catch {
102
- assertionFailure ( " Unexpected exception! " )
103
- }
48
+ sut. filterType = . images
49
+ sut. filterLocation = . allLocations
50
+ await sut. loadPhotos ( )
51
+ XCTAssertEqual ( sut. mediaNodesArray, expectedImages)
104
52
}
105
53
106
54
func testLoadingVideos_withImagesAllLocations_shouldReturnTrue( ) async throws {
107
- guard let photoVM = photosViewModel else { return }
108
-
109
55
let expectedVideos = sampleNodesForAllLocations ( ) . filter ( { $0. name? . mnz_isVideoPathExtension == true } )
110
- photoVM. filterType = . videos
111
- photoVM. filterLocation = . allLocations
112
-
113
- do {
114
- let photos = try await photoVM. loadFilteredPhotos ( )
115
- XCTAssertTrue ( photos. count == expectedVideos. count)
116
- } catch {
117
- assertionFailure ( " Unexpected exception! " )
118
- }
56
+ sut. filterType = . videos
57
+ sut. filterLocation = . allLocations
58
+ await sut. loadPhotos ( )
59
+ XCTAssertEqual ( sut. mediaNodesArray, expectedVideos)
119
60
}
120
61
121
62
// MARK: - Cloud Drive only test cases
122
63
123
64
func testLoadingPhotos_withAllMediaFromCloudDrive_shouldReturnTrue( ) async throws {
124
- guard let photoVM = photosViewModel else { return }
125
-
126
65
let expectedPhotos = sampleNodesForCloudDriveOnly ( )
127
- photoVM. filterType = . allMedia
128
- photoVM. filterLocation = . cloudDrive
129
-
130
- do {
131
- let photos = try await photoVM. loadFilteredPhotos ( )
132
- XCTAssertTrue ( photos. count == expectedPhotos. count)
133
- } catch {
134
- assertionFailure ( " Unexpected exception! " )
135
- }
66
+ sut. filterType = . allMedia
67
+ sut. filterLocation = . cloudDrive
68
+ await sut. loadPhotos ( )
69
+ XCTAssertEqual ( sut. mediaNodesArray, expectedPhotos)
136
70
}
137
71
138
72
func testLoadingPhotos_withImagesFromCloudDrive_shouldReturnTrue( ) async throws {
139
- guard let photoVM = photosViewModel else { return }
140
-
141
73
let expectedImages = sampleNodesForCloudDriveOnly ( ) . filter ( { $0. name? . mnz_isImagePathExtension == true } )
142
- photoVM. filterType = . images
143
- photoVM. filterLocation = . cloudDrive
144
-
145
- do {
146
- let photos = try await photoVM. loadFilteredPhotos ( )
147
- XCTAssertTrue ( photos. count == expectedImages. count)
148
- } catch {
149
- assertionFailure ( " Unexpected exception! " )
150
- }
74
+ sut. filterType = . images
75
+ sut. filterLocation = . cloudDrive
76
+ await sut. loadPhotos ( )
77
+ XCTAssertEqual ( sut. mediaNodesArray, expectedImages)
151
78
}
152
79
153
80
func testLoadingPhotos_withVideosFromCloudDrive_shouldReturnTrue( ) async throws {
154
- guard let photoVM = photosViewModel else { return }
155
-
156
81
let expectedVideos = sampleNodesForCloudDriveOnly ( ) . filter ( { $0. name? . mnz_isVideoPathExtension == true } )
157
- photoVM. filterType = . videos
158
- photoVM. filterLocation = . cloudDrive
159
-
160
- do {
161
- let photos = try await photoVM. loadFilteredPhotos ( )
162
- XCTAssertTrue ( photos. count == expectedVideos. count)
163
- } catch {
164
- assertionFailure ( " Unexpected exception! " )
165
- }
82
+ sut. filterType = . videos
83
+ sut. filterLocation = . cloudDrive
84
+ await sut. loadPhotos ( )
85
+ XCTAssertEqual ( sut. mediaNodesArray, expectedVideos)
166
86
}
167
87
168
88
// MARK: - Camera Uploads test cases
169
89
170
90
func testLoadingPhotos_withAllMediaFromCameraUploads_shouldReturnTrue( ) async throws {
171
- guard let photoVM = photosViewModel else { return }
172
-
173
91
let expectedPhotos = sampleNodesForCameraUploads ( )
174
- photoVM. filterType = . allMedia
175
- photoVM. filterLocation = . cameraUploads
176
-
177
- do {
178
- let photos = try await photoVM. loadFilteredPhotos ( )
179
- XCTAssertTrue ( photos. count == expectedPhotos. count)
180
- } catch {
181
- assertionFailure ( " Unexpected exception! " )
182
- }
92
+ sut. filterType = . allMedia
93
+ sut. filterLocation = . cameraUploads
94
+ await sut. loadPhotos ( )
95
+ XCTAssertEqual ( sut. mediaNodesArray, expectedPhotos)
183
96
}
184
97
185
98
func testLoadingPhotos_withImagesFromCameraUploads_shouldReturnTrue( ) async throws {
186
- guard let photoVM = photosViewModel else { return }
187
-
188
99
let expectedImages = sampleNodesForCameraUploads ( ) . filter ( { $0. name? . mnz_isImagePathExtension == true } )
189
- photoVM. filterType = . images
190
- photoVM. filterLocation = . cameraUploads
191
-
192
- do {
193
- let photos = try await photoVM. loadFilteredPhotos ( )
194
- XCTAssertTrue ( photos. count == expectedImages. count)
195
- } catch {
196
- assertionFailure ( " Unexpected exception! " )
197
- }
100
+ sut. filterType = . images
101
+ sut. filterLocation = . cameraUploads
102
+ await sut. loadPhotos ( )
103
+ XCTAssertEqual ( sut. mediaNodesArray, expectedImages)
198
104
}
199
105
200
106
func testLoadingPhotos_withVideosFromCameraUploads_shouldReturnTrue( ) async throws {
201
- guard let photoVM = photosViewModel else { return }
202
-
203
107
let expectedVideos = sampleNodesForCameraUploads ( ) . filter ( { $0. name? . mnz_isVideoPathExtension == true } )
204
- photoVM. filterType = . videos
205
- photoVM. filterLocation = . cameraUploads
206
-
207
- do {
208
- let photos = try await photoVM. loadFilteredPhotos ( )
209
- XCTAssertTrue ( photos. count == expectedVideos. count)
210
- } catch {
211
- assertionFailure ( " Unexpected exception! " )
212
- }
108
+ sut. filterType = . videos
109
+ sut. filterLocation = . cameraUploads
110
+ await sut. loadPhotos ( )
111
+ XCTAssertEqual ( sut. mediaNodesArray, expectedVideos)
213
112
}
214
113
215
114
private func sampleNodesForAllLocations( ) -> [ MEGANode ] {
216
- let node1 = MockNode ( handle: 1 , name: " TestImage1.png " , nodeType: . file, parentHandle: 0 )
217
- let node2 = MockNode ( handle: 2 , name: " TestImage2.png " , nodeType: . file, parentHandle: 1 )
218
- let node3 = MockNode ( handle: 3 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 2 )
219
- let node4 = MockNode ( handle: 4 , name: " TestVideo2.mp4 " , nodeType: . file, parentHandle: 3 )
220
- let node5 = MockNode ( handle: 5 , name: " TestImage1.png " , nodeType: . file, parentHandle: 4 )
221
- let node6 = MockNode ( handle: 6 , name: " TestImage2.png " , nodeType: . file, parentHandle: 5 )
222
- let node7 = MockNode ( handle: 7 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 6 )
223
- let node8 = MockNode ( handle: 8 , name: " TestVideo2.mp4 " , nodeType: . file, parentHandle: 7 )
115
+ let node1 = MockNode ( handle: 1 , name: " TestImage1.png " , nodeType: . file, parentHandle: 0 , hasThumbnail : true )
116
+ let node2 = MockNode ( handle: 2 , name: " TestImage2.png " , nodeType: . file, parentHandle: 1 , hasThumbnail : true )
117
+ let node3 = MockNode ( handle: 3 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 2 , hasThumbnail : true )
118
+ let node4 = MockNode ( handle: 4 , name: " TestVideo2.mp4 " , nodeType: . file, parentHandle: 3 , hasThumbnail : true )
119
+ let node5 = MockNode ( handle: 5 , name: " TestImage1.png " , nodeType: . file, parentHandle: 4 , hasThumbnail : true )
120
+ let node6 = MockNode ( handle: 6 , name: " TestImage2.png " , nodeType: . file, parentHandle: 5 , hasThumbnail : true )
121
+ let node7 = MockNode ( handle: 7 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 6 , hasThumbnail : true )
122
+ let node8 = MockNode ( handle: 8 , name: " TestVideo2.mp4 " , nodeType: . file, parentHandle: 7 , hasThumbnail : true )
224
123
225
124
return [ node1, node2, node3, node4, node5, node6, node7, node8]
226
125
}
227
126
228
127
private func sampleNodesForCloudDriveOnly( ) -> [ MEGANode ] {
229
- let node1 = MockNode ( handle: 1 , name: " TestImage1.png " , nodeType: . file, parentHandle: 0 )
230
- let node2 = MockNode ( handle: 2 , name: " TestImage2.png " , nodeType: . file, parentHandle: 1 )
231
- let node3 = MockNode ( handle: 3 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 2 )
232
- let node4 = MockNode ( handle: 4 , name: " TestVideo2.mp4 " , nodeType: . file, parentHandle: 3 )
128
+ let node1 = MockNode ( handle: 1 , name: " TestImage1.png " , nodeType: . file, parentHandle: 0 , hasThumbnail : true )
129
+ let node2 = MockNode ( handle: 2 , name: " TestImage2.png " , nodeType: . file, parentHandle: 1 , hasThumbnail : true )
130
+ let node3 = MockNode ( handle: 3 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 2 , hasThumbnail : true )
131
+ let node4 = MockNode ( handle: 4 , name: " TestVideo2.mp4 " , nodeType: . file, parentHandle: 3 , hasThumbnail : true )
233
132
234
133
return [ node1, node2, node3, node4]
235
134
}
236
135
237
136
private func sampleNodesForCameraUploads( ) -> [ MEGANode ] {
238
- let node5 = MockNode ( handle: 5 , name: " TestImage1.png " , nodeType: . file, parentHandle: 4 )
239
- let node6 = MockNode ( handle: 6 , name: " TestImage2.png " , nodeType: . file, parentHandle: 5 )
240
- let node7 = MockNode ( handle: 7 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 6 )
241
- let node8 = MockNode ( handle: 8 , name: " TestVideo2.mp4 " , nodeType: . file, parentHandle: 7 )
137
+ let node5 = MockNode ( handle: 5 , name: " TestImage1.png " , nodeType: . file, parentHandle: 4 , hasThumbnail : true )
138
+ let node6 = MockNode ( handle: 6 , name: " TestImage2.png " , nodeType: . file, parentHandle: 5 , hasThumbnail : true )
139
+ let node7 = MockNode ( handle: 7 , name: " TestVideo1.mp4 " , nodeType: . file, parentHandle: 6 , hasThumbnail : true )
140
+ let node8 = MockNode ( handle: 8 , name: " TestVideo2.mp4 " , nodeType: . file, parentHandle: 7 , hasThumbnail : true )
242
141
243
142
return [ node5, node6, node7, node8]
244
143
}
0 commit comments