MongoDBFormatterTest.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. namespace Monolog\Formatter;
  3. use Monolog\Logger;
  4. /**
  5. * @author Florian Plattner <me@florianplattner.de>
  6. */
  7. class MongoDBFormatterTest extends \PHPUnit_Framework_TestCase
  8. {
  9. public function setUp()
  10. {
  11. if (!class_exists('MongoDate')) {
  12. $this->markTestSkipped('mongo extension not installed');
  13. }
  14. }
  15. public function constructArgumentProvider()
  16. {
  17. return array(
  18. array(1, true, 1, true),
  19. array(0, false, 0, false),
  20. );
  21. }
  22. /**
  23. * @param $traceDepth
  24. * @param $traceAsString
  25. * @param $expectedTraceDepth
  26. * @param $expectedTraceAsString
  27. *
  28. * @dataProvider constructArgumentProvider
  29. */
  30. public function testConstruct($traceDepth, $traceAsString, $expectedTraceDepth, $expectedTraceAsString)
  31. {
  32. $formatter = new MongoDBFormatter($traceDepth, $traceAsString);
  33. $reflTrace = new \ReflectionProperty($formatter, 'exceptionTraceAsString');
  34. $reflTrace->setAccessible(true);
  35. $this->assertEquals($expectedTraceAsString, $reflTrace->getValue($formatter));
  36. $reflDepth = new\ReflectionProperty($formatter, 'maxNestingLevel');
  37. $reflDepth->setAccessible(true);
  38. $this->assertEquals($expectedTraceDepth, $reflDepth->getValue($formatter));
  39. }
  40. public function testSimpleFormat()
  41. {
  42. $record = array(
  43. 'message' => 'some log message',
  44. 'context' => array(),
  45. 'level' => Logger::WARNING,
  46. 'level_name' => Logger::getLevelName(Logger::WARNING),
  47. 'channel' => 'test',
  48. 'datetime' => new \DateTime('2014-02-01 00:00:00'),
  49. 'extra' => array(),
  50. );
  51. $formatter = new MongoDBFormatter();
  52. $formattedRecord = $formatter->format($record);
  53. $this->assertCount(7, $formattedRecord);
  54. $this->assertEquals('some log message', $formattedRecord['message']);
  55. $this->assertEquals(array(), $formattedRecord['context']);
  56. $this->assertEquals(Logger::WARNING, $formattedRecord['level']);
  57. $this->assertEquals(Logger::getLevelName(Logger::WARNING), $formattedRecord['level_name']);
  58. $this->assertEquals('test', $formattedRecord['channel']);
  59. $this->assertInstanceOf('\MongoDate', $formattedRecord['datetime']);
  60. $this->assertEquals('0.00000000 1391212800', $formattedRecord['datetime']->__toString());
  61. $this->assertEquals(array(), $formattedRecord['extra']);
  62. }
  63. public function testRecursiveFormat()
  64. {
  65. $someObject = new \stdClass();
  66. $someObject->foo = 'something';
  67. $someObject->bar = 'stuff';
  68. $record = array(
  69. 'message' => 'some log message',
  70. 'context' => array(
  71. 'stuff' => new \DateTime('2014-02-01 02:31:33'),
  72. 'some_object' => $someObject,
  73. 'context_string' => 'some string',
  74. 'context_int' => 123456,
  75. 'except' => new \Exception('exception message', 987),
  76. ),
  77. 'level' => Logger::WARNING,
  78. 'level_name' => Logger::getLevelName(Logger::WARNING),
  79. 'channel' => 'test',
  80. 'datetime' => new \DateTime('2014-02-01 00:00:00'),
  81. 'extra' => array(),
  82. );
  83. $formatter = new MongoDBFormatter();
  84. $formattedRecord = $formatter->format($record);
  85. $this->assertCount(5, $formattedRecord['context']);
  86. $this->assertInstanceOf('\MongoDate', $formattedRecord['context']['stuff']);
  87. $this->assertEquals('0.00000000 1391221893', $formattedRecord['context']['stuff']->__toString());
  88. $this->assertEquals(
  89. array(
  90. 'foo' => 'something',
  91. 'bar' => 'stuff',
  92. 'class' => 'stdClass',
  93. ),
  94. $formattedRecord['context']['some_object']
  95. );
  96. $this->assertEquals('some string', $formattedRecord['context']['context_string']);
  97. $this->assertEquals(123456, $formattedRecord['context']['context_int']);
  98. $this->assertCount(5, $formattedRecord['context']['except']);
  99. $this->assertEquals('exception message', $formattedRecord['context']['except']['message']);
  100. $this->assertEquals(987, $formattedRecord['context']['except']['code']);
  101. $this->assertInternalType('string', $formattedRecord['context']['except']['file']);
  102. $this->assertInternalType('integer', $formattedRecord['context']['except']['code']);
  103. $this->assertInternalType('string', $formattedRecord['context']['except']['trace']);
  104. $this->assertEquals('Exception', $formattedRecord['context']['except']['class']);
  105. }
  106. public function testFormatDepthArray()
  107. {
  108. $record = array(
  109. 'message' => 'some log message',
  110. 'context' => array(
  111. 'nest2' => array(
  112. 'property' => 'anything',
  113. 'nest3' => array(
  114. 'nest4' => 'value',
  115. 'property' => 'nothing'
  116. )
  117. )
  118. ),
  119. 'level' => Logger::WARNING,
  120. 'level_name' => Logger::getLevelName(Logger::WARNING),
  121. 'channel' => 'test',
  122. 'datetime' => new \DateTime('2014-02-01 00:00:00'),
  123. 'extra' => array(),
  124. );
  125. $formatter = new MongoDBFormatter(2);
  126. $formattedResult = $formatter->format($record);
  127. $this->assertEquals(
  128. array(
  129. 'nest2' => array(
  130. 'property' => 'anything',
  131. 'nest3' => '[...]',
  132. )
  133. ),
  134. $formattedResult['context']
  135. );
  136. }
  137. public function testFormatDepthArrayInfiniteNesting()
  138. {
  139. $record = array(
  140. 'message' => 'some log message',
  141. 'context' => array(
  142. 'nest2' => array(
  143. 'property' => 'something',
  144. 'nest3' => array(
  145. 'property' => 'anything',
  146. 'nest4' => array(
  147. 'property' => 'nothing',
  148. ),
  149. )
  150. )
  151. ),
  152. 'level' => Logger::WARNING,
  153. 'level_name' => Logger::getLevelName(Logger::WARNING),
  154. 'channel' => 'test',
  155. 'datetime' => new \DateTime('2014-02-01 00:00:00'),
  156. 'extra' => array(),
  157. );
  158. $formatter = new MongoDBFormatter(0);
  159. $formattedResult = $formatter->format($record);
  160. $this->assertEquals(
  161. array(
  162. 'nest2' => array(
  163. 'property' => 'something',
  164. 'nest3' => array(
  165. 'property' => 'anything',
  166. 'nest4' => array(
  167. 'property' => 'nothing',
  168. )
  169. ),
  170. )
  171. ),
  172. $formattedResult['context']
  173. );
  174. }
  175. public function testFormatDepthObjects()
  176. {
  177. $someObject = new \stdClass();
  178. $someObject->property = 'anything';
  179. $someObject->nest3 = new \stdClass();
  180. $someObject->nest3->property = 'nothing';
  181. $someObject->nest3->nest4 = 'invisible';
  182. $record = array(
  183. 'message' => 'some log message',
  184. 'context' => array(
  185. 'nest2' => $someObject
  186. ),
  187. 'level' => Logger::WARNING,
  188. 'level_name' => Logger::getLevelName(Logger::WARNING),
  189. 'channel' => 'test',
  190. 'datetime' => new \DateTime('2014-02-01 00:00:00'),
  191. 'extra' => array(),
  192. );
  193. $formatter = new MongoDBFormatter(2, true);
  194. $formattedResult = $formatter->format($record);
  195. $this->assertEquals(
  196. array(
  197. 'nest2' => array(
  198. 'property' => 'anything',
  199. 'nest3' => '[...]',
  200. 'class' => 'stdClass',
  201. ),
  202. ),
  203. $formattedResult['context']
  204. );
  205. }
  206. public function testFormatDepthException()
  207. {
  208. $record = array(
  209. 'message' => 'some log message',
  210. 'context' => array(
  211. 'nest2' => new \Exception('exception message', 987),
  212. ),
  213. 'level' => Logger::WARNING,
  214. 'level_name' => Logger::getLevelName(Logger::WARNING),
  215. 'channel' => 'test',
  216. 'datetime' => new \DateTime('2014-02-01 00:00:00'),
  217. 'extra' => array(),
  218. );
  219. $formatter = new MongoDBFormatter(2, false);
  220. $formattedRecord = $formatter->format($record);
  221. $this->assertEquals('exception message', $formattedRecord['context']['nest2']['message']);
  222. $this->assertEquals(987, $formattedRecord['context']['nest2']['code']);
  223. $this->assertEquals('[...]', $formattedRecord['context']['nest2']['trace']);
  224. }
  225. }