Stabilize iOS/watchOS/tvOS apps and add cross-platform audit remediation
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
import XCTest
|
||||
@testable import SharedCore
|
||||
|
||||
final class BoundedFIFOQueueTests: XCTestCase {
|
||||
func testDisconnectReconnectFlushPreservesOrder() {
|
||||
var queue = BoundedFIFOQueue<Int>(maxCount: 5)
|
||||
|
||||
_ = queue.enqueue(10)
|
||||
_ = queue.enqueue(20)
|
||||
_ = queue.enqueue(30)
|
||||
|
||||
XCTAssertEqual(queue.dequeueAll(), [10, 20, 30])
|
||||
XCTAssertTrue(queue.isEmpty)
|
||||
}
|
||||
|
||||
func testOverflowDropsOldestPayloads() {
|
||||
var queue = BoundedFIFOQueue<Int>(maxCount: 3)
|
||||
|
||||
XCTAssertEqual(queue.enqueue(1), 0)
|
||||
XCTAssertEqual(queue.enqueue(2), 0)
|
||||
XCTAssertEqual(queue.enqueue(3), 0)
|
||||
XCTAssertEqual(queue.enqueue(4), 1)
|
||||
XCTAssertEqual(queue.enqueue(5), 1)
|
||||
|
||||
XCTAssertEqual(queue.dequeueAll(), [3, 4, 5])
|
||||
}
|
||||
|
||||
func testMaxCountHasLowerBoundOfOne() {
|
||||
var queue = BoundedFIFOQueue<Int>(maxCount: 0)
|
||||
|
||||
_ = queue.enqueue(1)
|
||||
XCTAssertEqual(queue.enqueue(2), 1)
|
||||
XCTAssertEqual(queue.dequeueAll(), [2])
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
import XCTest
|
||||
@testable import SharedCore
|
||||
|
||||
final class WatchPayloadValidationTests: XCTestCase {
|
||||
private struct MockPayload: Codable, Equatable {
|
||||
let name: String
|
||||
let count: Int
|
||||
}
|
||||
|
||||
func testValidateRejectsEmptyPayload() {
|
||||
let error = WatchPayloadValidation.validate(Data())
|
||||
XCTAssertEqual(error, .emptyPayload)
|
||||
}
|
||||
|
||||
func testValidateRejectsOversizedPayload() {
|
||||
let payload = Data(repeating: 0, count: 9)
|
||||
let error = WatchPayloadValidation.validate(payload, maxBytes: 8)
|
||||
XCTAssertEqual(error, .payloadTooLarge(actualBytes: 9, maxBytes: 8))
|
||||
}
|
||||
|
||||
func testDecodeAcceptsValidPayload() throws {
|
||||
let payload = try JSONEncoder().encode(MockPayload(name: "set", count: 12))
|
||||
let decoded = try WatchPayloadValidation.decode(MockPayload.self, from: payload)
|
||||
XCTAssertEqual(decoded, MockPayload(name: "set", count: 12))
|
||||
}
|
||||
|
||||
func testDecodeRejectsInvalidJSON() throws {
|
||||
let invalid = Data("not-json".utf8)
|
||||
|
||||
XCTAssertThrowsError(try WatchPayloadValidation.decode(MockPayload.self, from: invalid)) { error in
|
||||
XCTAssertEqual(error as? WatchPayloadValidationError, .decodeFailure)
|
||||
}
|
||||
}
|
||||
|
||||
func testDecodeRejectsOversizedPayloadBeforeDecoding() {
|
||||
let payload = Data(repeating: 1, count: 32)
|
||||
|
||||
XCTAssertThrowsError(
|
||||
try WatchPayloadValidation.decode(MockPayload.self, from: payload, maxBytes: 16)
|
||||
) { error in
|
||||
XCTAssertEqual(
|
||||
error as? WatchPayloadValidationError,
|
||||
.payloadTooLarge(actualBytes: 32, maxBytes: 16)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
import XCTest
|
||||
@testable import SharedCore
|
||||
|
||||
final class WorkoutValidationTests: XCTestCase {
|
||||
func testValidateSupersetsRejectsEmptyPayload() {
|
||||
let issues = WorkoutValidation.validateSupersets([])
|
||||
XCTAssertEqual(issues.first?.code, "empty_supersets")
|
||||
}
|
||||
|
||||
func testValidateSupersetsRejectsInvalidRoundsAndExercisePayload() {
|
||||
let supersets: [[String: Any]] = [
|
||||
[
|
||||
"rounds": 0,
|
||||
"exercises": [
|
||||
["reps": 0, "duration": 0]
|
||||
]
|
||||
]
|
||||
]
|
||||
|
||||
let issues = WorkoutValidation.validateSupersets(supersets)
|
||||
XCTAssertTrue(issues.contains(where: { $0.code == "invalid_rounds" }))
|
||||
XCTAssertTrue(issues.contains(where: { $0.code == "invalid_exercise_payload" }))
|
||||
}
|
||||
|
||||
func testValidateSupersetsAcceptsValidPayload() {
|
||||
let supersets: [[String: Any]] = [
|
||||
[
|
||||
"rounds": 3,
|
||||
"exercises": [
|
||||
["reps": 12, "duration": 0],
|
||||
["reps": 0, "duration": 30]
|
||||
]
|
||||
]
|
||||
]
|
||||
|
||||
let issues = WorkoutValidation.validateSupersets(supersets)
|
||||
XCTAssertTrue(issues.isEmpty)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user