Files
snipe-it/tests/Feature/Importing/Api/ImportUsersMultiCompanyTest.php
2026-05-19 13:04:16 +01:00

112 lines
3.8 KiB
PHP

<?php
namespace Tests\Feature\Importing\Api;
use App\Models\Company;
use App\Models\Import;
use App\Models\User;
use Illuminate\Testing\TestResponse;
use Tests\Support\Importing\CleansUpImportFiles;
use Tests\Support\Importing\UsersImportFileBuilder as ImportFileBuilder;
class ImportUsersMultiCompanyTest extends ImportDataTestCase
{
use CleansUpImportFiles;
protected function importFileResponse(array $parameters = []): TestResponse
{
if (! array_key_exists('import-type', $parameters)) {
$parameters['import-type'] = 'user';
}
return parent::importFileResponse($parameters);
}
public function test_pipe_separated_company_names_create_multiple_pivot_entries()
{
[$companyA, $companyB] = Company::factory()->count(2)->create();
$importFileBuilder = ImportFileBuilder::new([
'companyName' => $companyA->name.'|'.$companyB->name,
]);
$row = $importFileBuilder->firstRow();
$import = Import::factory()->users()->create(['file_path' => $importFileBuilder->saveToImportsDirectory()]);
$this->actingAsForApi(User::factory()->superuser()->create());
$this->importFileResponse(['import' => $import->id])
->assertOk();
$user = User::where('username', $row['username'])->firstOrFail();
$this->assertCount(2, $user->companies, 'User should belong to both pipe-separated companies');
$this->assertTrue($user->companies->contains($companyA));
$this->assertTrue($user->companies->contains($companyB));
}
public function test_pipe_separated_companies_create_new_companies_when_not_found()
{
$importFileBuilder = ImportFileBuilder::new([
'companyName' => 'Acme Corp|Widget Inc',
]);
$row = $importFileBuilder->firstRow();
$import = Import::factory()->users()->create(['file_path' => $importFileBuilder->saveToImportsDirectory()]);
$this->actingAsForApi(User::factory()->superuser()->create());
$this->importFileResponse(['import' => $import->id])
->assertOk();
$user = User::where('username', $row['username'])->firstOrFail();
$this->assertCount(2, $user->companies, 'User should belong to two newly-created companies');
$names = $user->companies->pluck('name')->all();
$this->assertContains('Acme Corp', $names);
$this->assertContains('Widget Inc', $names);
}
public function test_single_company_name_without_pipe_works_as_before()
{
$company = Company::factory()->create();
$importFileBuilder = ImportFileBuilder::new([
'companyName' => $company->name,
]);
$row = $importFileBuilder->firstRow();
$import = Import::factory()->users()->create(['file_path' => $importFileBuilder->saveToImportsDirectory()]);
$this->actingAsForApi(User::factory()->superuser()->create());
$this->importFileResponse(['import' => $import->id])
->assertOk();
$user = User::where('username', $row['username'])->firstOrFail();
$this->assertCount(1, $user->companies);
$this->assertTrue($user->companies->contains($company));
}
public function test_blank_company_column_leaves_user_without_companies()
{
$importFileBuilder = ImportFileBuilder::new([
'companyName' => '',
]);
$row = $importFileBuilder->firstRow();
$import = Import::factory()->users()->create(['file_path' => $importFileBuilder->saveToImportsDirectory()]);
$this->actingAsForApi(User::factory()->superuser()->create());
$this->importFileResponse(['import' => $import->id])
->assertOk();
$user = User::where('username', $row['username'])->firstOrFail();
$this->assertCount(0, $user->companies, 'Blank company column should leave user with no companies');
}
}