71 lines
3.4 KiB
PHP
71 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace Modules\Company\Tests\Feature;
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Modules\Company\Models\Company;
|
|
use Modules\Company\Models\CompanyAddress;
|
|
use Modules\Company\Models\CompanyDirectorAssignment;
|
|
use Modules\Company\Models\CompanyDivision;
|
|
use Modules\Countries\Models\Country;
|
|
use Modules\Warehouse\app\Models\Warehouse;
|
|
use Tests\TestCase;
|
|
|
|
class CompanyStructureTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
public function test_company_has_one_editable_country_backed_address(): void
|
|
{
|
|
$company = Company::create(['name' => 'Abbott Logistics Limited', 'billing_email' => 'billing@abbott.example']);
|
|
$country = Country::create(['alpha2' => 'GB', 'alpha3' => 'GBR', 'numeric' => '826', 'name' => 'United Kingdom', 'is_active' => true]);
|
|
|
|
$company->address()->create([
|
|
'line_1' => '1 Warehouse Way',
|
|
'locality' => 'London',
|
|
'postal_code' => 'SW1A 1AA',
|
|
'country_id' => $country->id,
|
|
]);
|
|
|
|
$company->address()->update(['line_1' => '2 Warehouse Way']);
|
|
|
|
$this->assertSame(1, CompanyAddress::count());
|
|
$this->assertSame('2 Warehouse Way', $company->fresh()->address->line_1);
|
|
$this->assertSame('United Kingdom', $company->fresh()->address->country->name);
|
|
}
|
|
|
|
public function test_company_division_has_address_users_directors_and_optional_warehouses(): void
|
|
{
|
|
$company = Company::create(['name' => 'Sentinel', 'billing_email' => 'sentinel@example.test']);
|
|
$country = Country::create(['alpha2' => 'GB', 'alpha3' => 'GBR', 'numeric' => '826', 'name' => 'United Kingdom', 'is_active' => true]);
|
|
$user = User::create(['company_id' => $company->id, 'name' => 'Jane Director', 'email' => 'jane@example.test', 'password' => 'password']);
|
|
$division = $company->divisions()->create(['name' => 'North Operations', 'code' => 'NORTH']);
|
|
$warehouse = Warehouse::create(['company_id' => $company->id, 'division_id' => $division->id, 'code' => 'NTH', 'name' => 'North DC']);
|
|
|
|
$division->address()->create([
|
|
'label' => 'Operating address',
|
|
'line_1' => 'North Road',
|
|
'locality' => 'Manchester',
|
|
'country_id' => $country->id,
|
|
]);
|
|
$division->users()->attach($user->id, ['company_id' => $company->id, 'role' => 'director', 'is_director' => true]);
|
|
CompanyDirectorAssignment::create(['company_id' => $company->id, 'company_division_id' => $division->id, 'user_id' => $user->id, 'coverage_type' => 'division']);
|
|
|
|
$this->assertTrue($company->fresh()->divisions()->exists());
|
|
$this->assertSame('North Operations', $warehouse->fresh()->division->name);
|
|
$this->assertSame('Manchester', $division->fresh()->address->locality);
|
|
$this->assertTrue($user->fresh()->divisions()->whereKey($division->id)->exists());
|
|
$this->assertTrue($user->fresh()->directorAssignments()->where('company_division_id', $division->id)->exists());
|
|
}
|
|
|
|
public function test_warehouse_can_remain_at_company_level_without_division(): void
|
|
{
|
|
$company = Company::create(['name' => 'Company Level Warehousing']);
|
|
$warehouse = Warehouse::create(['company_id' => $company->id, 'code' => 'MAIN', 'name' => 'Main Warehouse']);
|
|
|
|
$this->assertNull($warehouse->division_id);
|
|
$this->assertSame('Company Level Warehousing', $warehouse->company->name);
|
|
}
|
|
}
|