/
PokemonRepositoryTests.swift
114 lines (100 loc) · 2.96 KB
/
PokemonRepositoryTests.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
112
113
114
import Combine
@testable import PokemonData
import XCTest
final class PokemonRepositoryTests: XCTestCase {
func test_loadAllPokemons_success() async {
// Given
let expectedPokemons: [APIPokemon] = [.mock]
let sut = PokemonRepository(
dependencies: .init(
getAllPokemons: {
expectedPokemons
}, deletePokemon: { _ in
()
}
)
)
var cancellables: [AnyCancellable] = []
// When
let exp = expectation(description: "Publisher")
sut.pokemonsPublisher.sink { result in
switch result {
case .idle:
()
case .loading:
()
case .success(let pokemons):
XCTAssertEqual(pokemons.count, 1)
XCTAssertEqual(pokemons, expectedPokemons.map(\.uiModel))
exp.fulfill()
case .failure:
XCTFail("Shouldn't reach this point")
}
}
.store(in: &cancellables)
await sut.loadAllPokemons()
await fulfillment(of: [exp], timeout: 1)
}
func test_loadAllPokemons_error() async {
// Given
let expectedError = SomeError()
let sut = PokemonRepository(
dependencies: .init(
getAllPokemons: {
throw expectedError
}, deletePokemon: { _ in
()
}
)
)
var cancellables: [AnyCancellable] = []
// When
let exp = expectation(description: "Publisher")
sut.pokemonsPublisher.sink { result in
switch result {
case .idle:
()
case .loading:
()
case .success:
XCTFail("Shouldn't reach this point")
case .failure(let error):
XCTAssertEqual(error as? SomeError, expectedError)
exp.fulfill()
}
}
.store(in: &cancellables)
await sut.loadAllPokemons()
await fulfillment(of: [exp], timeout: 1)
}
func test_wipe() async {
// Given
let expectedError = SomeError()
let sut = PokemonRepository(
dependencies: .init(
getAllPokemons: {
throw expectedError
}, deletePokemon: { _ in
()
}
)
)
sut.pokemonsPublisher = .init(.loading)
// When
await sut.wipe()
// Then
XCTAssertEqual(sut.pokemonsPublisher.value, .idle)
}
}
extension APIPokemon {
static var mock: Self {
APIPokemon(id: "1", name: "Name", imageUrl: "url", type: .fire, trainerId: "2")
}
}
extension Pokemon {
static var mock: Self {
let apiPokemonMock = APIPokemon.mock
return apiPokemonMock.uiModel
}
}
struct SomeError: Error, Equatable {}