-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathErrorHandlingMiddlewareTest.php
More file actions
119 lines (103 loc) · 4.08 KB
/
ErrorHandlingMiddlewareTest.php
File metadata and controls
119 lines (103 loc) · 4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php
namespace Phpactor\LanguageServer\Tests\Unit\Middleware;
use Amp\PHPUnit\AsyncTestCase;
use Amp\Success;
use ColinODell\PsrTestLogger\TestLogger;
use Generator;
use Phpactor\LanguageServer\Core\Handler\HandlerNotFound;
use Phpactor\LanguageServer\Core\Middleware\RequestHandler;
use Phpactor\LanguageServer\Core\Rpc\ErrorCodes;
use Phpactor\LanguageServer\Core\Rpc\NotificationMessage;
use Phpactor\LanguageServer\Core\Rpc\RequestMessage;
use Phpactor\LanguageServer\Core\Rpc\ResponseError;
use Phpactor\LanguageServer\Core\Rpc\ResponseMessage;
use Phpactor\LanguageServer\Core\Server\Exception\ExitSession;
use Phpactor\LanguageServer\Middleware\ClosureMiddleware;
use Phpactor\LanguageServer\Middleware\ErrorHandlingMiddleware;
use RuntimeException;
class ErrorHandlingMiddlewareTest extends AsyncTestCase
{
/**
* @var TestLogger
*/
private $logger;
protected function setUp(): void
{
parent::setUp();
$this->logger = new TestLogger();
}
public function testDelegatesToNextHandlerIfMessageIsNotRequest(): Generator
{
$response = yield $this->createMiddleware()->process(
new NotificationMessage('foobar'),
new RequestHandler([
new ClosureMiddleware(function () {
return new Success(new ResponseMessage(1, null));
})
])
);
self::assertInstanceOf(ResponseMessage::class, $response);
self::assertEquals([], $this->logger->records);
}
public function testRethrowsServerControlException(): Generator
{
$this->expectException(ExitSession::class);
yield $this->createMiddleware()->process(
new NotificationMessage('foobar'),
new RequestHandler([
new ClosureMiddleware(function (): void {
throw new ExitSession('please');
})
])
);
}
public function testLogsAndReturnsNullForNoticationException(): Generator
{
$response = yield $this->createMiddleware()->process(
new NotificationMessage('foobar'),
new RequestHandler([
new ClosureMiddleware(function (): void {
throw new RuntimeException('please');
})
])
);
self::assertNull($response);
self::assertTrue($this->logger->hasErrorThatContains('please'));
}
public function testDoesNotLogButReturnsErrorResponseForRequest(): Generator
{
$response = yield $this->createMiddleware()->process(
new RequestMessage(1, 'foobar', []),
new RequestHandler([
new ClosureMiddleware(function (): void {
throw new RuntimeException('please');
})
])
);
self::assertInstanceOf(ResponseMessage::class, $response);
assert($response instanceof ResponseMessage);
self::assertInstanceOf(ResponseError::class, $response->error);
self::assertStringContainsString('Exception [RuntimeException] please', $response->error->message);
self::assertEquals(ErrorCodes::InternalError, $response->error->code);
}
public function testMethodNotFoundCodeForHandlerNotFound(): Generator
{
$response = yield $this->createMiddleware()->process(
new RequestMessage(1, 'foobar', []),
new RequestHandler([
new ClosureMiddleware(function (): void {
throw new HandlerNotFound('please');
})
])
);
self::assertInstanceOf(ResponseMessage::class, $response);
assert($response instanceof ResponseMessage);
self::assertInstanceOf(ResponseError::class, $response->error);
self::assertStringContainsString('Exception [Phpactor\LanguageServer\Core\Handler\HandlerNotFound] please', $response->error->message);
self::assertEquals(ErrorCodes::MethodNotFound, $response->error->code);
}
private function createMiddleware(): ErrorHandlingMiddleware
{
return new ErrorHandlingMiddleware($this->logger);
}
}