Skip to content

Commit d819f09

Browse files
authored
Merge pull request #8897 from ProcessMaker/bugfix/FOUR-30920
FOUR-30920: Remove expected DevLink ping 401
2 parents fcf7ece + a633694 commit d819f09

3 files changed

Lines changed: 104 additions & 8 deletions

File tree

‎ProcessMaker/Http/Controllers/Api/DevLinkController.php‎

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,20 @@ public function destroy(DevLink $devLink)
105105
public function ping(DevLink $devLink)
106106
{
107107
try {
108-
return $devLink->client()->get(route('api.devlink.pong', [], false));
109-
} catch (\Exception $e) {
110-
return response()->json(['error' => 'DevLink connection error'], $e->getCode());
108+
$response = $devLink->client()->get(route('api.devlink.pong', [], false));
109+
} catch (RequestException $e) {
110+
$status = $e->response->status();
111+
112+
return response()->json([
113+
'status' => in_array($status, [401, 403], true) ? 'authorization_required' : 'error',
114+
]);
115+
} catch (\Throwable $e) {
116+
return response()->json(['status' => 'error']);
111117
}
118+
119+
return response()->json([
120+
'status' => $response->json('status') === 'ok' ? 'ok' : 'error',
121+
]);
112122
}
113123

114124
public function pong()

‎resources/js/admin/devlink/components/Index.vue‎

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,15 @@ const create = (name, url) => {
104104
ProcessMaker.apiClient
105105
.get(`devlink/${newId}/ping`)
106106
.then((response) => {
107-
status.value = 'success';
108-
window.location.href = fullUrl;
109-
})
110-
.catch((e) => {
111-
if (e.response.status === 401) {
107+
if (['ok', 'authorization_required'].includes(response.data.status)) {
112108
status.value = 'success';
113109
window.location.href = fullUrl;
114110
} else {
115111
status.value = 'error';
116112
}
113+
})
114+
.catch(() => {
115+
status.value = 'error';
117116
});
118117
})
119118
.catch((error) => {

‎tests/Feature/Api/DevLinkTest.php‎

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,93 @@ public function testAddAssets()
433433
$this->assertEquals('Asset already exists in bundle', $response->json()['error']['message']);
434434
}
435435

436+
public function testPingReturnsOkWhenRemotePongSucceeds()
437+
{
438+
$devLink = DevLink::factory()->create([
439+
'url' => 'https://remote-instance.test',
440+
'access_token' => 'token',
441+
]);
442+
443+
Http::fake([
444+
'remote-instance.test/*' => Http::response(['status' => 'ok'], 200),
445+
]);
446+
447+
$response = $this->apiCall('GET', route('api.devlink.ping', ['devLink' => $devLink->id]));
448+
449+
$response->assertStatus(200);
450+
$response->assertJson(['status' => 'ok']);
451+
}
452+
453+
public function testPingReturnsAuthorizationRequiredWhenRemotePongReturnsUnauthorized()
454+
{
455+
$devLink = DevLink::factory()->create([
456+
'url' => 'https://remote-instance.test',
457+
'access_token' => 'token',
458+
]);
459+
460+
Http::fake([
461+
'remote-instance.test/*' => Http::response(['message' => 'Unauthorized'], 401),
462+
]);
463+
464+
$response = $this->apiCall('GET', route('api.devlink.ping', ['devLink' => $devLink->id]));
465+
466+
$response->assertStatus(200);
467+
$response->assertJson(['status' => 'authorization_required']);
468+
}
469+
470+
public function testPingReturnsAuthorizationRequiredWhenRemotePongReturnsForbidden()
471+
{
472+
$devLink = DevLink::factory()->create([
473+
'url' => 'https://remote-instance.test',
474+
'access_token' => 'token',
475+
]);
476+
477+
Http::fake([
478+
'remote-instance.test/*' => Http::response(['message' => 'Forbidden'], 403),
479+
]);
480+
481+
$response = $this->apiCall('GET', route('api.devlink.ping', ['devLink' => $devLink->id]));
482+
483+
$response->assertStatus(200);
484+
$response->assertJson(['status' => 'authorization_required']);
485+
}
486+
487+
public function testPingReturnsErrorWhenRemotePongFails()
488+
{
489+
$devLink = DevLink::factory()->create([
490+
'url' => 'https://remote-instance.test',
491+
'access_token' => 'token',
492+
]);
493+
494+
Http::fake([
495+
'remote-instance.test/*' => Http::response(['message' => 'Server error'], 500),
496+
]);
497+
498+
$response = $this->apiCall('GET', route('api.devlink.ping', ['devLink' => $devLink->id]));
499+
500+
$response->assertStatus(200);
501+
$response->assertJson(['status' => 'error']);
502+
}
503+
504+
public function testPingReturnsErrorWhenRemotePongCannotConnect()
505+
{
506+
$devLink = DevLink::factory()->create([
507+
'url' => 'https://remote-instance.test',
508+
'access_token' => 'token',
509+
]);
510+
511+
Http::fake([
512+
'remote-instance.test/*' => function () {
513+
throw new ConnectionException('Connection failed');
514+
},
515+
]);
516+
517+
$response = $this->apiCall('GET', route('api.devlink.ping', ['devLink' => $devLink->id]));
518+
519+
$response->assertStatus(200);
520+
$response->assertJson(['status' => 'error']);
521+
}
522+
436523
public function testInstallRemoteAsset()
437524
{
438525
$screen = Screen::factory()->create();

0 commit comments

Comments
 (0)