MongoDBFormatterTest.php 8.9 KB

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