Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Encodable.jsonEncodedData: fixed tests on iOS 17 due to inconsistent key ordering #2607

Merged
merged 4 commits into from
Jun 9, 2023

Conversation

NachoSoto
Copy link
Contributor

@NachoSoto NachoSoto commented Jun 8, 2023

A bunch of tests were failing on Xcode 15 due to a change in Swift, because we relying on being able to verify that the encoded Data saved to caches is consistent.
Starting on Swift 5.9 JSONEncoder has optimizations that mean we can't rely on it.

To fix this, this PR does 2 things:

  • Changed JSONEncoder.prettyPrinted to have .sortedKeys
  • Changed test to verify the decoded response struct, not the raw encoded Data

Note that I didn't make JSONEncoder.default use .sortedKeys because of the potential performance impact. Encodable.prettyPrintedData is used in tests like ReceiptFetcherTests (which this PR fixes) and for debug purposes, but Encodable.encodedJSON is used everywhere.

@NachoSoto NachoSoto requested a review from a team June 8, 2023 21:25
@NachoSoto NachoSoto mentioned this pull request Jun 8, 2023
@codecov
Copy link

codecov bot commented Jun 8, 2023

Codecov Report

Merging #2607 (5cea985) into main (9494f2e) will decrease coverage by 0.03%.
The diff coverage is n/a.

❗ Current head 5cea985 differs from pull request most recent head d82ca8e. Consider uploading reports for the commit d82ca8e to get more accurate results

@@            Coverage Diff             @@
##             main    #2607      +/-   ##
==========================================
- Coverage   86.29%   86.26%   -0.03%     
==========================================
  Files         205      205              
  Lines       14334    14328       -6     
==========================================
- Hits        12369    12360       -9     
- Misses       1965     1968       +3     

see 4 files with indirect coverage changes

@NachoSoto NachoSoto changed the title JSONEncoding: add tests to cover Xcode 15 regression JSONEncoding: sort keys to ensure data consistency Jun 9, 2023
@NachoSoto
Copy link
Contributor Author

That issue was closed, which confirms that we do indeed need to sort keys to ensure consistent results.

NachoSoto added 3 commits June 9, 2023 09:54
These and a bunch of other tests are failing on Xcode 15 due to [a regression](swiftlang/swift#66466).
To make the other failures more explicit, I've added new comparisons to ensure that both the `CustomerInfoResponse` and underlying `Data` are encoded equally.

This breaks tests because we relying on being able to verify that the encoded `Data` saved to caches is consistent.

A potential workaround (if they don't fix that regression) will be to force key ordering:
```diff
diff --git i/Sources/LocalReceiptParsing/DataConverters/Codable+Extensions.swift w/Sources/LocalReceiptParsing/DataConverters/Codable+Extensions.swift
index 025419d6..2d43b7a5 100644
--- i/Sources/LocalReceiptParsing/DataConverters/Codable+Extensions.swift
+++ w/Sources/LocalReceiptParsing/DataConverters/Codable+Extensions.swift
@@ -53,6 +53,7 @@ extension JSONEncoder {
         let encoder = JSONEncoder()
         encoder.keyEncodingStrategy = .convertToSnakeCase
         encoder.dateEncodingStrategy = .iso8601
+        encoder.outputFormatting = .sortedKeys

         return encoder
     }()
@@ -61,7 +62,7 @@ extension JSONEncoder {
         let encoder = JSONEncoder()
         encoder.keyEncodingStrategy = .convertToSnakeCase
         encoder.dateEncodingStrategy = .iso8601
-        encoder.outputFormatting = .prettyPrinted
+        encoder.outputFormatting = [.sortedKeys, .prettyPrinted]

         return encoder
     }()
```
@NachoSoto NachoSoto force-pushed the json-encoding-test-regression branch from ee29e79 to 07f1342 Compare June 9, 2023 17:01
@NachoSoto NachoSoto changed the title JSONEncoding: sort keys to ensure data consistency Encodable.jsonEncodedData: fixed tests on iOS 17 due to inconsistent key ordering Jun 9, 2023
@NachoSoto NachoSoto force-pushed the json-encoding-test-regression branch from 07f1342 to d82ca8e Compare June 9, 2023 17:04
@NachoSoto NachoSoto requested review from tonidero and a team June 9, 2023 17:07
@NachoSoto
Copy link
Contributor Author

@tonidero mind taking another look? I reworked this PR to actually fix the issue, now that I got a response and we know it's not really a regression.

Copy link
Contributor

@tonidero tonidero left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

@NachoSoto NachoSoto enabled auto-merge (squash) June 9, 2023 18:02
@NachoSoto NachoSoto merged commit 4187316 into main Jun 9, 2023
@NachoSoto NachoSoto deleted the json-encoding-test-regression branch June 9, 2023 18:31
This was referenced Jun 13, 2023
NachoSoto pushed a commit that referenced this pull request Jun 13, 2023
**This is an automatic release.**

### New Features
* New `DebugViewController`: UIKit counterpart for SwiftUI's
`debugRevenueCatOverlay` (#2631) via NachoSoto (@NachoSoto)
* Created `PaywallExtensions`: `StoreView` and `SubscriptionStoreView`
overloads for `Offering` (#2593) via NachoSoto (@NachoSoto)
* Introduced `debugRevenueCatOverlay()`: new SwiftUI debug overlay
(#2567) via NachoSoto (@NachoSoto)
### Bugfixes
* Removed `preventPurchasePopupCallFromTriggeringCacheRefresh`, update
caches on `willEnterForeground` (#2623) via NachoSoto (@NachoSoto)
* Fixed `Catalyst` build with `Xcode 15 beta 1` (#2586) via NachoSoto
(@NachoSoto)
### Dependency Updates
* Bump danger from 9.3.0 to 9.3.1 (#2592) via dependabot[bot]
(@dependabot[bot])
### Other Changes
* `StoreTransaction`: added new `Storefront` to API testers (#2634) via
NachoSoto (@NachoSoto)
* `DebugView`: added snapshot tests (#2630) via NachoSoto (@NachoSoto)
* `verifyNoUnfinishedTransactions`/`verifyUnfinishedTransaction`: added
missing `#file` parameter (#2625) via NachoSoto (@NachoSoto)
* `PostReceiptDataOperation`: clean up cache key (#2628) via NachoSoto
(@NachoSoto)
* `PurchasesOrchestrator`: also get `Storefront` from SK1 (#2629) via
NachoSoto (@NachoSoto)
* `CI`: disable iOS 17 for now (#2627) via NachoSoto (@NachoSoto)
* `Tests`: fixed crash on iOS 13 (#2624) via NachoSoto (@NachoSoto)
* `StoreTransaction`: read `Storefront` from `StoreKit.Transaction`
(#2611) via NachoSoto (@NachoSoto)
* `StoreKitConfigTestCase`/`BaseStoreKitIntegrationTests`: also clear
transactions after every test (#2616) via NachoSoto (@NachoSoto)
* `ErrorCode.networkError`: improved description (#2610) via NachoSoto
(@NachoSoto)
* `PurchaseTester`: make CI job always point to current version (#2622)
via NachoSoto (@NachoSoto)
* Improved `finishAllUnfinishedTransactions` (#2615) via NachoSoto
(@NachoSoto)
* `StoreKitConfigTestCase`: improved `waitForStoreKitTestIfNeeded`
(#2614) via NachoSoto (@NachoSoto)
* `StoreKitConfigTestCase`: set `continueAfterFailure` to `false`
(#2617) via NachoSoto (@NachoSoto)
* `PaywallExtensions`: fixed compilation (#2613) via NachoSoto
(@NachoSoto)
* `CI`: added `iOS 17` job (#2591) via NachoSoto (@NachoSoto)
* `Encodable.jsonEncodedData`: fixed tests on iOS 17 due to inconsistent
key ordering (#2607) via NachoSoto (@NachoSoto)
* `debugRevenueCatOverlay`: added ability to display new
`SubscriptionStoreView` (#2595) via NachoSoto (@NachoSoto)
* Refactor: extracted all log strings (#2600) via NachoSoto (@NachoSoto)
* Changed tests to work around `URL` decoding differences in `iOS 17`
(#2605) via NachoSoto (@NachoSoto)
* Removed unnecessary `Strings.trimmedOrError` (#2601) via NachoSoto
(@NachoSoto)
* Fixed test compilation with `Xcode 15` (#2602) via NachoSoto
(@NachoSoto)
* Tests: added `iOS 17` snapshots (#2603) via NachoSoto (@NachoSoto)
* `StoreProductDiscount`: added `description` (#2604) via NachoSoto
(@NachoSoto)
* `debugRevenueCatOverlay` improvements (#2594) via NachoSoto
(@NachoSoto)
* `Xcode 15`: fixed all documentation warnings (#2596) via NachoSoto
(@NachoSoto)
* `StoreKitObserverModeIntegrationTests`: fixed and disabled SK2
`testPurchaseInDevicePostsReceipt` (#2589) via NachoSoto (@NachoSoto)
* `StoreKit2TransactionListener`: added log when receiving
`Transactions.Updates` (#2588) via NachoSoto (@NachoSoto)
* `Dictionary.MergeStrategy`: simplify implementation (#2587) via
NachoSoto (@NachoSoto)
* `Configuration.Builder`: fixed doc reference (#2583) via NachoSoto
(@NachoSoto)
* `APITesters`: available since iOS 11 (#2581) via NachoSoto
(@NachoSoto)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants