PluginProbe ʕ •ᴥ•ʔ
Booking for Appointments and Events Calendar – Amelia / 2.4.4
Booking for Appointments and Events Calendar – Amelia v2.4.4
2.4.4 2.4.3 2.4.2 2.4.1 2.4 trunk 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.15 1.2.16 1.2.17 1.2.18 1.2.19 1.2.2 1.2.20 1.2.21 1.2.22 1.2.23 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.32 1.2.33 1.2.34 1.2.35 1.2.36 1.2.37 1.2.38 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 2.0 2.0.1 2.0.2 2.1 2.1.1 2.1.2 2.1.3 2.2 2.2.1 2.3
ameliabooking / vendor / apimatic / core / tests / LoggerTest.php
ameliabooking / vendor / apimatic / core / tests Last commit date
Mocking 1 year ago ApiCallTest.php 1 year ago AuthenticationTest.php 1 year ago ClientTest.php 1 year ago CoreTestCaseTest.php 1 year ago EndToEndTest.php 1 year ago LoggerTest.php 1 year ago TypesTest.php 1 year ago UtilsTest.php 1 year ago bootstrap.php 1 year ago
LoggerTest.php
424 lines
1 <?php
2
3 namespace Core\Tests;
4
5 use Core\Logger\ApiLogger;
6 use Core\Logger\ConsoleLogger;
7 use Core\Request\Parameters\BodyParam;
8 use Core\Request\Parameters\FormParam;
9 use Core\Request\Parameters\HeaderParam;
10 use Core\Request\Parameters\QueryParam;
11 use Core\Request\Request;
12 use Core\Tests\Mocking\Logger\LogEntry;
13 use Core\Tests\Mocking\Logger\MockPrinter;
14 use Core\Tests\Mocking\MockHelper;
15 use Core\Tests\Mocking\Response\MockResponse;
16 use Core\Utils\CoreHelper;
17 use CoreInterfaces\Core\Format;
18 use CoreInterfaces\Core\Logger\ApiLoggerInterface;
19 use PHPUnit\Framework\TestCase;
20 use Psr\Log\InvalidArgumentException;
21 use Psr\Log\LoggerInterface;
22 use Psr\Log\LogLevel;
23
24 class LoggerTest extends TestCase
25 {
26 private const REQUEST_FORMAT = 'Request {method} {url} {contentType}';
27 private const REQUEST_BODY_FORMAT = 'Request Body {body}';
28 private const REQUEST_HEADERS_FORMAT = 'Request Headers {headers}';
29 private const RESPONSE_FORMAT = 'Response {statusCode} {contentLength} {contentType}';
30 private const RESPONSE_BODY_FORMAT = 'Response Body {body}';
31 private const RESPONSE_HEADERS_FORMAT = 'Response Headers {headers}';
32
33 private const TEST_URL = 'https://some/path';
34 private const TEST_HEADERS = [
35 'Content-Type' => 'my-content-type',
36 'HeaderA' => 'value A',
37 'HeaderB' => 'value B',
38 'Expires' => '2345ms'
39 ];
40 private const REDACTED_VALUE = '**Redacted**';
41
42 public function testLogLevels()
43 {
44 MockHelper::getMockLogger()->assertLastEntries($this->logAndGetEntry(LogLevel::INFO));
45 MockHelper::getMockLogger()->assertLastEntries($this->logAndGetEntry(LogLevel::DEBUG));
46 MockHelper::getMockLogger()->assertLastEntries($this->logAndGetEntry(LogLevel::NOTICE));
47 MockHelper::getMockLogger()->assertLastEntries($this->logAndGetEntry(LogLevel::ERROR));
48 MockHelper::getMockLogger()->assertLastEntries($this->logAndGetEntry(LogLevel::EMERGENCY));
49 MockHelper::getMockLogger()->assertLastEntries($this->logAndGetEntry(LogLevel::ALERT));
50 MockHelper::getMockLogger()->assertLastEntries($this->logAndGetEntry(LogLevel::CRITICAL));
51 MockHelper::getMockLogger()->assertLastEntries($this->logAndGetEntry(LogLevel::WARNING));
52 MockHelper::getMockLogger()->assertLastEntries($this->logAndGetEntry(LogLevel::INFO));
53 }
54
55 public function testConsoleLogger()
56 {
57 $printer = new MockPrinter();
58 $consoleLogger = new ConsoleLogger([$printer, 'printMessage']);
59
60 $this->logAndGetEntry(LogLevel::INFO, $consoleLogger, '{key1}-{key2}', [
61 'key1' => 'valA',
62 'key2' => 'valB'
63 ]);
64
65 $this->assertEquals(["%s: %s\n", LogLevel::INFO, 'valA-valB'], $printer->args);
66 }
67
68 public function testConsoleLoggerFailure()
69 {
70 $level = '__unknown__';
71 $this->expectException(InvalidArgumentException::class);
72 $this->expectExceptionMessage(
73 "Invalid LogLevel: $level. See Psr\Log\LogLevel.php for possible values of log levels."
74 );
75
76 $printer = new MockPrinter();
77 $consoleLogger = new ConsoleLogger([$printer, 'printMessage']);
78
79 $this->logAndGetEntry($level, $consoleLogger);
80 }
81
82 private function logAndGetEntry(
83 string $level,
84 LoggerInterface $logger = null,
85 string $message = 'someMessage',
86 array $context = []
87 ): LogEntry {
88 $logEntry = new LogEntry($level, $message, $context);
89 MockHelper::getLoggingConfiguration($level, null, null, null, $logger)
90 ->logMessage($logEntry->message, $logEntry->context);
91 return $logEntry;
92 }
93
94 public function testDefaultLoggingConfiguration()
95 {
96 $apiLogger = MockHelper::getClient()->getApiLogger();
97 $this->assertInstanceOf(ApiLoggerInterface::class, $apiLogger);
98
99 $request = new Request(self::TEST_URL);
100 $response = MockHelper::getClient()->getHttpClient()->execute($request);
101 $apiLogger->logRequest($request);
102 MockHelper::getMockLogger()->assertLastEntries(
103 new LogEntry(LogLevel::INFO, self::REQUEST_FORMAT, [
104 'method' => 'Get',
105 'url' => self::TEST_URL,
106 'contentType' => null
107 ])
108 );
109 $apiLogger->logResponse($response);
110 MockHelper::getMockLogger()->assertLastEntries(
111 new LogEntry(LogLevel::INFO, self::RESPONSE_FORMAT, [
112 'statusCode' => 200,
113 'contentLength' => null,
114 'contentType' => Format::JSON
115 ])
116 );
117 }
118
119 public function testLoggingRequestShouldIncludeInQuery()
120 {
121 $requestParams = MockHelper::getClient()->validateParameters([
122 QueryParam::init('key', 'value')
123 ]);
124 $request = new Request(self::TEST_URL, MockHelper::getClient(), $requestParams);
125 $apiLogger = new ApiLogger(MockHelper::getLoggingConfiguration(
126 null,
127 null,
128 MockHelper::getRequestLoggingConfiguration(true)
129 ));
130 $apiLogger->logRequest($request);
131 MockHelper::getMockLogger()->assertLastEntries(
132 new LogEntry(LogLevel::INFO, self::REQUEST_FORMAT, [
133 'method' => 'Get',
134 'url' => 'https://some/path?key=value',
135 'contentType' => null
136 ])
137 );
138 }
139
140 public function testLoggingRequestContentType()
141 {
142 $requestParams = MockHelper::getClient()->validateParameters([
143 HeaderParam::init('Content-Type', self::TEST_HEADERS['Content-Type'])
144 ]);
145 $request = new Request(self::TEST_URL, MockHelper::getClient(), $requestParams);
146 $apiLogger = new ApiLogger(MockHelper::getLoggingConfiguration());
147 $apiLogger->logRequest($request);
148 MockHelper::getMockLogger()->assertLastEntries(
149 new LogEntry(LogLevel::INFO, self::REQUEST_FORMAT, [
150 'method' => 'Get',
151 'url' => self::TEST_URL,
152 'contentType' => self::TEST_HEADERS['Content-Type']
153 ])
154 );
155 }
156
157 public function testLoggingRequestFileAsBody()
158 {
159 $requestParams = MockHelper::getClient()->validateParameters([
160 BodyParam::init(MockHelper::getFileWrapper()),
161 ]);
162 $request = new Request(self::TEST_URL, MockHelper::getClient(), $requestParams);
163 $request->setBodyFormat(Format::JSON, [CoreHelper::class, 'serialize']);
164 $apiLogger = new ApiLogger(MockHelper::getLoggingConfiguration(
165 null,
166 null,
167 MockHelper::getRequestLoggingConfiguration(
168 false,
169 true
170 )
171 ));
172 $apiLogger->logRequest($request);
173 MockHelper::getMockLogger()->assertLastEntries(
174 new LogEntry(LogLevel::INFO, self::REQUEST_FORMAT, [
175 'method' => 'Get',
176 'url' => self::TEST_URL,
177 'contentType' => 'application/octet-stream'
178 ]),
179 new LogEntry(LogLevel::INFO, self::REQUEST_BODY_FORMAT, [
180 'body' => 'This test file is created to test CoreFileWrapper functionality'
181 ])
182 );
183 }
184
185 public function testLoggingRequestBody()
186 {
187 $requestParams = MockHelper::getClient()->validateParameters([
188 BodyParam::init([
189 'key' => 'value'
190 ]),
191 ]);
192 $request = new Request(self::TEST_URL, MockHelper::getClient(), $requestParams);
193 $request->setBodyFormat(Format::JSON, [CoreHelper::class, 'serialize']);
194 $apiLogger = new ApiLogger(MockHelper::getLoggingConfiguration(
195 null,
196 null,
197 MockHelper::getRequestLoggingConfiguration(
198 false,
199 true
200 )
201 ));
202 $apiLogger->logRequest($request);
203 MockHelper::getMockLogger()->assertLastEntries(
204 new LogEntry(LogLevel::INFO, self::REQUEST_FORMAT, [
205 'method' => 'Get',
206 'url' => self::TEST_URL,
207 'contentType' => Format::JSON
208 ]),
209 new LogEntry(LogLevel::INFO, self::REQUEST_BODY_FORMAT, [
210 'body' => '{"key":"value"}'
211 ])
212 );
213 }
214
215 public function testLoggingRequestFormParams()
216 {
217 $requestParams = MockHelper::getClient()->validateParameters([
218 FormParam::init('key', 'value')
219 ]);
220 $request = new Request(self::TEST_URL, MockHelper::getClient(), $requestParams);
221 $apiLogger = new ApiLogger(MockHelper::getLoggingConfiguration(
222 null,
223 null,
224 MockHelper::getRequestLoggingConfiguration(
225 false,
226 true
227 )
228 ));
229 $apiLogger->logRequest($request);
230 MockHelper::getMockLogger()->assertLastEntries(
231 new LogEntry(LogLevel::INFO, self::REQUEST_FORMAT, [
232 'method' => 'Get',
233 'url' => self::TEST_URL,
234 'contentType' => null
235 ]),
236 new LogEntry(LogLevel::INFO, self::REQUEST_BODY_FORMAT, [
237 'body' => [
238 'key' => 'value'
239 ]
240 ])
241 );
242 }
243
244 public function testLoggingRequestHeaders()
245 {
246 $requestParams = MockHelper::getClient()->validateParameters([
247 HeaderParam::init('Content-Type', self::TEST_HEADERS['Content-Type']),
248 HeaderParam::init('HeaderA', self::TEST_HEADERS['HeaderA']),
249 HeaderParam::init('HeaderB', self::TEST_HEADERS['HeaderB']),
250 HeaderParam::init('Expires', self::TEST_HEADERS['Expires'])
251 ]);
252 $request = new Request(self::TEST_URL, MockHelper::getClient(), $requestParams);
253 $apiLogger = new ApiLogger(MockHelper::getLoggingConfiguration(
254 null,
255 null,
256 MockHelper::getRequestLoggingConfiguration(
257 false,
258 false,
259 true
260 )
261 ));
262 $apiLogger->logRequest($request);
263 MockHelper::getMockLogger()->assertLastEntries(
264 new LogEntry(LogLevel::INFO, self::REQUEST_FORMAT, [
265 'method' => 'Get',
266 'url' => self::TEST_URL,
267 'contentType' => self::TEST_HEADERS['Content-Type']
268 ]),
269 new LogEntry(LogLevel::INFO, self::REQUEST_HEADERS_FORMAT, [
270 'headers' => [
271 'Content-Type' => self::TEST_HEADERS['Content-Type'],
272 'HeaderA' => self::REDACTED_VALUE,
273 'HeaderB' => self::REDACTED_VALUE,
274 'Expires' => self::TEST_HEADERS['Expires'],
275 'key5' => self::REDACTED_VALUE
276 ]
277 ])
278 );
279 }
280
281 public function testLoggingResponseBody()
282 {
283 $response = new MockResponse();
284 $response->setStatusCode(200);
285 $response->setBody([
286 'key' => 'value'
287 ]);
288 $response->setHeaders([
289 'content-type' => Format::JSON,
290 'content-length' => '45'
291 ]);
292 $apiLogger = new ApiLogger(MockHelper::getLoggingConfiguration(
293 null,
294 null,
295 null,
296 MockHelper::getResponseLoggingConfiguration(true)
297 ));
298 $apiLogger->logResponse($response);
299 MockHelper::getMockLogger()->assertLastEntries(
300 new LogEntry(LogLevel::INFO, self::RESPONSE_FORMAT, [
301 'statusCode' => 200,
302 'contentLength' => '45',
303 'contentType' => Format::JSON
304 ]),
305 new LogEntry(LogLevel::INFO, self::RESPONSE_BODY_FORMAT, [
306 'body' => '{"key":"value"}'
307 ])
308 );
309 }
310
311 public function testLoggingResponseHeaders()
312 {
313 $response = new MockResponse();
314 $response->setStatusCode(400);
315 $response->setHeaders(self::TEST_HEADERS);
316 $apiLogger = new ApiLogger(MockHelper::getLoggingConfiguration(
317 LogLevel::ERROR,
318 null,
319 null,
320 MockHelper::getResponseLoggingConfiguration(
321 false,
322 true
323 )
324 ));
325 $apiLogger->logResponse($response);
326 MockHelper::getMockLogger()->assertLastEntries(
327 new LogEntry('error', self::RESPONSE_FORMAT, [
328 'statusCode' => 400,
329 'contentLength' => null,
330 'contentType' => self::TEST_HEADERS['Content-Type']
331 ]),
332 new LogEntry('error', self::RESPONSE_HEADERS_FORMAT, [
333 'headers' => [
334 'Content-Type' => self::TEST_HEADERS['Content-Type'],
335 'HeaderA' => self::REDACTED_VALUE,
336 'HeaderB' => self::REDACTED_VALUE,
337 'Expires' => self::TEST_HEADERS['Expires']
338 ]
339 ])
340 );
341 }
342
343 public function testLoggableHeaders()
344 {
345 $responseConfig = MockHelper::getResponseLoggingConfiguration(false, true);
346 $expectedHeaders = [
347 'Content-Type' => self::TEST_HEADERS['Content-Type'],
348 'HeaderA' => self::REDACTED_VALUE,
349 'HeaderB' => self::REDACTED_VALUE,
350 'Expires' => self::TEST_HEADERS['Expires']
351 ];
352 $this->assertEquals($expectedHeaders, $responseConfig->getLoggableHeaders(self::TEST_HEADERS, true));
353 }
354
355 public function testAllUnMaskedLoggableHeaders()
356 {
357 $responseConfig = MockHelper::getResponseLoggingConfiguration(false, true);
358 $this->assertEquals(self::TEST_HEADERS, $responseConfig->getLoggableHeaders(self::TEST_HEADERS, false));
359 }
360
361 public function testIncludedLoggableHeaders()
362 {
363 $responseConfig = MockHelper::getResponseLoggingConfiguration(
364 false,
365 true,
366 ['HeaderB', 'Expires']
367 );
368 $expectedHeaders = [
369 'HeaderB' => self::REDACTED_VALUE,
370 'Expires' => self::TEST_HEADERS['Expires']
371 ];
372 $this->assertEquals($expectedHeaders, $responseConfig->getLoggableHeaders(self::TEST_HEADERS, true));
373 }
374
375 public function testExcludedLoggableHeaders()
376 {
377 $responseConfig = MockHelper::getResponseLoggingConfiguration(
378 false,
379 true,
380 [],
381 ['HeaderB', 'Expires']
382 );
383 $expectedHeaders = [
384 'HeaderA' => self::REDACTED_VALUE,
385 'Content-Type' => self::TEST_HEADERS['Content-Type'],
386 ];
387 $this->assertEquals($expectedHeaders, $responseConfig->getLoggableHeaders(self::TEST_HEADERS, true));
388 }
389
390 public function testIncludeAndExcludeLoggableHeaders()
391 {
392 $responseConfig = MockHelper::getResponseLoggingConfiguration(
393 false,
394 true,
395 ['HEADERB', 'EXPIRES'],
396 ['EXPIRES']
397 );
398 $expectedHeaders = [
399 'HeaderB' => self::REDACTED_VALUE,
400 'Expires' => self::TEST_HEADERS['Expires']
401 ];
402 // If both include and exclude headers are provided then only includeHeaders will work
403 $this->assertEquals($expectedHeaders, $responseConfig->getLoggableHeaders(self::TEST_HEADERS, true));
404 }
405
406 public function testUnMaskedLoggableHeaders()
407 {
408 $responseConfig = MockHelper::getResponseLoggingConfiguration(
409 false,
410 true,
411 [],
412 [],
413 ['HeaderB']
414 );
415 $expectedHeaders = [
416 'Content-Type' => self::TEST_HEADERS['Content-Type'],
417 'HeaderA' => self::REDACTED_VALUE,
418 'HeaderB' => self::TEST_HEADERS['HeaderB'],
419 'Expires' => self::TEST_HEADERS['Expires']
420 ];
421 $this->assertEquals($expectedHeaders, $responseConfig->getLoggableHeaders(self::TEST_HEADERS, true));
422 }
423 }
424