Skip to content

Commit 0a16660

Browse files
committed
Add pending metric tests
1 parent 797c990 commit 0a16660

File tree

3 files changed

+321
-8
lines changed

3 files changed

+321
-8
lines changed

src/PendingMetric.php

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,21 @@ public function measurable(Model $measurable): self
8080
public function record(int $value = 1): void
8181
{
8282
app(MetricManager::class)->record(
83-
new MetricData(
84-
$this->name,
85-
$this->category,
86-
$value,
87-
$this->date,
88-
$this->measurable
89-
)
83+
$this->toMetricData($value)
84+
);
85+
}
86+
87+
/**
88+
* Convert the pending metric to a metric data object.
89+
*/
90+
public function toMetricData(int $value): Measurable
91+
{
92+
return new MetricData(
93+
$this->name,
94+
$this->category,
95+
$value,
96+
$this->date,
97+
$this->measurable
9098
);
9199
}
92100
}

tests/DatabaseMetricManagerTest.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,12 @@
216216
it('groups captured metrics by name, category, date, and measurable', function () {
217217
config(['metrics.queue' => false]);
218218

219-
$user = User::create(['name' => 'John', 'email' => '[email protected]', 'password' => 'password']);
219+
$user = User::create([
220+
'name' => 'John',
221+
'email' => '[email protected]',
222+
'password' => 'password',
223+
]);
224+
220225
$date = CarbonImmutable::parse('2025-01-15');
221226

222227
Metrics::capture();

tests/PendingMetricTest.php

Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
<?php
2+
3+
use Carbon\Carbon;
4+
use DirectoryTree\Metrics\Facades\Metrics;
5+
use DirectoryTree\Metrics\Jobs\RecordMetric;
6+
use DirectoryTree\Metrics\Metric;
7+
use DirectoryTree\Metrics\PendingMetric;
8+
use DirectoryTree\Metrics\Tests\User;
9+
10+
it('can be instantiated with constructor', function () {
11+
$pending = new PendingMetric('page_views');
12+
13+
expect($pending)->toBeInstanceOf(PendingMetric::class);
14+
});
15+
16+
it('can be instantiated with make method', function () {
17+
$pending = PendingMetric::make('page_views');
18+
19+
expect($pending)->toBeInstanceOf(PendingMetric::class);
20+
});
21+
22+
it('can set category', function () {
23+
$pending = PendingMetric::make('page_views')->category('marketing');
24+
25+
$data = $pending->toMetricData(1);
26+
27+
expect($data->name())->toBe('page_views')
28+
->and($data->category())->toBe('marketing')
29+
->and($data->value())->toBe(1);
30+
});
31+
32+
it('can set date', function () {
33+
$date = Carbon::yesterday();
34+
35+
$pending = PendingMetric::make('page_views')->date($date);
36+
37+
$data = $pending->toMetricData(1);
38+
39+
expect($data->name())->toBe('page_views')
40+
->and($data->year())->toBe($date->year)
41+
->and($data->month())->toBe($date->month)
42+
->and($data->day())->toBe($date->day);
43+
});
44+
45+
it('can set measurable', function () {
46+
$user = User::create([
47+
'name' => 'John',
48+
'email' => '[email protected]',
49+
'password' => 'password',
50+
]);
51+
52+
$pending = PendingMetric::make('logins')->measurable($user);
53+
54+
$data = $pending->toMetricData(1);
55+
56+
expect($data->name())->toBe('logins')
57+
->and($data->measurable())->toBe($user);
58+
});
59+
60+
it('can chain multiple setters', function () {
61+
$user = User::create([
62+
'name' => 'John',
63+
'email' => '[email protected]',
64+
'password' => 'password',
65+
]);
66+
67+
$date = Carbon::yesterday();
68+
69+
$pending = PendingMetric::make('page_views')
70+
->category('marketing')
71+
->date($date)
72+
->measurable($user);
73+
74+
$data = $pending->toMetricData(5);
75+
76+
expect($data->name())->toBe('page_views')
77+
->and($data->category())->toBe('marketing')
78+
->and($data->value())->toBe(5)
79+
->and($data->year())->toBe($date->year)
80+
->and($data->month())->toBe($date->month)
81+
->and($data->day())->toBe($date->day)
82+
->and($data->measurable())->toBe($user);
83+
});
84+
85+
it('records metric with default value', function () {
86+
PendingMetric::make('page_views')->record();
87+
88+
expect(Metric::count())->toBe(1);
89+
90+
$metric = Metric::first();
91+
92+
expect($metric->name)->toBe('page_views')
93+
->and($metric->value)->toBe(1);
94+
});
95+
96+
it('records metric with custom value', function () {
97+
PendingMetric::make('page_views')->record(5);
98+
99+
expect(Metric::count())->toBe(1);
100+
101+
$metric = Metric::first();
102+
103+
expect($metric->name)->toBe('page_views')
104+
->and($metric->value)->toBe(5);
105+
});
106+
107+
it('records metric with category', function () {
108+
PendingMetric::make('page_views')
109+
->category('marketing')
110+
->record();
111+
112+
$metric = Metric::first();
113+
114+
expect($metric->name)->toBe('page_views')
115+
->and($metric->category)->toBe('marketing')
116+
->and($metric->value)->toBe(1);
117+
});
118+
119+
it('records metric with custom date', function () {
120+
$date = Carbon::parse('2025-03-15');
121+
122+
PendingMetric::make('page_views')
123+
->date($date)
124+
->record();
125+
126+
$metric = Metric::first();
127+
128+
expect($metric->name)->toBe('page_views')
129+
->and($metric->year)->toBe(2025)
130+
->and($metric->month)->toBe(3)
131+
->and($metric->day)->toBe(15);
132+
});
133+
134+
it('records metric with measurable model', function () {
135+
$user = User::create([
136+
'name' => 'John',
137+
'email' => '[email protected]',
138+
'password' => 'password',
139+
]);
140+
141+
PendingMetric::make('logins')
142+
->measurable($user)
143+
->record();
144+
145+
$metric = Metric::first();
146+
147+
expect($metric->name)->toBe('logins')
148+
->and($metric->measurable_type)->toBe(User::class)
149+
->and($metric->measurable_id)->toBe($user->id)
150+
->and($metric->value)->toBe(1);
151+
});
152+
153+
it('records metric with all properties', function () {
154+
$user = User::create([
155+
'name' => 'John',
156+
'email' => '[email protected]',
157+
'password' => 'password',
158+
]);
159+
160+
$date = Carbon::parse('2025-03-15');
161+
162+
PendingMetric::make('page_views')
163+
->category('marketing')
164+
->date($date)
165+
->measurable($user)
166+
->record(10);
167+
168+
$metric = Metric::first();
169+
170+
expect($metric->name)->toBe('page_views')
171+
->and($metric->category)->toBe('marketing')
172+
->and($metric->year)->toBe(2025)
173+
->and($metric->month)->toBe(3)
174+
->and($metric->day)->toBe(15)
175+
->and($metric->measurable_type)->toBe(User::class)
176+
->and($metric->measurable_id)->toBe($user->id)
177+
->and($metric->value)->toBe(10);
178+
});
179+
180+
it('can set null category', function () {
181+
PendingMetric::make('page_views')
182+
->category(null)
183+
->record();
184+
185+
$metric = Metric::first();
186+
187+
expect($metric->category)->toBeNull();
188+
});
189+
190+
it('records multiple metrics independently', function () {
191+
PendingMetric::make('page_views')->record();
192+
PendingMetric::make('api_calls')->record();
193+
PendingMetric::make('errors')->record();
194+
195+
expect(Metric::count())->toBe(3);
196+
});
197+
198+
it('increments existing metric when recorded multiple times', function () {
199+
PendingMetric::make('page_views')->record();
200+
PendingMetric::make('page_views')->record();
201+
PendingMetric::make('page_views')->record();
202+
203+
expect(Metric::count())->toBe(1);
204+
205+
$metric = Metric::first();
206+
207+
expect($metric->name)->toBe('page_views')
208+
->and($metric->value)->toBe(3);
209+
});
210+
211+
it('treats metrics with different categories as separate', function () {
212+
PendingMetric::make('page_views')->category('marketing')->record();
213+
PendingMetric::make('page_views')->category('analytics')->record();
214+
215+
expect(Metric::count())->toBe(2);
216+
});
217+
218+
it('works with capturing mode', function () {
219+
Metrics::capture();
220+
221+
PendingMetric::make('page_views')->record();
222+
PendingMetric::make('api_calls')->record();
223+
224+
expect(Metric::count())->toBe(0);
225+
226+
Metrics::commit();
227+
228+
expect(Metric::count())->toBe(2);
229+
});
230+
231+
it('works with queueing enabled', function () {
232+
config(['metrics.queue' => true]);
233+
234+
Queue::fake();
235+
236+
PendingMetric::make('page_views')->record();
237+
238+
Queue::assertPushed(RecordMetric::class);
239+
});
240+
241+
it('can be used with helper function', function () {
242+
$pending = metric('page_views');
243+
244+
expect($pending)->toBeInstanceOf(PendingMetric::class);
245+
246+
$pending->record();
247+
248+
expect(Metric::count())->toBe(1);
249+
});
250+
251+
it('helper function works with full chain', function () {
252+
$user = User::create([
253+
'name' => 'John',
254+
'email' => '[email protected]',
255+
'password' => 'password',
256+
]);
257+
258+
metric('page_views')
259+
->category('marketing')
260+
->measurable($user)
261+
->record(5);
262+
263+
$metric = Metric::first();
264+
265+
expect($metric->name)->toBe('page_views')
266+
->and($metric->category)->toBe('marketing')
267+
->and($metric->measurable_id)->toBe($user->id)
268+
->and($metric->value)->toBe(5);
269+
});
270+
271+
it('can record large values', function () {
272+
PendingMetric::make('api_calls')->record(1000000);
273+
274+
$metric = Metric::first();
275+
276+
expect($metric->value)->toBe(1000000);
277+
});
278+
279+
it('can record zero value', function () {
280+
PendingMetric::make('errors')->record(0);
281+
282+
$metric = Metric::first();
283+
284+
expect($metric->value)->toBe(0);
285+
});
286+
287+
it('creates new instance for each make call', function () {
288+
$pending1 = PendingMetric::make('page_views')->category('marketing');
289+
$pending2 = PendingMetric::make('page_views')->category('analytics');
290+
291+
expect($pending1)->not->toBe($pending2);
292+
});
293+
294+
it('does not mutate when chaining', function () {
295+
$pending = PendingMetric::make('page_views');
296+
297+
$withCategory = $pending->category('marketing');
298+
299+
expect($pending)->toBe($withCategory);
300+
});

0 commit comments

Comments
 (0)