Skip to content

Commit de9ea4b

Browse files
committed
Take advantage of php-vcr 1.2.0 to display which requests where replayed
1 parent 27f2682 commit de9ea4b

File tree

14 files changed

+203
-77
lines changed

14 files changed

+203
-77
lines changed

DataCollector/VCRDataCollector.php

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,50 @@
66
use Symfony\Component\HttpFoundation\Response;
77
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
88

9-
use VCR\VCRBundle\VCR\LoggedVideoRecorder;
9+
use VCR\VCRBundle\VCR\Logger;
1010

1111
class VCRDataCollector extends DataCollector
1212
{
13-
private $recorder;
13+
private $logger;
1414

15-
public function __construct(LoggedVideoRecorder $recorder)
15+
public function __construct(Logger $logger)
1616
{
17-
$this->recorder = $recorder;
17+
$this->logger = $logger;
1818
}
1919

2020
public function collect(Request $request, Response $response, \Exception $exception = null)
2121
{
22+
$requests = $this->logger->getHttpRequests();
23+
$playbacks = $this->logger->getPlaybacks();
24+
2225
$this->data = array(
23-
'logs' => $logs = $this->recorder->getLog(),
24-
'count' => count($logs),
26+
'requests' => $requests,
27+
'playbacks' => $playbacks,
28+
'count' => count($requests) + count($playbacks),
2529
);
2630
}
2731

2832
public function getRequestsLogs()
2933
{
30-
return $this->data['logs'];
34+
return $this->data['requests'];
35+
}
36+
37+
public function getPlaybacks()
38+
{
39+
return $this->data['playbacks'];
40+
}
41+
42+
public function getPlaybacksCount()
43+
{
44+
return count($this->data['playbacks']);
3145
}
3246

3347
public function getRequestsCount()
48+
{
49+
return count($this->data['requests']);
50+
}
51+
52+
public function getCount()
3453
{
3554
return $this->data['count'];
3655
}

DependencyInjection/VCRVCRExtension.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class VCRVCRExtension extends Extension
1212
public function load(array $configs, ContainerBuilder $container)
1313
{
1414
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
15+
$loader->load('listeners.yml');
1516
$loader->load('services.yml');
1617

1718
$config = $this->processConfiguration($this->getConfiguration($configs, $container), $configs);
@@ -27,7 +28,6 @@ public function load(array $configs, ContainerBuilder $container)
2728
public function getConfiguration(array $config, ContainerBuilder $container)
2829
{
2930
return new Configuration();
30-
3131
}
3232

3333
public function getAlias()
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace VCR\VCRBundle\EventListener;
4+
5+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
6+
use VCR\VCREvents;
7+
use VCR\Event\AfterHttpRequestEvent;
8+
9+
use VCR\VCRBundle\VCR\Logger;
10+
11+
class HttpRequestListener implements EventSubscriberInterface
12+
{
13+
private $logger;
14+
15+
public function __construct(Logger $logger)
16+
{
17+
$this->logger = $logger;
18+
}
19+
20+
/**
21+
* {@inheritDoc}
22+
*/
23+
public static function getSubscribedEvents()
24+
{
25+
return array(
26+
VCREvents::VCR_AFTER_HTTP_REQUEST => 'onHttpRequest',
27+
);
28+
}
29+
30+
public function onHttpRequest(AfterHttpRequestEvent $event)
31+
{
32+
$this->logger->logHttpRequest(
33+
$event->getRequest(),
34+
$event->getResponse()
35+
);
36+
}
37+
}

EventListener/PlaybackListener.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace VCR\VCRBundle\EventListener;
4+
5+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
6+
use VCR\VCREvents;
7+
use VCR\Event\AfterPlaybackEvent;
8+
9+
use VCR\VCRBundle\VCR\Logger;
10+
11+
class PlaybackListener implements EventSubscriberInterface
12+
{
13+
private $logger;
14+
15+
public function __construct(Logger $logger)
16+
{
17+
$this->logger = $logger;
18+
}
19+
20+
/**
21+
* {@inheritDoc}
22+
*/
23+
public static function getSubscribedEvents()
24+
{
25+
return array(
26+
VCREvents::VCR_AFTER_PLAYBACK => 'onPlayback',
27+
);
28+
}
29+
30+
public function onPlayback(AfterPlaybackEvent $event)
31+
{
32+
$this->logger->logPlayback(
33+
$event->getRequest(),
34+
$event->getResponse(),
35+
$event->getCassette()
36+
);
37+
}
38+
}

Resources/config/listeners.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
services:
2+
vcr.listener.http_request:
3+
class: VCR\VCRBundle\EventListener\HttpRequestListener
4+
arguments: [ @vcr.logger ]
5+
tags:
6+
- { name: kernel.event_subscriber }
7+
8+
vcr.listener.playback:
9+
class: VCR\VCRBundle\EventListener\PlaybackListener
10+
arguments: [ @vcr.logger ]
11+
tags:
12+
- { name: kernel.event_subscriber }

Resources/config/services.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
services:
22
data_collector.vcr:
33
class: VCR\VCRBundle\DataCollector\VCRDataCollector
4-
arguments: [ @vcr.recorder ]
4+
arguments: [ @vcr.logger ]
55
tags:
66
- { name: data_collector, template: "VCRVCRBundle:Profiler:collector", id: "vcr_collector" }
77

8+
vcr.logger:
9+
class: VCR\VCRBundle\VCR\Logger
10+
811
vcr.config:
912
class: VCR\Configuration
1013
calls:
@@ -21,8 +24,9 @@ services:
2124
arguments: [ @vcr.config ]
2225

2326
vcr.recorder:
24-
class: VCR\VCRBundle\VCR\LoggedVideoRecorder
27+
class: VCR\Videorecorder
2528
arguments: [ @vcr.config, @vcr.http_client, @vcr.factory ]
2629
calls:
30+
- [ setEventDispatcher, [ @event_dispatcher ] ]
2731
- [ turnOn, [ ] ]
2832
- [ insertCassette, [ %vcr.cassette.name% ] ]

Resources/views/Profiler/call.html.twig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
<div id="log_{{ index }}" class="request {{ log.request.method|lower }}">
2-
<div class="status icon {% if log.response.status != 200 %}error{% else %}success{% endif %}"></div>
2+
<div class="status icon {% if log.response.status.code != 200 %}error{% else %}success{% endif %}"></div>
33

44
<div class="summary">
55
<h3>
66
<span class="method">{{ log.request.method }}</span>
77
<span class="path">&nbsp{{ log.request.url }}</span>
88
</h3>
99
<div class="code">
10-
<abbr title="{{ log.response.status_text }}">{{ log.response.status }}</abbr>
10+
<abbr title="{{ log.response.status.message }}">{{ log.response.status.code }}</abbr>
1111
</div>
1212
</div>
1313

Resources/views/Profiler/collector.html.twig

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@
55
{# the web debug toolbar content #}
66
{% set icon %}
77
<img alt="VCR" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5QUVGQjczQ0Q0ODIxMUUxQjBDOENFNTg5Q0ZFQTZENSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5QUVGQjczREQ0ODIxMUUxQjBDOENFNTg5Q0ZFQTZENSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjlBRUZCNzNBRDQ4MjExRTFCMEM4Q0U1ODlDRkVBNkQ1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjlBRUZCNzNCRDQ4MjExRTFCMEM4Q0U1ODlDRkVBNkQ1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+TS3nKAAAAUVJREFUeNpi/P//PwM9ABMDncDws4jFxMSEC0hPAeIYIGalsvm/gXgJEOewQC1JpJFHWGFmM0F9QmsQw0SD4MLqMxY0gU9ATM2MxQ9PDGgS8mfPnv1gbGwsAGSXArELVHwPEHeD5JAVY1G3C4i7gOo+Q+XhjmZE5gCBIJQ+BsSaaI64DsRWMMuglmBTdxmIrUGWIZuNLR+VImneBcUMULFSItTpAnEJMRnWFUrvBrrKHYRBbDQ5QurcqVkyMOIrCAgKQF1lCnIxMIx3orseSd1eIDbBoW4/MT7qhkY8CLhBMSwxdCOp6wTiO1jU3YPK4bcImqqsgLgNiE9DcRtyioOqew+kLIB4MhDfhGJQcWYJlHuDEc5oyfsxEP+jYoaVxxVHsrSsj37Toaz7zQStL2gNloCCLgdWlNOy4mMcbQUNeosAAgwA9nZtAXhMJ/oAAAAASUVORK5CYII="/>
8-
<span class="sf-toolbar-status">{{ collector.requestsCount }}</span>
8+
<span class="sf-toolbar-status">{{ collector.count }}</span>
99
{% endset %}
1010
{% set text %}
1111
<div class="sf-toolbar-info-piece">
12-
<b>Requests sent</b>
13-
<span>{{ collector.requestsCount }}</span>
12+
<b>Interceptions</b>
13+
<span class="sf-toolbar-status sf-toolbar-status-yellow">{{ collector.requestsCount }}</span>
14+
</div>
15+
<div class="sf-toolbar-info-piece">
16+
<b>Replays</b>
17+
<span class="sf-toolbar-status sf-toolbar-status-green">{{ collector.playbacksCount }}</span>
1418
</div>
1519
{% endset %}
1620

@@ -29,9 +33,21 @@
2933
{% endblock %}
3034

3135
{% block panel %}
32-
<h2>Sent Requests</h2>
36+
<h2>Intercepted Requests</h2>
37+
38+
{% if collector.requestsLogs %}
39+
{% include 'VCRVCRBundle:Profiler:calls.html.twig' with {'logs': collector.requestsLogs } %}
40+
{% else %}
41+
<p>No request intercepted.</p>
42+
{% endif %}
43+
44+
<h2>Replays</h2>
3345

34-
{% include 'VCRVCRBundle:Profiler:calls.html.twig' with {'logs': collector.requestsLogs } %}
46+
{% if collector.playbacks %}
47+
{% include 'VCRVCRBundle:Profiler:calls.html.twig' with {'logs': collector.playbacks } %}
48+
{% else %}
49+
<p>No request replayed.</p>
50+
{% endif %}
3551
{% endblock %}
3652

3753
{% block head %}

Resources/views/Profiler/request.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
<h5>Query Parameters</h5>
5151
<table>
5252
<tbody>
53-
{% for name,parameter in request.query %}
53+
{% for name, parameter in request.query %}
5454
<tr>
5555
<th style="width: 25%">{{ name }}</th>
5656
<td>

Resources/views/Profiler/response.html.twig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
<tbody>
55
<tr>
66
<th style="width: 25%">Code</th>
7-
<td>{{ response.status }}</td>
7+
<td>{{ response.status.code }}</td>
88
</tr>
99
<tr>
1010
<th style="width: 25%">Status</th>
11-
<td>{{ response.status_text }}</td>
11+
<td>{{ response.status.message }}</td>
1212
</tr>
1313
</tbody>
1414
</table>
@@ -27,7 +27,7 @@
2727
</tbody>
2828
</table>
2929

30-
{% if response.body is defined %}
30+
{% if request.body is defined %}
3131
<h5>Content</h5>
3232
<pre>{{ response.body|replace({"\t\t\n": "", "\t": " "}) }}</pre>
3333
{% endif %}

0 commit comments

Comments
 (0)