1
<?php
2
declare(strict_types=1);
3
use Machweis\Backend\Auth\AuthGuard;
4
use Machweis\Backend\Auth\AuthorizationException;
5
use Machweis\Backend\Auth\TokenService;
6
use Machweis\Backend\Config;
7
use Machweis\Backend\EmployeeProfilePolicy;
8
use Machweis\Backend\Kernel;
9
use Machweis\Backend\Logger;
10
use Machweis\Backend\Request;
11
require dirname(__DIR__) . '/src/autoload.php';
12
$tokens=new TokenService(new Config('test',false,'',3306,'','','',[],false,str_repeat('x',32)));
13
$token=$tokens->issueAccess(['sub'=>'user-a','tid'=>'tenant-a','role'=>'owner']);
14
$guard=new AuthGuard($tokens);$identity=$guard->requireIdentity(new Request('GET','/api/v1/customers',['authorization'=>'Bearer '.$token]));
15
assert($identity['tid']==='tenant-a');$guard->requireRole($identity,'owner');
16
try{$guard->requireRole($identity,'technician');assert(false);}catch(AuthorizationException){}
17
18
$office=$tokens->verifyAccess($tokens->issueAccess(['sub'=>'user-b','tid'=>'tenant-a','role'=>'office']));
19
$supervisor=$tokens->verifyAccess($tokens->issueAccess(['sub'=>'user-c','tid'=>'tenant-a','role'=>'supervisor']));
20
$technician=$tokens->verifyAccess($tokens->issueAccess(['sub'=>'user-d','tid'=>'tenant-a','role'=>'technician']));
21
$guard->requireRole($office,'owner','office');
22
$guard->requireRole($supervisor,'owner','office','supervisor','technician');
23
$guard->requireRole($technician,'owner','office','supervisor','technician');
24
foreach ([$supervisor,$technician] as $readOnly) {
25
try{$guard->requireRole($readOnly,'owner','office');assert(false);}catch(AuthorizationException){}
26
}
27
$kernel=new Kernel(new Config('test',false,'',3306,'','','',[],false,str_repeat('x',32)),new Logger('test'));
28
$technicianToken=$tokens->issueAccess(['sub'=>'user-d','tid'=>'tenant-a','role'=>'technician']);
29
$forbidden=$kernel->handle(new Request('POST','/api/v1/employees',['authorization'=>'Bearer '.$technicianToken],'{}'));
30
assert($forbidden->status===403);
31
assert($forbidden->body['error']['code']==='forbidden');
32
33
EmployeeProfilePolicy::assertAssignable(['tenant_id'=>'tenant-a','is_active'=>1,'deleted_at'=>null],'tenant-a');
34
foreach ([
35
false,
36
['tenant_id'=>'tenant-b','is_active'=>1,'deleted_at'=>null],
37
['tenant_id'=>'tenant-a','is_active'=>0,'deleted_at'=>null],
38
['tenant_id'=>'tenant-a','is_active'=>1,'deleted_at'=>'2026-08-29 12:00:00'],
39
] as $unavailable) {
40
try{EmployeeProfilePolicy::assertAssignable($unavailable,'tenant-a');assert(false);}catch(InvalidArgumentException){}
41
}
42
fwrite(STDOUT,"master_data_contract: OK\n");
43