snipe-it/tests/Feature/Reporting/CustomReportTest.php

155 lines
5.9 KiB
PHP
Raw Normal View History

<?php
2024-06-04 10:49:29 -07:00
namespace Tests\Feature\Reporting;
use App\Models\Asset;
use App\Models\Company;
2024-10-28 14:24:47 -07:00
use App\Models\ReportTemplate;
use App\Models\User;
use Illuminate\Testing\TestResponse;
use League\Csv\Reader;
2023-08-08 17:40:02 -07:00
use PHPUnit\Framework\Assert;
2024-10-28 14:24:47 -07:00
use Tests\Concerns\TestsPermissionsRequirement;
use Tests\TestCase;
2024-10-28 14:24:47 -07:00
class CustomReportTest extends TestCase implements TestsPermissionsRequirement
{
2023-08-08 17:40:02 -07:00
protected function setUp(): void
{
parent::setUp();
TestResponse::macro(
'assertSeeTextInStreamedResponse',
function (string $needle) {
Assert::assertTrue(
collect(Reader::createFromString($this->streamedContent())->getRecords())
->pluck(0)
->contains($needle)
);
return $this;
}
);
TestResponse::macro(
'assertDontSeeTextInStreamedResponse',
function (string $needle) {
Assert::assertFalse(
collect(Reader::createFromString($this->streamedContent())->getRecords())
->pluck(0)
->contains($needle)
);
return $this;
}
);
}
2024-10-28 14:24:47 -07:00
public function testRequiresPermission()
{
$this->actingAs(User::factory()->create())
->get(route('reports/custom'))
->assertForbidden();
}
public function testCanLoadCustomReportPage()
{
$this->actingAs(User::factory()->canViewReports()->create())
->get(route('reports/custom'))
->assertOk()
->assertViewHas([
'template' => function (ReportTemplate $template) {
// the view should have an empty report by default
return $template->exists() === false;
}
]);
}
public function testCustomAssetReport()
{
Asset::factory()->create(['name' => 'Asset A']);
Asset::factory()->create(['name' => 'Asset B']);
2023-08-08 17:40:02 -07:00
$this->actingAs(User::factory()->canViewReports()->create())
->post('reports/custom', [
'asset_name' => '1',
'asset_tag' => '1',
'serial' => '1',
])->assertOk()
2023-08-08 17:40:02 -07:00
->assertHeader('content-type', 'text/csv; charset=UTF-8')
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
}
public function testCustomAssetReportAdheresToCompanyScoping()
{
[$companyA, $companyB] = Company::factory()->count(2)->create();
Asset::factory()->for($companyA)->create(['name' => 'Asset A']);
Asset::factory()->for($companyB)->create(['name' => 'Asset B']);
$superUser = $companyA->users()->save(User::factory()->superuser()->make());
$userInCompanyA = $companyA->users()->save(User::factory()->canViewReports()->make());
$userInCompanyB = $companyB->users()->save(User::factory()->canViewReports()->make());
$this->settings->disableMultipleFullCompanySupport();
2023-08-08 17:40:02 -07:00
$this->actingAs($superUser)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
2023-08-08 17:40:02 -07:00
$this->actingAs($userInCompanyA)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
2023-08-08 17:40:02 -07:00
$this->actingAs($userInCompanyB)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
$this->settings->enableMultipleFullCompanySupport();
2023-08-08 17:40:02 -07:00
$this->actingAs($superUser)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
2023-08-08 17:40:02 -07:00
$this->actingAs($userInCompanyA)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertSeeTextInStreamedResponse('Asset A')
->assertDontSeeTextInStreamedResponse('Asset B');
2023-08-08 17:40:02 -07:00
$this->actingAs($userInCompanyB)
->post('reports/custom', ['asset_name' => '1', 'asset_tag' => '1', 'serial' => '1'])
->assertDontSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B');
}
public function testCanLimitAssetsByLastCheckIn()
{
Asset::factory()->create(['name' => 'Asset A', 'last_checkin' => '2023-08-01']);
Asset::factory()->create(['name' => 'Asset B', 'last_checkin' => '2023-08-02']);
Asset::factory()->create(['name' => 'Asset C', 'last_checkin' => '2023-08-03']);
Asset::factory()->create(['name' => 'Asset D', 'last_checkin' => '2023-08-04']);
Asset::factory()->create(['name' => 'Asset E', 'last_checkin' => '2023-08-05']);
$this->actingAs(User::factory()->canViewReports()->create())
->post('reports/custom', [
'asset_name' => '1',
'asset_tag' => '1',
'serial' => '1',
'checkin_date' => '1',
'checkin_date_start' => '2023-08-02',
'checkin_date_end' => '2023-08-04',
])->assertOk()
->assertHeader('content-type', 'text/csv; charset=UTF-8')
->assertDontSeeTextInStreamedResponse('Asset A')
->assertSeeTextInStreamedResponse('Asset B')
->assertSeeTextInStreamedResponse('Asset C')
->assertSeeTextInStreamedResponse('Asset D')
->assertDontSeeTextInStreamedResponse('Asset E');
}
}