Skip to content

Commit 654f6d3

Browse files
committed
Fix tests for example app
1 parent 3197543 commit 654f6d3

File tree

5 files changed

+56
-60
lines changed

5 files changed

+56
-60
lines changed

Examples/Examples.xcodeproj/project.pbxproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
archiveVersion = 1;
44
classes = {
55
};
6-
objectVersion = 51;
6+
objectVersion = 52;
77
objects = {
88

99
/* Begin PBXBuildFile section */
@@ -27,6 +27,7 @@
2727
8E4174CA12184B89C04932C3 /* APIRequestPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C56139636BCE9E6B7A5A1CF0 /* APIRequestPage.swift */; };
2828
9A21001120896DD74A77368A /* TodoPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A01793F321BFB68D18E27818 /* TodoPage.swift */; };
2929
A9E31B44F7E151BD8F7A3CD8 /* Hooks in Frameworks */ = {isa = PBXBuildFile; productRef = FD40812DAB4C1F5B720757F7 /* Hooks */; };
30+
B34A8EAE280C5B7B00E83967 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B34A8EAD280C5B7B00E83967 /* Utilities.swift */; };
3031
C078F002FB29736B800B3774 /* CounterPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D8757F265C5526C297EFDB /* CounterPage.swift */; };
3132
DCDC2A61345B88907286B20C /* SimpleUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B06DA75E791F7A1E0B6542 /* SimpleUITests.swift */; };
3233
E404ADC8590A7823470D6488 /* UseMovieImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A76A9D3B40580BCF4FEE209 /* UseMovieImageTests.swift */; };
@@ -77,6 +78,7 @@
7778
A01793F321BFB68D18E27818 /* TodoPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoPage.swift; sourceTree = "<group>"; };
7879
A233EB4C5891C4899B737ACF /* TopRatedMoviesPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TopRatedMoviesPage.swift; sourceTree = "<group>"; };
7980
A80807CB4E7902470EE2CF4E /* Todo.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Todo.app; sourceTree = BUILT_PRODUCTS_DIR; };
81+
B34A8EAD280C5B7B00E83967 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = "<group>"; };
8082
B5CDB321485B19447B2E5863 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = "<group>"; };
8183
C56139636BCE9E6B7A5A1CF0 /* APIRequestPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRequestPage.swift; sourceTree = "<group>"; };
8284
C9F47469489E2AC56001C720 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
@@ -206,6 +208,7 @@
206208
895CD000DCB5854C20C39119 /* MovieDBServiceMock.swift */,
207209
5A76A9D3B40580BCF4FEE209 /* UseMovieImageTests.swift */,
208210
20A38A9D88C5F0D2B9CCAC13 /* UseTopRatedMoviesViewModelTests.swift */,
211+
B34A8EAD280C5B7B00E83967 /* Utilities.swift */,
209212
);
210213
path = "TheMovieDB-MVVM-Tests";
211214
sourceTree = "<group>";
@@ -386,6 +389,7 @@
386389
files = (
387390
22B1EFFA1478D324171D5E75 /* MovieDBServiceMock.swift in Sources */,
388391
E404ADC8590A7823470D6488 /* UseMovieImageTests.swift in Sources */,
392+
B34A8EAE280C5B7B00E83967 /* Utilities.swift in Sources */,
389393
5B2A5E7A0AA463A0BF685F71 /* UseTopRatedMoviesViewModelTests.swift in Sources */,
390394
);
391395
runOnlyForDeploymentPostprocessing = 0;

Examples/TheMovieDB-MVVM-Tests/MovieDBServiceMock.swift

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,19 @@ import UIKit
44
@testable import TheMovieDB_MVVM
55

66
final class MovieDBServiceMock: MovieDBServiceProtocol {
7-
let imageSubject = PassthroughSubject<UIImage?, URLError>()
8-
let moviesSubject = PassthroughSubject<[Movie], URLError>()
7+
var imageResult: Result<UIImage?, URLError>?
8+
var moviesResult: Result<[Movie], URLError>?
99
var totalPages = 100
1010

11-
func getImage(path: String?, size: NetworkImageSize) -> AnyPublisher<UIImage?, URLError> {
12-
imageSubject.eraseToAnyPublisher()
11+
func getImage(path: String?, size: NetworkImageSize) async throws -> UIImage? {
12+
try imageResult?.get()
1313
}
1414

15-
func getTopRated(page: Int) -> AnyPublisher<PagedResponse<Movie>, URLError> {
16-
moviesSubject
17-
.map { [totalPages] movies in
18-
PagedResponse(
19-
page: page,
20-
totalPages: totalPages,
21-
results: movies
22-
)
23-
}
24-
.eraseToAnyPublisher()
15+
func getTopRated(page: Int) async throws -> PagedResponse<Movie> {
16+
try PagedResponse(
17+
page: page,
18+
totalPages: totalPages,
19+
results: moviesResult?.get() ?? []
20+
)
2521
}
2622
}

Examples/TheMovieDB-MVVM-Tests/UseMovieImageTests.swift

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,57 +5,60 @@ import XCTest
55

66
final class UseMovieImageTests: XCTestCase {
77
func testSuccess() {
8+
let image1 = UIImage()
9+
let image2 = UIImage()
10+
let image3 = UIImage()
811
let service = MovieDBServiceMock()
912
let tester = HookTester(("path1", .medium)) { path, size in
1013
useMovieImage(for: path, size: size)
1114
} environment: {
1215
$0[Context<Dependency>.self] = Dependency(service: service)
1316
}
1417

15-
let image1 = UIImage()
16-
let image2 = UIImage()
17-
let image3 = UIImage()
18-
1918
XCTAssertNil(tester.value)
2019

21-
service.imageSubject.send(image1)
20+
service.imageResult = .success(image1)
21+
wait(timeout: 0.1)
2222

2323
XCTAssertTrue(tester.value === image1)
2424

2525
tester.update()
26+
wait(timeout: 0.1)
2627

2728
XCTAssertTrue(tester.value === image1)
2829

2930
tester.update(with: ("path1", .original))
3031

3132
XCTAssertNil(tester.value)
3233

33-
service.imageSubject.send(image2)
34+
service.imageResult = .success(image2)
35+
wait(timeout: 0.1)
3436

3537
XCTAssertTrue(tester.value === image2)
3638

3739
tester.update(with: ("path2", .original))
3840

3941
XCTAssertNil(tester.value)
4042

41-
service.imageSubject.send(image3)
43+
service.imageResult = .success(image3)
44+
wait(timeout: 0.1)
4245

4346
XCTAssertTrue(tester.value === image3)
4447
}
4548

4649
func testFailure() {
50+
let error = URLError(.badURL)
4751
let service = MovieDBServiceMock()
4852
let tester = HookTester(("path1", .medium)) { path, size in
4953
useMovieImage(for: path, size: size)
5054
} environment: {
5155
$0[Context<Dependency>.self] = Dependency(service: service)
5256
}
5357

54-
let error = URLError(.badURL)
55-
5658
XCTAssertNil(tester.value)
5759

58-
service.imageSubject.send(completion: .failure(error))
60+
service.imageResult = .failure(error)
61+
wait(timeout: 0.1)
5962

6063
XCTAssertNil(tester.value)
6164
}

Examples/TheMovieDB-MVVM-Tests/UseTopRatedMoviesViewModelTests.swift

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import XCTest
33

44
@testable import TheMovieDB_MVVM
55

6+
@MainActor
67
final class UseTopRatedMoviesViewModelTests: XCTestCase {
78
func testSelectedMovie() {
89
let tester = HookTester {
@@ -20,7 +21,7 @@ final class UseTopRatedMoviesViewModelTests: XCTestCase {
2021
XCTAssertEqual(tester.value.selectedMovie.wrappedValue, .stub)
2122
}
2223

23-
func testLoad() {
24+
func testLoad() async {
2425
let service = MovieDBServiceMock()
2526
let tester = HookTester {
2627
useTopRatedMoviesViewModel()
@@ -30,26 +31,15 @@ final class UseTopRatedMoviesViewModelTests: XCTestCase {
3031

3132
let movies = Array(repeating: Movie.stub, count: 3)
3233

33-
XCTAssertEqual(tester.value.loadPhase, .pending)
34+
XCTAssertTrue(tester.value.loadPhase.isPending)
3435

35-
tester.value.load()
36+
service.moviesResult = .success(movies)
37+
await tester.value.load()
3638

37-
XCTAssertEqual(tester.value.loadPhase, .running)
38-
39-
service.moviesSubject.send(movies)
40-
41-
XCTAssertEqual(tester.value.loadPhase, .success(movies))
42-
43-
tester.value.load()
44-
45-
XCTAssertEqual(tester.value.loadPhase, .running)
46-
47-
service.moviesSubject.send(movies)
48-
49-
XCTAssertEqual(tester.value.loadPhase, .success(movies))
39+
XCTAssertEqual(tester.value.loadPhase.value, movies)
5040
}
5141

52-
func testLoadNext() {
42+
func testLoadNext() async {
5343
let service = MovieDBServiceMock()
5444
let tester = HookTester {
5545
useTopRatedMoviesViewModel()
@@ -58,28 +48,24 @@ final class UseTopRatedMoviesViewModelTests: XCTestCase {
5848
}
5949

6050
let movies = Array(repeating: Movie.stub, count: 3)
51+
service.moviesResult = .success(movies)
6152

62-
XCTAssertEqual(tester.value.loadPhase, .pending)
63-
64-
tester.value.loadNext()
53+
XCTAssertTrue(tester.value.loadPhase.isPending)
6554

66-
XCTAssertEqual(tester.value.loadPhase, .pending)
55+
await tester.value.loadNext()
6756

68-
tester.value.load()
69-
service.moviesSubject.send(movies)
57+
XCTAssertTrue(tester.value.loadPhase.isPending)
7058

71-
XCTAssertEqual(tester.value.loadPhase, .success(movies))
59+
await tester.value.load()
7260

73-
tester.value.loadNext()
61+
XCTAssertEqual(tester.value.loadPhase.value, movies)
7462

75-
XCTAssertEqual(tester.value.loadPhase, .success(movies))
63+
await tester.value.loadNext()
7664

77-
service.moviesSubject.send(movies)
78-
79-
XCTAssertEqual(tester.value.loadPhase, .success(movies + movies))
65+
XCTAssertEqual(tester.value.loadPhase.value, movies + movies)
8066
}
8167

82-
func testHasNext() {
68+
func testHasNext() async {
8369
let service = MovieDBServiceMock()
8470
let tester = HookTester {
8571
useTopRatedMoviesViewModel()
@@ -89,15 +75,13 @@ final class UseTopRatedMoviesViewModelTests: XCTestCase {
8975

9076
XCTAssertFalse(tester.value.hasNextPage)
9177

92-
tester.value.load()
93-
service.moviesSubject.send([])
78+
service.moviesResult = .success([])
79+
await tester.value.load()
9480

9581
XCTAssertTrue(tester.value.hasNextPage)
9682

9783
service.totalPages = 0
98-
99-
tester.value.load()
100-
service.moviesSubject.send([])
84+
await tester.value.load()
10185

10286
XCTAssertFalse(tester.value.hasNextPage)
10387
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import XCTest
2+
3+
extension XCTestCase {
4+
func wait(timeout seconds: TimeInterval) {
5+
let expectation = expectation(description: #function)
6+
expectation.isInverted = true
7+
wait(for: [expectation], timeout: seconds)
8+
}
9+
}

0 commit comments

Comments
 (0)