import Foundation
import Testing
@testable import IrdAPI
@Suite struct GateRulesTests {
@Test func normalizeLowercasesTrimsAndStripsTrailingDots() {
#expect(normalizeDomain(" Example.RO.. ") == "example.ro")
#expect(normalizeDomain("") == nil)
#expect(normalizeDomain(" ") == nil)
#expect(normalizeDomain(nil) == nil)
#expect(normalizeDomain(".") == nil)
}
@Test func wildcardMatchesTheBareSuffixAndEverythingUnderIt() {
#expect(patternMatches("*.example.ro", "example.ro"))
#expect(patternMatches("*.example.ro", "a.b.example.ro"))
#expect(!patternMatches("*.example.ro", "notexample.ro"))
#expect(patternMatches("Example.RO.", "example.ro"))
#expect(!patternMatches("example.ro", "a.example.ro"))
#expect(!patternMatches(" ", "example.ro"))
}
@Test func denyWinsOverAllow() {
let rules = GateRules(deniedDomains: ["*.ro"], allowedDomains: ["x.ro"])
#expect(rules.decide("x.ro") == GateDenial(domain: "x.ro", pattern: "*.ro"))
}
@Test func allowListMissDeniesWithoutAPattern() {
let rules = GateRules(allowedDomains: ["x.ro"])
#expect(rules.decide("y.ro") == GateDenial(domain: "y.ro", pattern: nil))
#expect(rules.decide("X.RO.") == nil)
}
@Test func emptyAllowListDeniesEverythingWhileNilAllowsAll() {
#expect(GateRules(allowedDomains: []).decide("x.ro") == GateDenial(domain: "x.ro", pattern: nil))
#expect(GateRules().decide("x.ro") == nil)
}
@Test func unknownDomainPassesUnderDenyListAndFailsClosedUnderAllowList() {
#expect(GateRules(deniedDomains: ["x.ro"]).decide(nil) == nil)
#expect(GateRules(allowedDomains: ["x.ro"]).decide(nil) == GateDenial(domain: nil, pattern: nil))
#expect(GateRules(allowedDomains: ["x.ro"]).decide(" ") == GateDenial(domain: nil, pattern: nil))
}
}