Skip to content

Commit 94a782a

Browse files
Merge pull request #3 from NicolaLancellotti/master
Added new features
2 parents 9905450 + 79b36de commit 94a782a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2394
-1099
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//
2+
// This source file is part of the Marvin open source project.
3+
// Copyright © 2018 Monk. All rights reserved.
4+
//
5+
6+
import XCTest
7+
import Marvin
8+
9+
class CustomResultTests: XCTestCase {
10+
11+
func testErrorResult() {
12+
typealias ErrorResult<T> = Result<T, Error>
13+
14+
let error1: ErrorResult<Int> = .ok(10)
15+
XCTAssert(error1.isOk)
16+
let error2: ErrorResult<Int> = .err(GenericError(description: ""))
17+
XCTAssert(error2.isErr)
18+
}
19+
20+
func testNetworkResult() {
21+
enum NetworkError: Error, LocalizedError {
22+
case ko
23+
public var errorDescription: String? { return ""}
24+
}
25+
26+
typealias NetworkResult<T> = Result<T, NetworkError>
27+
28+
let error1: NetworkResult<Int> = .ok(10)
29+
XCTAssert(error1.isOk)
30+
let error2: NetworkResult<Int> = .err(.ko)
31+
XCTAssert(error2.isErr)
32+
}
33+
34+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//
2+
// This source file is part of the Marvin open source project.
3+
// Copyright © 2018 Monk. All rights reserved.
4+
//
5+
6+
import XCTest
7+
import Marvin
8+
9+
class ResultTests: XCTestCase {
10+
11+
func testOk() {
12+
var resultOk: Result<Int, String>
13+
resultOk = .ok(1)
14+
XCTAssert(resultOk.isOk)
15+
XCTAssert(resultOk.ok == .some(1))
16+
XCTAssert(resultOk.map({ (value) -> String in String(value)}) == .ok("1"))
17+
XCTAssert(resultOk.mapErr({ (err) -> Int in err.count}).ok! == 1)
18+
19+
20+
let result1 = resultOk.flatMap({ (value: Int) -> Result<String, String> in
21+
Result.ok("ok")
22+
})
23+
XCTAssert(result1.ok! == "ok")
24+
25+
26+
let result2 = resultOk.flatMap({ (value: Int) -> Result<String, String> in
27+
Result.err("e")
28+
})
29+
XCTAssert(result2.err! == "e")
30+
}
31+
32+
func testErr() {
33+
var resultErr: Result<Int32, String>
34+
resultErr = .err("error")
35+
XCTAssert(resultErr.isErr)
36+
XCTAssert(resultErr.err == .some("error"))
37+
XCTAssert(resultErr.map({ (value) -> String in String(value)}) == .err("error"))
38+
XCTAssert(resultErr.mapErr({ (err) -> Int in err.count}).err! == 5)
39+
40+
41+
let result1 = resultErr.flatMapErr({ (err: String) -> Result<Int32, Int> in
42+
Result.ok(1)
43+
})
44+
XCTAssert(result1.ok! == 1)
45+
46+
let result2 = resultErr.flatMapErr({ (err: String) -> Result<Int32, Int> in
47+
Result.err(1)
48+
})
49+
XCTAssert(result2.err! == 1)
50+
}
51+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// This source file is part of the Marvin open source project.
3+
// Copyright © 2018 Monk. All rights reserved.
4+
//
5+
6+
import XCTest
7+
import Marvin
8+
9+
class GenericErrorTests: XCTestCase {
10+
11+
func testExample() {
12+
let e: Error = GenericError(description: "test")
13+
XCTAssertEqual(e.localizedDescription, "test")
14+
}
15+
16+
}
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
//
2+
// This source file is part of the Marvin open source project.
3+
// Copyright © 2018 Monk. All rights reserved.
4+
//
5+
6+
import XCTest
7+
import Marvin
8+
9+
func currentQueueName() -> String? {
10+
let name = __dispatch_queue_get_label(nil)
11+
return String(cString: name, encoding: .utf8)
12+
}
13+
14+
class NetworkTests: XCTestCase {
15+
16+
// _____________________________________________________________________________
17+
// MARK: - Queues
18+
19+
func test_sync_fromMain() {
20+
Network.execute(mode: .sync, request: Requests.testGet(id: 1)) { _ in
21+
XCTAssert(Thread.isMainThread)
22+
}
23+
}
24+
25+
func test_Sync_NotFromMain() {
26+
let exp = expectation(description: "test_sync_fromMain")
27+
let queue = DispatchQueue(label: "test_sync_fromMain", qos: .default);
28+
29+
queue.async {
30+
Network.execute(mode: .sync,
31+
request: Requests.testGet(id: 1))
32+
{ _ in
33+
XCTAssertEqual(currentQueueName(), "test_sync_fromMain")
34+
exp.fulfill()
35+
}
36+
}
37+
wait(for: [exp], timeout: 60);
38+
}
39+
40+
func test_async() {
41+
let exp = expectation(description: "test_async")
42+
let queue = DispatchQueue(label: "test_async", qos: .default);
43+
44+
Network.execute(mode: .async(responseQueue: queue),
45+
request: Requests.testGet(id: 1))
46+
{ _ in
47+
XCTAssertEqual(currentQueueName(), "test_async")
48+
exp.fulfill()
49+
}
50+
51+
wait(for: [exp], timeout: 60);
52+
}
53+
54+
// _____________________________________________________________________________
55+
// MARK: - Methods
56+
57+
func test_get_custom() {
58+
Network.execute(mode: .sync,
59+
request: Requests.testGetCustom(id: 1))
60+
{ result in
61+
switch result {
62+
case .ok(let response): XCTAssert(response.item.userId == 1)
63+
case .err(let error): XCTFail(error.localizedDescription)
64+
}
65+
}
66+
}
67+
68+
func test_get() {
69+
let req = Requests.testGet(id: 12)
70+
71+
Network.execute(mode: .sync,
72+
request: req)
73+
{ result in
74+
switch result {
75+
case .ok(let item):
76+
print(item)
77+
case .err(let e):
78+
switch e {
79+
case .networkError(_): break
80+
case .parseJSONError(_): break
81+
}
82+
}
83+
}
84+
}
85+
86+
func test_delete() {
87+
let item = Item(userId: 1, title: "title", body: "body")
88+
let req = Requests.testDelete(item: item)
89+
90+
Network.execute(mode: .sync,
91+
request: req)
92+
{ result in
93+
switch result {
94+
case .ok(let item):
95+
print(item)
96+
case .err(let e):
97+
switch e {
98+
case .networkError(_): break
99+
case .parseJSONError(_): break
100+
}
101+
}
102+
}
103+
}
104+
105+
func test_operation() {
106+
let exp = expectation(description: "test_operation")
107+
108+
let item = Item(userId: 1, title: "title", body: "body")
109+
let operation = DeleteOperation(item: item)
110+
operation.completionBlock = {
111+
exp.fulfill()
112+
}
113+
OperationQueue().addOperation(operation)
114+
115+
waitForExpectations(timeout: 10) { error in
116+
if error != nil {
117+
XCTFail()
118+
}
119+
}
120+
121+
}
122+
}
123+
124+
125+
class DeleteOperation: Operation, Codable {
126+
127+
let item: Item
128+
129+
init(item: Item) {
130+
self.item = item
131+
}
132+
133+
override func main() {
134+
let req = Requests.testDelete(item: item)
135+
136+
Network.execute(mode: .sync,
137+
request: req)
138+
{ result in
139+
switch result {
140+
case .ok(_):
141+
break
142+
case .err(let error):
143+
XCTFail(error.localizedDescription)
144+
}
145+
}
146+
}
147+
}
148+
149+
150+
151+
152+
153+
154+
155+
156+
157+
158+
159+
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
//
2+
// This source file is part of the Marvin open source project.
3+
// Copyright © 2018 Monk. All rights reserved.
4+
//
5+
6+
import Foundation
7+
import Marvin
8+
9+
enum Requests {
10+
static let endpoint = URL(string: "https://jsonplaceholder.typicode.com")!
11+
12+
struct Empty: Codable {
13+
14+
}
15+
16+
static func testGet(id: Int) -> NetworkRequest<Item> {
17+
return NetworkRequest(path: endpoint + "posts/\(id)",
18+
method: .get,
19+
response: Item.self)
20+
}
21+
22+
static func testDelete(item: Item) -> NetworkRequest<Empty> {
23+
let path = endpoint + "posts\(item.userId)"
24+
let body = try! JSONEncoder().encode(item)
25+
return NetworkRequest(path: path,
26+
method: .delete,
27+
headers: nil,
28+
bodyAsJSON: body,
29+
queryString: nil,
30+
response: Empty.self)
31+
32+
}
33+
34+
static func testGetCustom(id: Int) -> NetworkRequestWithCustomResponse<CustomTestGetResponse> {
35+
return NetworkRequestWithCustomResponse(path: endpoint + "posts/\(id)",
36+
method: .get,
37+
headers: nil,
38+
bodyAsJSON: nil,
39+
queryString: nil,
40+
response: CustomTestGetResponse.self)
41+
}
42+
43+
}
44+
45+
46+
struct Item: Codable {
47+
let userId: Int
48+
let title: String
49+
let body: String
50+
}
51+
52+
53+
struct CustomTestGetResponse: Response {
54+
55+
let item: Item
56+
57+
static func make(jsonData: Data) -> ErrorResult<CustomTestGetResponse> {
58+
return CustomTestGetResponse.decode {
59+
let item = try $0.decode(Item.self, from: jsonData)
60+
return CustomTestGetResponse(item: item)
61+
}
62+
}
63+
}

0 commit comments

Comments
 (0)