From a1dda725a0452926692d466f7dd9e553f197ca19 Mon Sep 17 00:00:00 2001 From: Daniel Siepmann Date: Mon, 5 Oct 2020 09:40:54 +0200 Subject: [PATCH] Handle unavailable skills and skillsets in backend and frontend Show an error message in backend, to allow editors to spot the issue. Hide issues in frontend to not break frontend. Relates: #1, #2 --- Classes/Backend/Preview.php | 12 ++- Classes/Frontend/DataProcessing/SkillSets.php | 6 +- Classes/Frontend/DataProcessing/Skills.php | 6 +- .../Backend/ContentElements/Skills.html | 11 +- .../Backend/ContentElements/Skillset.html | 10 +- Tests/Unit/Backend/PreviewTest.php | 102 ++++++++++++++++++ .../Frontend/DataProcessing/SkillSetsTest.php | 35 ++++++ .../Frontend/DataProcessing/SkillsTest.php | 35 ++++++ 8 files changed, 210 insertions(+), 7 deletions(-) diff --git a/Classes/Backend/Preview.php b/Classes/Backend/Preview.php index e7bdb43..cf36e22 100644 --- a/Classes/Backend/Preview.php +++ b/Classes/Backend/Preview.php @@ -74,7 +74,11 @@ class Preview implements PageLayoutViewDrawItemHookInterface $skills = GeneralUtility::intExplode(',', $row['skilldisplay_skills'], true); foreach ($skills as $skillId) { - $row['skills'][] = $this->skillApi->getById($skillId); + try { + $row['skills'][] = $this->skillApi->getById($skillId); + } catch (\Exception $e) { + $row['skills'][]['error'] = $e->getMessage(); + } } return $row; @@ -85,7 +89,11 @@ class Preview implements PageLayoutViewDrawItemHookInterface $skillSets = GeneralUtility::intExplode(',', $row['skilldisplay_skillset'], true); foreach ($skillSets as $skillSetId) { - $row['skillSets'][] = $this->skillSetApi->getById($skillSetId); + try { + $row['skillSets'][] = $this->skillSetApi->getById($skillSetId); + } catch (\Exception $e) { + $row['skillSets'][]['error'] = $e->getMessage(); + } } return $row; diff --git a/Classes/Frontend/DataProcessing/SkillSets.php b/Classes/Frontend/DataProcessing/SkillSets.php index 7adc54e..440b978 100644 --- a/Classes/Frontend/DataProcessing/SkillSets.php +++ b/Classes/Frontend/DataProcessing/SkillSets.php @@ -54,7 +54,11 @@ class SkillSets implements DataProcessorInterface $skillSets = []; foreach ($skillSetIds as $skillSetId) { - $skillSets[] = $this->skillSetApi->getById($skillSetId); + try { + $skillSets[] = $this->skillSetApi->getById($skillSetId); + } catch (\Exception $e) { + continue; + } } $processedData[$as] = $skillSets; diff --git a/Classes/Frontend/DataProcessing/Skills.php b/Classes/Frontend/DataProcessing/Skills.php index 4235c95..6757bbc 100644 --- a/Classes/Frontend/DataProcessing/Skills.php +++ b/Classes/Frontend/DataProcessing/Skills.php @@ -54,7 +54,11 @@ class Skills implements DataProcessorInterface $skills = []; foreach ($skillIds as $skillId) { - $skills[] = $this->skillApi->getById($skillId); + try { + $skills[] = $this->skillApi->getById($skillId); + } catch (\Exception $e) { + continue; + } } $processedData[$as] = $skills; diff --git a/Resources/Private/Templates/Backend/ContentElements/Skills.html b/Resources/Private/Templates/Backend/ContentElements/Skills.html index eb64f88..e603ab1 100644 --- a/Resources/Private/Templates/Backend/ContentElements/Skills.html +++ b/Resources/Private/Templates/Backend/ContentElements/Skills.html @@ -10,8 +10,15 @@
  1. - {skill.title}
    - {sd:verification.url(skill: skill.id)} + + + {skill.error} + + + {skill.title}
    + {sd:verification.url(skill: skill.id)} +
    +
diff --git a/Resources/Private/Templates/Backend/ContentElements/Skillset.html b/Resources/Private/Templates/Backend/ContentElements/Skillset.html index 0eef70b..d5b44f6 100644 --- a/Resources/Private/Templates/Backend/ContentElements/Skillset.html +++ b/Resources/Private/Templates/Backend/ContentElements/Skillset.html @@ -10,7 +10,15 @@
  1. - {skillSet.name}
    + + + {skillSet.error} + + + {skillSet.title}
    + {sd:verification.url(skillSet: skillSet.id)} +
    +
diff --git a/Tests/Unit/Backend/PreviewTest.php b/Tests/Unit/Backend/PreviewTest.php index 9957d24..c08aae1 100644 --- a/Tests/Unit/Backend/PreviewTest.php +++ b/Tests/Unit/Backend/PreviewTest.php @@ -188,4 +188,106 @@ class PreviewTest extends TestCase ], ], $row); } + + /** + * @test + */ + public function addsExceptionMessageForSkills(): void + { + $skillApi = $this->prophesize(Skill::class); + $skillSetApi = $this->prophesize(SkillSet::class); + $pageLayoutView = $this->prophesize(PageLayoutView::class); + $exception = new \Exception('Some helpfull message'); + + $skill10 = $this->prophesize(SkillEntity::class); + $skillApi->getById(10)->willThrow($exception); + $skill20 = $this->prophesize(SkillEntity::class); + $skillApi->getById(20)->willReturn($skill20->reveal()); + + $subject = new Preview( + $skillApi->reveal(), + $skillSetApi->reveal() + ); + + $revealedPageLayoutView = $pageLayoutView->reveal(); + $drawItem = false; + $headerContent = ''; + $itemContent = ''; + $row = [ + 'skilldisplay_skills' => '10, 20,,', + 'skilldisplay_skillset' => '0', + ]; + + $subject->preProcess( + $revealedPageLayoutView, + $drawItem, + $headerContent, + $itemContent, + $row + ); + + static::assertFalse($drawItem); + static::assertEmpty($headerContent); + static::assertEmpty($itemContent); + static::assertSame([ + 'skilldisplay_skills' => '10, 20,,', + 'skilldisplay_skillset' => '0', + 'skills' => [ + [ + 'error' => 'Some helpfull message', + ], + $skill20->reveal(), + ], + 'skillSets' => [], + ], $row); + } + + /** + * @test + */ + public function addsExceptionMessageForSkillSets(): void + { + $skillApi = $this->prophesize(Skill::class); + $skillSetApi = $this->prophesize(SkillSet::class); + $pageLayoutView = $this->prophesize(PageLayoutView::class); + $exception = new \Exception('Some helpfull message'); + + $skillSetApi->getById(10)->willThrow($exception); + + $subject = new Preview( + $skillApi->reveal(), + $skillSetApi->reveal() + ); + + $revealedPageLayoutView = $pageLayoutView->reveal(); + $drawItem = false; + $headerContent = ''; + $itemContent = ''; + $row = [ + 'skilldisplay_skills' => '', + 'skilldisplay_skillset' => '10', + ]; + + $subject->preProcess( + $revealedPageLayoutView, + $drawItem, + $headerContent, + $itemContent, + $row + ); + + static::assertFalse($drawItem); + static::assertEmpty($headerContent); + static::assertEmpty($itemContent); + static::assertSame([ + 'skilldisplay_skills' => '', + 'skilldisplay_skillset' => '10', + 'skills' => [], + 'skillSets' => [ + [ + 'error' => 'Some helpfull message', + ], + ], + ], $row); + } } diff --git a/Tests/Unit/Frontend/DataProcessing/SkillSetsTest.php b/Tests/Unit/Frontend/DataProcessing/SkillSetsTest.php index 3d5a2f0..aa945ca 100644 --- a/Tests/Unit/Frontend/DataProcessing/SkillSetsTest.php +++ b/Tests/Unit/Frontend/DataProcessing/SkillSetsTest.php @@ -106,4 +106,39 @@ class SkillSetsTest extends TestCase ], ], $processedData); } + + /** + * @test + */ + public function skillsSkillSetInCaseOfException(): void + { + $skillApi = $this->prophesize(SkillSet::class); + $skillSet10 = $this->prophesize(SkillSetEntity::class); + $skillApi->getById(10)->willReturn($skillSet10->reveal()); + $skillSet20 = $this->prophesize(SkillSetEntity::class); + $skillApi->getById(20)->willThrow(new \Exception()); + + $cObj = $this->prophesize(ContentObjectRenderer::class); + $cObj->stdWrapValue('as', [], 'skillSets')->willReturn('skillSets'); + $cObj->stdWrapValue('skillSets', [], '')->willReturn('10, 20,,'); + + $subject = new SkillSets( + $skillApi->reveal() + ); + + $processedData = $subject->process( + $cObj->reveal(), + [], + [], + [ + 'skillSets' => '10, 20,,', + ] + ); + + static::assertEquals([ + 'skillSets' => [ + $skillSet10->reveal(), + ], + ], $processedData); + } } diff --git a/Tests/Unit/Frontend/DataProcessing/SkillsTest.php b/Tests/Unit/Frontend/DataProcessing/SkillsTest.php index b75bccd..cb89e14 100644 --- a/Tests/Unit/Frontend/DataProcessing/SkillsTest.php +++ b/Tests/Unit/Frontend/DataProcessing/SkillsTest.php @@ -106,4 +106,39 @@ class SkillsTest extends TestCase ], ], $processedData); } + + /** + * @test + */ + public function skillsSkillSetInCaseOfException(): void + { + $skillApi = $this->prophesize(Skill::class); + $skill10 = $this->prophesize(SkillEntity::class); + $skillApi->getById(10)->willReturn($skill10->reveal()); + $skill20 = $this->prophesize(SkillEntity::class); + $skillApi->getById(20)->willThrow(new \Exception()); + + $cObj = $this->prophesize(ContentObjectRenderer::class); + $cObj->stdWrapValue('as', [], 'skills')->willReturn('skills'); + $cObj->stdWrapValue('skills', [], '')->willReturn('10, 20,,'); + + $subject = new Skills( + $skillApi->reveal() + ); + + $processedData = $subject->process( + $cObj->reveal(), + [], + [], + [ + 'skills' => '10, 20,,', + ] + ); + + static::assertEquals([ + 'skills' => [ + $skill10->reveal(), + ], + ], $processedData); + } }