-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
When exhaustivity is off receive now waits for the expected action rather than the first action #2100
When exhaustivity is off receive now waits for the expected action rather than the first action #2100
Conversation
@alex-reilly-pronto Can you provide a description of what this PR intends to do? Also, if you found a bug, can you include some tests that would have failed before the changes you made? |
Hi @alex-reilly-pronto, thanks for the PR! I think you definitely have found a bug/oversight with non-exhaustive test stores. However, as @stephencelis mentioned, can you please update the PR description to describe exactly what the problem is and how you are fixing. This is important for us to have for our records. Also it would be nice to get some test coverage. Here is something you can use to get started: func testReceiveWithTimeout() async {
struct Feature: ReducerProtocol {
struct State: Equatable {}
enum Action: Equatable { case tap, response1, response2 }
func reduce(into state: inout State, action: Action) -> EffectTask<Action> {
switch action {
case .tap:
return .run { send in
try await Task.sleep(nanoseconds: 1_000_000_000)
await send(.response1)
try await Task.sleep(nanoseconds: 1_000_000_000)
await send(.response2)
}
case .response1, .response2:
return .none
}
}
}
let store = TestStore(initialState: Feature.State(), reducer: Feature())
store.exhaustivity = .off
await store.send(.tap)
await store.receive(.response2, timeout: 3_000_000_000)
} |
@stephencelis @mbrandonw Wrote up an explanation for the PR and threw in some tests. Thanks for the example! Let me know if anything is unclear |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR @alex-reilly-pronto! This looks good to us and we will merge soon.
Awesome! Happy to hear it. Is that CI failure expected or did I break something? |
Oh nevermind this is one of mine:
Maybe it needs a longer timeout? |
I just bumped the timeouts. They are a bit flakey, but we do have some tools coming soon to improve the situation. |
Ope we had the same idea. Feel free to roll mine back if you don't want all of them bumped. |
…ure to from: "0.55.0" (#452) [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [pointfreeco/swift-composable-architecture](https://togithub.com/pointfreeco/swift-composable-architecture) | minor | `from: "0.51.0"` -> `from: "0.55.0"` | --- ### Release Notes <details> <summary>pointfreeco/swift-composable-architecture (pointfreeco/swift-composable-architecture)</summary> ### [`v0.55.0`](https://togithub.com/pointfreeco/swift-composable-architecture/releases/tag/0.55.0) [Compare Source](https://togithub.com/pointfreeco/swift-composable-architecture/compare/0.54.1...0.55.0) #### What's Changed - Added: The Composable Architecture's SwiftUI bindings integration has been greatly improved, with better support for view state bindings ([pointfreeco/swift-composable-architecture#2215). - Added: `Store.send` and `Store.withState` have been added, for sending actions to stores and accessing store state without needing a view store ([pointfreeco/swift-composable-architecture#2222). - Added: `ReducerProtocol.onChange` ([pointfreeco/swift-composable-architecture#2226). - Added: `EffectOf<Reducer>` convenience type alias to `EffectTask<Reducer.Action>` ([pointfreeco/swift-composable-architecture#2237). - Updated: `swiftui-navigation` has been bumped to 0.8.0 ([pointfreeco/swift-composable-architecture#2239). - Improved: `TestStore` failure messages have been improved ([pointfreeco/swift-composable-architecture#2227, [pointfreeco/swift-composable-architecture#2236). - Fixed: `ForEachStore` no longer force-unwraps its cached value, avoiding crashes in race condition-heavy code (thanks [@​ohitsdaniel](https://togithub.com/ohitsdaniel), [pointfreeco/swift-composable-architecture#1036). - Fixed: Addressed a few Xcode 15 warnings (Swift 6 errors) ([pointfreeco/swift-composable-architecture#2213). - Deprecated: `Effect.cancel(ids:)` has been deprecated ([pointfreeco/swift-composable-architecture#2221). - Infrastructure: Documentation improvements (thanks [@​ccxla](https://togithub.com/ccxla), [pointfreeco/swift-composable-architecture#2185, [pointfreeco/swift-composable-architecture#2184, [pointfreeco/swift-composable-architecture#2183; [@​tomu28](https://togithub.com/tomu28), [pointfreeco/swift-composable-architecture#2209; [@​alexhunsley](https://togithub.com/alexhunsley), [pointfreeco/swift-composable-architecture#2204; [@​oronbz](https://togithub.com/oronbz), [pointfreeco/swift-composable-architecture#2173; [pointfreeco/swift-composable-architecture#2225; [pointfreeco/swift-composable-architecture#2238). #### New Contributors - [@​tomu28](https://togithub.com/tomu28) made their first contribution in [pointfreeco/swift-composable-architecture#2209 - [@​alexhunsley](https://togithub.com/alexhunsley) made their first contribution in [pointfreeco/swift-composable-architecture#2204 - [@​ohitsdaniel](https://togithub.com/ohitsdaniel) made their first contribution in [pointfreeco/swift-composable-architecture#1036 **Full Changelog**: pointfreeco/swift-composable-architecture@0.54.1...0.55.0 ### [`v0.54.1`](https://togithub.com/pointfreeco/swift-composable-architecture/releases/tag/0.54.1) [Compare Source](https://togithub.com/pointfreeco/swift-composable-architecture/compare/0.54.0...0.54.1) #### What's Changed - Fixed: A regression introduced in 0.54.0 prevented some Composable Architecture projects from building in release due to a Swift compiler bug. We have removed some `@inlineable` attributes to work around this bug ([pointfreeco/swift-composable-architecture#2201). While we don't anticipate noticeable runtime performance regressions in release builds of applications, please report any issues you may see. - Infrastructure: Added Hindi (Indian) translation of README.md (thanks [@​akashsoni01](https://togithub.com/akashsoni01), [pointfreeco/swift-composable-architecture#2171) - Infrastructure: Documentation updates and fixes (thanks [@​Sajjon](https://togithub.com/Sajjon), [pointfreeco/swift-composable-architecture#2150; [@​tatsuz0u](https://togithub.com/tatsuz0u), [pointfreeco/swift-composable-architecture#2155; [@​hmhv](https://togithub.com/hmhv), [pointfreeco/swift-composable-architecture#2152; [@​MarshalGeazipp](https://togithub.com/MarshalGeazipp), [pointfreeco/swift-composable-architecture#2154; [@​Ryu0118](https://togithub.com/Ryu0118), [pointfreeco/swift-composable-architecture#2153; [@​Czajnikowski](https://togithub.com/Czajnikowski), [pointfreeco/swift-composable-architecture#2157; [@​kristofferjohansson](https://togithub.com/kristofferjohansson), [pointfreeco/swift-composable-architecture#2159; [@​jaesung-0o0](https://togithub.com/jaesung-0o0), [pointfreeco/swift-composable-architecture#2160; [pointfreeco/swift-composable-architecture#2161; [@​takehilo](https://togithub.com/takehilo), [pointfreeco/swift-composable-architecture#2165; [@​nickkohrn](https://togithub.com/nickkohrn), [pointfreeco/swift-composable-architecture#2168 [pointfreeco/swift-composable-architecture#2169; [@​d-date](https://togithub.com/d-date), [pointfreeco/swift-composable-architecture#2174; [@​oronbz](https://togithub.com/oronbz), [pointfreeco/swift-composable-architecture#2175, [pointfreeco/swift-composable-architecture#2176, [pointfreeco/swift-composable-architecture#2177; [@​devMinseok](https://togithub.com/devMinseok), [pointfreeco/swift-composable-architecture#2180; [@​ccxla](https://togithub.com/ccxla), [pointfreeco/swift-composable-architecture#2181; [@​filblue](https://togithub.com/filblue), [pointfreeco/swift-composable-architecture#2188; [@​thomastosoni](https://togithub.com/thomastosoni), [pointfreeco/swift-composable-architecture#2190). #### New Contributors - [@​Sajjon](https://togithub.com/Sajjon) made their first contribution in [pointfreeco/swift-composable-architecture#2150 - [@​MarshalGeazipp](https://togithub.com/MarshalGeazipp) made their first contribution in [pointfreeco/swift-composable-architecture#2154 - [@​takehilo](https://togithub.com/takehilo) made their first contribution in [pointfreeco/swift-composable-architecture#2165 - [@​nickkohrn](https://togithub.com/nickkohrn) made their first contribution in [pointfreeco/swift-composable-architecture#2168 - [@​akashsoni01](https://togithub.com/akashsoni01) made their first contribution in [pointfreeco/swift-composable-architecture#2171 - [@​d-date](https://togithub.com/d-date) made their first contribution in [pointfreeco/swift-composable-architecture#2174 - [@​oronbz](https://togithub.com/oronbz) made their first contribution in [pointfreeco/swift-composable-architecture#2175 - [@​devMinseok](https://togithub.com/devMinseok) made their first contribution in [pointfreeco/swift-composable-architecture#2180 - [@​ccxla](https://togithub.com/ccxla) made their first contribution in [pointfreeco/swift-composable-architecture#2181 - [@​thomastosoni](https://togithub.com/thomastosoni) made their first contribution in [pointfreeco/swift-composable-architecture#2190 **Full Changelog**: pointfreeco/swift-composable-architecture@0.54.0...0.54.1 ### [`v0.54.0`](https://togithub.com/pointfreeco/swift-composable-architecture/releases/tag/0.54.0) [Compare Source](https://togithub.com/pointfreeco/swift-composable-architecture/compare/0.53.2...0.54.0) #### What's Changed - Added: All-new navigation tools for presenting child features ([pointfreeco/swift-composable-architecture#1945, [pointfreeco/swift-composable-architecture#1944, [pointfreeco/swift-composable-architecture#2048). See the associated [documentation](https://pointfreeco.github.io/swift-composable-architecture/main/documentation/composablearchitecture/navigation) and [tutorial](https://pointfreeco.github.io/swift-composable-architecture/main/tutorials/meetcomposablearchitecture/#navigation) for how to incorporate these tools into your applications today! - Added: `TestStore.assert`, for asserting state changes on non-exhaustive stores at any time ([pointfreeco/swift-composable-architecture#2123). - Fixed: Ensure that a test store helper runs on the main actor ([pointfreeco/swift-composable-architecture#2117). - Added: Ukrainian translation of TCA's README (thanks [@​barabashd](https://togithub.com/barabashd), [pointfreeco/swift-composable-architecture#2121). - Infrastructure: DocC organization ([pointfreeco/swift-composable-architecture#2118). - Infrastructure: Ensure CI runs library tests in release ([pointfreeco/swift-composable-architecture#2120). - Fix assertion values by [@​tomassliz](https://togithub.com/tomassliz) in [pointfreeco/swift-composable-architecture#2128 - Infrastructure: Documentation fixes (thanks [@​tomassliz](https://togithub.com/tomassliz), [pointfreeco/swift-composable-architecture#2124, [pointfreeco/swift-composable-architecture#2128; [@​jaesung-0o0](https://togithub.com/jaesung-0o0), [pointfreeco/swift-composable-architecture#2144). #### New Contributors - [@​tomassliz](https://togithub.com/tomassliz) made their first contribution in [pointfreeco/swift-composable-architecture#2124 - [@​jaesung-0o0](https://togithub.com/jaesung-0o0) made their first contribution in [pointfreeco/swift-composable-architecture#2144 **Full Changelog**: pointfreeco/swift-composable-architecture@0.53.2...0.54.0 ### [`v0.53.2`](https://togithub.com/pointfreeco/swift-composable-architecture/releases/tag/0.53.2) [Compare Source](https://togithub.com/pointfreeco/swift-composable-architecture/compare/0.53.1...0.53.2) #### What's Changed - Make `Send` sendable ([pointfreeco/swift-composable-architecture#2112) - When test exhaustivity is off, `receive` now waits for the expected action rather than taking the first action (thanks [@​alex-reilly-pronto](https://togithub.com/alex-reilly-pronto), [pointfreeco/swift-composable-architecture#2100) - Fix typo in the "Meet the Composable Architecture" (thanks [@​redryerye](https://togithub.com/redryerye), [pointfreeco/swift-composable-architecture#2114) - Fix compile error in Xcode <14.3 (thanks [@​hj56775](https://togithub.com/hj56775), [pointfreeco/swift-composable-architecture#2115) #### New Contributors - [@​alex-reilly-pronto](https://togithub.com/alex-reilly-pronto) made their first contribution in [pointfreeco/swift-composable-architecture#2100 - [@​redryerye](https://togithub.com/redryerye) made their first contribution in [pointfreeco/swift-composable-architecture#2114 - [@​hj56775](https://togithub.com/hj56775) made their first contribution in [pointfreeco/swift-composable-architecture#2115 **Full Changelog**: pointfreeco/swift-composable-architecture@0.53.1...0.53.2 ### [`v0.53.1`](https://togithub.com/pointfreeco/swift-composable-architecture/releases/tag/0.53.1) [Compare Source](https://togithub.com/pointfreeco/swift-composable-architecture/compare/0.53.0...0.53.1) #### What's Changed - Fixed: A regression was introduced in 0.53.0 where `TestStore.init`'s `prepareDependencies` was called twice. It will not be called just a single time again ([pointfreeco/swift-composable-architecture#2111). - Infrastructure: Added a "Meet the Composable Architecture" tutorial ([pointfreeco/swift-composable-architecture#2107, [pointfreeco/swift-composable-architecture#2109). - Infrastructure: Docs fixes (thanks [@​Ryu0118](https://togithub.com/Ryu0118), [pointfreeco/swift-composable-architecture#2110) **Full Changelog**: pointfreeco/swift-composable-architecture@0.53.0...0.53.1 ### [`v0.53.0`](https://togithub.com/pointfreeco/swift-composable-architecture/releases/tag/0.53.0) [Compare Source](https://togithub.com/pointfreeco/swift-composable-architecture/compare/0.52.0...0.53.0) #### What's Changed - Added: `Store.init` and `TestStore.init` now take reducer builders ([pointfreeco/swift-composable-architecture#2087). ```swift // Before: Store( initialState: Feature.State(), reducer: Feature() ) // After: Store(initialState: Feature.State()) { Feature() } ``` - Changed: `SwitchStore` has gotten some quality-of-life improvements ([pointfreeco/swift-composable-architecture#2029). - `SwitchStore.init` can now take the initial enum state so that it can be switched over exhaustively. This initializer also relaxes certain compile-time constraints previously requiring only `CaseLet` views and an optional, trailing `Default` view. - `CaseLet` can now omit the `state` parameter label, making it more consistent with other APIs, like `Reducer.ifCaseLet`. - The older `SwitchStore` and `CaseLet` initializers have been soft-deprecated along with the `Default` view. ```swift // Before: SwitchStore(self.store) { CaseLet(state: /App.State.loggedIn, action: App.Action.loggedIn) { loggedInStore in LoggedInView(store: loggedInStore) } CaseLet(state: /App.State.loggedOut, action: App.Action.loggedOut) { loggedOutStore in LoggedOutView(store: loggedOutStore) } } // After: SwitchStore(self.store) { switch $0 { // Can now switch over initial state for exhaustivity at compile time case .loggedIn: CaseLet(/App.State.loggedIn, action: App.Action.loggedIn) { loggedInStore in LoggedInView(store: loggedInStore) } .buttonStyle(.plain) // Can now render arbitrary views/modifiers in the view builder case .loggedOut: CaseLet(/App.State.loggedOut, action: App.Action.loggedOut) { loggedOutStore in LoggedOutView(store: loggedOutStore) } } } ``` - Changed: `WithViewStore.debug` has been renamed to `WithViewStore._printChanges` for consistency with `Reducer._printChanges` ([pointfreeco/swift-composable-architecture#2101). - Fixed: `EffectTask.publisher` now properly escapes dependencies accessed within it ([pointfreeco/swift-composable-architecture#1988). - Fixed: `Reducer._printChanges()` is no longer disabled in tests ([pointfreeco/swift-composable-architecture#1995). This allows it to be used for debugging purposes during test runs. - Changed: The internal `Task.megaYield` tool, for more predictably testing concurrent code, is now configurable via the `TASK_MEGA_YIELD_COUNT` environment variable ([pointfreeco/swift-composable-architecture#2064). - Improved: The output format of `WithViewStore._printChanges()` has been improved ([pointfreeco/swift-composable-architecture#1973). - Improved: Runtime warnings will now emit XCTest failures in test code rather than in app code ([pointfreeco/swift-composable-architecture#2059). - Deprecated: Type-based cancel IDs have been deprecated ([pointfreeco/swift-composable-architecture#2091). Use hashable values, instead. - Deprecated: The actionless overload of `Store.scope(state:)` has been deprecated in favor of the `observe` parameter on view stores ([pointfreeco/swift-composable-architecture#2097). - Deprecated: `Effect.task` and `Effect.fireAndForget` have been soft-deprecated in favor of `Effect.run` ([pointfreeco/swift-composable-architecture#2099). - Infrastructure: Added test coverage for child/parent effect cancellation behavior ([pointfreeco/swift-composable-architecture#1970). - Infrastructure: Clean up effect cancellation logic ([pointfreeco/swift-composable-architecture#1977). - Infrastructure: Miscellaneous documentation/formatting fixes: Fixed missing `action` parameter in `ForEachStore` documentation (thanks [@​m-housh](https://togithub.com/m-housh), [pointfreeco/swift-composable-architecture#1998). Number fact tutorial fix (thanks [@​siliconsorcery](https://togithub.com/siliconsorcery), [pointfreeco/swift-composable-architecture#1962). `BindingAction` fix (thanks [@​Ryu0118](https://togithub.com/Ryu0118), [pointfreeco/swift-composable-architecture#2019). `withTaskCancellation(id:)` fix (thanks [@​bjford](https://togithub.com/bjford), [pointfreeco/swift-composable-architecture#2049). Formatting fix (thanks [@​mooyoung2309](https://togithub.com/mooyoung2309), [pointfreeco/swift-composable-architecture#2056). Update 'bindable state' to 'binding state' (thanks [@​Jager-yoo](https://togithub.com/Jager-yoo), [pointfreeco/swift-composable-architecture#2054). - Infrastructure: Added Russian README translation (thanks [@​artyom-ivanov](https://togithub.com/artyom-ivanov), [pointfreeco/swift-composable-architecture#2014). - Infrastructure: Added Polish README translation (thanks [@​MarcelStarczyk](https://togithub.com/MarcelStarczyk), [pointfreeco/swift-composable-architecture#2040). - Infrastructure: Bump dependencies. - Infrastructure: Bump Xcode demo project settings ([pointfreeco/swift-composable-architecture#2042). - Infrastructure: Clean up and test `TestStore.skipInFlightEffects` ([pointfreeco/swift-composable-architecture#2057). - Infrastructure: CI updates ([pointfreeco/swift-composable-architecture#2060). - Infrastructure: Document how exhaustive vs. non-exhaustive test stores work ([pointfreeco/swift-composable-architecture#2096). #### New Contributors - [@​m-housh](https://togithub.com/m-housh) made their first contribution in [pointfreeco/swift-composable-architecture#1998 - [@​siliconsorcery](https://togithub.com/siliconsorcery) made their first contribution in [pointfreeco/swift-composable-architecture#1962 - [@​artyom-ivanov](https://togithub.com/artyom-ivanov) made their first contribution in [pointfreeco/swift-composable-architecture#2014 - [@​Ryu0118](https://togithub.com/Ryu0118) made their first contribution in [pointfreeco/swift-composable-architecture#2019 - [@​MarcelStarczyk](https://togithub.com/MarcelStarczyk) made their first contribution in [pointfreeco/swift-composable-architecture#2040 - [@​mooyoung2309](https://togithub.com/mooyoung2309) made their first contribution in [pointfreeco/swift-composable-architecture#2056 **Full Changelog**: pointfreeco/swift-composable-architecture@0.52.0...0.53.0 ### [`v0.52.0`](https://togithub.com/pointfreeco/swift-composable-architecture/releases/tag/0.52.0) [Compare Source](https://togithub.com/pointfreeco/swift-composable-architecture/compare/0.51.0...0.52.0) #### What's Changed - Added: Support for `XCTModify` and non-exhaustive testing ([pointfreeco/swift-composable-architecture#1939). - Added: Library reducer operators are now annotated with `@warn_unqualified_access` to prevent accidental bugs ([pointfreeco/swift-composable-architecture#1950). - Added: `Effect.publisher` for bridging effects from Combine ([pointfreeco/swift-composable-architecture#1958). - Changed: `Effect<Action>.Send` has been renamed to `Send<Action>` (thanks [@​tgrapperon](https://togithub.com/tgrapperon), [pointfreeco/swift-composable-architecture#1930). - Changed: Dependencies have been bumped to their latest versions to encourage adoption of bug fixes ([pointfreeco/swift-composable-architecture#1964). - Fixed: Dependencies are no longer recursively propagated over effects ([pointfreeco/swift-composable-architecture#1954). - Fixed: `TestStore.init` now calls `prepareDependencies` in a `withDependencies` block ([pointfreeco/swift-composable-architecture#1955). - Infrastructure: Fix UI test for `ForEach` bindings ([pointfreeco/swift-composable-architecture#1933). - Infrastructure: Add missing documentation to `Store.init` (thanks [@​kristofferjohansson](https://togithub.com/kristofferjohansson), [pointfreeco/swift-composable-architecture#1940). - Infrastructure: DocC fixes ([pointfreeco/swift-composable-architecture#1942, [pointfreeco/swift-composable-architecture#1956). - Infrastructure: Update latest version documentation link in README (thanks [@​yimajo](https://togithub.com/yimajo), [pointfreeco/swift-composable-architecture#1943) - Infrastructure: Fix `.forEach()` documentation (thanks [@​finestructure](https://togithub.com/finestructure), [pointfreeco/swift-composable-architecture#1957). - Infrastructure: Documentation grammar fixes (thanks [@​bjford](https://togithub.com/bjford), [pointfreeco/swift-composable-architecture#1963) #### New Contributors - [@​kristofferjohansson](https://togithub.com/kristofferjohansson) made their first contribution in [pointfreeco/swift-composable-architecture#1940 **Full Changelog**: pointfreeco/swift-composable-architecture@0.51.0...0.52.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/cgrindel/rules_swift_package_manager). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4xNDQuMiIsInVwZGF0ZWRJblZlciI6IjM1LjE0NC4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
In the doc comments for the
receive
functions, thenanoseconds
/duration
timeout params are described asThe amount of time to wait for the expected action
. This is true whenexhaustivity
is on becausereceiveAction(actionPredicate:timeout:file:line)
waits for any action to be received. However, whenexhaustivity
is off, users are allowed to skip receiving actions in their tests, so waiting until any action is received is not the same as waiting for the expected action to be received.This PR resolves that by having
receiveAction(actionPredicate:timeout:file:line)
wait untilactionPredicate
is met by one of the received actions whenexhaustivity
is off. The existing behavior stays the same whenexhaustivity
is on.