++ proclamatori senza email e telefono; il link si copia o si condivide
- Migrazione: tolte le colonne email e telefono dei proclamatori (vuote in produzione). Tolti da form, scheda, elenco, XML (un file vecchio si importa ignorandoli). - Invio del link: solo "Copia link" e "Condividi…" (menu di condivisione del telefono, navigator.share): il destinatario lo sceglie chi usa l'app. Via WhatsApp diretto, canale email, notifica LinkTerritorio, componente x-whatsapp. - Elenco assegnati: "Condividi" al posto di WhatsApp; a condivisione fatta il link risulta inviato. - Informativa privacy, README, HANDOFF e test aggiornati. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -41,14 +41,14 @@ class AssegnaPrestazioniTest extends TestCase
|
||||
$this->admin->assignRole('amministratore');
|
||||
}
|
||||
|
||||
/** $n assegnazioni aperte, ognuna con PDF e un proclamatore con telefono. */
|
||||
/** $n assegnazioni aperte, ognuna con PDF. */
|
||||
private function assegnazioni(int $n): void
|
||||
{
|
||||
$zona = Zona::create(['nome' => 'Montepellegrino', 'attivo' => true]);
|
||||
for ($i = 1; $i <= $n; $i++) {
|
||||
Storage::disk('public')->put("territori-pdf/t{$i}.pdf", '%PDF-1.4');
|
||||
$t = Territorio::create(['numero' => (string) $i, 'attivo' => true, 'zona_id' => $zona->id, 'pdf_path' => "territori-pdf/t{$i}.pdf"]);
|
||||
$p = Proclamatore::create(['nome' => "Nicolò{$i}", 'cognome' => 'Rossi', 'attivo' => true, 'telefono' => '3331234567']);
|
||||
$p = Proclamatore::create(['nome' => "Nicolò{$i}", 'cognome' => 'Rossi', 'attivo' => true]);
|
||||
Assegnazione::create([
|
||||
'territorio_id' => $t->id, 'proclamatore_id' => $p->id, 'anno_teocratico_id' => AnnoTeocratico::sole()->id,
|
||||
'assigned_at' => now()->subDays($i), 'created_by' => $this->admin->id,
|
||||
|
||||
@@ -1,337 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Livewire\Assegnazioni\Assegna;
|
||||
use App\Livewire\Assegnazioni\ElencoAssegnati;
|
||||
use App\Livewire\Proclamatori\ProclamatoreCreate;
|
||||
use App\Livewire\Settings\XmlExchange;
|
||||
use App\Models\AnnoTeocratico;
|
||||
use App\Models\Assegnazione;
|
||||
use App\Models\Proclamatore;
|
||||
use App\Models\Setting;
|
||||
use App\Models\Territorio;
|
||||
use App\Models\User;
|
||||
use App\Notifications\LinkTerritorio;
|
||||
use Database\Seeders\RolesAndPermissionsSeeder;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Notification;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Livewire\Livewire;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* Email e telefono dei proclamatori (facoltativi), WhatsApp, e il riquadro
|
||||
* con il link da mandare subito dopo l'assegnazione.
|
||||
*/
|
||||
class ContattiProclamatoriTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
private User $admin;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->withoutVite();
|
||||
Storage::fake('public');
|
||||
$this->seed(RolesAndPermissionsSeeder::class);
|
||||
Setting::firstOrCreate([], ['congregazione_nome' => 'Congregazione di prova']);
|
||||
AnnoTeocratico::create(['label' => '2026-2027', 'start_date' => '2026-09-01', 'end_date' => '2027-08-31']);
|
||||
|
||||
$this->admin = User::create(['name' => 'Admin', 'email' => 'admin@example.test', 'password' => 'password-di-prova']);
|
||||
$this->admin->assignRole('amministratore');
|
||||
}
|
||||
|
||||
// ─── Contatti ───────────────────────────────────────────────
|
||||
|
||||
public function test_email_e_telefono_sono_facoltativi_e_cifrati(): void
|
||||
{
|
||||
Livewire::actingAs($this->admin)->test(ProclamatoreCreate::class)
|
||||
->set('nome', 'Mario')->set('cognome', 'Rossi')
|
||||
->call('save')
|
||||
->assertHasNoErrors();
|
||||
|
||||
Livewire::actingAs($this->admin)->test(ProclamatoreCreate::class)
|
||||
->set('nome', 'Anna')->set('cognome', 'Verdi')
|
||||
->set('email', 'anna@example.test')
|
||||
->set('telefono', '333 123 4567')
|
||||
->call('save')
|
||||
->assertHasNoErrors();
|
||||
|
||||
$anna = Proclamatore::all()->first(fn ($p) => $p->nome === 'Anna');
|
||||
$this->assertSame('anna@example.test', $anna->email);
|
||||
$this->assertSame('333 123 4567', $anna->telefono);
|
||||
|
||||
$riga = DB::table('proclamatori')->where('id', $anna->id)->first();
|
||||
$this->assertStringNotContainsString('anna@', $riga->email);
|
||||
$this->assertStringNotContainsString('333', $riga->telefono);
|
||||
}
|
||||
|
||||
public function test_un_email_sbagliata_si_segnala_ma_si_puo_lasciare_vuota(): void
|
||||
{
|
||||
Livewire::actingAs($this->admin)->test(ProclamatoreCreate::class)
|
||||
->set('nome', 'Mario')->set('cognome', 'Rossi')
|
||||
->set('email', 'non-una-email')
|
||||
->call('save')
|
||||
->assertHasErrors('email');
|
||||
|
||||
$this->assertSame(0, Proclamatore::count());
|
||||
}
|
||||
|
||||
#[DataProvider('numeri')]
|
||||
public function test_il_numero_diventa_internazionale_per_whatsapp(string $scritto, ?string $atteso): void
|
||||
{
|
||||
$p = new Proclamatore(['nome' => 'A', 'cognome' => 'B', 'telefono' => $scritto]);
|
||||
|
||||
$this->assertSame($atteso, $p->telefonoInternazionale());
|
||||
$this->assertSame($atteso ? 'https://wa.me/' . $atteso : null, $p->whatsappUrl());
|
||||
}
|
||||
|
||||
public static function numeri(): array
|
||||
{
|
||||
return [
|
||||
'cellulare italiano' => ['333 123 4567', '393331234567'],
|
||||
'con +39' => ['+39 333 1234567', '393331234567'],
|
||||
'con 0039' => ['0039 3331234567', '393331234567'],
|
||||
'39 senza +' => ['393331234567', '393331234567'],
|
||||
'cellulare che inizia con 39' => ['392 1234567', '393921234567'],
|
||||
'fisso italiano' => ['06 12345678', '390612345678'],
|
||||
'estero' => ['+44 7911 123456', '447911123456'],
|
||||
'troppo corto' => ['123', null],
|
||||
'vuoto' => ['', null],
|
||||
];
|
||||
}
|
||||
|
||||
public function test_il_messaggio_whatsapp_contiene_il_link(): void
|
||||
{
|
||||
$p = new Proclamatore(['nome' => 'A', 'cognome' => 'B', 'telefono' => '3331234567']);
|
||||
|
||||
$this->assertSame(
|
||||
'https://wa.me/393331234567?text=' . rawurlencode('Ecco: https://x.test/p/AB12'),
|
||||
$p->whatsappUrl('Ecco: https://x.test/p/AB12'),
|
||||
);
|
||||
}
|
||||
|
||||
public function test_anonimizzare_cancella_anche_i_contatti(): void
|
||||
{
|
||||
$p = Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true, 'email' => 'm@example.test', 'telefono' => '3331234567']);
|
||||
|
||||
$p->anonimizza();
|
||||
|
||||
$p = Proclamatore::withTrashed()->find($p->id);
|
||||
$this->assertNull($p->email);
|
||||
$this->assertNull($p->telefono);
|
||||
}
|
||||
|
||||
public function test_l_xml_porta_con_se_i_contatti(): void
|
||||
{
|
||||
$this->actingAs($this->admin);
|
||||
Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true, 'email' => 'm@example.test', 'telefono' => '3331234567']);
|
||||
|
||||
$xml = (new XmlExchange())->currentXmlBackup();
|
||||
$this->assertArrayNotHasKey('error', (new XmlExchange())->importXmlFromContent($xml));
|
||||
|
||||
$p = Proclamatore::sole();
|
||||
$this->assertSame('m@example.test', $p->email);
|
||||
$this->assertSame('3331234567', $p->telefono);
|
||||
}
|
||||
|
||||
// ─── Dopo l'assegnazione ────────────────────────────────────
|
||||
|
||||
private function assegna(Proclamatore $proclamatore, Territorio $territorio)
|
||||
{
|
||||
return Livewire::actingAs($this->admin)->test(Assegna::class)
|
||||
->set('territorio_id', $territorio->id)
|
||||
->set('proclamatore_id', $proclamatore->id)
|
||||
->set('assigned_at', now()->format('Y-m-d'))
|
||||
->call('save');
|
||||
}
|
||||
|
||||
private function territorioConPdf(string $numero = '7'): Territorio
|
||||
{
|
||||
Storage::disk('public')->put("territori-pdf/t{$numero}.pdf", '%PDF-1.4');
|
||||
|
||||
return Territorio::create(['numero' => $numero, 'attivo' => true, 'pdf_path' => "territori-pdf/t{$numero}.pdf"]);
|
||||
}
|
||||
|
||||
public function test_dopo_l_assegnazione_non_si_va_avanti_ma_si_sceglie_il_canale(): void
|
||||
{
|
||||
$mario = Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true, 'telefono' => '333 1234567']);
|
||||
|
||||
$pagina = $this->assegna($mario, $this->territorioConPdf())
|
||||
->assertHasNoErrors()
|
||||
->assertNoRedirect();
|
||||
|
||||
$assegnazione = Assegnazione::sole();
|
||||
$this->assertTrue($assegnazione->link_da_inviare);
|
||||
$this->assertFalse($assegnazione->link_sent);
|
||||
|
||||
$link = $assegnazione->shortPdfUrl();
|
||||
$pagina->assertSet('invioId', $assegnazione->id)
|
||||
->assertSee('Territorio N° 7 assegnato a Rossi Mario')
|
||||
->assertSee('Come vuoi mandare il link della piantina?')
|
||||
->assertSee($link)
|
||||
->assertSee('https://wa.me/393331234567?text=', false)
|
||||
->assertSee(rawurlencode($link), false)
|
||||
->assertSee('Hai inviato il link?');
|
||||
}
|
||||
|
||||
public function test_si_dice_inviato_solo_dopo_aver_scelto_un_canale(): void
|
||||
{
|
||||
$mario = Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true, 'telefono' => '3331234567']);
|
||||
|
||||
$this->assegna($mario, $this->territorioConPdf())
|
||||
->call('concludiInvio', true)
|
||||
->assertNoRedirect()
|
||||
->assertSet('erroreInvio', 'Scegli prima come mandare il link.')
|
||||
->call('canale', 'whatsapp')
|
||||
->call('concludiInvio', true)
|
||||
->assertRedirect(route('assegnazioni.assegna'));
|
||||
|
||||
$assegnazione = Assegnazione::sole();
|
||||
$this->assertTrue($assegnazione->link_sent);
|
||||
$this->assertFalse($assegnazione->link_da_inviare);
|
||||
$this->assertSame('whatsapp', $assegnazione->link_canale);
|
||||
|
||||
$log = \Spatie\Activitylog\Models\Activity::where('description', 'link_inviato')->sole();
|
||||
$this->assertSame('whatsapp', $log->properties['canale']);
|
||||
$this->assertSame($mario->id, $log->properties['proclamatore_id']);
|
||||
$this->assertStringNotContainsString('333', json_encode($log->properties));
|
||||
}
|
||||
|
||||
public function test_senza_contatti_resta_solo_copia_link(): void
|
||||
{
|
||||
$anna = Proclamatore::create(['nome' => 'Anna', 'cognome' => 'Verdi', 'attivo' => true]);
|
||||
|
||||
$this->assegna($anna, $this->territorioConPdf())
|
||||
->assertSee('Copia link')
|
||||
// Testo scritto nel template, non {{ }}: l'apostrofo esce com'è.
|
||||
->assertSee('nel profilo non c\'è un numero di telefono', false)
|
||||
->assertSee('nel profilo non c\'è un indirizzo email', false)
|
||||
->assertDontSee('wa.me', false)
|
||||
// WhatsApp senza numero non si può segnare come canale usato.
|
||||
->call('canale', 'whatsapp')
|
||||
->assertSet('canaleUsato', null)
|
||||
->call('canale', 'copia')
|
||||
->assertSet('canaleUsato', 'copia');
|
||||
}
|
||||
|
||||
public function test_l_email_parte_solo_con_indirizzo_e_posta_configurata(): void
|
||||
{
|
||||
Notification::fake();
|
||||
$anna = Proclamatore::create(['nome' => 'Anna', 'cognome' => 'Verdi', 'attivo' => true, 'email' => 'anna@example.test']);
|
||||
|
||||
// Posta non configurata: il canale c'è ma è spento, e non parte nulla.
|
||||
$pagina = $this->assegna($anna, $this->territorioConPdf())
|
||||
->assertSee('il server di posta non è configurato')
|
||||
->call('inviaEmail')
|
||||
->assertSet('canaleUsato', null);
|
||||
Notification::assertNothingSent();
|
||||
|
||||
// Posta configurata dall'app: l'email parte, subito e non in coda.
|
||||
Setting::instance()->update(['mail_host' => 'smtp.example.test', 'mail_port' => 587, 'mail_from_address' => 'noreply@example.test']);
|
||||
$pagina->call('inviaEmail')->assertSet('canaleUsato', 'email');
|
||||
|
||||
Notification::assertSentOnDemand(LinkTerritorio::class, function ($notifica, $canali, $destinatario) {
|
||||
return $destinatario->routes['mail'] === 'anna@example.test';
|
||||
});
|
||||
}
|
||||
|
||||
public function test_se_non_si_conclude_l_invio_l_assegnazione_lo_segnala(): void
|
||||
{
|
||||
$mario = Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true]);
|
||||
$this->assegna($mario, $this->territorioConPdf());
|
||||
$assegnazione = Assegnazione::sole();
|
||||
|
||||
// La pagina viene chiusa senza rispondere: l'invio è perso, l'avviso resta
|
||||
// nell'elenco, e "Invia link" chiede alla pagina di riaprirlo.
|
||||
Livewire::withoutLazyLoading()->actingAs($this->admin)->test(ElencoAssegnati::class)
|
||||
->assertSee('Link ancora da inviare')
|
||||
->assertSeeHtml("\$dispatch('apri-invio', { assegnazioneId: {$assegnazione->id} })");
|
||||
|
||||
Livewire::actingAs($this->admin)->test(Assegna::class)
|
||||
->assertSet('invioId', null)
|
||||
->dispatch('apri-invio', assegnazioneId: $assegnazione->id)
|
||||
->assertSee('Hai inviato il link?')
|
||||
->call('concludiInvio', false)
|
||||
->assertRedirect(route('assegnazioni.assegna'));
|
||||
|
||||
// "No, non ancora": la procedura è finita, ma il link resta da inviare.
|
||||
$this->assertTrue($assegnazione->fresh()->link_in_sospeso);
|
||||
$this->get(route('territori.show', $assegnazione->territorio_id))
|
||||
->assertSee('Il link della piantina è ancora da inviare');
|
||||
|
||||
// Segnato come inviato dall'elenco: l'avviso sparisce.
|
||||
Livewire::withoutLazyLoading()->actingAs($this->admin)->test(ElencoAssegnati::class)
|
||||
->call('toggleLinkSent', $assegnazione->id)
|
||||
->assertDontSee('Link ancora da inviare');
|
||||
$this->assertFalse($assegnazione->fresh()->link_in_sospeso);
|
||||
}
|
||||
|
||||
public function test_dalla_scheda_territorio_si_riprende_l_invio(): void
|
||||
{
|
||||
$mario = Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true]);
|
||||
$this->assegna($mario, $this->territorioConPdf());
|
||||
$assegnazione = Assegnazione::sole();
|
||||
|
||||
$this->actingAs($this->admin)
|
||||
->get(route('assegnazioni.assegna', ['invia' => $assegnazione->id]))
|
||||
->assertOk()
|
||||
->assertSee('Hai inviato il link?');
|
||||
}
|
||||
|
||||
public function test_senza_pdf_non_c_e_un_link_da_inviare(): void
|
||||
{
|
||||
$anna = Proclamatore::create(['nome' => 'Anna', 'cognome' => 'Verdi', 'attivo' => true]);
|
||||
$territorio = Territorio::create(['numero' => '9', 'attivo' => true]);
|
||||
|
||||
$this->assegna($anna, $territorio)
|
||||
->assertSee('non ha un PDF')
|
||||
->call('concludiInvio', false);
|
||||
|
||||
$this->assertFalse(Assegnazione::sole()->link_in_sospeso);
|
||||
}
|
||||
|
||||
public function test_le_assegnazioni_gia_esistenti_non_vengono_segnalate(): void
|
||||
{
|
||||
$mario = Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true]);
|
||||
$territorio = $this->territorioConPdf();
|
||||
$vecchia = Assegnazione::create([
|
||||
'territorio_id' => $territorio->id,
|
||||
'proclamatore_id' => $mario->id,
|
||||
'anno_teocratico_id' => AnnoTeocratico::sole()->id,
|
||||
'assigned_at' => now(),
|
||||
'created_by' => $this->admin->id,
|
||||
]);
|
||||
|
||||
$this->assertFalse($vecchia->fresh()->link_in_sospeso);
|
||||
}
|
||||
|
||||
public function test_l_xml_porta_con_se_lo_stato_dell_invio(): void
|
||||
{
|
||||
$this->actingAs($this->admin);
|
||||
$mario = Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true]);
|
||||
$this->assegna($mario, $this->territorioConPdf())->call('canale', 'copia')->call('concludiInvio', true);
|
||||
|
||||
$xml = (new XmlExchange())->currentXmlBackup();
|
||||
$this->assertArrayNotHasKey('error', (new XmlExchange())->importXmlFromContent($xml));
|
||||
|
||||
$assegnazione = Assegnazione::sole();
|
||||
$this->assertTrue($assegnazione->link_sent);
|
||||
$this->assertFalse($assegnazione->link_da_inviare);
|
||||
$this->assertSame('copia', $assegnazione->link_canale);
|
||||
}
|
||||
|
||||
// ─── Nuovo territorio dal designer ──────────────────────────
|
||||
|
||||
public function test_nuovo_territorio_porta_al_designer_delle_piantine(): void
|
||||
{
|
||||
$this->actingAs($this->admin)
|
||||
->get(route('territori.index'))
|
||||
->assertSee(route('piantine.editor', ['nuovo' => 1]), false);
|
||||
}
|
||||
|
||||
}
|
||||
263
tests/Feature/InvioLinkTest.php
Normal file
263
tests/Feature/InvioLinkTest.php
Normal file
@@ -0,0 +1,263 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Livewire\Assegnazioni\Assegna;
|
||||
use App\Livewire\Assegnazioni\ElencoAssegnati;
|
||||
use App\Livewire\Proclamatori\ProclamatoreCreate;
|
||||
use App\Livewire\Settings\XmlExchange;
|
||||
use App\Models\AnnoTeocratico;
|
||||
use App\Models\Assegnazione;
|
||||
use App\Models\Proclamatore;
|
||||
use App\Models\Setting;
|
||||
use App\Models\Territorio;
|
||||
use App\Models\User;
|
||||
use Database\Seeders\RolesAndPermissionsSeeder;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Livewire\Livewire;
|
||||
use Spatie\Activitylog\Models\Activity;
|
||||
use Tests\TestCase;
|
||||
|
||||
/**
|
||||
* L'invio del link della piantina dopo l'assegnazione: copia link o
|
||||
* "Condividi" (menu del telefono), con il destinatario scelto da chi usa
|
||||
* l'app. I proclamatori non hanno più email né telefono (19 ottobre 2026).
|
||||
*/
|
||||
class InvioLinkTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
private User $admin;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->withoutVite();
|
||||
Storage::fake('public');
|
||||
$this->seed(RolesAndPermissionsSeeder::class);
|
||||
Setting::firstOrCreate([], ['congregazione_nome' => 'Congregazione di prova']);
|
||||
AnnoTeocratico::create(['label' => '2026-2027', 'start_date' => '2026-09-01', 'end_date' => '2027-08-31']);
|
||||
|
||||
$this->admin = User::create(['name' => 'Admin', 'email' => 'admin@example.test', 'password' => 'password-di-prova']);
|
||||
$this->admin->assignRole('amministratore');
|
||||
}
|
||||
|
||||
private function assegna(Proclamatore $proclamatore, Territorio $territorio)
|
||||
{
|
||||
return Livewire::actingAs($this->admin)->test(Assegna::class)
|
||||
->set('territorio_id', $territorio->id)
|
||||
->set('proclamatore_id', $proclamatore->id)
|
||||
->set('assigned_at', now()->format('Y-m-d'))
|
||||
->call('save');
|
||||
}
|
||||
|
||||
private function territorioConPdf(string $numero = '7'): Territorio
|
||||
{
|
||||
Storage::disk('public')->put("territori-pdf/t{$numero}.pdf", '%PDF-1.4');
|
||||
|
||||
return Territorio::create(['numero' => $numero, 'attivo' => true, 'pdf_path' => "territori-pdf/t{$numero}.pdf"]);
|
||||
}
|
||||
|
||||
private function mario(): Proclamatore
|
||||
{
|
||||
return Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true]);
|
||||
}
|
||||
|
||||
// ─── Niente contatti nei proclamatori ───────────────────────
|
||||
|
||||
public function test_i_proclamatori_non_hanno_ne_email_ne_telefono(): void
|
||||
{
|
||||
$this->assertFalse(Schema::hasColumn('proclamatori', 'email'));
|
||||
$this->assertFalse(Schema::hasColumn('proclamatori', 'telefono'));
|
||||
|
||||
$this->actingAs($this->admin)->get(route('proclamatori.create'))
|
||||
->assertOk()
|
||||
->assertDontSee('id="telefono"', false)
|
||||
->assertDontSee('id="email"', false);
|
||||
|
||||
Livewire::actingAs($this->admin)->test(ProclamatoreCreate::class)
|
||||
->set('nome', 'Anna')->set('cognome', 'Verdi')
|
||||
->call('save')
|
||||
->assertHasNoErrors();
|
||||
$this->assertSame(['Verdi Anna'], Proclamatore::all()->map->nome_completo->all());
|
||||
}
|
||||
|
||||
public function test_un_xml_vecchio_con_email_e_telefono_si_importa_ignorandoli(): void
|
||||
{
|
||||
$this->actingAs($this->admin);
|
||||
$this->mario();
|
||||
$xml = (new XmlExchange())->currentXmlBackup();
|
||||
$vecchio = str_replace('<cognome>', '<email>m@example.test</email><telefono>3331234567</telefono><cognome>', $xml);
|
||||
|
||||
$this->assertArrayNotHasKey('error', (new XmlExchange())->importXmlFromContent($vecchio));
|
||||
$this->assertSame('Rossi Mario', Proclamatore::sole()->nome_completo);
|
||||
$this->assertStringNotContainsString('<telefono>', (new XmlExchange())->currentXmlBackup());
|
||||
}
|
||||
|
||||
// ─── Dopo l'assegnazione ────────────────────────────────────
|
||||
|
||||
public function test_dopo_l_assegnazione_si_sceglie_tra_copia_link_e_condividi(): void
|
||||
{
|
||||
$pagina = $this->assegna($this->mario(), $this->territorioConPdf())
|
||||
->assertHasNoErrors()
|
||||
->assertNoRedirect();
|
||||
|
||||
$assegnazione = Assegnazione::sole();
|
||||
$this->assertTrue($assegnazione->link_da_inviare);
|
||||
$this->assertFalse($assegnazione->link_sent);
|
||||
|
||||
$link = $assegnazione->shortPdfUrl();
|
||||
$pagina->assertSet('invioId', $assegnazione->id)
|
||||
->assertSee('Territorio N° 7 assegnato a Rossi Mario')
|
||||
->assertSee('Come vuoi mandare il link della piantina?')
|
||||
->assertSee($link)
|
||||
->assertSee('Copia link')
|
||||
->assertSee('Condividi…')
|
||||
// Il messaggio per "Condividi", con il link.
|
||||
->assertSeeHtml('data-messaggio="Ciao Mario, ti è stato assegnato il territorio N° 7. Ecco la piantina: ' . e($link) . '"')
|
||||
->assertDontSee('wa.me', false)
|
||||
->assertDontSee('WhatsApp')
|
||||
->assertSee('Hai inviato il link?');
|
||||
}
|
||||
|
||||
public function test_si_dice_inviato_solo_dopo_aver_scelto_un_canale(): void
|
||||
{
|
||||
$mario = $this->mario();
|
||||
|
||||
$this->assegna($mario, $this->territorioConPdf())
|
||||
->call('concludiInvio', true)
|
||||
->assertNoRedirect()
|
||||
->assertSet('erroreInvio', 'Scegli prima come mandare il link.')
|
||||
->call('canale', 'condividi')
|
||||
->call('concludiInvio', true)
|
||||
->assertRedirect(route('assegnazioni.assegna'));
|
||||
|
||||
$assegnazione = Assegnazione::sole();
|
||||
$this->assertTrue($assegnazione->link_sent);
|
||||
$this->assertFalse($assegnazione->link_da_inviare);
|
||||
$this->assertSame('condividi', $assegnazione->link_canale);
|
||||
|
||||
$log = Activity::where('description', 'link_inviato')->sole();
|
||||
$this->assertSame('condividi', $log->properties['canale']);
|
||||
$this->assertSame($mario->id, $log->properties['proclamatore_id']);
|
||||
$this->assertStringNotContainsString('Rossi', json_encode($log->properties));
|
||||
}
|
||||
|
||||
public function test_whatsapp_ed_email_non_sono_piu_canali(): void
|
||||
{
|
||||
$this->assegna($this->mario(), $this->territorioConPdf())
|
||||
->call('canale', 'whatsapp')
|
||||
->assertSet('canaleUsato', null)
|
||||
->call('canale', 'email')
|
||||
->assertSet('canaleUsato', null)
|
||||
->call('canale', 'copia')
|
||||
->assertSet('canaleUsato', 'copia');
|
||||
|
||||
$this->assertSame(['copia', 'condividi'], Assegnazione::CANALI_ATTIVI);
|
||||
}
|
||||
|
||||
public function test_se_non_si_conclude_l_invio_l_assegnazione_lo_segnala(): void
|
||||
{
|
||||
$this->assegna($this->mario(), $this->territorioConPdf());
|
||||
$assegnazione = Assegnazione::sole();
|
||||
|
||||
// La pagina viene chiusa senza rispondere: l'invio è perso, l'avviso resta
|
||||
// nell'elenco, e "Invia link" chiede alla pagina di riaprirlo.
|
||||
Livewire::withoutLazyLoading()->actingAs($this->admin)->test(ElencoAssegnati::class)
|
||||
->assertSee('Link ancora da inviare')
|
||||
->assertSeeHtml("\$dispatch('apri-invio', { assegnazioneId: {$assegnazione->id} })");
|
||||
|
||||
Livewire::actingAs($this->admin)->test(Assegna::class)
|
||||
->assertSet('invioId', null)
|
||||
->dispatch('apri-invio', assegnazioneId: $assegnazione->id)
|
||||
->assertSee('Hai inviato il link?')
|
||||
->call('concludiInvio', false)
|
||||
->assertRedirect(route('assegnazioni.assegna'));
|
||||
|
||||
// "No, non ancora": la procedura è finita, ma il link resta da inviare.
|
||||
$this->assertTrue($assegnazione->fresh()->link_in_sospeso);
|
||||
$this->get(route('territori.show', $assegnazione->territorio_id))
|
||||
->assertSee('Il link della piantina è ancora da inviare');
|
||||
|
||||
// Segnato come inviato dall'elenco: l'avviso sparisce.
|
||||
Livewire::withoutLazyLoading()->actingAs($this->admin)->test(ElencoAssegnati::class)
|
||||
->call('toggleLinkSent', $assegnazione->id)
|
||||
->assertDontSee('Link ancora da inviare');
|
||||
$this->assertFalse($assegnazione->fresh()->link_in_sospeso);
|
||||
}
|
||||
|
||||
public function test_condividere_dall_elenco_segna_il_link_come_inviato(): void
|
||||
{
|
||||
$this->assegna($this->mario(), $this->territorioConPdf());
|
||||
$assegnazione = Assegnazione::sole();
|
||||
|
||||
Livewire::withoutLazyLoading()->actingAs($this->admin)->test(ElencoAssegnati::class)
|
||||
->assertSeeHtml('data-id="' . $assegnazione->id . '"')
|
||||
->assertDontSee('wa.me', false)
|
||||
->call('segnaCondiviso', $assegnazione->id)
|
||||
->assertDontSee('Link ancora da inviare');
|
||||
|
||||
$this->assertTrue($assegnazione->fresh()->link_sent);
|
||||
$this->assertSame('condividi', $assegnazione->fresh()->link_canale);
|
||||
}
|
||||
|
||||
public function test_dalla_scheda_territorio_si_riprende_l_invio(): void
|
||||
{
|
||||
$this->assegna($this->mario(), $this->territorioConPdf());
|
||||
$assegnazione = Assegnazione::sole();
|
||||
|
||||
$this->actingAs($this->admin)
|
||||
->get(route('assegnazioni.assegna', ['invia' => $assegnazione->id]))
|
||||
->assertOk()
|
||||
->assertSee('Hai inviato il link?');
|
||||
}
|
||||
|
||||
public function test_senza_pdf_non_c_e_un_link_da_inviare(): void
|
||||
{
|
||||
$territorio = Territorio::create(['numero' => '9', 'attivo' => true]);
|
||||
|
||||
$this->assegna($this->mario(), $territorio)
|
||||
->assertSee('non ha un PDF')
|
||||
->call('concludiInvio', false);
|
||||
|
||||
$this->assertFalse(Assegnazione::sole()->link_in_sospeso);
|
||||
}
|
||||
|
||||
public function test_le_assegnazioni_gia_esistenti_non_vengono_segnalate(): void
|
||||
{
|
||||
$vecchia = Assegnazione::create([
|
||||
'territorio_id' => $this->territorioConPdf()->id,
|
||||
'proclamatore_id' => $this->mario()->id,
|
||||
'anno_teocratico_id' => AnnoTeocratico::sole()->id,
|
||||
'assigned_at' => now(),
|
||||
'created_by' => $this->admin->id,
|
||||
]);
|
||||
|
||||
$this->assertFalse($vecchia->fresh()->link_in_sospeso);
|
||||
}
|
||||
|
||||
public function test_l_xml_porta_con_se_lo_stato_dell_invio(): void
|
||||
{
|
||||
$this->actingAs($this->admin);
|
||||
$this->assegna($this->mario(), $this->territorioConPdf())->call('canale', 'copia')->call('concludiInvio', true);
|
||||
|
||||
$xml = (new XmlExchange())->currentXmlBackup();
|
||||
$this->assertArrayNotHasKey('error', (new XmlExchange())->importXmlFromContent($xml));
|
||||
|
||||
$assegnazione = Assegnazione::sole();
|
||||
$this->assertTrue($assegnazione->link_sent);
|
||||
$this->assertFalse($assegnazione->link_da_inviare);
|
||||
$this->assertSame('copia', $assegnazione->link_canale);
|
||||
}
|
||||
|
||||
// ─── Nuovo territorio dal designer ──────────────────────────
|
||||
|
||||
public function test_nuovo_territorio_porta_al_designer_delle_piantine(): void
|
||||
{
|
||||
$this->actingAs($this->admin)
|
||||
->get(route('territori.index'))
|
||||
->assertSee(route('piantine.editor', ['nuovo' => 1]), false);
|
||||
}
|
||||
}
|
||||
@@ -73,13 +73,13 @@ class PrivacyTest extends TestCase
|
||||
public function test_conta_i_dati_conservati_senza_mostrarli(): void
|
||||
{
|
||||
Setting::firstOrCreate([], ['congregazione_nome' => 'Prova']);
|
||||
Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true, 'email' => 'mario@example.test', 'telefono' => '3331234567']);
|
||||
Proclamatore::create(['nome' => 'Mario', 'cognome' => 'Rossi', 'attivo' => true]);
|
||||
Proclamatore::create(['nome' => 'Anna', 'cognome' => 'Verdi', 'attivo' => false]);
|
||||
|
||||
$this->actingAs($this->admin)->get(route('privacy'))
|
||||
->assertSee('2 proclamatori, di cui 1 attivi; 1 con email e 1 con numero di telefono')
|
||||
->assertDontSee('Rossi')
|
||||
->assertDontSee('mario@example.test');
|
||||
->assertSee('2 proclamatori, di cui 1 attivi;')
|
||||
->assertSee('Nessun numero di telefono né indirizzo email')
|
||||
->assertDontSee('Rossi');
|
||||
}
|
||||
|
||||
public function test_senza_posta_dice_che_non_si_inviano_email(): void
|
||||
|
||||
Reference in New Issue
Block a user