Skip to content

Commit c530ae6

Browse files
committed
Fix fake method and add fake tests
1 parent 54827dd commit c530ae6

File tree

2 files changed

+311
-1
lines changed

2 files changed

+311
-1
lines changed

src/MetricFake.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public function recorded(Closure|string|null $callback = null): Collection
114114
{
115115
$callback = $callback ?: fn () => true;
116116

117-
return Collection::make($this->recorded)->when($callback)->filter(
117+
return Collection::make($this->recorded)->filter(
118118
fn (Measurable $metric) => is_string($callback)
119119
? $metric->name() === $callback
120120
: $callback($metric)

tests/MetricFakeTest.php

Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
<?php
2+
3+
use DirectoryTree\Metrics\Facades\Metrics;
4+
use DirectoryTree\Metrics\MetricData;
5+
use DirectoryTree\Metrics\MetricFake;
6+
use DirectoryTree\Metrics\Tests\User;
7+
use Illuminate\Support\Collection;
8+
use PHPUnit\Framework\AssertionFailedError;
9+
10+
it('can be instantiated', function () {
11+
$fake = new MetricFake;
12+
13+
expect($fake)->toBeInstanceOf(MetricFake::class);
14+
});
15+
16+
it('records metrics', function () {
17+
$fake = new MetricFake;
18+
19+
$fake->record(new MetricData('page_views'));
20+
21+
expect($fake->recorded()->count())->toBe(1);
22+
});
23+
24+
it('records multiple metrics', function () {
25+
$fake = new MetricFake;
26+
27+
$fake->record(new MetricData('page_views'));
28+
$fake->record(new MetricData('api_calls'));
29+
$fake->record(new MetricData('errors'));
30+
31+
expect($fake->recorded()->count())->toBe(3);
32+
});
33+
34+
it('can assert metric was recorded by name', function () {
35+
$fake = new MetricFake;
36+
37+
$fake->record(new MetricData('page_views'));
38+
39+
$fake->assertRecorded('page_views');
40+
});
41+
42+
it('can assert metric was recorded with closure', function () {
43+
$fake = new MetricFake;
44+
45+
$fake->record(new MetricData('page_views', 'marketing'));
46+
47+
$fake->assertRecorded(fn ($metric) => $metric->name() === 'page_views' && $metric->category() === 'marketing');
48+
});
49+
50+
it('can assert metric was not recorded', function () {
51+
$fake = new MetricFake;
52+
53+
$fake->record(new MetricData('page_views'));
54+
55+
$fake->assertNotRecorded('api_calls');
56+
});
57+
58+
it('can assert metric was not recorded with closure', function () {
59+
$fake = new MetricFake;
60+
61+
$fake->record(new MetricData('page_views', 'marketing'));
62+
63+
$fake->assertNotRecorded(fn ($metric) => $metric->category() === 'analytics');
64+
});
65+
66+
it('can assert nothing was recorded', function () {
67+
$fake = new MetricFake;
68+
69+
$fake->assertNothingRecorded();
70+
});
71+
72+
it('can assert metric was recorded specific times', function () {
73+
$fake = new MetricFake;
74+
75+
$fake->record(new MetricData('page_views'));
76+
$fake->record(new MetricData('page_views'));
77+
$fake->record(new MetricData('page_views'));
78+
79+
$fake->assertRecordedTimes('page_views', 3);
80+
});
81+
82+
it('can assert metric was recorded specific times with closure', function () {
83+
$fake = new MetricFake;
84+
85+
$fake->record(new MetricData('page_views', 'marketing'));
86+
$fake->record(new MetricData('page_views', 'marketing'));
87+
$fake->record(new MetricData('page_views', 'analytics'));
88+
89+
$fake->assertRecordedTimes(fn ($metric) => $metric->category() === 'marketing', 2);
90+
});
91+
92+
it('can get recorded metrics by name', function () {
93+
$fake = new MetricFake;
94+
95+
$fake->record(new MetricData('page_views'));
96+
$fake->record(new MetricData('api_calls'));
97+
98+
$recorded = $fake->recorded('page_views');
99+
100+
expect($recorded->count())->toBe(1)
101+
->and($recorded->first()->name())->toBe('page_views');
102+
});
103+
104+
it('can get recorded metrics with closure', function () {
105+
$fake = new MetricFake;
106+
107+
$fake->record(new MetricData('page_views', 'marketing'));
108+
$fake->record(new MetricData('page_views', 'analytics'));
109+
110+
$recorded = $fake->recorded(fn ($metric) => $metric->category() === 'marketing');
111+
112+
expect($recorded->count())->toBe(1)
113+
->and($recorded->first()->category())->toBe('marketing');
114+
});
115+
116+
it('can get all recorded metrics', function () {
117+
$fake = new MetricFake;
118+
119+
$fake->record(new MetricData('page_views'));
120+
$fake->record(new MetricData('api_calls'));
121+
122+
$recorded = $fake->recorded();
123+
124+
expect($recorded->count())->toBe(2);
125+
});
126+
127+
it('commit clears recorded metrics', function () {
128+
$fake = new MetricFake;
129+
130+
$fake->record(new MetricData('page_views'));
131+
$fake->record(new MetricData('api_calls'));
132+
133+
expect($fake->recorded()->count())->toBe(2);
134+
135+
$fake->commit();
136+
137+
expect($fake->recorded()->count())->toBe(0);
138+
});
139+
140+
it('can start capturing', function () {
141+
$fake = new MetricFake;
142+
143+
expect($fake->isCapturing())->toBeFalse();
144+
145+
$fake->capture();
146+
147+
expect($fake->isCapturing())->toBeTrue();
148+
});
149+
150+
it('can stop capturing', function () {
151+
$fake = new MetricFake;
152+
153+
$fake->capture();
154+
expect($fake->isCapturing())->toBeTrue();
155+
156+
$fake->stopCapturing();
157+
158+
expect($fake->isCapturing())->toBeFalse();
159+
});
160+
161+
it('records metrics regardless of capturing state', function () {
162+
$fake = new MetricFake;
163+
164+
$fake->capture();
165+
$fake->record(new MetricData('page_views'));
166+
167+
expect($fake->recorded()->count())->toBe(1);
168+
});
169+
170+
it('can be used with facade', function () {
171+
Metrics::fake();
172+
173+
Metrics::record(new MetricData('page_views'));
174+
175+
Metrics::assertRecorded('page_views');
176+
});
177+
178+
it('facade fake returns MetricFake instance', function () {
179+
$fake = Metrics::fake();
180+
181+
expect($fake)->toBeInstanceOf(MetricFake::class);
182+
});
183+
184+
it('can assert metrics with different properties', function () {
185+
$fake = new MetricFake;
186+
187+
$user = User::forceCreate(['name' => 'John', 'email' => 'john@example.com', 'password' => 'password']);
188+
189+
$fake->record(new MetricData('logins', measurable: $user));
190+
191+
$fake->assertRecorded(fn ($metric) => $metric->name() === 'logins' &&
192+
$metric->measurable()?->is($user)
193+
);
194+
});
195+
196+
it('can filter recorded metrics by multiple criteria', function () {
197+
$fake = new MetricFake;
198+
199+
$fake->record(new MetricData('page_views', 'marketing', value: 5));
200+
$fake->record(new MetricData('page_views', 'analytics', value: 3));
201+
$fake->record(new MetricData('api_calls', 'marketing', value: 2));
202+
203+
$recorded = $fake->recorded(fn ($metric) => $metric->name() === 'page_views' &&
204+
$metric->category() === 'marketing'
205+
);
206+
207+
expect($recorded->count())->toBe(1)
208+
->and($recorded->first()->value())->toBe(5);
209+
});
210+
211+
it('returns empty collection when no metrics match', function () {
212+
$fake = new MetricFake;
213+
214+
$fake->record(new MetricData('page_views'));
215+
216+
$recorded = $fake->recorded('api_calls');
217+
218+
expect($recorded->isEmpty())->toBeTrue();
219+
});
220+
221+
it('can record same metric multiple times', function () {
222+
$fake = new MetricFake;
223+
224+
$fake->record(new MetricData('page_views'));
225+
$fake->record(new MetricData('page_views'));
226+
$fake->record(new MetricData('page_views'));
227+
228+
expect($fake->recorded('page_views')->count())->toBe(3);
229+
});
230+
231+
it('maintains order of recorded metrics', function () {
232+
$fake = new MetricFake;
233+
234+
$fake->record(new MetricData('first'));
235+
$fake->record(new MetricData('second'));
236+
$fake->record(new MetricData('third'));
237+
238+
$recorded = $fake->recorded();
239+
240+
expect($recorded->get(0)->name())->toBe('first')
241+
->and($recorded->get(1)->name())->toBe('second')
242+
->and($recorded->get(2)->name())->toBe('third');
243+
});
244+
245+
it('can record and commit multiple times', function () {
246+
$fake = new MetricFake;
247+
248+
$fake->record(new MetricData('page_views'));
249+
$fake->commit();
250+
251+
expect($fake->recorded()->count())->toBe(0);
252+
253+
$fake->record(new MetricData('api_calls'));
254+
255+
expect($fake->recorded()->count())->toBe(1);
256+
});
257+
258+
it('assertion fails when metric not recorded', function () {
259+
$fake = new MetricFake;
260+
261+
expect(fn () => $fake->assertRecorded('page_views'))
262+
->toThrow(AssertionFailedError::class);
263+
});
264+
265+
it('assertion fails when metric was recorded but should not be', function () {
266+
$fake = new MetricFake;
267+
268+
$fake->record(new MetricData('page_views'));
269+
270+
expect(fn () => $fake->assertNotRecorded('page_views'))
271+
->toThrow(AssertionFailedError::class);
272+
});
273+
274+
it('assertion fails when nothing recorded but something was', function () {
275+
$fake = new MetricFake;
276+
277+
$fake->record(new MetricData('page_views'));
278+
279+
expect(fn () => $fake->assertNothingRecorded())
280+
->toThrow(AssertionFailedError::class);
281+
});
282+
283+
it('assertion fails when recorded times does not match', function () {
284+
$fake = new MetricFake;
285+
286+
$fake->record(new MetricData('page_views'));
287+
$fake->record(new MetricData('page_views'));
288+
289+
expect(fn () => $fake->assertRecordedTimes('page_views', 3))
290+
->toThrow(AssertionFailedError::class);
291+
});
292+
293+
it('can assert with complex closure conditions', function () {
294+
$fake = new MetricFake;
295+
296+
$fake->record(new MetricData('page_views', 'marketing', value: 100));
297+
298+
$fake->assertRecorded(fn ($metric) => $metric->name() === 'page_views' &&
299+
$metric->category() === 'marketing' &&
300+
$metric->value() >= 100
301+
);
302+
});
303+
304+
it('recorded returns collection instance', function () {
305+
$fake = new MetricFake;
306+
307+
$fake->record(new MetricData('page_views'));
308+
309+
expect($fake->recorded())->toBeInstanceOf(Collection::class);
310+
});

0 commit comments

Comments
 (0)