Skip to content

Commit 3d79f14

Browse files
authored
Merge pull request #627 from darshanparajuli/darshan/make-side-effect-expectations-explicit-requirement
Make side effect expectations explicit requirement.
2 parents e85d260 + 3f2d2c0 commit 3d79f14

File tree

4 files changed

+43
-1
lines changed

4 files changed

+43
-1
lines changed

workflow-testing/api/workflow-testing.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public abstract class com/squareup/workflow1/testing/RenderTester {
2020
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;
2121
public abstract fun render (Lkotlin/jvm/functions/Function1;)Lcom/squareup/workflow1/testing/RenderTestResult;
2222
public static synthetic fun render$default (Lcom/squareup/workflow1/testing/RenderTester;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lcom/squareup/workflow1/testing/RenderTestResult;
23+
public abstract fun requireExplicitSideEffectExpectations ()Lcom/squareup/workflow1/testing/RenderTester;
2324
public abstract fun requireExplicitWorkerExpectations ()Lcom/squareup/workflow1/testing/RenderTester;
2425
}
2526

workflow-testing/src/main/java/com/squareup/workflow1/testing/RealRenderTester.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ internal class RealRenderTester<PropsT, StateT, OutputT, RenderingT>(
9898
}
9999

100100
private var explicitWorkerExpectationsRequired: Boolean = false
101+
private var explicitSideEffectExpectationsRequired: Boolean = false
101102
override val actionSink: Sink<WorkflowAction<PropsT, StateT, OutputT>> get() = this
102103

103104
override fun expectWorkflow(
@@ -125,6 +126,11 @@ internal class RealRenderTester<PropsT, StateT, OutputT, RenderingT>(
125126
expectWorker(description = "unexpected worker", exactMatch = false) { _, _, _ -> true }
126127
}
127128

129+
if (!explicitSideEffectExpectationsRequired) {
130+
// Allow unexpected side effects.
131+
expectSideEffect(description = "unexpected side effect", exactMatch = false) { true }
132+
}
133+
128134
// Clone the expectations to run a "dry" render pass.
129135
val noopContext = deepCloneForRender()
130136
workflow.render(props, state, RenderContext(noopContext, workflow))
@@ -251,6 +257,11 @@ internal class RealRenderTester<PropsT, StateT, OutputT, RenderingT>(
251257
explicitWorkerExpectationsRequired = true
252258
}
253259

260+
override fun requireExplicitSideEffectExpectations():
261+
RenderTester<PropsT, StateT, OutputT, RenderingT> = this.apply {
262+
explicitSideEffectExpectationsRequired = true
263+
}
264+
254265
override fun send(value: WorkflowAction<PropsT, StateT, OutputT>) {
255266
checkNoOutputs()
256267
check(processedAction == null) {

workflow-testing/src/main/java/com/squareup/workflow1/testing/RenderTester.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,9 @@ public abstract class RenderTester<PropsT, StateT, OutputT, RenderingT> {
244244
public abstract fun requireExplicitWorkerExpectations():
245245
RenderTester<PropsT, StateT, OutputT, RenderingT>
246246

247+
public abstract fun requireExplicitSideEffectExpectations():
248+
RenderTester<PropsT, StateT, OutputT, RenderingT>
249+
247250
/**
248251
* Describes a call to
249252
* [RenderContext.renderChild][com.squareup.workflow1.BaseRenderContext.renderChild].

workflow-testing/src/test/java/com/squareup/workflow1/testing/RealRenderTesterTest.kt

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ internal class RealRenderTesterTest {
106106
runningSideEffect("the key") {}
107107
}
108108
val tester = workflow.testRender(Unit)
109+
.requireExplicitSideEffectExpectations()
109110
.expectSideEffect(key = "the key")
110111
.expectSideEffect(description = "duplicate match") { it == "the key" }
111112

@@ -326,7 +327,7 @@ internal class RealRenderTesterTest {
326327
val workflow = Workflow.stateless<Unit, Nothing, Unit> {
327328
runningSideEffect("effect") {}
328329
}
329-
val tester = workflow.testRender(Unit)
330+
val tester = workflow.testRender(Unit).requireExplicitSideEffectExpectations()
330331

331332
val error = assertFailsWith<AssertionError> {
332333
tester.render()
@@ -340,6 +341,7 @@ internal class RealRenderTesterTest {
340341
runningSideEffect("unexpected") {}
341342
}
342343
val tester = workflow.testRender(Unit)
344+
.requireExplicitSideEffectExpectations()
343345
.expectSideEffect("expected")
344346

345347
val error = assertFailsWith<AssertionError> {
@@ -353,6 +355,7 @@ internal class RealRenderTesterTest {
353355
runningSideEffect("effect") {}
354356
}
355357
val tester = workflow.testRender(Unit)
358+
.requireExplicitSideEffectExpectations()
356359
.expectSideEffect("effect")
357360
.expectSideEffect(description = "custom", exactMatch = true) { key -> "effect" in key }
358361

@@ -546,6 +549,30 @@ internal class RealRenderTesterTest {
546549
tester.render()
547550
}
548551

552+
@Test fun `runningSideEffect doesn't throw when none expected`() {
553+
val workflow = Workflow.stateless<Unit, Nothing, Unit> {
554+
runningSideEffect(key = "foo") { }
555+
}
556+
val tester = workflow.testRender(Unit)
557+
tester.render()
558+
}
559+
560+
@Test fun `runningSideEffect does throw when none expected and require explicit side effect is set`() { // ktlint-disable max-line-length
561+
val key = "foo"
562+
val workflow = Workflow.stateless<Unit, Nothing, Unit> {
563+
runningSideEffect(key = key) { }
564+
}
565+
val tester = workflow.testRender(Unit).requireExplicitSideEffectExpectations()
566+
val error = assertFailsWith<AssertionError> {
567+
tester.render()
568+
}
569+
570+
assertEquals(
571+
"Tried to run unexpected side effect with key \"$key\"",
572+
error.message
573+
)
574+
}
575+
549576
@Test fun `runningWorker does throw when none expected and require explicit workers is set`() {
550577
class MySpecialWorker : Worker<Nothing> {
551578
override fun doesSameWorkAs(otherWorker: Worker<*>): Boolean = true

0 commit comments

Comments
 (0)