forked from kudoleh/iOS-Clean-Architecture-MVVM
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSearchMoviesUseCaseTests.swift
executable file
·111 lines (99 loc) · 4.25 KB
/
SearchMoviesUseCaseTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import XCTest
class SearchMoviesUseCaseTests: XCTestCase {
static let moviesPages: [MoviesPage] = {
let page1 = MoviesPage(page: 1, totalPages: 2, movies: [
Movie.stub(id: "1", title: "title1", posterPath: "/1", overview: "overview1"),
Movie.stub(id: "2", title: "title2", posterPath: "/2", overview: "overview2")])
let page2 = MoviesPage(page: 2, totalPages: 2, movies: [
Movie.stub(id: "3", title: "title3", posterPath: "/3", overview: "overview3")])
return [page1, page2]
}()
enum MoviesRepositorySuccessTestError: Error {
case failedFetching
}
class MoviesQueriesRepositoryMock: MoviesQueriesRepository {
var recentQueries: [MovieQuery] = []
var fetchCompletionCallsCount = 0
func fetchRecentsQueries(
maxCount: Int,
completion: @escaping (Result<[MovieQuery], Error>) -> Void
) {
completion(.success(recentQueries))
fetchCompletionCallsCount += 1
}
func saveRecentQuery(query: MovieQuery, completion: @escaping (Result<MovieQuery, Error>) -> Void) {
recentQueries.append(query)
}
}
class MoviesRepositoryMock: MoviesRepository {
var result: Result<MoviesPage, Error>
var fetchCompletionCallsCount = 0
init(result: Result<MoviesPage, Error>) {
self.result = result
}
func fetchMoviesList(
query: MovieQuery,
page: Int,
cached: @escaping (MoviesPage) -> Void,
completion: @escaping (Result<MoviesPage, Error>
) -> Void
) -> Cancellable? {
completion(result)
fetchCompletionCallsCount += 1
return nil
}
}
func testSearchMoviesUseCase_whenSuccessfullyFetchesMoviesForQuery_thenQueryIsSavedInRecentQueries() {
// given
var useCaseCompletionCallsCount = 0
let moviesQueriesRepository = MoviesQueriesRepositoryMock()
let moviesRepository = MoviesRepositoryMock(
result: .success(SearchMoviesUseCaseTests.moviesPages[0])
)
let useCase = DefaultSearchMoviesUseCase(
moviesRepository: moviesRepository,
moviesQueriesRepository: moviesQueriesRepository
)
// when
let requestValue = SearchMoviesUseCaseRequestValue(
query: MovieQuery(query: "title1"),
page: 0
)
_ = useCase.execute(
requestValue: requestValue,
cached: { _ in }
) { _ in
useCaseCompletionCallsCount += 1
}
// then
var recents = [MovieQuery]()
moviesQueriesRepository.fetchRecentsQueries(maxCount: 1) { result in
recents = (try? result.get()) ?? []
}
XCTAssertTrue(recents.contains(MovieQuery(query: "title1")))
XCTAssertEqual(useCaseCompletionCallsCount, 1)
XCTAssertEqual(moviesQueriesRepository.fetchCompletionCallsCount, 1)
XCTAssertEqual(moviesRepository.fetchCompletionCallsCount, 1)
}
func testSearchMoviesUseCase_whenFailedFetchingMoviesForQuery_thenQueryIsNotSavedInRecentQueries() {
// given
var useCaseCompletionCallsCountCount = 0
let moviesQueriesRepository = MoviesQueriesRepositoryMock()
let useCase = DefaultSearchMoviesUseCase(moviesRepository: MoviesRepositoryMock(result: .failure(MoviesRepositorySuccessTestError.failedFetching)),
moviesQueriesRepository: moviesQueriesRepository)
// when
let requestValue = SearchMoviesUseCaseRequestValue(query: MovieQuery(query: "title1"),
page: 0)
_ = useCase.execute(requestValue: requestValue, cached: { _ in }) { _ in
useCaseCompletionCallsCountCount += 1
}
// then
var recents = [MovieQuery]()
moviesQueriesRepository.fetchRecentsQueries(maxCount: 1) { result in
recents = (try? result.get()) ?? []
}
XCTAssertTrue(recents.isEmpty)
XCTAssertEqual(useCaseCompletionCallsCountCount, 1)
XCTAssertEqual(moviesQueriesRepository.fetchCompletionCallsCount, 1)
}
}