From 3f2d2c00ec9154fae5a94342e6731f2127921eae Mon Sep 17 00:00:00 2001 From: Darshan Parajuli Date: Tue, 11 Jan 2022 10:46:23 -0800 Subject: [PATCH] Make side effect expectations explicit requirement. --- workflow-testing/api/workflow-testing.api | 1 + .../workflow1/testing/RealRenderTester.kt | 11 +++++++ .../workflow1/testing/RenderTester.kt | 3 ++ .../workflow1/testing/RealRenderTesterTest.kt | 29 ++++++++++++++++++- 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/workflow-testing/api/workflow-testing.api b/workflow-testing/api/workflow-testing.api index 4ed0798274..22f6736761 100644 --- a/workflow-testing/api/workflow-testing.api +++ b/workflow-testing/api/workflow-testing.api @@ -20,6 +20,7 @@ public abstract class com/squareup/workflow1/testing/RenderTester { public static synthetic fun expectSideEffect$default (Lcom/squareup/workflow1/testing/RenderTester;Ljava/lang/String;ZLkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/squareup/workflow1/testing/RenderTester; public abstract fun render (Lkotlin/jvm/functions/Function1;)Lcom/squareup/workflow1/testing/RenderTestResult; public static synthetic fun render$default (Lcom/squareup/workflow1/testing/RenderTester;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/squareup/workflow1/testing/RenderTestResult; + public abstract fun requireExplicitSideEffectExpectations ()Lcom/squareup/workflow1/testing/RenderTester; public abstract fun requireExplicitWorkerExpectations ()Lcom/squareup/workflow1/testing/RenderTester; } diff --git a/workflow-testing/src/main/java/com/squareup/workflow1/testing/RealRenderTester.kt b/workflow-testing/src/main/java/com/squareup/workflow1/testing/RealRenderTester.kt index 28e33f4d30..1bc8de3772 100644 --- a/workflow-testing/src/main/java/com/squareup/workflow1/testing/RealRenderTester.kt +++ b/workflow-testing/src/main/java/com/squareup/workflow1/testing/RealRenderTester.kt @@ -98,6 +98,7 @@ internal class RealRenderTester( } private var explicitWorkerExpectationsRequired: Boolean = false + private var explicitSideEffectExpectationsRequired: Boolean = false override val actionSink: Sink> get() = this override fun expectWorkflow( @@ -125,6 +126,11 @@ internal class RealRenderTester( expectWorker(description = "unexpected worker", exactMatch = false) { _, _, _ -> true } } + if (!explicitSideEffectExpectationsRequired) { + // Allow unexpected side effects. + expectSideEffect(description = "unexpected side effect", exactMatch = false) { true } + } + // Clone the expectations to run a "dry" render pass. val noopContext = deepCloneForRender() workflow.render(props, state, RenderContext(noopContext, workflow)) @@ -251,6 +257,11 @@ internal class RealRenderTester( explicitWorkerExpectationsRequired = true } + override fun requireExplicitSideEffectExpectations(): + RenderTester = this.apply { + explicitSideEffectExpectationsRequired = true + } + override fun send(value: WorkflowAction) { checkNoOutputs() check(processedAction == null) { diff --git a/workflow-testing/src/main/java/com/squareup/workflow1/testing/RenderTester.kt b/workflow-testing/src/main/java/com/squareup/workflow1/testing/RenderTester.kt index c7434dfddc..699a926f07 100644 --- a/workflow-testing/src/main/java/com/squareup/workflow1/testing/RenderTester.kt +++ b/workflow-testing/src/main/java/com/squareup/workflow1/testing/RenderTester.kt @@ -244,6 +244,9 @@ public abstract class RenderTester { public abstract fun requireExplicitWorkerExpectations(): RenderTester + public abstract fun requireExplicitSideEffectExpectations(): + RenderTester + /** * Describes a call to * [RenderContext.renderChild][com.squareup.workflow1.BaseRenderContext.renderChild]. diff --git a/workflow-testing/src/test/java/com/squareup/workflow1/testing/RealRenderTesterTest.kt b/workflow-testing/src/test/java/com/squareup/workflow1/testing/RealRenderTesterTest.kt index cb4a82f52e..8d7c41a8ce 100644 --- a/workflow-testing/src/test/java/com/squareup/workflow1/testing/RealRenderTesterTest.kt +++ b/workflow-testing/src/test/java/com/squareup/workflow1/testing/RealRenderTesterTest.kt @@ -106,6 +106,7 @@ internal class RealRenderTesterTest { runningSideEffect("the key") {} } val tester = workflow.testRender(Unit) + .requireExplicitSideEffectExpectations() .expectSideEffect(key = "the key") .expectSideEffect(description = "duplicate match") { it == "the key" } @@ -326,7 +327,7 @@ internal class RealRenderTesterTest { val workflow = Workflow.stateless { runningSideEffect("effect") {} } - val tester = workflow.testRender(Unit) + val tester = workflow.testRender(Unit).requireExplicitSideEffectExpectations() val error = assertFailsWith { tester.render() @@ -340,6 +341,7 @@ internal class RealRenderTesterTest { runningSideEffect("unexpected") {} } val tester = workflow.testRender(Unit) + .requireExplicitSideEffectExpectations() .expectSideEffect("expected") val error = assertFailsWith { @@ -353,6 +355,7 @@ internal class RealRenderTesterTest { runningSideEffect("effect") {} } val tester = workflow.testRender(Unit) + .requireExplicitSideEffectExpectations() .expectSideEffect("effect") .expectSideEffect(description = "custom", exactMatch = true) { key -> "effect" in key } @@ -546,6 +549,30 @@ internal class RealRenderTesterTest { tester.render() } + @Test fun `runningSideEffect doesn't throw when none expected`() { + val workflow = Workflow.stateless { + runningSideEffect(key = "foo") { } + } + val tester = workflow.testRender(Unit) + tester.render() + } + + @Test fun `runningSideEffect does throw when none expected and require explicit side effect is set`() { // ktlint-disable max-line-length + val key = "foo" + val workflow = Workflow.stateless { + runningSideEffect(key = key) { } + } + val tester = workflow.testRender(Unit).requireExplicitSideEffectExpectations() + val error = assertFailsWith { + tester.render() + } + + assertEquals( + "Tried to run unexpected side effect with key \"$key\"", + error.message + ) + } + @Test fun `runningWorker does throw when none expected and require explicit workers is set`() { class MySpecialWorker : Worker { override fun doesSameWorkAs(otherWorker: Worker<*>): Boolean = true