Ajoute fiche d'identité informatique, catalogue prestataires et schémas draw.io
- Fiche d'identité par organisation (technicien référent, FAI, IP publiques, prestataires liés) accessible depuis un nouveau menu. - Nouveau module Prestataires dédié (catalogue léger réutilisable entre communes, avec journal de suivi des échanges) plutôt que de détourner les organisations de type "Fournisseur". - Nouveau menu Infrastructure par organisation avec schémas réseau/fonctionnel édités via draw.io embarqué (URL configurable, cf. réglages admin). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
74c0b01a2e
commit
3c87ced1e4
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\Organization;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Livewire\Livewire;
|
||||
use Tests\TestCase;
|
||||
|
||||
class InfrastructureTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
public function test_infrastructure_index_page_renders_for_an_authenticated_user(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
$org = Organization::create(['name' => 'Test Commune', 'slug' => 'test-commune', 'org_type' => 'client']);
|
||||
|
||||
$response = $this->actingAs($user)->get(route('organizations.infrastructure.index', $org));
|
||||
|
||||
$response->assertOk();
|
||||
$response->assertSee('Infrastructure');
|
||||
}
|
||||
|
||||
public function test_can_create_a_diagram_and_it_opens_in_the_editor(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
$org = Organization::create(['name' => 'Test Commune', 'slug' => 'test-commune', 'org_type' => 'client']);
|
||||
|
||||
$this->actingAs($user);
|
||||
|
||||
Livewire::test('infrastructure.index', ['organization' => $org])
|
||||
->set('newDiagramName', 'Schéma réseau - Mairie')
|
||||
->call('createDiagram')
|
||||
->assertHasNoErrors();
|
||||
|
||||
$this->assertDatabaseHas('documents', [
|
||||
'organization_id' => $org->id,
|
||||
'name' => 'Schéma réseau - Mairie',
|
||||
'type' => 'diagram',
|
||||
]);
|
||||
|
||||
$document = $org->documents()->where('type', 'diagram')->firstOrFail();
|
||||
|
||||
$response = $this->get(route('organizations.infrastructure.edit', [$org, $document]));
|
||||
$response->assertOk();
|
||||
$response->assertSee('Schéma réseau - Mairie');
|
||||
}
|
||||
|
||||
public function test_saving_a_diagram_creates_a_new_version_only_when_content_changed(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
$org = Organization::create(['name' => 'Test Commune', 'slug' => 'test-commune', 'org_type' => 'client']);
|
||||
|
||||
$document = $org->documents()->create([
|
||||
'name' => 'Schéma test',
|
||||
'type' => 'diagram',
|
||||
'content' => '<mxfile>old</mxfile>',
|
||||
'current_version' => 1,
|
||||
'created_by' => $user->id,
|
||||
]);
|
||||
$document->versions()->create(['version' => 1, 'content' => '<mxfile>old</mxfile>', 'created_by' => $user->id]);
|
||||
|
||||
$this->actingAs($user);
|
||||
|
||||
Livewire::test('documents.diagram-editor', ['organization' => $org, 'document' => $document])
|
||||
->call('saveDiagram', '<mxfile>new</mxfile>');
|
||||
|
||||
$document->refresh();
|
||||
$this->assertSame('<mxfile>new</mxfile>', $document->content);
|
||||
$this->assertSame(2, $document->current_version);
|
||||
$this->assertCount(2, $document->versions);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\Organization;
|
||||
use App\Models\Provider;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Livewire\Livewire;
|
||||
use Tests\TestCase;
|
||||
|
||||
class OrganizationIdentityCardTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
public function test_identity_card_page_renders_for_an_authenticated_user(): void
|
||||
{
|
||||
$this->seed(\Database\Seeders\RolesAndPermissionsSeeder::class);
|
||||
|
||||
$user = User::factory()->create();
|
||||
$org = Organization::create(['name' => 'Test Commune', 'slug' => 'test-commune', 'org_type' => 'client']);
|
||||
|
||||
$response = $this->actingAs($user)->get(route('organizations.identity-card', $org));
|
||||
|
||||
$response->assertOk();
|
||||
$response->assertSee("Fiche d'identité informatique");
|
||||
}
|
||||
|
||||
public function test_can_save_identity_fields_and_link_a_provider(): void
|
||||
{
|
||||
$this->seed(\Database\Seeders\RolesAndPermissionsSeeder::class);
|
||||
|
||||
$user = User::factory()->create();
|
||||
$technician = User::factory()->create();
|
||||
$technician->assignRole('Technicien');
|
||||
|
||||
$org = Organization::create(['name' => 'Test Commune', 'slug' => 'test-commune', 'org_type' => 'client']);
|
||||
$provider = Provider::create(['name' => 'Orange Pro']);
|
||||
|
||||
$this->actingAs($user);
|
||||
|
||||
Livewire::test('organizations.identity-card', ['organization' => $org])
|
||||
->set('technicianUserId', $technician->id)
|
||||
->set('ispName', 'Orange Pro')
|
||||
->set('publicIpsText', "203.0.113.10\n203.0.113.11")
|
||||
->call('save')
|
||||
->assertHasNoErrors();
|
||||
|
||||
$org->refresh();
|
||||
$this->assertSame($technician->id, $org->technician_user_id);
|
||||
$this->assertSame('Orange Pro', $org->isp_name);
|
||||
$this->assertSame(['203.0.113.10', '203.0.113.11'], $org->public_ips);
|
||||
|
||||
Livewire::test('organizations.identity-card', ['organization' => $org])
|
||||
->set('newProviderId', $provider->id)
|
||||
->set('newProviderLabel', 'Téléphonie')
|
||||
->call('addProvider')
|
||||
->assertHasNoErrors();
|
||||
|
||||
$this->assertCount(1, $org->providers()->get());
|
||||
|
||||
$pivotId = $org->providers()->first()->pivot->id;
|
||||
|
||||
Livewire::test('organizations.identity-card', ['organization' => $org])
|
||||
->call('removeProvider', $pivotId);
|
||||
|
||||
$this->assertCount(0, $org->providers()->get());
|
||||
}
|
||||
|
||||
public function test_clearing_the_technician_select_nulls_it_out(): void
|
||||
{
|
||||
$this->seed(\Database\Seeders\RolesAndPermissionsSeeder::class);
|
||||
|
||||
$user = User::factory()->create();
|
||||
$technician = User::factory()->create();
|
||||
$technician->assignRole('Technicien');
|
||||
|
||||
$org = Organization::create([
|
||||
'name' => 'Test Commune',
|
||||
'slug' => 'test-commune',
|
||||
'org_type' => 'client',
|
||||
'technician_user_id' => $technician->id,
|
||||
]);
|
||||
|
||||
$this->actingAs($user);
|
||||
|
||||
Livewire::test('organizations.identity-card', ['organization' => $org])
|
||||
->assertSet('technicianUserId', $technician->id)
|
||||
->set('technicianUserId', '')
|
||||
->call('save')
|
||||
->assertHasNoErrors();
|
||||
|
||||
$this->assertNull($org->refresh()->technician_user_id);
|
||||
}
|
||||
|
||||
public function test_duplicate_provider_link_with_same_label_is_rejected(): void
|
||||
{
|
||||
$this->seed(\Database\Seeders\RolesAndPermissionsSeeder::class);
|
||||
|
||||
$user = User::factory()->create();
|
||||
$org = Organization::create(['name' => 'Test Commune', 'slug' => 'test-commune', 'org_type' => 'client']);
|
||||
$provider = Provider::create(['name' => 'Orange Pro']);
|
||||
|
||||
$this->actingAs($user);
|
||||
|
||||
$org->providers()->attach($provider->id, ['label' => 'Téléphonie']);
|
||||
|
||||
Livewire::test('organizations.identity-card', ['organization' => $org])
|
||||
->set('newProviderId', $provider->id)
|
||||
->set('newProviderLabel', 'Téléphonie')
|
||||
->call('addProvider')
|
||||
->assertHasErrors('newProviderId');
|
||||
|
||||
$this->assertCount(1, $org->providers()->get());
|
||||
}
|
||||
|
||||
public function test_duplicate_provider_link_without_a_label_is_rejected(): void
|
||||
{
|
||||
$this->seed(\Database\Seeders\RolesAndPermissionsSeeder::class);
|
||||
|
||||
$user = User::factory()->create();
|
||||
$org = Organization::create(['name' => 'Test Commune', 'slug' => 'test-commune', 'org_type' => 'client']);
|
||||
$provider = Provider::create(['name' => 'Orange Pro']);
|
||||
|
||||
$this->actingAs($user);
|
||||
|
||||
$org->providers()->attach($provider->id, ['label' => null]);
|
||||
|
||||
Livewire::test('organizations.identity-card', ['organization' => $org])
|
||||
->set('newProviderId', $provider->id)
|
||||
->set('newProviderLabel', '')
|
||||
->call('addProvider')
|
||||
->assertHasErrors('newProviderId');
|
||||
|
||||
$this->assertCount(1, $org->providers()->get());
|
||||
}
|
||||
|
||||
public function test_removing_a_provider_link_is_scoped_to_its_own_organization(): void
|
||||
{
|
||||
$this->seed(\Database\Seeders\RolesAndPermissionsSeeder::class);
|
||||
|
||||
$user = User::factory()->create();
|
||||
$orgA = Organization::create(['name' => 'Commune A', 'slug' => 'commune-a', 'org_type' => 'client']);
|
||||
$orgB = Organization::create(['name' => 'Commune B', 'slug' => 'commune-b', 'org_type' => 'client']);
|
||||
$provider = Provider::create(['name' => 'Orange Pro']);
|
||||
|
||||
$orgA->providers()->attach($provider->id, ['label' => null]);
|
||||
$pivotIdA = $orgA->providers()->first()->pivot->id;
|
||||
|
||||
$this->actingAs($user);
|
||||
|
||||
Livewire::test('organizations.identity-card', ['organization' => $orgB])
|
||||
->call('removeProvider', $pivotIdA);
|
||||
|
||||
$this->assertCount(1, $orgA->providers()->get());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\Provider;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Livewire\Livewire;
|
||||
use Tests\TestCase;
|
||||
|
||||
class ProviderTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
public function test_provider_index_page_renders_for_an_authenticated_user(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
|
||||
$response = $this->actingAs($user)->get(route('providers.index'));
|
||||
|
||||
$response->assertOk();
|
||||
$response->assertSee('Prestataires');
|
||||
}
|
||||
|
||||
public function test_can_create_a_provider(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
$this->actingAs($user);
|
||||
|
||||
Livewire::test('providers.form')
|
||||
->set('name', 'Orange Pro')
|
||||
->set('phone', '09 70 00 00 00')
|
||||
->set('email', 'contact@orange-pro.fr')
|
||||
->call('save')
|
||||
->assertHasNoErrors();
|
||||
|
||||
$this->assertDatabaseHas('providers', ['name' => 'Orange Pro', 'email' => 'contact@orange-pro.fr']);
|
||||
}
|
||||
|
||||
public function test_blank_optional_fields_are_stored_as_null_not_empty_strings(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
$this->actingAs($user);
|
||||
|
||||
Livewire::test('providers.form')
|
||||
->set('name', 'Minimal Provider')
|
||||
->call('save')
|
||||
->assertHasNoErrors();
|
||||
|
||||
$provider = Provider::where('name', 'Minimal Provider')->firstOrFail();
|
||||
$this->assertNull($provider->phone);
|
||||
$this->assertNull($provider->email);
|
||||
$this->assertNull($provider->website);
|
||||
$this->assertNull($provider->notes);
|
||||
}
|
||||
|
||||
public function test_can_add_a_log_entry_to_a_provider(): void
|
||||
{
|
||||
$user = User::factory()->create();
|
||||
$provider = Provider::create(['name' => 'Orange Pro']);
|
||||
|
||||
$this->actingAs($user);
|
||||
|
||||
Livewire::test('providers.form', ['provider' => $provider])
|
||||
->set('newLogCategory', 'contact')
|
||||
->set('newLogNote', "Mail envoyé le 21/08 pour demander des précisions sur le contrat.")
|
||||
->call('addLogEntry')
|
||||
->assertHasNoErrors();
|
||||
|
||||
$this->assertDatabaseHas('provider_log_entries', [
|
||||
'provider_id' => $provider->id,
|
||||
'category' => 'contact',
|
||||
'created_by' => $user->id,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Tests\TestCase;
|
||||
|
||||
class SettingsEnvPageTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
public function test_admin_settings_page_renders_with_the_new_drawio_section(): void
|
||||
{
|
||||
$this->seed(\Database\Seeders\RolesAndPermissionsSeeder::class);
|
||||
|
||||
$admin = User::factory()->create();
|
||||
$admin->assignRole('Administrateur');
|
||||
|
||||
$response = $this->actingAs($admin)->get(route('settings.env'));
|
||||
|
||||
$response->assertOk();
|
||||
$response->assertSee('Draw.io');
|
||||
$response->assertSee('DRAWIO_URL');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user