Add WorkoutsTests unit test target

No unit test target existed (testTargets: [] in scheme). Adds a
bundle.unit-test target wired into the Workouts scheme, with a smoke test
that round-trips SplitDocument through IndieSync's DocumentCoder — the
same codec DocumentFileStore uses for every iCloud document.
This commit is contained in:
2026-07-05 10:23:08 -04:00
parent 6c01942406
commit ddd5631ef2
2 changed files with 62 additions and 1 deletions
@@ -0,0 +1,45 @@
import Foundation
import Testing
import IndieSync
@testable import Workouts
/// Round-trips `SplitDocument` through `DocumentCoder` the exact JSON codec
/// (ISO-8601 dates, sorted keys, pretty-printed) `DocumentFileStore` uses to
/// write and read every document in this app's iCloud container.
struct SplitDocumentCodableTests {
/// A whole-second epoch so ISO-8601 round-trips (no fractional-second loss).
private static let stableTimestamp = Date(timeIntervalSince1970: 1_700_000_000)
@Test func encodeDecodeRoundTrip() throws {
let exercise = ExerciseDocument(
id: ULID.make(),
name: "Bench Press",
order: 0,
sets: 4,
reps: 10,
weight: 135,
loadType: 0,
durationSeconds: 0,
weightLastUpdated: Self.stableTimestamp,
weightReminderWeeks: 4
)
let original = SplitDocument(
schemaVersion: SplitDocument.currentSchemaVersion,
id: ULID.make(),
name: "Push Day",
color: "blue",
systemImage: "dumbbell.fill",
order: 0,
createdAt: Self.stableTimestamp,
updatedAt: Self.stableTimestamp,
exercises: [exercise],
activityType: nil
)
let data = try DocumentCoder.encode(original)
let decoded = try DocumentCoder.decode(SplitDocument.self, from: data)
#expect(decoded == original)
#expect(decoded.relativePath == "Splits/\(original.id).json")
}
}
+17 -1
View File
@@ -72,7 +72,23 @@ targets:
TARGETED_DEVICE_FAMILY: "1"
DEVELOPMENT_ASSET_PATHS: "\"Workouts/Preview Content\""
scheme:
testTargets: []
testTargets:
- WorkoutsTests
# ---- unit tests (domain model / codec, against the iOS app target) --------
WorkoutsTests:
type: bundle.unit-test
platform: iOS
sources:
- WorkoutsTests
dependencies:
- target: Workouts
- package: IndieSync
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: dev.rzen.indie.WorkoutsTests
GENERATE_INFOPLIST_FILE: true
SWIFT_STRICT_CONCURRENCY: complete
# ---- watchOS app (no iCloud; syncs through the phone via WatchConnectivity) -
Workouts Watch App: