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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
@testable import Grain
import XCTest
final class LabelResolutionTests: GrainTestCase {
// MARK: - LabelAction ordering
func testLabelActionSeverityOrder() {
XCTAssertTrue(LabelAction.none < .badge)
XCTAssertTrue(LabelAction.badge < .warnMedia)
XCTAssertTrue(LabelAction.warnMedia < .warnContent)
XCTAssertTrue(LabelAction.warnContent < .hide)
}
// MARK: - resolveLabels with nil/empty
func testNilLabelsReturnsNone() {
let result = resolveLabels(nil, definitions: [])
XCTAssertEqual(result.action, .none)
}
func testEmptyLabelsReturnsNone() {
let result = resolveLabels([], definitions: [])
XCTAssertEqual(result.action, .none)
}
func testLabelWithNilValIsSkipped() {
let label = ATLabel(src: nil, uri: nil, val: nil, cts: nil)
let result = resolveLabels([label], definitions: [])
XCTAssertEqual(result.action, .none)
}
func testLabelWithEmptyValIsSkipped() {
let label = ATLabel(src: nil, uri: nil, val: "", cts: nil)
let result = resolveLabels([label], definitions: [])
XCTAssertEqual(result.action, .none)
}
// MARK: - Fallback definitions
func testPornFallbackToWarnMedia() {
let label = ATLabel(src: nil, uri: nil, val: "porn", cts: nil)
let result = resolveLabels([label], definitions: [])
XCTAssertEqual(result.action, .warnMedia)
XCTAssertEqual(result.label, "porn")
}
func testGoreFallbackToWarnMedia() {
// gore has blurs=media, setting=hide -> warnMedia (media + hide = warnMedia)
let label = ATLabel(src: nil, uri: nil, val: "gore", cts: nil)
let result = resolveLabels([label], definitions: [])
XCTAssertEqual(result.action, .warnMedia)
}
func testDMCAFallbackToHide() {
// dmca-violation has blurs=content, setting=hide -> hide
let label = ATLabel(src: nil, uri: nil, val: "dmca-violation", cts: nil)
let result = resolveLabels([label], definitions: [])
XCTAssertEqual(result.action, .hide)
}
func testDoxxingFallbackToHide() {
let label = ATLabel(src: nil, uri: nil, val: "doxxing", cts: nil)
let result = resolveLabels([label], definitions: [])
XCTAssertEqual(result.action, .hide)
}
func testBangHideFallback() {
let label = ATLabel(src: nil, uri: nil, val: "!hide", cts: nil)
let result = resolveLabels([label], definitions: [])
XCTAssertEqual(result.action, .hide)
}
func testBangWarnFallback() {
let label = ATLabel(src: nil, uri: nil, val: "!warn", cts: nil)
let result = resolveLabels([label], definitions: [])
XCTAssertEqual(result.action, .warnContent)
}
// MARK: - Unknown labels
func testUnknownLabelFallsToBadge() {
let label = ATLabel(src: nil, uri: nil, val: "totally-unknown", cts: nil)
let result = resolveLabels([label], definitions: [])
XCTAssertEqual(result.action, .badge)
XCTAssertEqual(result.label, "totally-unknown")
}
// MARK: - Server-provided definitions
func testServerDefinitionOverridesFallback() {
let def = LabelDefinition(
identifier: "porn",
locales: [LabelLocale(name: "Adult")],
blurs: "content",
defaultSetting: "hide"
)
let label = ATLabel(src: nil, uri: nil, val: "porn", cts: nil)
let result = resolveLabels([label], definitions: [def])
// content + hide = .hide (server says hide, overriding fallback's warnMedia)
XCTAssertEqual(result.action, .hide)
XCTAssertEqual(result.name, "Adult")
}
func testServerDefinitionWithWarnSetting() {
let def = LabelDefinition(
identifier: "custom-label",
locales: [LabelLocale(name: "Custom Warning")],
blurs: "media",
defaultSetting: "warn"
)
let label = ATLabel(src: nil, uri: nil, val: "custom-label", cts: nil)
let result = resolveLabels([label], definitions: [def])
XCTAssertEqual(result.action, .warnMedia)
XCTAssertEqual(result.name, "Custom Warning")
}
// MARK: - Worst wins
func testWorstActionWins() {
let labels = [
ATLabel(src: nil, uri: nil, val: "nudity", cts: nil), // warnMedia
ATLabel(src: nil, uri: nil, val: "dmca-violation", cts: nil), // hide
]
let result = resolveLabels(labels, definitions: [])
XCTAssertEqual(result.action, .hide)
XCTAssertEqual(result.label, "dmca-violation")
}
func testMultipleSameSeverityKeepsFirst() {
// Both are warnMedia — the first one encountered at that severity stays
let labels = [
ATLabel(src: nil, uri: nil, val: "porn", cts: nil),
ATLabel(src: nil, uri: nil, val: "nudity", cts: nil),
]
let result = resolveLabels(labels, definitions: [])
XCTAssertEqual(result.action, .warnMedia)
XCTAssertEqual(result.label, "porn")
}
}