[]]);
$this->tenant = Tenant::create(['name' => 'CABM', 'entra_tenant_id' => '11111111-1111-1111-1111-111111111111']);
$this->agent = DirectoryUser::create([
'tenant_id' => $this->tenant->id, 'entra_oid' => '22222222-2222-2222-2222-222222222222',
'display_name' => 'Jean Martin', 'given_name' => 'Jean', 'surname' => 'Martin',
'mail' => 'j.martin@beziers-mediterranee.fr', 'account_enabled' => true,
]);
}
private function user(string $role): User
{
return User::create([
'name' => $role, 'email' => "{$role}@beziers-mediterranee.fr", 'tenant_id' => $this->tenant->id,
'entra_oid' => '22222222-2222-2222-2222-222222222222', 'role' => $role,
]);
}
private function payload(array $over = []): array
{
return array_merge(['name' => 'Directeurs', 'draft_html_full' => '{{prenom}}', 'draft_html_short' => '{{nom}}'], $over);
}
public function test_agent_sans_role_refuse(): void
{
$this->actingAs($this->user(''))->get('/admin/templates')->assertForbidden();
}
public function test_editeur_cree_et_modifie_un_brouillon_nettoye_mais_ne_publie_pas(): void
{
$editor = $this->user('editor');
$this->actingAs($editor)->post('/admin/templates', $this->payload([
'draft_html_full' => '{{prenom}}',
]))->assertRedirect();
$t = Template::firstWhere('name', 'Directeurs');
$this->assertSame('{{prenom}}', $t->draft_html_full);
$this->assertNull($t->html_full, 'rien n\'est publié tant qu\'un admin ne publie pas');
$this->actingAs($editor)->post("/admin/templates/{$t->id}/publish")->assertForbidden();
$this->actingAs($editor)->get('/admin/affectations')->assertForbidden();
$this->assertTrue(AuditLog::where('action', 'template.create')->exists());
}
public function test_admin_publie_versionne_et_restaure(): void
{
$admin = $this->user('admin');
$t = Template::create(['tenant_id' => $this->tenant->id] + $this->payload());
$this->actingAs($admin)->post("/admin/templates/{$t->id}/publish")->assertRedirect();
$t->refresh();
$this->assertSame(1, $t->published_version);
$this->assertSame('{{prenom}}', $t->html_full);
$this->actingAs($admin)->put("/admin/templates/{$t->id}", $this->payload(['draft_html_full' => 'v2']))->assertRedirect();
$this->assertSame('{{prenom}}', $t->fresh()->html_full, 'le brouillon ne modifie pas le publié');
$version = $t->versions()->first();
$this->actingAs($admin)->post("/admin/templates/{$t->id}/versions/{$version->id}/restore")->assertRedirect();
$this->assertSame('{{prenom}}', $t->fresh()->draft_html_full);
}
public function test_apercu_rend_le_brouillon_pour_un_agent(): void
{
$this->actingAs($this->user('editor'))
->postJson('/admin/templates/preview', ['html' => 'Bonjour {{prenom}}
', 'variant' => 'full', 'agent_id' => $this->agent->id])
->assertOk()
->assertJson(['html' => 'Bonjour Jean
', 'agent' => 'Jean Martin — j.martin@beziers-mediterranee.fr']);
}
public function test_cloisonnement_entre_tenants(): void
{
$other = Tenant::create(['name' => 'Commune', 'entra_tenant_id' => '99999999-9999-9999-9999-999999999999']);
$foreign = Template::create(['tenant_id' => $other->id, 'name' => 'Autre', 'draft_html_full' => 'x']);
$this->actingAs($this->user('superadmin'))->get("/admin/templates/{$foreign->id}")->assertNotFound();
}
public function test_affectations_crud_et_template_par_defaut(): void
{
$admin = $this->user('admin');
$t = Template::create(['tenant_id' => $this->tenant->id] + $this->payload());
$t->publish();
$group = DirectoryGroup::create(['tenant_id' => $this->tenant->id, 'entra_oid' => '33333333-3333-3333-3333-333333333333', 'display_name' => 'signature_mail_directeurs']);
$this->actingAs($admin)->post('/admin/affectations', ['template_id' => $t->id, 'directory_group_id' => $group->id, 'priority' => 50])->assertRedirect();
$this->actingAs($admin)->post('/admin/affectations', ['template_id' => $t->id, 'directory_group_id' => $group->id, 'priority' => 60])
->assertSessionHasErrors('directory_group_id');
$a = Assignment::first();
$this->actingAs($admin)->put("/admin/affectations/{$a->id}", ['priority' => 100])->assertRedirect();
$this->assertSame(100, $a->fresh()->priority);
$this->actingAs($admin)->post("/admin/templates/{$t->id}/default")->assertRedirect();
$this->assertTrue($t->fresh()->is_default);
$this->actingAs($admin)->delete("/admin/templates/{$t->id}")->assertStatus(422);
$this->actingAs($admin)->delete("/admin/affectations/{$a->id}")->assertRedirect();
$this->assertSame(0, Assignment::count());
}
public function test_pages_principales_s_affichent(): void
{
$admin = $this->user('superadmin');
$t = Template::create(['tenant_id' => $this->tenant->id] + $this->payload());
foreach (['/admin', '/admin/templates', '/admin/templates/create', "/admin/templates/{$t->id}", '/admin/affectations', '/admin/agents', "/admin/agents/{$this->agent->id}", '/me'] as $url) {
$this->actingAs($admin)->get($url)->assertOk();
}
$this->actingAs($admin)->getJson('/admin/agents/recherche?q=mar')->assertOk()->assertJsonFragment(['id' => $this->agent->id]);
}
}