~ knotless Search/
↑↓ move↵ open⇧↵ all results

grain.social/grain-ios

1 collaborator
0
1
main
139 lines · 5.0 KB Raw History
@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")
    }
}