Skip to content
This repository was archived by the owner on May 1, 2019. It is now read-only.

Commit 393f709

Browse files
committed
Update ModuleController to detect module fetch failure and display error message to user
1 parent a71a432 commit 393f709

File tree

5 files changed

+130
-12
lines changed

5 files changed

+130
-12
lines changed

module/User/view/user/helper/user-organizations.phtml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,18 @@
2626

2727
<?php
2828
$jsTemplate = <<<'JAVASCRIPT'
29-
$('#org-%s').on("show.bs.collapse", function () {
30-
$('#org-content-%s').load("%s");
29+
$('#org-%1$s').on("show.bs.collapse", function () {
30+
$.ajax({
31+
url: "%2$s",
32+
}).done(function(data) {
33+
$('#org-content-%1$s').html(data);
34+
}).fail(function(xhr) {
35+
$('#org-content-%1$s').html(xhr.responseText);
36+
});
3137
});
3238
JAVASCRIPT;
3339

34-
$this->inlineScript()->appendScript(sprintf($jsTemplate, $org->login, $org->login, $this->url('zf-module/list', ['owner' => $org->login])));
40+
$this->inlineScript()->appendScript(sprintf($jsTemplate, $org->login, $this->url('zf-module/list', ['owner' => $org->login])));
3541
?>
3642
<?php endforeach; ?>
3743
</div>

module/User/view/zfc-user/user/index.phtml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,13 @@
4848
</div>
4949
</div>
5050
</div>
51-
<?php $this->inlineScript()->appendScript('$("#repositories").load("' . $this->escapeJs($this->url('zf-module')) . '");'); ?>
51+
<?php $this->inlineScript()->appendScript(<<<EOB
52+
$.ajax({
53+
url: "{$this->escapeJs($this->url('zf-module'))}",
54+
}).done(function(data) {
55+
$('#repositories').html(data);
56+
}).fail(function(xhr) {
57+
$('#repositories').html(xhr.responseText);
58+
});
59+
EOB
60+
);

module/ZfModule/src/ZfModule/Controller/ModuleController.php

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,24 @@ public function indexAction()
8383
return $this->redirect()->toRoute('zfcuser/login');
8484
}
8585

86+
$viewModel = new ViewModel();
87+
$viewModel->setTerminal(true);
88+
8689
$currentUserRepositories = $this->repositoryRetriever->getAuthenticatedUserRepositories([
8790
'type' => 'all',
8891
'per_page' => 100,
8992
'sort' => 'updated',
9093
'direction' => 'desc',
9194
]);
95+
if ($currentUserRepositories === false) {
96+
$this->getResponse()->setStatusCode(503);
97+
$viewModel->setVariable('errorMessage', 'module_fetch_failed');
9298

93-
$repositories = $this->unregisteredRepositories($currentUserRepositories);
99+
return $viewModel;
100+
}
94101

95-
$viewModel = new ViewModel(['repositories' => $repositories]);
96-
$viewModel->setTerminal(true);
102+
$repositories = $this->unregisteredRepositories($currentUserRepositories);
103+
$viewModel->setVariable('repositories', $repositories);
97104

98105
return $viewModel;
99106
}
@@ -105,18 +112,25 @@ public function listAction()
105112
}
106113

107114
$owner = $this->params()->fromRoute('owner', null);
115+
116+
$viewModel = new ViewModel();
117+
$viewModel->setTerminal(true);
118+
$viewModel->setTemplate('zf-module/module/index.phtml');
108119

109120
$userRepositories = $this->repositoryRetriever->getUserRepositories($owner, [
110121
'per_page' => 100,
111122
'sort' => 'updated',
112123
'direction' => 'desc',
113124
]);
125+
if ($userRepositories === false) {
126+
$this->getResponse()->setStatusCode(503);
127+
$viewModel->setVariable('errorMessage', 'module_fetch_failed');
114128

129+
return $viewModel;
130+
}
131+
115132
$repositories = $this->unregisteredRepositories($userRepositories);
116-
117-
$viewModel = new ViewModel(['repositories' => $repositories]);
118-
$viewModel->setTerminal(true);
119-
$viewModel->setTemplate('zf-module/module/index.phtml');
133+
$viewModel->setVariable('repositories', $repositories);
120134

121135
return $viewModel;
122136
}

module/ZfModule/test/ZfModuleTest/Integration/Controller/ModuleControllerTest.php

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,46 @@ public function testIndexActionRendersUnregisteredModulesOnly()
173173
$this->assertCount(1, $viewVariable);
174174
$this->assertSame($unregisteredModule, $viewVariable[0]);
175175
}
176+
177+
public function testIndexActionRendersErrorMessageWhenModuleFetchReturnsFalse()
178+
{
179+
$this->authenticatedAs(new User());
180+
181+
$repositoryRetriever = $this->getMockBuilder(RepositoryRetriever::class)
182+
->disableOriginalConstructor()
183+
->getMock()
184+
;
185+
186+
$repositoryRetriever
187+
->expects($this->once())
188+
->method('getAuthenticatedUserRepositories')
189+
->willReturn(false)
190+
;
191+
192+
$this->getApplicationServiceLocator()
193+
->setAllowOverride(true)
194+
->setService(
195+
RepositoryRetriever::class,
196+
$repositoryRetriever
197+
)
198+
;
199+
200+
$this->dispatch('/module');
201+
202+
$this->assertMatchedRouteName('zf-module');
203+
204+
$this->assertControllerName(Controller\ModuleController::class);
205+
$this->assertActionName('index');
206+
$this->assertResponseStatusCode(Http\Response::STATUS_CODE_503);
207+
208+
$viewModel = $this->getApplication()->getMvcEvent()->getViewModel();
209+
210+
$this->assertTrue($viewModel->terminate());
211+
$this->assertSame('zf-module/module/index', $viewModel->getTemplate());
212+
213+
$this->assertEquals(null, $viewModel->getVariable('repositories'));
214+
$this->assertEquals('module_fetch_failed', $viewModel->getVariable('errorMessage'));
215+
}
176216

177217
public function testListActionRedirectsIfNotAuthenticated()
178218
{
@@ -439,6 +479,53 @@ public function testListActionRendersUnregisteredModulesOnly()
439479
$this->assertCount(1, $viewVariable);
440480
$this->assertSame($unregisteredModule, $viewVariable[0]);
441481
}
482+
483+
public function testListActionRendersErrorMessageWhenModuleFetchReturnsFalse()
484+
{
485+
$this->authenticatedAs(new User());
486+
487+
$repositoryRetriever = $this->getMockBuilder(RepositoryRetriever::class)
488+
->disableOriginalConstructor()
489+
->getMock()
490+
;
491+
492+
$vendor = 'suzie';
493+
494+
$repositoryRetriever
495+
->expects($this->once())
496+
->method('getUserRepositories')
497+
->willReturn(false)
498+
;
499+
500+
$this->getApplicationServiceLocator()
501+
->setAllowOverride(true)
502+
->setService(
503+
RepositoryRetriever::class,
504+
$repositoryRetriever
505+
)
506+
;
507+
508+
$url = sprintf(
509+
'/module/list/%s',
510+
$vendor
511+
);
512+
513+
$this->dispatch($url);
514+
515+
$this->assertMatchedRouteName('zf-module/list');
516+
517+
$this->assertControllerName(Controller\ModuleController::class);
518+
$this->assertActionName('list');
519+
$this->assertResponseStatusCode(Http\Response::STATUS_CODE_503);
520+
521+
$viewModel = $this->getApplication()->getMvcEvent()->getViewModel();
522+
523+
$this->assertTrue($viewModel->terminate());
524+
$this->assertSame('zf-module/module/index.phtml', $viewModel->getTemplate());
525+
526+
$this->assertEquals(null, $viewModel->getVariable('repositories'));
527+
$this->assertEquals('module_fetch_failed', $viewModel->getVariable('errorMessage'));
528+
}
442529

443530
public function testAddActionRedirectsIfNotAuthenticated()
444531
{

module/ZfModule/view/zf-module/module/index.phtml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?php /* @var stdClass[] $repositories */ ?>
2-
<?php if (!count($repositories)): ?>
2+
<?php if (isset($errorMessage)): ?>
3+
<div class="alert alert-block alert-danger">An error occurred while fetching modules</div>
4+
<?php elseif (!count($repositories)): ?>
35
<div class="alert alert-block">No modules found</div>
46
<?php else: ?>
57
<?php foreach ($repositories as $repository): ?>

0 commit comments

Comments
 (0)