3
0
mirror of https://github.com/snipe/snipe-it.git synced 2026-05-31 20:13:22 +00:00
Files
snipe-it/tests/Support/CustomTestMacros.php
2026-05-13 11:27:26 -07:00

245 lines
8.0 KiB
PHP

<?php
namespace Tests\Support;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Testing\TestResponse;
use League\Csv\Reader;
use PHPUnit\Framework\Assert;
use RuntimeException;
trait CustomTestMacros
{
protected function registerCustomMacros()
{
$guardAgainstNullProperty = function (Model $model, string $property) {
if (is_null($model->{$property})) {
throw new RuntimeException(
"The property ({$property}) either does not exist or is null on the model which isn't helpful for comparison."
);
}
};
TestResponse::macro(
'assertResponseContainsInRows',
function (iterable|Model $models, string $property = 'name') use ($guardAgainstNullProperty) {
if ($models instanceof Model) {
$models = [$models];
}
foreach ($models as $model) {
$guardAgainstNullProperty($model, $property);
Assert::assertTrue(
collect($this['rows'])->pluck($property)->contains(e($model->{$property})),
"Response did not contain the expected value: {$model->{$property}}"
);
}
return $this;
}
);
TestResponse::macro(
'assertResponseDoesNotContainInRows',
function (Model $model, string $property = 'name') use ($guardAgainstNullProperty) {
$guardAgainstNullProperty($model, $property);
Assert::assertFalse(
collect($this['rows'])->pluck($property)->contains(e($model->{$property})),
"Response contained unexpected value: {$model->{$property}}"
);
return $this;
}
);
TestResponse::macro(
'assertResponseContainsInResults',
function (Model $model, string $property = 'id') use ($guardAgainstNullProperty) {
$guardAgainstNullProperty($model, $property);
Assert::assertTrue(
collect($this->json('results'))->pluck('id')->contains(e($model->{$property})),
"Response did not contain the expected value: {$model->{$property}}"
);
return $this;
}
);
TestResponse::macro(
'assertResponseDoesNotContainInResults',
function (Model $model, string $property = 'id') use ($guardAgainstNullProperty) {
$guardAgainstNullProperty($model, $property);
Assert::assertFalse(
collect($this->json('results'))->pluck('id')->contains(e($model->{$property})),
"Response contained unexpected value: {$model->{$property}}"
);
return $this;
}
);
TestResponse::macro(
'assertStatusMessageIs',
function (string $message) {
Assert::assertEquals(
$message,
$this['status'],
"Response status message was not {$message}"
);
return $this;
}
);
TestResponse::macro(
'assertMessagesAre',
function (string $message) {
Assert::assertEquals(
$message,
$this['messages'],
"Response messages was not {$message}"
);
return $this;
}
);
TestResponse::macro(
'assertMessagesContains',
function (array|string $keys) {
Assert::assertArrayHasKey('messages', $this, 'Response did not contain any messages');
if (is_string($keys)) {
$keys = [$keys];
}
foreach ($keys as $key) {
Assert::assertArrayHasKey(
$key,
$this['messages'],
"Response messages did not contain the key: {$key}"
);
}
return $this;
}
);
TestResponse::macro(
'assertPayloadContains',
function (array|string $keys) {
Assert::assertArrayHasKey('payload', $this, 'Response did not contain a payload');
if (is_string($keys)) {
$keys = [$keys];
}
foreach ($keys as $key) {
Assert::assertArrayHasKey(
$key,
$this['payload'],
"Response messages did not contain the key: {$key}"
);
}
return $this;
}
);
TestResponse::macro(
'assertSeeTextInStreamedResponse',
function (array|string $needles): self {
if (! is_array($needles)) {
$needles = [$needles];
}
$records = collect(Reader::createFromString($this->streamedContent())->getRecords())->flatten();
foreach ($needles as $needle) {
Assert::assertTrue(
$records->contains($needle),
"Response did not contain the expected value: {$needle}"
);
}
return $this;
}
);
TestResponse::macro(
'assertDontSeeTextInStreamedResponse',
function (array|string $needles): self {
if (! is_array($needles)) {
$needles = [$needles];
}
$records = collect(Reader::createFromString($this->streamedContent())->getRecords())->flatten();
foreach ($needles as $needle) {
Assert::assertFalse(
$records->contains($needle),
"Response contained unexpected value: {$needle}"
);
}
return $this;
}
);
/**
* Assert that the streamed CSV response contains a row where all given header→value pairs match simultaneously.
*
* The first row of the CSV is treated as headers. Each subsequent row is combined with those headers
* to produce an associative map, and the assertion passes if at least one row satisfies every pair.
*
* Unlike assertSeeTextInStreamedResponse, this verifies that the values appear together in the same
* row under the correct column — not just anywhere in the file.
*
* Usage:
* ->assertSeePairsInStreamedResponse([
* 'First Name' => 'Luke',
* 'Last Name' => 'Skywalker',
* 'Username' => 'lskywalker',
* ])
*/
TestResponse::macro(
'assertSeePairsInStreamedResponse',
function (array $pair): self {
$records = collect(Reader::createFromString($this->streamedContent())->getRecords());
$headers = collect($records->shift());
$combined = $records->map(fn ($record) => $headers->combine($record));
Assert::assertTrue(
$combined->contains(function ($row) use ($pair) {
foreach ($pair as $key => $value) {
if (($row[$key] ?? null) !== $value) {
return false;
}
}
return true;
}),
'Response did not contain a row matching the expected pairs: '.json_encode($pair)
);
return $this;
}
);
TestResponse::macro(
'assertCsvHeader',
function () {
$this->assertHeader('content-type', 'text/csv; charset=utf-8');
return $this;
}
);
}
}