Procházet zdrojové kódy

made raven user context less destructive

Stepan Mazurov před 10 roky
rodič
revize
09be78d62a

+ 7 - 4
src/Monolog/Handler/RavenHandler.php

@@ -127,8 +127,7 @@ class RavenHandler extends AbstractProcessingHandler
      */
     protected function write(array $record)
     {
-        // ensures user context is empty
-        $this->ravenClient->user_context(null);
+        $previousUserContext = false;
         $options = array();
         $options['level'] = $this->logLevels[$record['level']];
         $options['tags'] = array();
@@ -149,6 +148,7 @@ class RavenHandler extends AbstractProcessingHandler
         if (!empty($record['context'])) {
             $options['extra']['context'] = $record['context'];
             if (!empty($record['context']['user'])) {
+                $previousUserContext = $this->ravenClient->context->user;
                 $this->ravenClient->user_context($record['context']['user']);
                 unset($options['extra']['context']['user']);
             }
@@ -160,11 +160,14 @@ class RavenHandler extends AbstractProcessingHandler
         if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) {
             $options['extra']['message'] = $record['formatted'];
             $this->ravenClient->captureException($record['context']['exception'], $options);
+        } else {
+            $this->ravenClient->captureMessage($record['formatted'], array(), $options);
+        }
 
-            return;
+        if ($previousUserContext !== false) {
+            $this->ravenClient->user_context($previousUserContext);
         }
 
-        $this->ravenClient->captureMessage($record['formatted'], array(), $options);
     }
 
     /**

+ 1 - 0
tests/Monolog/Handler/MockRavenClient.php

@@ -17,6 +17,7 @@ class MockRavenClient extends Raven_Client
 {
     public function capture($data, $stack, $vars = null)
     {
+        $data = array_merge($this->get_user_data(), $data);
         $this->lastData = $data;
         $this->lastStack = $stack;
     }

+ 25 - 10
tests/Monolog/Handler/RavenHandlerTest.php

@@ -19,8 +19,8 @@ class RavenHandlerTest extends TestCase
 {
     public function setUp()
     {
-        if (!class_exists("Raven_Client")) {
-            $this->markTestSkipped("raven/raven not installed");
+        if (!class_exists('Raven_Client')) {
+            $this->markTestSkipped('raven/raven not installed');
         }
 
         require_once __DIR__ . '/MockRavenClient.php';
@@ -54,7 +54,7 @@ class RavenHandlerTest extends TestCase
         $ravenClient = $this->getRavenClient();
         $handler = $this->getHandler($ravenClient);
 
-        $record = $this->getRecord(Logger::DEBUG, "A test debug message");
+        $record = $this->getRecord(Logger::DEBUG, 'A test debug message');
         $handler->handle($record);
 
         $this->assertEquals($ravenClient::DEBUG, $ravenClient->lastData['level']);
@@ -66,7 +66,7 @@ class RavenHandlerTest extends TestCase
         $ravenClient = $this->getRavenClient();
         $handler = $this->getHandler($ravenClient);
 
-        $record = $this->getRecord(Logger::WARNING, "A test warning message");
+        $record = $this->getRecord(Logger::WARNING, 'A test warning message');
         $handler->handle($record);
 
         $this->assertEquals($ravenClient::WARNING, $ravenClient->lastData['level']);
@@ -79,7 +79,7 @@ class RavenHandlerTest extends TestCase
         $handler = $this->getHandler($ravenClient);
 
         $tags = array(1, 2, 'foo');
-        $record = $this->getRecord(Logger::INFO, "test", array('tags' => $tags));
+        $record = $this->getRecord(Logger::INFO, 'test', array('tags' => $tags));
         $handler->handle($record);
 
         $this->assertEquals($tags, $ravenClient->lastData['tags']);
@@ -90,18 +90,33 @@ class RavenHandlerTest extends TestCase
         $ravenClient = $this->getRavenClient();
         $handler = $this->getHandler($ravenClient);
 
+        $recordWithNoContext = $this->getRecord(Logger::INFO, 'test with default user context');
+        // set user context 'externally'
+
         $user = array(
             'id' => '123',
             'email' => 'test@test.com'
         );
-        $record = $this->getRecord(Logger::INFO, "test", array('user' => $user));
 
-        $handler->handle($record);
-        $this->assertEquals($user, $ravenClient->context->user);
+        $recordWithContext = $this->getRecord(Logger::INFO, 'test', array('user' => $user));
+
+        $ravenClient->user_context(array('id' => 'test_user_id'));
+        // handle context
+        $handler->handle($recordWithContext);
+        $this->assertEquals($user, $ravenClient->lastData['sentry.interfaces.User']);
+
+        // check to see if its reset
+        $handler->handle($recordWithNoContext);
+        $this->assertInternalType('array', $ravenClient->context->user);
+        $this->assertSame('test_user_id', $ravenClient->context->user['id']);
 
-        $secondRecord = $this->getRecord(Logger::INFO, "test without user");
+        // handle with null context
+        $ravenClient->user_context(null);
+        $handler->handle($recordWithContext);
+        $this->assertEquals($user, $ravenClient->lastData['sentry.interfaces.User']);
 
-        $handler->handle($secondRecord);
+        // check to see if its reset
+        $handler->handle($recordWithNoContext);
         $this->assertNull($ravenClient->context->user);
     }