P3: iOS parity gallery (swift-snapshot-testing, 1.17.0+)

Records 58 baseline PNGs across 29 primary SwiftUI screens × {light, dark}
for the honeyDue iOS app. Covers auth, password reset, onboarding,
residences, tasks, contractors, documents, profile, and subscription
surfaces — everything that's instantiable without complex runtime context.

State coverage is empty-only for this first pass: views currently spin up
their own ViewModels which read DataManagerObservable.shared directly, and
the test host has no login → all flows render their empty states. A
follow-up PR adds an optional `dataManager:` init param to each
*ViewModel.swift so populated-state snapshots (backed by P1's
FixtureDataManager) can land.

Tolerance knobs: pixelPrecision 0.97 / perceptualPrecision 0.95 — tuned to
absorb animation-frame drift (gradient blobs, focus rings) while catching
structural regressions.

Tooling: swift-snapshot-testing SPM dep added to the HoneyDueTests target
only (not the app target) via scripts/add_snapshot_testing.rb, which is an
idempotent xcodeproj-gem script so the edit is reproducible rather than a
hand-crafted pbxproj diff. Pins resolve to 1.19.2 (up-to-next-major from
the 1.17.0 plan floor).

Blocks regressions at PR time via `xcodebuild test
-only-testing:HoneyDueTests/SnapshotGalleryTests`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Trey T
2026-04-18 19:37:09 -05:00
parent 47eaf5a0c0
commit 6f2fb629c9
62 changed files with 465 additions and 9 deletions

View File

@@ -15,6 +15,7 @@
1C81F2822EE41BB6000739EA /* QuickLookThumbnailing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C81F2812EE41BB6000739EA /* QuickLookThumbnailing.framework */; };
1C81F2892EE41BB6000739EA /* HoneyDueQLThumbnail.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 1C81F2802EE41BB6000739EA /* HoneyDueQLThumbnail.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
1C81F3902EE69AF1000739EA /* PostHog in Frameworks */ = {isa = PBXBuildFile; productRef = 1C81F38F2EE69AF1000739EA /* PostHog */; };
36A43DA6D19BA51568EC55A5 /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 6424E7E39866AD706041F321 /* SnapshotTesting */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -201,6 +202,8 @@
};
7A237E53D5D71D9D6A361E29 /* Configuration */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
);
path = Configuration;
sourceTree = "<group>";
};
@@ -230,6 +233,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
36A43DA6D19BA51568EC55A5 /* SnapshotTesting in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -337,8 +341,6 @@
1C0789432EBC218B00392B46 /* HoneyDue */,
);
name = HoneyDueExtension;
packageProductDependencies = (
);
productName = HoneyDueExtension;
productReference = 1C07893D2EBC218B00392B46 /* HoneyDueExtension.appex */;
productType = "com.apple.product-type.app-extension";
@@ -361,6 +363,7 @@
);
name = HoneyDueTests;
packageProductDependencies = (
6424E7E39866AD706041F321 /* SnapshotTesting */,
);
productName = HoneyDueTests;
productReference = 1C685CD22EC5539000A9669B /* HoneyDueTests.xctest */;
@@ -382,8 +385,6 @@
1C81F26C2EE416EE000739EA /* HoneyDueQLPreview */,
);
name = HoneyDueQLPreview;
packageProductDependencies = (
);
productName = HoneyDueQLPreview;
productReference = 1C81F2692EE416EE000739EA /* HoneyDueQLPreview.appex */;
productType = "com.apple.product-type.app-extension";
@@ -404,8 +405,6 @@
1C81F2832EE41BB6000739EA /* HoneyDueQLThumbnail */,
);
name = HoneyDueQLThumbnail;
packageProductDependencies = (
);
productName = HoneyDueQLThumbnail;
productReference = 1C81F2802EE41BB6000739EA /* HoneyDueQLThumbnail.appex */;
productType = "com.apple.product-type.app-extension";
@@ -427,8 +426,6 @@
1CBF1BEE2ECD9768001BF56C /* HoneyDueUITests */,
);
name = HoneyDueUITests;
packageProductDependencies = (
);
productName = HoneyDueUITests;
productReference = 1CBF1BED2ECD9768001BF56C /* HoneyDueUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
@@ -504,6 +501,7 @@
minimizedProjectReferenceProxies = 1;
packageReferences = (
1C81F38E2EE69698000739EA /* XCRemoteSwiftPackageReference "posthog-ios" */,
15EBA3121E0FD8442B65FC71 /* XCRemoteSwiftPackageReference "swift-snapshot-testing" */,
);
preferredProjectObjectVersion = 77;
productRefGroup = FA6022B7B844191C54E57EB4 /* Products */;
@@ -1224,6 +1222,14 @@
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
15EBA3121E0FD8442B65FC71 /* XCRemoteSwiftPackageReference "swift-snapshot-testing" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/pointfreeco/swift-snapshot-testing";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 1.17.0;
};
};
1C81F38E2EE69698000739EA /* XCRemoteSwiftPackageReference "posthog-ios" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/PostHog/posthog-ios.git";
@@ -1240,6 +1246,11 @@
package = 1C81F38E2EE69698000739EA /* XCRemoteSwiftPackageReference "posthog-ios" */;
productName = PostHog;
};
6424E7E39866AD706041F321 /* SnapshotTesting */ = {
isa = XCSwiftPackageProductDependency;
package = 15EBA3121E0FD8442B65FC71 /* XCRemoteSwiftPackageReference "swift-snapshot-testing" */;
productName = SnapshotTesting;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 6A3E1D84F9F1A2FD92A75A6C /* Project object */;

View File

@@ -1,5 +1,5 @@
{
"originHash" : "47cbe4ef2adc7155b834c1fb5ae451e260f9ef6ba19f0658c4fcafd3565fad48",
"originHash" : "8d2dc312a50c3ca2edce0566ec936acffb1ad4994986cda0c1f773163efa59de",
"pins" : [
{
"identity" : "posthog-ios",
@@ -9,6 +9,42 @@
"revision" : "fac9fc77380d2a38c3389f3cf4505a534921ee41",
"version" : "3.35.1"
}
},
{
"identity" : "swift-custom-dump",
"kind" : "remoteSourceControl",
"location" : "https://github.com/pointfreeco/swift-custom-dump",
"state" : {
"revision" : "06c57924455064182d6b217f06ebc05d00cb2990",
"version" : "1.5.0"
}
},
{
"identity" : "swift-snapshot-testing",
"kind" : "remoteSourceControl",
"location" : "https://github.com/pointfreeco/swift-snapshot-testing",
"state" : {
"revision" : "ad5e3190cc63dc288f28546f9c6827efc1e9d495",
"version" : "1.19.2"
}
},
{
"identity" : "swift-syntax",
"kind" : "remoteSourceControl",
"location" : "https://github.com/swiftlang/swift-syntax",
"state" : {
"revision" : "2b59c0c741e9184ab057fd22950b491076d42e91",
"version" : "603.0.0"
}
},
{
"identity" : "xctest-dynamic-overlay",
"kind" : "remoteSourceControl",
"location" : "https://github.com/pointfreeco/xctest-dynamic-overlay",
"state" : {
"revision" : "dfd70507def84cb5fb821278448a262c6ff2bbad",
"version" : "1.9.0"
}
}
],
"version" : 3