Skip to content

Commit 2b3aa47

Browse files
author
Tobias Wojtylak
committed
adjusted getNext/PreviousStep
1 parent 0a418e9 commit 2b3aa47

File tree

2 files changed

+82
-10
lines changed

2 files changed

+82
-10
lines changed

spec/Context/FlowContextSpec.php

Lines changed: 70 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use solutionDrive\MultiStepBundle\Context\FlowContextInterface;
1616
use solutionDrive\MultiStepBundle\Model\MultiStepFlowInterface;
1717
use solutionDrive\MultiStepBundle\Model\MultiStepInterface;
18+
use solutionDrive\MultiStepBundle\StepChecker\StepRequiredCheckerInterface;
1819

1920
class FlowContextSpec extends ObjectBehavior
2021
{
@@ -39,26 +40,82 @@ public function it_returns_current_step(MultiStepInterface $currentStep): void
3940
$this->getCurrentStep()->shouldBe($currentStep);
4041
}
4142

42-
public function it_returns_next_step(MultiStepFlowInterface $flow, MultiStepInterface $nextStep): void
43-
{
43+
public function it_returns_direct_successor_as_next_step(
44+
MultiStepFlowInterface $flow,
45+
MultiStepInterface $nextStep,
46+
StepRequiredCheckerInterface $stepRequiredChecker
47+
): void {
48+
$stepRequiredChecker->check()->shouldBeCalled()->willReturn(true);
49+
$nextStep->getStepRequiredChecker()->willReturn($stepRequiredChecker);
4450
$flow->getStepAfter(Argument::any())->shouldBeCalled()->willReturn($nextStep);
4551
$this->getNextStep()->shouldBe($nextStep);
4652
}
4753

48-
public function it_returns_previous_step(MultiStepFlowInterface $flow, MultiStepInterface $previousStep): void
54+
public function it_returns_step_after_successor_as_next_step(
55+
MultiStepFlowInterface $flow,
56+
MultiStepInterface $currentStep,
57+
MultiStepInterface $nextStep,
58+
MultiStepInterface $nextStepAfter,
59+
StepRequiredCheckerInterface $stepRequiredCheckerNext,
60+
StepRequiredCheckerInterface $stepRequiredCheckerAfterNext
61+
): void {
62+
63+
$stepRequiredCheckerNext->check()->shouldBeCalled()->willReturn(false);
64+
$nextStep->getStepRequiredChecker()->willReturn($stepRequiredCheckerNext);
65+
66+
$stepRequiredCheckerAfterNext->check()->shouldBeCalled()->willReturn(true);
67+
$nextStepAfter->getStepRequiredChecker()->willReturn($stepRequiredCheckerAfterNext);
68+
69+
$flow->getStepAfter($currentStep)->shouldBeCalled()->willReturn($nextStep);
70+
$flow->getStepAfter($nextStep)->shouldBeCalled()->willReturn($nextStepAfter);
71+
$this->getNextStep()->shouldBe($nextStepAfter);
72+
}
73+
74+
public function it_returns_direct_predecessor_previous_step(
75+
MultiStepFlowInterface $flow,
76+
MultiStepInterface $previousStep,
77+
StepRequiredCheckerInterface $stepRequiredChecker
78+
): void
4979
{
80+
$stepRequiredChecker->check()->shouldBeCalled()->willReturn(true);
81+
$previousStep->getStepRequiredChecker()->willReturn($stepRequiredChecker);
5082
$flow->getStepBefore(Argument::any())->shouldBeCalled()->willReturn($previousStep);
5183
$this->getPreviousStep()->shouldBe($previousStep);
5284
}
5385

86+
public function it_returns_step_before_predecessor_as_previous_step(
87+
MultiStepFlowInterface $flow,
88+
MultiStepInterface $currentStep,
89+
MultiStepInterface $previousStep,
90+
MultiStepInterface $prviousStepBefore,
91+
StepRequiredCheckerInterface $stepRequiredCheckerPrevious,
92+
StepRequiredCheckerInterface $stepRequiredCheckerBeforePrevious
93+
): void {
94+
95+
$stepRequiredCheckerPrevious->check()->shouldBeCalled()->willReturn(false);
96+
$previousStep->getStepRequiredChecker()->willReturn($stepRequiredCheckerPrevious);
97+
98+
$stepRequiredCheckerBeforePrevious->check()->shouldBeCalled()->willReturn(true);
99+
$prviousStepBefore->getStepRequiredChecker()->willReturn($stepRequiredCheckerBeforePrevious);
100+
101+
$flow->getStepBefore($currentStep)->shouldBeCalled()->willReturn($previousStep);
102+
$flow->getStepBefore($previousStep)->shouldBeCalled()->willReturn($prviousStepBefore);
103+
$this->getPreviousStep()->shouldBe($prviousStepBefore);
104+
}
105+
54106
public function it_returns_false_for_has_next_step(MultiStepFlowInterface $flow): void
55107
{
56108
$flow->getStepAfter(Argument::any())->willReturn(null);
57109
$this->hasNextStep()->shouldBe(false);
58110
}
59111

60-
public function it_returns_true_for_has_next_step(MultiStepFlowInterface $flow, MultiStepInterface $nextStep): void
61-
{
112+
public function it_returns_true_for_has_next_step(
113+
MultiStepFlowInterface $flow,
114+
MultiStepInterface $nextStep,
115+
StepRequiredCheckerInterface $stepRequiredChecker
116+
): void {
117+
$stepRequiredChecker->check()->shouldBeCalled()->willReturn(true);
118+
$nextStep->getStepRequiredChecker()->willReturn($stepRequiredChecker);
62119
$flow->getStepAfter(Argument::any())->willReturn($nextStep);
63120
$this->hasNextStep()->shouldBe(true);
64121
}
@@ -69,9 +126,14 @@ public function it_returns_false_for_has_previous_step(MultiStepFlowInterface $f
69126
$this->hasPreviousStep()->shouldBe(false);
70127
}
71128

72-
public function it_returns_true_for_has_previous_step(MultiStepFlowInterface $flow, MultiStepInterface $nextStep): void
73-
{
74-
$flow->getStepBefore(Argument::any())->willReturn($nextStep);
129+
public function it_returns_true_for_has_previous_step(
130+
MultiStepFlowInterface $flow,
131+
MultiStepInterface $previousStep,
132+
StepRequiredCheckerInterface $stepRequiredChecker
133+
): void {
134+
$stepRequiredChecker->check()->shouldBeCalled()->willReturn(true);
135+
$previousStep->getStepRequiredChecker()->willReturn($stepRequiredChecker);
136+
$flow->getStepBefore(Argument::any())->willReturn($previousStep);
75137
$this->hasPreviousStep()->shouldBe(true);
76138
}
77139

src/Context/FlowContext.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,23 @@ public function getCurrentStep(): MultiStepInterface
3434
public function getNextStep(): ?MultiStepInterface
3535
{
3636
$currentStep = $this->getCurrentStep();
37-
return $this->flow->getStepAfter($currentStep);
37+
do {
38+
$nextStep = $this->flow->getStepAfter($currentStep);
39+
$currentStep = $nextStep;
40+
} while (null !== $nextStep && $nextStep->getStepRequiredChecker()->check() === false);
41+
42+
return $nextStep;
3843
}
3944

4045
public function getPreviousStep(): ?MultiStepInterface
4146
{
4247
$currentStep = $this->getCurrentStep();
43-
return $this->flow->getStepBefore($currentStep);
48+
do {
49+
$previousStep = $this->flow->getStepBefore($currentStep);
50+
$currentStep = $previousStep;
51+
} while (null !== $previousStep && $previousStep->getStepRequiredChecker()->check() === false);
52+
53+
return $previousStep;
4454
}
4555

4656
public function hasNextStep(): bool

0 commit comments

Comments
 (0)