Files
RelaisSMS/tests/Feature/SmsCampaignHistoryTest.php

129 lines
4.1 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\ContactGroup;
use App\Models\SmsCampaign;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class SmsCampaignHistoryTest extends TestCase
{
use RefreshDatabase;
public function test_history_can_be_filtered_by_status_user_group_and_dates(): void
{
$user = User::factory()->create(['name' => 'Alice Admin']);
$otherUser = User::factory()->create(['name' => 'Bob Admin']);
$group = ContactGroup::query()->create([
'source' => 'local',
'name' => 'Benevoles',
'slug' => 'benevoles',
]);
$matchingCampaign = $this->createCampaign($user, [
'message' => 'Message filtre',
'status' => 'sent',
'selected_group_ids' => [$group->id],
'selected_group_names' => [$group->name],
]);
$this->createCampaign($otherUser, [
'message' => 'Message hors filtre',
'status' => 'failed',
])->forceFill([
'created_at' => now()->subDays(10),
])->save();
$this->actingAs($user)
->get(route('sms-campaigns.index', [
'from' => now()->subDay()->toDateString(),
'to' => now()->addDay()->toDateString(),
'status' => 'sent',
'user_id' => $user->id,
'group_id' => $group->id,
]))
->assertOk()
->assertSee($matchingCampaign->message)
->assertSee('Benevoles')
->assertDontSee('Message hors filtre');
}
public function test_history_export_uses_current_filters(): void
{
$user = User::factory()->create();
$group = ContactGroup::query()->create([
'source' => 'local',
'name' => 'Membres',
'slug' => 'membres',
]);
$this->createCampaign($user, [
'message' => 'Message exporte',
'status' => 'sent',
'selected_group_ids' => [$group->id],
'selected_group_names' => [$group->name],
]);
$this->createCampaign($user, [
'message' => 'Message ignore',
'status' => 'sent',
]);
$response = $this->actingAs($user)
->get(route('sms-campaigns.export', ['group_id' => $group->id]))
->assertOk();
$csv = $response->streamedContent();
$this->assertStringContainsString('Message exporte', $csv);
$this->assertStringContainsString('Membres', $csv);
$this->assertStringNotContainsString('Message ignore', $csv);
}
public function test_expired_sms_history_can_be_pruned(): void
{
config(['relais_sms.default_settings.history_retention_years' => 3]);
$user = User::factory()->create();
$expired = $this->createCampaign($user, ['message' => 'Ancienne campagne'])
->forceFill(['created_at' => now()->subYears(4)]);
$expired->save();
$recent = $this->createCampaign($user, ['message' => 'Campagne recente']);
$this->artisan('sms-campaigns:prune-history')
->assertExitCode(0);
$this->assertDatabaseMissing('sms_campaigns', ['id' => $expired->id]);
$this->assertDatabaseHas('sms_campaigns', ['id' => $recent->id]);
}
/**
* @param array<string, mixed> $attributes
*/
private function createCampaign(User $user, array $attributes = []): SmsCampaign
{
$campaign = SmsCampaign::query()->create(array_merge([
'user_id' => $user->id,
'provider' => 'ovh',
'status' => 'sent',
'message' => 'Message',
'recipients_count' => 1,
'sent_count' => 1,
'failed_count' => 0,
'sent_at' => now(),
], $attributes));
$campaign->deliveries()->create([
'contact_name' => 'Marie Durand',
'number' => '+33611111111',
'status' => 'sent',
'provider_message_id' => 'message-123',
'sent_at' => now(),
]);
return $campaign;
}
}