Full rename ahead of App Store submission: project, targets, bundle identifiers (dev.bchen.Severed -> dev.bchen.OpenAppLock), entitlements file, app entry point, user-facing onboarding strings, test helpers, and docs. Verified: all 62 unit tests pass. Co-Authored-By: Claude <noreply@anthropic.com>
82 lines
3.1 KiB
Swift
82 lines
3.1 KiB
Swift
//
|
|
// RulePolicyTests.swift
|
|
// OpenAppLockTests
|
|
//
|
|
|
|
import Foundation
|
|
import Testing
|
|
|
|
@testable import OpenAppLock
|
|
|
|
@MainActor
|
|
@Suite("Hard Mode policy")
|
|
struct RulePolicyTests {
|
|
let mondayDuringWork = date(2025, 1, 6, 10, 0)
|
|
let mondayEvening = date(2025, 1, 6, 19, 0)
|
|
|
|
func rule(hardMode: Bool) -> BlockingRule {
|
|
BlockingRule(name: "Work Time", hardMode: hardMode)
|
|
}
|
|
|
|
@Test("An active Hard Mode rule is locked")
|
|
func hardLockedWhileActive() {
|
|
let rule = rule(hardMode: true)
|
|
#expect(RulePolicy.isHardLocked(rule, at: mondayDuringWork, calendar: utc))
|
|
#expect(!RulePolicy.canEdit(rule, at: mondayDuringWork, calendar: utc))
|
|
#expect(!RulePolicy.canDisable(rule, at: mondayDuringWork, calendar: utc))
|
|
#expect(!RulePolicy.canDelete(rule, at: mondayDuringWork, calendar: utc))
|
|
#expect(!RulePolicy.canUnblock(rule, at: mondayDuringWork, calendar: utc))
|
|
#expect(!RulePolicy.canTurnOffHardMode(rule, at: mondayDuringWork, calendar: utc))
|
|
}
|
|
|
|
@Test("A Hard Mode rule unlocks once its window ends")
|
|
func unlockedOutsideWindow() {
|
|
let rule = rule(hardMode: true)
|
|
#expect(!RulePolicy.isHardLocked(rule, at: mondayEvening, calendar: utc))
|
|
#expect(RulePolicy.canEdit(rule, at: mondayEvening, calendar: utc))
|
|
#expect(RulePolicy.canDisable(rule, at: mondayEvening, calendar: utc))
|
|
#expect(RulePolicy.canDelete(rule, at: mondayEvening, calendar: utc))
|
|
#expect(RulePolicy.canTurnOffHardMode(rule, at: mondayEvening, calendar: utc))
|
|
}
|
|
|
|
@Test("A disabled Hard Mode rule is not locked")
|
|
func disabledRuleNotLocked() {
|
|
let rule = rule(hardMode: true)
|
|
rule.isEnabled = false
|
|
#expect(!RulePolicy.isHardLocked(rule, at: mondayDuringWork, calendar: utc))
|
|
#expect(RulePolicy.canEdit(rule, at: mondayDuringWork, calendar: utc))
|
|
}
|
|
|
|
@Test("Active non-Hard-Mode rules may be unblocked")
|
|
func softRuleUnblockable() {
|
|
let rule = rule(hardMode: false)
|
|
#expect(RulePolicy.canUnblock(rule, at: mondayDuringWork, calendar: utc))
|
|
}
|
|
|
|
@Test("Unblocking pauses the rule until its window ends")
|
|
func unblockPausesUntilWindowEnd() {
|
|
let rule = rule(hardMode: false)
|
|
let didUnblock = RulePolicy.unblock(rule, at: mondayDuringWork, calendar: utc)
|
|
#expect(didUnblock)
|
|
#expect(rule.pausedUntil == date(2025, 1, 6, 17, 0))
|
|
#expect(rule.status(at: mondayDuringWork, calendar: utc)
|
|
== .paused(until: date(2025, 1, 6, 17, 0)))
|
|
}
|
|
|
|
@Test("Unblocking a Hard Mode rule is refused and changes nothing")
|
|
func hardModeUnblockRefused() {
|
|
let rule = rule(hardMode: true)
|
|
let didUnblock = RulePolicy.unblock(rule, at: mondayDuringWork, calendar: utc)
|
|
#expect(!didUnblock)
|
|
#expect(rule.pausedUntil == nil)
|
|
#expect(rule.status(at: mondayDuringWork, calendar: utc).isActive)
|
|
}
|
|
|
|
@Test("Unblocking an inactive rule is refused")
|
|
func inactiveUnblockRefused() {
|
|
let rule = rule(hardMode: false)
|
|
#expect(!RulePolicy.unblock(rule, at: mondayEvening, calendar: utc))
|
|
#expect(rule.pausedUntil == nil)
|
|
}
|
|
}
|