Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pterodactyl
GitHub Repository: pterodactyl/panel
Path: blob/1.0-develop/tests/Assertions/AssertsActivityLogged.php
7458 views
1
<?php
2
3
namespace Pterodactyl\Tests\Assertions;
4
5
use PHPUnit\Framework\Assert;
6
use Illuminate\Support\Facades\Event;
7
use Pterodactyl\Events\ActivityLogged;
8
use Illuminate\Database\Eloquent\Model;
9
use Pterodactyl\Models\ActivityLogSubject;
10
11
trait AssertsActivityLogged
12
{
13
/**
14
* @param Model|array $subjects
15
*/
16
public function assertActivityFor(string $event, ?Model $actor, ...$subjects): void
17
{
18
$this->assertActivityLogged($event);
19
$this->assertActivityActor($event, $actor);
20
$this->assertActivitySubjects($event, ...$subjects);
21
}
22
23
/**
24
* Asserts that the given activity log event was stored in the database.
25
*/
26
public function assertActivityLogged(string $event): void
27
{
28
Event::assertDispatched(ActivityLogged::class, fn ($e) => $e->is($event));
29
}
30
31
/**
32
* Asserts that a given activity log event was stored with the subjects being
33
* any of the values provided.
34
*/
35
public function assertActivitySubjects(string $event, Model|array $subjects): void
36
{
37
if (is_array($subjects)) {
38
\Webmozart\Assert\Assert::lessThanEq(count(func_get_args()), 2, 'Invalid call to ' . __METHOD__ . ': cannot provide additional arguments if providing an array.');
39
} else {
40
$subjects = array_slice(func_get_args(), 1);
41
}
42
43
Event::assertDispatched(ActivityLogged::class, function (ActivityLogged $e) use ($event, $subjects) {
44
Assert::assertEquals($event, $e->model->event);
45
Assert::assertNotEmpty($e->model->subjects);
46
47
foreach ($subjects as $subject) {
48
$match = $e->model->subjects->first(function (ActivityLogSubject $model) use ($subject) {
49
return $model->subject_type === $subject->getMorphClass()
50
&& $model->subject_id = $subject->getKey();
51
});
52
53
Assert::assertNotNull(
54
$match,
55
sprintf('Failed asserting that event "%s" includes a %s[%d] subject', $event, get_class($subject), $subject->getKey())
56
);
57
}
58
59
return true;
60
});
61
}
62
63
/**
64
* Asserts that the provided event was logged into the activity logs with the provided
65
* actor model associated with it.
66
*/
67
public function assertActivityActor(string $event, ?Model $actor = null): void
68
{
69
Event::assertDispatched(ActivityLogged::class, function (ActivityLogged $e) use ($event, $actor) {
70
Assert::assertEquals($event, $e->model->event);
71
72
if (is_null($actor)) {
73
Assert::assertNull($e->actor());
74
} else {
75
Assert::assertNotNull($e->actor());
76
Assert::assertTrue($e->actor()->is($actor));
77
}
78
79
return true;
80
});
81
}
82
}
83
84