@@ -85,4 +85,96 @@ public static function handleDataProvider(): iterable
8585 $ defaultBreadcrumb ->withMetadata ('extra ' , ['foo ' => 'bar ' ]),
8686 ];
8787 }
88+
89+ /**
90+ * @dataProvider timestampDataProvider
91+ *
92+ * @param LogRecord|array<string, mixed> $record
93+ */
94+ public function testTimestamp ($ record , Breadcrumb $ expectedBreadcrumb ): void
95+ {
96+ $ hub = $ this ->createMock (HubInterface::class);
97+ $ hub ->expects ($ this ->once ())
98+ ->method ('addBreadcrumb ' )
99+ ->with ($ this ->callback (function (Breadcrumb $ breadcrumb ) use ($ expectedBreadcrumb ): bool {
100+ $ this ->assertEquals ($ expectedBreadcrumb ->getTimestamp (), $ breadcrumb ->getTimestamp ());
101+
102+ return true ;
103+ }));
104+
105+ $ handler = new BreadcrumbHandler ($ hub );
106+ $ handler ->handle ($ record );
107+ }
108+
109+ /**
110+ * @return iterable<string, array{LogRecord|array<string, mixed>, Breadcrumb}>
111+ */
112+ public function timestampDataProvider (): iterable
113+ {
114+ if (Logger::API >= 3 ) {
115+ return $ this ->newTimestampProvider ();
116+ }
117+
118+ return $ this ->oldTimestampProvider ();
119+ }
120+
121+ /**
122+ * @return iterable<string, array{array<string, mixed>, Breadcrumb}>
123+ */
124+ private function oldTimestampProvider (): iterable
125+ {
126+ yield 'with timestamp, API < 3 ' => [
127+ ['datetime ' => new \DateTimeImmutable ('1970-01-01 00:00:42.1337 ' ), 'message ' => 'foo bar ' , 'context ' => [], 'level ' => Logger::DEBUG , 'level_name ' => 'DEBUG ' , 'channel ' => 'channel.foo ' , 'extra ' => []],
128+ new Breadcrumb (
129+ Breadcrumb::LEVEL_DEBUG ,
130+ Breadcrumb::TYPE_DEFAULT ,
131+ 'channel.foo ' ,
132+ 'foo bar ' ,
133+ [],
134+ 42.1337
135+ ),
136+ ];
137+
138+ yield 'with negative timestamp, API < 3 ' => [
139+ ['datetime ' => new \DateTimeImmutable ('1969-12-31 23:59:56.859 ' ), 'message ' => 'foo bar ' , 'context ' => [], 'level ' => Logger::DEBUG , 'level_name ' => 'DEBUG ' , 'channel ' => 'channel.foo ' , 'extra ' => []],
140+ new Breadcrumb (
141+ Breadcrumb::LEVEL_DEBUG ,
142+ Breadcrumb::TYPE_DEFAULT ,
143+ 'channel.foo ' ,
144+ 'foo bar ' ,
145+ [],
146+ -3.141
147+ ),
148+ ];
149+ }
150+
151+ /**
152+ * @return iterable<string, array{LogRecord, Breadcrumb}>
153+ */
154+ private function newTimestampProvider (): iterable
155+ {
156+ yield 'with timestamp, API >= 3 ' => [
157+ new LogRecord (new \DateTimeImmutable ('1970-01-01 00:00:42.1337 ' ), 'channel.foo ' , \Monolog \Level::Debug, 'foo bar ' ),
158+ new Breadcrumb (
159+ Breadcrumb::LEVEL_DEBUG ,
160+ Breadcrumb::TYPE_DEFAULT ,
161+ 'channel.foo ' ,
162+ 'foo bar ' ,
163+ [],
164+ 42.1337
165+ ),
166+ ];
167+
168+ yield 'with negative timestamp, API >= 3 ' => [
169+ new LogRecord (new \DateTimeImmutable ('1969-12-31 23:59:56.859 ' ), 'channel.foo ' , \Monolog \Level::Debug, 'foo bar ' ),
170+ new Breadcrumb (
171+ Breadcrumb::LEVEL_DEBUG ,
172+ Breadcrumb::TYPE_DEFAULT ,
173+ 'channel.foo ' ,
174+ 'foo bar ' ,
175+ [],
176+ -3.141
177+ ),
178+ ];
179+ }
88180}
0 commit comments