scratch – Blame information for rev 122
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
120 | office | 1 | <?php |
2 | |||
3 | namespace Psr\Log\Test; |
||
4 | |||
5 | use Psr\Log\LoggerInterface; |
||
6 | use Psr\Log\LogLevel; |
||
7 | |||
8 | /** |
||
9 | * Provides a base test class for ensuring compliance with the LoggerInterface. |
||
10 | * |
||
11 | * Implementors can extend the class and implement abstract methods to run this |
||
12 | * as part of their test suite. |
||
13 | */ |
||
14 | abstract class LoggerInterfaceTest extends \PHPUnit_Framework_TestCase |
||
15 | { |
||
16 | /** |
||
17 | * @return LoggerInterface |
||
18 | */ |
||
19 | abstract public function getLogger(); |
||
20 | |||
21 | /** |
||
22 | * This must return the log messages in order. |
||
23 | * |
||
24 | * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>". |
||
25 | * |
||
26 | * Example ->error('Foo') would yield "error Foo". |
||
27 | * |
||
28 | * @return string[] |
||
29 | */ |
||
30 | abstract public function getLogs(); |
||
31 | |||
32 | public function testImplements() |
||
33 | { |
||
34 | $this->assertInstanceOf('Psr\Log\LoggerInterface', $this->getLogger()); |
||
35 | } |
||
36 | |||
37 | /** |
||
38 | * @dataProvider provideLevelsAndMessages |
||
39 | */ |
||
40 | public function testLogsAtAllLevels($level, $message) |
||
41 | { |
||
42 | $logger = $this->getLogger(); |
||
43 | $logger->{$level}($message, array('user' => 'Bob')); |
||
44 | $logger->log($level, $message, array('user' => 'Bob')); |
||
45 | |||
46 | $expected = array( |
||
47 | $level.' message of level '.$level.' with context: Bob', |
||
48 | $level.' message of level '.$level.' with context: Bob', |
||
49 | ); |
||
50 | $this->assertEquals($expected, $this->getLogs()); |
||
51 | } |
||
52 | |||
53 | public function provideLevelsAndMessages() |
||
54 | { |
||
55 | return array( |
||
56 | LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), |
||
57 | LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), |
||
58 | LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), |
||
59 | LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), |
||
60 | LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), |
||
61 | LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), |
||
62 | LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), |
||
63 | LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'), |
||
64 | ); |
||
65 | } |
||
66 | |||
67 | /** |
||
68 | * @expectedException \Psr\Log\InvalidArgumentException |
||
69 | */ |
||
70 | public function testThrowsOnInvalidLevel() |
||
71 | { |
||
72 | $logger = $this->getLogger(); |
||
73 | $logger->log('invalid level', 'Foo'); |
||
74 | } |
||
75 | |||
76 | public function testContextReplacement() |
||
77 | { |
||
78 | $logger = $this->getLogger(); |
||
79 | $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); |
||
80 | |||
81 | $expected = array('info {Message {nothing} Bob Bar a}'); |
||
82 | $this->assertEquals($expected, $this->getLogs()); |
||
83 | } |
||
84 | |||
85 | public function testObjectCastToString() |
||
86 | { |
||
87 | if (method_exists($this, 'createPartialMock')) { |
||
88 | $dummy = $this->createPartialMock('Psr\Log\Test\DummyTest', array('__toString')); |
||
89 | } else { |
||
90 | $dummy = $this->getMock('Psr\Log\Test\DummyTest', array('__toString')); |
||
91 | } |
||
92 | $dummy->expects($this->once()) |
||
93 | ->method('__toString') |
||
94 | ->will($this->returnValue('DUMMY')); |
||
95 | |||
96 | $this->getLogger()->warning($dummy); |
||
97 | |||
98 | $expected = array('warning DUMMY'); |
||
99 | $this->assertEquals($expected, $this->getLogs()); |
||
100 | } |
||
101 | |||
102 | public function testContextCanContainAnything() |
||
103 | { |
||
104 | $context = array( |
||
105 | 'bool' => true, |
||
106 | 'null' => null, |
||
107 | 'string' => 'Foo', |
||
108 | 'int' => 0, |
||
109 | 'float' => 0.5, |
||
110 | 'nested' => array('with object' => new DummyTest), |
||
111 | 'object' => new \DateTime, |
||
112 | 'resource' => fopen('php://memory', 'r'), |
||
113 | ); |
||
114 | |||
115 | $this->getLogger()->warning('Crazy context data', $context); |
||
116 | |||
117 | $expected = array('warning Crazy context data'); |
||
118 | $this->assertEquals($expected, $this->getLogs()); |
||
119 | } |
||
120 | |||
121 | public function testContextExceptionKeyCanBeExceptionOrOtherValues() |
||
122 | { |
||
123 | $logger = $this->getLogger(); |
||
124 | $logger->warning('Random message', array('exception' => 'oops')); |
||
125 | $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); |
||
126 | |||
127 | $expected = array( |
||
128 | 'warning Random message', |
||
129 | 'critical Uncaught Exception!' |
||
130 | ); |
||
131 | $this->assertEquals($expected, $this->getLogs()); |
||
132 | } |
||
133 | } |
||
134 | |||
135 | class DummyTest |
||
136 | { |
||
137 | public function __toString() |
||
138 | { |
||
139 | } |
||
140 | } |