Skip to content

Commit dd15ea2

Browse files
committed
Ensure current pattern/state values are set
1 parent e65e066 commit dd15ea2

File tree

2 files changed

+148
-2
lines changed

2 files changed

+148
-2
lines changed

src/Primer.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,18 @@ public function getMenu(): Menu
161161
public function getPatternStateData(string $id, string $state = 'default'): array
162162
{
163163
try {
164-
return $this->patternProvider->getPatternStateData($id, $state);
164+
$oldPattern = $this->currentPatternId;
165+
$oldState = $this->currentPatternState;
166+
167+
$this->currentPatternId = $id;
168+
$this->currentPatternState = $state;
169+
170+
$retVal = $this->patternProvider->getPatternStateData($id, $state);
171+
172+
$this->currentPatternId = $oldPattern;
173+
$this->currentPatternState = $oldState;
174+
175+
return $retVal;
165176
} catch (PatternNotFoundException $e) {
166177
return [];
167178
}
@@ -170,7 +181,18 @@ public function getPatternStateData(string $id, string $state = 'default'): arra
170181
public function getTemplateStateData(string $id, string $state = 'default'): array
171182
{
172183
try {
173-
return $this->templateProvider->getPatternStateData($id, $state);
184+
$oldTemplate = $this->currentTemplateId;
185+
$oldState = $this->currentTemplateState;
186+
187+
$this->currentTemplateId = $id;
188+
$this->currentTemplateState = $state;
189+
190+
$retVal = $this->templateProvider->getPatternStateData($id, $state);
191+
192+
$this->currentTemplateId = $id;
193+
$this->currentTemplateState = $state;
194+
195+
return $retVal;
174196
} catch (PatternNotFoundException $e) {
175197
return [];
176198
}

tests/PrimerTest.php

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,68 @@ public function can_get_pattern_state_data()
534534
$this->assertSame(['foo' => 'bar'], $data);
535535
}
536536

537+
/** @test */
538+
public function current_pattern_and_state_is_set_for_get_pattern_state_data()
539+
{
540+
$templateRenderer = Mockery::mock(TemplateRenderer::class);
541+
$patternProvider = Mockery::mock(PatternProvider::class);
542+
543+
$templateProvider = Mockery::mock(PatternProvider::class);
544+
$documentProvider = Mockery::mock(DocumentProvider::class);
545+
546+
$primer = new Primer($templateRenderer, $patternProvider, $templateProvider, $documentProvider);
547+
548+
$patternProvider
549+
->shouldReceive('getPatternStateData')
550+
->once()
551+
->with('components/common/header', 'state-name')
552+
->andReturnUsing(function () use ($primer) {
553+
return ['pattern' => $primer->currentPatternId(), 'state' => $primer->currentPatternState()];
554+
});
555+
556+
$data = $primer->getPatternStateData('components/common/header', 'state-name');
557+
558+
$this->assertSame(['pattern' => 'components/common/header', 'state' => 'state-name'], $data);
559+
}
560+
561+
/** @test */
562+
public function current_pattern_and_state_is_set_for_get_pattern_state_data_when_using_include()
563+
{
564+
$templateRenderer = Mockery::mock(TemplateRenderer::class);
565+
$patternProvider = Mockery::mock(PatternProvider::class);
566+
567+
$templateProvider = Mockery::mock(PatternProvider::class);
568+
$documentProvider = Mockery::mock(DocumentProvider::class);
569+
570+
$primer = new Primer($templateRenderer, $patternProvider, $templateProvider, $documentProvider);
571+
572+
$patternProvider
573+
->shouldReceive('getPatternStateData')
574+
->once()
575+
->with('components/common/header', 'state-name')
576+
->andReturnUsing(function ($id) use ($primer) {
577+
return [
578+
'this' => ['pattern' => $primer->currentPatternId(), 'state' => $primer->currentPatternState()],
579+
'sub' => $primer->getPatternStateData('components/common/footer', 'another-state'),
580+
];
581+
});
582+
583+
$patternProvider
584+
->shouldReceive('getPatternStateData')
585+
->once()
586+
->with('components/common/footer', 'another-state')
587+
->andReturnUsing(function ($id) use ($primer) {
588+
return ['pattern' => $primer->currentPatternId(), 'state' => $primer->currentPatternState()];
589+
});
590+
591+
$data = $primer->getPatternStateData('components/common/header', 'state-name');
592+
593+
$this->assertSame([
594+
'this' => ['pattern' => 'components/common/header', 'state' => 'state-name'],
595+
'sub' => ['pattern' => 'components/common/footer', 'state' => 'another-state'],
596+
], $data);
597+
}
598+
537599
/** @test */
538600
public function can_get_template_state_data()
539601
{
@@ -555,6 +617,68 @@ public function can_get_template_state_data()
555617
$this->assertSame(['foo' => 'bar'], $data);
556618
}
557619

620+
/** @test */
621+
public function current_template_id_is_set_when_calling_can_get_template_state_data()
622+
{
623+
$templateRenderer = Mockery::mock(TemplateRenderer::class);
624+
$patternProvider = Mockery::mock(PatternProvider::class);
625+
626+
$templateProvider = Mockery::mock(PatternProvider::class);
627+
$documentProvider = Mockery::mock(DocumentProvider::class);
628+
629+
$primer = new Primer($templateRenderer, $patternProvider, $templateProvider, $documentProvider);
630+
631+
$templateProvider
632+
->shouldReceive('getPatternStateData')
633+
->once()
634+
->with('home', 'state-name')
635+
->andReturnUsing(function () use ($primer) {
636+
return ['template' => $primer->currentTemplateId(), 'state' => $primer->currentTemplateState()];
637+
});
638+
639+
$data = $primer->getTemplateStateData('home', 'state-name');
640+
641+
$this->assertSame(['template' => 'home', 'state' => 'state-name'], $data);
642+
}
643+
644+
/** @test */
645+
public function current_template_id_is_set_when_calling_can_get_template_state_data_when_using_includes()
646+
{
647+
$templateRenderer = Mockery::mock(TemplateRenderer::class);
648+
$patternProvider = Mockery::mock(PatternProvider::class);
649+
650+
$templateProvider = Mockery::mock(PatternProvider::class);
651+
$documentProvider = Mockery::mock(DocumentProvider::class);
652+
653+
$primer = new Primer($templateRenderer, $patternProvider, $templateProvider, $documentProvider);
654+
655+
$templateProvider
656+
->shouldReceive('getPatternStateData')
657+
->once()
658+
->with('home', 'state-name')
659+
->andReturnUsing(function () use ($primer) {
660+
return [
661+
'this' => ['template' => $primer->currentTemplateId(), 'state' => $primer->currentTemplateState()],
662+
'sub' => $primer->getTemplateStateData('away', 'another-state'),
663+
];
664+
});
665+
666+
$templateProvider
667+
->shouldReceive('getPatternStateData')
668+
->once()
669+
->with('away', 'another-state')
670+
->andReturnUsing(function () use ($primer) {
671+
return ['template' => $primer->currentTemplateId(), 'state' => $primer->currentTemplateState()];
672+
});
673+
674+
$data = $primer->getTemplateStateData('home', 'state-name');
675+
676+
$this->assertSame([
677+
'this' => ['template' => 'home', 'state' => 'state-name'],
678+
'sub' => ['template' => 'away', 'state' => 'another-state'],
679+
], $data);
680+
}
681+
558682
/** @test */
559683
public function getPatternStateData_returns_empty_array_when_pattern_is_not_valid()
560684
{

0 commit comments

Comments
 (0)