1*dc4d9dc6SAnna Dabrowska<?php 2*dc4d9dc6SAnna Dabrowska 3*dc4d9dc6SAnna Dabrowskanamespace Psr\Log\Test; 4*dc4d9dc6SAnna Dabrowska 5*dc4d9dc6SAnna Dabrowskause Psr\Log\AbstractLogger; 6*dc4d9dc6SAnna Dabrowska 7*dc4d9dc6SAnna Dabrowska/** 8*dc4d9dc6SAnna Dabrowska * Used for testing purposes. 9*dc4d9dc6SAnna Dabrowska * 10*dc4d9dc6SAnna Dabrowska * It records all records and gives you access to them for verification. 11*dc4d9dc6SAnna Dabrowska * 12*dc4d9dc6SAnna Dabrowska * @method bool hasEmergency($record) 13*dc4d9dc6SAnna Dabrowska * @method bool hasAlert($record) 14*dc4d9dc6SAnna Dabrowska * @method bool hasCritical($record) 15*dc4d9dc6SAnna Dabrowska * @method bool hasError($record) 16*dc4d9dc6SAnna Dabrowska * @method bool hasWarning($record) 17*dc4d9dc6SAnna Dabrowska * @method bool hasNotice($record) 18*dc4d9dc6SAnna Dabrowska * @method bool hasInfo($record) 19*dc4d9dc6SAnna Dabrowska * @method bool hasDebug($record) 20*dc4d9dc6SAnna Dabrowska * 21*dc4d9dc6SAnna Dabrowska * @method bool hasEmergencyRecords() 22*dc4d9dc6SAnna Dabrowska * @method bool hasAlertRecords() 23*dc4d9dc6SAnna Dabrowska * @method bool hasCriticalRecords() 24*dc4d9dc6SAnna Dabrowska * @method bool hasErrorRecords() 25*dc4d9dc6SAnna Dabrowska * @method bool hasWarningRecords() 26*dc4d9dc6SAnna Dabrowska * @method bool hasNoticeRecords() 27*dc4d9dc6SAnna Dabrowska * @method bool hasInfoRecords() 28*dc4d9dc6SAnna Dabrowska * @method bool hasDebugRecords() 29*dc4d9dc6SAnna Dabrowska * 30*dc4d9dc6SAnna Dabrowska * @method bool hasEmergencyThatContains($message) 31*dc4d9dc6SAnna Dabrowska * @method bool hasAlertThatContains($message) 32*dc4d9dc6SAnna Dabrowska * @method bool hasCriticalThatContains($message) 33*dc4d9dc6SAnna Dabrowska * @method bool hasErrorThatContains($message) 34*dc4d9dc6SAnna Dabrowska * @method bool hasWarningThatContains($message) 35*dc4d9dc6SAnna Dabrowska * @method bool hasNoticeThatContains($message) 36*dc4d9dc6SAnna Dabrowska * @method bool hasInfoThatContains($message) 37*dc4d9dc6SAnna Dabrowska * @method bool hasDebugThatContains($message) 38*dc4d9dc6SAnna Dabrowska * 39*dc4d9dc6SAnna Dabrowska * @method bool hasEmergencyThatMatches($message) 40*dc4d9dc6SAnna Dabrowska * @method bool hasAlertThatMatches($message) 41*dc4d9dc6SAnna Dabrowska * @method bool hasCriticalThatMatches($message) 42*dc4d9dc6SAnna Dabrowska * @method bool hasErrorThatMatches($message) 43*dc4d9dc6SAnna Dabrowska * @method bool hasWarningThatMatches($message) 44*dc4d9dc6SAnna Dabrowska * @method bool hasNoticeThatMatches($message) 45*dc4d9dc6SAnna Dabrowska * @method bool hasInfoThatMatches($message) 46*dc4d9dc6SAnna Dabrowska * @method bool hasDebugThatMatches($message) 47*dc4d9dc6SAnna Dabrowska * 48*dc4d9dc6SAnna Dabrowska * @method bool hasEmergencyThatPasses($message) 49*dc4d9dc6SAnna Dabrowska * @method bool hasAlertThatPasses($message) 50*dc4d9dc6SAnna Dabrowska * @method bool hasCriticalThatPasses($message) 51*dc4d9dc6SAnna Dabrowska * @method bool hasErrorThatPasses($message) 52*dc4d9dc6SAnna Dabrowska * @method bool hasWarningThatPasses($message) 53*dc4d9dc6SAnna Dabrowska * @method bool hasNoticeThatPasses($message) 54*dc4d9dc6SAnna Dabrowska * @method bool hasInfoThatPasses($message) 55*dc4d9dc6SAnna Dabrowska * @method bool hasDebugThatPasses($message) 56*dc4d9dc6SAnna Dabrowska */ 57*dc4d9dc6SAnna Dabrowskaclass TestLogger extends AbstractLogger 58*dc4d9dc6SAnna Dabrowska{ 59*dc4d9dc6SAnna Dabrowska /** 60*dc4d9dc6SAnna Dabrowska * @var array 61*dc4d9dc6SAnna Dabrowska */ 62*dc4d9dc6SAnna Dabrowska public $records = []; 63*dc4d9dc6SAnna Dabrowska 64*dc4d9dc6SAnna Dabrowska public $recordsByLevel = []; 65*dc4d9dc6SAnna Dabrowska 66*dc4d9dc6SAnna Dabrowska /** 67*dc4d9dc6SAnna Dabrowska * @inheritdoc 68*dc4d9dc6SAnna Dabrowska */ 69*dc4d9dc6SAnna Dabrowska public function log($level, $message, array $context = []) 70*dc4d9dc6SAnna Dabrowska { 71*dc4d9dc6SAnna Dabrowska $record = [ 72*dc4d9dc6SAnna Dabrowska 'level' => $level, 73*dc4d9dc6SAnna Dabrowska 'message' => $message, 74*dc4d9dc6SAnna Dabrowska 'context' => $context, 75*dc4d9dc6SAnna Dabrowska ]; 76*dc4d9dc6SAnna Dabrowska 77*dc4d9dc6SAnna Dabrowska $this->recordsByLevel[$record['level']][] = $record; 78*dc4d9dc6SAnna Dabrowska $this->records[] = $record; 79*dc4d9dc6SAnna Dabrowska } 80*dc4d9dc6SAnna Dabrowska 81*dc4d9dc6SAnna Dabrowska public function hasRecords($level) 82*dc4d9dc6SAnna Dabrowska { 83*dc4d9dc6SAnna Dabrowska return isset($this->recordsByLevel[$level]); 84*dc4d9dc6SAnna Dabrowska } 85*dc4d9dc6SAnna Dabrowska 86*dc4d9dc6SAnna Dabrowska public function hasRecord($record, $level) 87*dc4d9dc6SAnna Dabrowska { 88*dc4d9dc6SAnna Dabrowska if (is_string($record)) { 89*dc4d9dc6SAnna Dabrowska $record = ['message' => $record]; 90*dc4d9dc6SAnna Dabrowska } 91*dc4d9dc6SAnna Dabrowska return $this->hasRecordThatPasses(function ($rec) use ($record) { 92*dc4d9dc6SAnna Dabrowska if ($rec['message'] !== $record['message']) { 93*dc4d9dc6SAnna Dabrowska return false; 94*dc4d9dc6SAnna Dabrowska } 95*dc4d9dc6SAnna Dabrowska if (isset($record['context']) && $rec['context'] !== $record['context']) { 96*dc4d9dc6SAnna Dabrowska return false; 97*dc4d9dc6SAnna Dabrowska } 98*dc4d9dc6SAnna Dabrowska return true; 99*dc4d9dc6SAnna Dabrowska }, $level); 100*dc4d9dc6SAnna Dabrowska } 101*dc4d9dc6SAnna Dabrowska 102*dc4d9dc6SAnna Dabrowska public function hasRecordThatContains($message, $level) 103*dc4d9dc6SAnna Dabrowska { 104*dc4d9dc6SAnna Dabrowska return $this->hasRecordThatPasses(function ($rec) use ($message) { 105*dc4d9dc6SAnna Dabrowska return strpos($rec['message'], $message) !== false; 106*dc4d9dc6SAnna Dabrowska }, $level); 107*dc4d9dc6SAnna Dabrowska } 108*dc4d9dc6SAnna Dabrowska 109*dc4d9dc6SAnna Dabrowska public function hasRecordThatMatches($regex, $level) 110*dc4d9dc6SAnna Dabrowska { 111*dc4d9dc6SAnna Dabrowska return $this->hasRecordThatPasses(function ($rec) use ($regex) { 112*dc4d9dc6SAnna Dabrowska return preg_match($regex, $rec['message']) > 0; 113*dc4d9dc6SAnna Dabrowska }, $level); 114*dc4d9dc6SAnna Dabrowska } 115*dc4d9dc6SAnna Dabrowska 116*dc4d9dc6SAnna Dabrowska public function hasRecordThatPasses(callable $predicate, $level) 117*dc4d9dc6SAnna Dabrowska { 118*dc4d9dc6SAnna Dabrowska if (!isset($this->recordsByLevel[$level])) { 119*dc4d9dc6SAnna Dabrowska return false; 120*dc4d9dc6SAnna Dabrowska } 121*dc4d9dc6SAnna Dabrowska foreach ($this->recordsByLevel[$level] as $i => $rec) { 122*dc4d9dc6SAnna Dabrowska if (call_user_func($predicate, $rec, $i)) { 123*dc4d9dc6SAnna Dabrowska return true; 124*dc4d9dc6SAnna Dabrowska } 125*dc4d9dc6SAnna Dabrowska } 126*dc4d9dc6SAnna Dabrowska return false; 127*dc4d9dc6SAnna Dabrowska } 128*dc4d9dc6SAnna Dabrowska 129*dc4d9dc6SAnna Dabrowska public function __call($method, $args) 130*dc4d9dc6SAnna Dabrowska { 131*dc4d9dc6SAnna Dabrowska if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { 132*dc4d9dc6SAnna Dabrowska $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; 133*dc4d9dc6SAnna Dabrowska $level = strtolower($matches[2]); 134*dc4d9dc6SAnna Dabrowska if (method_exists($this, $genericMethod)) { 135*dc4d9dc6SAnna Dabrowska $args[] = $level; 136*dc4d9dc6SAnna Dabrowska return call_user_func_array([$this, $genericMethod], $args); 137*dc4d9dc6SAnna Dabrowska } 138*dc4d9dc6SAnna Dabrowska } 139*dc4d9dc6SAnna Dabrowska throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); 140*dc4d9dc6SAnna Dabrowska } 141*dc4d9dc6SAnna Dabrowska 142*dc4d9dc6SAnna Dabrowska public function reset() 143*dc4d9dc6SAnna Dabrowska { 144*dc4d9dc6SAnna Dabrowska $this->records = []; 145*dc4d9dc6SAnna Dabrowska $this->recordsByLevel = []; 146*dc4d9dc6SAnna Dabrowska } 147*dc4d9dc6SAnna Dabrowska} 148