-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathSafeDecodableTests.swift
108 lines (91 loc) · 2.56 KB
/
SafeDecodableTests.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
//
// SafeDecodableTests.swift
// CodableTests
//
// Created by Nate Walczak on 4/6/20.
// Copyright © 2020 Detroit Labs. All rights reserved.
//
import XCTest
@testable import Codable
class SafeDecodableTests: XCTestCase {
func testValue() throws {
// Given
let json = Data("""
{
"sku": "I001",
"name": "Labs Beats V1",
"quantity": 10000
}
""".utf8)
// When
let safeItem: SafeDecodable<Item>
do {
safeItem = try JSONDecoder().decode(SafeDecodable<Item>.self, from: json)
} catch {
XCTFail(error.localizedDescription)
return
}
// Then
XCTAssertNil(safeItem.error)
let item = try XCTUnwrap(safeItem.value)
XCTAssertEqual(item.sku, "I001")
XCTAssertEqual(item.name, "Labs Beats V1")
XCTAssertEqual(item.quantity, 10_000)
}
func testError() {
// Given
let json = Data("""
{
"sku": "I001",
"name": "Labs Beats V1"
}
""".utf8)
// When
let safeItem: SafeDecodable<Item>
do {
safeItem = try JSONDecoder().decode(SafeDecodable<Item>.self, from: json)
} catch {
XCTFail(error.localizedDescription)
return
}
// Then
XCTAssertNil(safeItem.value)
XCTAssertNotNil(safeItem.error)
}
func testValues() throws {
// Given
let json = Data("""
[
{
"sku": "I001",
"name": "Labs Beats V1",
},
{
"sku": "I002",
"name": "Labs Beats V2",
"quantity": 8
},
{
"sku": "I003",
"name": "Labs Beats V3",
}
]
""".utf8)
// When
let safeItems: [SafeDecodable<Item>]
do {
safeItems = try JSONDecoder().decode([SafeDecodable<Item>].self, from: json)
} catch {
XCTFail(error.localizedDescription)
return
}
// Then
let items = safeItems.values()
let firstItem = try XCTUnwrap(items.first)
XCTAssertEqual(firstItem.sku, "I002")
XCTAssertEqual(firstItem.name, "Labs Beats V2")
XCTAssertEqual(firstItem.quantity, 8)
let errors = safeItems.errors()
XCTAssertEqual(errors.count, 2)
}
}