3
3
namespace Sentry \SentryBundle \Test \DependencyInjection ;
4
4
5
5
use PHPUnit \Framework \TestCase ;
6
+ use Sentry \Event ;
6
7
use Sentry \Options ;
7
8
use Sentry \SentryBundle \DependencyInjection \SentryExtension ;
8
9
use Sentry \SentryBundle \EventListener \ConsoleListener ;
9
10
use Sentry \SentryBundle \EventListener \RequestListener ;
10
11
use Symfony \Component \DependencyInjection \Alias ;
11
12
use Symfony \Component \DependencyInjection \Container ;
12
13
use Symfony \Component \DependencyInjection \ContainerBuilder ;
14
+ use Symfony \Component \DependencyInjection \Definition ;
13
15
use Symfony \Component \EventDispatcher \EventDispatcherInterface ;
14
16
use Symfony \Component \HttpFoundation \RequestStack ;
15
17
use Symfony \Component \HttpKernel \Kernel ;
@@ -87,6 +89,7 @@ public function optionsValueProvider(): array
87
89
{
88
90
return [
89
91
['attach_stacktrace ' , true , 'shouldAttachStacktrace ' ],
92
+ ['before_send ' , __NAMESPACE__ . '\mockBeforeSend ' , 'getBeforeSendCallback ' ],
90
93
['context_lines ' , 1 ],
91
94
['default_integrations ' , false , 'hasDefaultIntegrations ' ],
92
95
['enable_compression ' , false , 'isCompressionEnabled ' ],
@@ -146,6 +149,75 @@ public function emptyDsnValueProvider(): array
146
149
];
147
150
}
148
151
152
+ public function testBeforeSendUsingServiceDefinition (): void
153
+ {
154
+ $ container = $ this ->getContainer ([
155
+ 'options ' => [
156
+ 'before_send ' => '@before_send ' ,
157
+ ],
158
+ ]);
159
+
160
+ $ beforeSendCallback = $ this ->getOptionsFrom ($ container )->getBeforeSendCallback ();
161
+ $ this ->assertIsCallable ($ beforeSendCallback );
162
+ $ defaultOptions = $ this ->getOptionsFrom ($ this ->getContainer ());
163
+ $ this ->assertNotEquals (
164
+ $ defaultOptions ->getBeforeSendCallback (),
165
+ $ beforeSendCallback ,
166
+ 'before_send closure has not been replaced, is the default one '
167
+ );
168
+ $ this ->assertEquals (
169
+ CallbackMock::createBeforeSendCallback (),
170
+ $ beforeSendCallback
171
+ );
172
+ }
173
+
174
+ /**
175
+ * @dataProvider beforeSendDataProvider
176
+ */
177
+ public function testBeforeSendUsingScalarCallable ($ scalarCallable ): void
178
+ {
179
+ $ container = $ this ->getContainer ([
180
+ 'options ' => [
181
+ 'before_send ' => $ scalarCallable ,
182
+ ],
183
+ ]);
184
+
185
+ $ beforeSendCallback = $ this ->getOptionsFrom ($ container )->getBeforeSendCallback ();
186
+ $ this ->assertIsCallable ($ beforeSendCallback );
187
+ $ defaultOptions = $ this ->getOptionsFrom ($ this ->getContainer ());
188
+ $ this ->assertNotEquals (
189
+ $ defaultOptions ->getBeforeSendCallback (),
190
+ $ beforeSendCallback ,
191
+ 'before_send closure has not been replaced, is the default one '
192
+ );
193
+ $ this ->assertEquals (
194
+ $ scalarCallable ,
195
+ $ beforeSendCallback
196
+ );
197
+ }
198
+
199
+ public function beforeSendDataProvider (): array
200
+ {
201
+ return [
202
+ [[CallbackMock::class, 'beforeSend ' ]],
203
+ [CallbackMock::class . '::beforeSend ' ],
204
+ [__NAMESPACE__ . '\mockBeforeSend ' ],
205
+ ];
206
+ }
207
+
208
+ public function testBeforeSendWithInvalidServiceReference (): void
209
+ {
210
+ $ container = $ this ->getContainer ([
211
+ 'options ' => [
212
+ 'before_send ' => '@event_dispatcher ' ,
213
+ ],
214
+ ]);
215
+
216
+ $ this ->expectException (\TypeError::class);
217
+
218
+ $ this ->getOptionsFrom ($ container )->getBeforeSendCallback ();
219
+ }
220
+
149
221
private function getContainer (array $ configuration = []): Container
150
222
{
151
223
$ containerBuilder = new ContainerBuilder ();
@@ -168,6 +240,10 @@ private function getContainer(array $configuration = []): Container
168
240
$ containerBuilder ->setAlias (self ::REQUEST_LISTENER_TEST_PUBLIC_ALIAS , new Alias (RequestListener::class, true ));
169
241
$ containerBuilder ->setAlias (self ::CONSOLE_LISTENER_TEST_PUBLIC_ALIAS , new Alias (ConsoleListener::class, true ));
170
242
243
+ $ beforeSend = new Definition ('callable ' );
244
+ $ beforeSend ->setFactory ([CallbackMock::class, 'createBeforeSendCallback ' ]);
245
+ $ containerBuilder ->setDefinition ('before_send ' , $ beforeSend );
246
+
171
247
$ extension = new SentryExtension ();
172
248
$ extension ->load (['sentry ' => $ configuration ], $ containerBuilder );
173
249
@@ -186,3 +262,21 @@ private function getOptionsFrom(Container $container): Options
186
262
return $ options ;
187
263
}
188
264
}
265
+
266
+ function mockBeforeSend (Event $ event ): ?Event
267
+ {
268
+ return null ;
269
+ }
270
+
271
+ class CallbackMock
272
+ {
273
+ public static function beforeSend (Event $ event ): ?Event
274
+ {
275
+ return null ;
276
+ }
277
+
278
+ public static function createBeforeSendCallback (): callable
279
+ {
280
+ return [new self (), 'beforeSend ' ];
281
+ }
282
+ }
0 commit comments