16
16
use Kodeine \Metable \Tests \Observers \EventObserver ;
17
17
use Kodeine \Metable \Tests \Events \MetaDeletingTestEvent ;
18
18
use Kodeine \Metable \Tests \Events \MetaCreatingTestEvent ;
19
+ use Kodeine \Metable \Tests \Events \SavedWithMetasTestEvent ;
20
+ use Kodeine \Metable \Tests \Events \CreatedWithMetasTestEvent ;
21
+ use Kodeine \Metable \Tests \Events \UpdatedWithMetasTestEvent ;
19
22
use Kodeine \Metable \Tests \Listeners \HandleMetaSavedTestEvent ;
20
23
use Kodeine \Metable \Tests \Listeners \HandleMetaSavingTestEvent ;
21
24
use Kodeine \Metable \Tests \Listeners \HandleMetaCreatedTestEvent ;
24
27
use Kodeine \Metable \Tests \Listeners \HandleMetaUpdatingTestEvent ;
25
28
use Kodeine \Metable \Tests \Listeners \HandleMetaDeletingTestEvent ;
26
29
use Kodeine \Metable \Tests \Listeners \HandleMetaCreatingTestEvent ;
30
+ use Kodeine \Metable \Tests \Listeners \HandleSavedWithMetasTestEvent ;
31
+ use Kodeine \Metable \Tests \Listeners \HandleCreatedWithMetasTestEvent ;
32
+ use Kodeine \Metable \Tests \Listeners \HandleUpdatedWithMetasTestEvent ;
27
33
28
34
class HasMetaEventsTest extends TestCase
29
35
{
@@ -86,6 +92,15 @@ public static function setUpBeforeClass(): void {
86
92
MetaDeletedTestEvent::class => [
87
93
HandleMetaDeletedTestEvent::class,
88
94
],
95
+ CreatedWithMetasTestEvent::class => [
96
+ HandleCreatedWithMetasTestEvent::class,
97
+ ],
98
+ UpdatedWithMetasTestEvent::class => [
99
+ HandleUpdatedWithMetasTestEvent::class,
100
+ ],
101
+ SavedWithMetasTestEvent::class => [
102
+ HandleSavedWithMetasTestEvent::class,
103
+ ],
89
104
];
90
105
foreach ($ listen as $ event => $ listeners ) {
91
106
foreach ($ listeners as $ listener ) {
@@ -467,4 +482,124 @@ public function testMetaDeletedEvent() {
467
482
$ event ->listenerShouldReturnFalse ['metaDeleting ' ] = false ;
468
483
$ event ->delete ();
469
484
}
485
+
486
+ public function testCreatedWithMetasEvent () {
487
+ $ eventName = 'createdWithMetas ' ;
488
+ $ event = new EventTest ;
489
+
490
+ $ this ->assertContains ( $ eventName , $ event ->getObservableEvents (), "$ eventName event should be observable " );
491
+
492
+ EventTest::creating ( function () {
493
+ static $ fired = false ;//make sure event listener fired only once
494
+ if ( ! $ fired ) {
495
+ $ fired = true ;
496
+ return false ;
497
+ }
498
+ return true ;
499
+ } );
500
+
501
+ $ event ->foo = 'bar ' ;
502
+ $ event ->save ();//the creating event in above should prevent model saving process
503
+
504
+ $ this ->assertEmpty ( $ event ->listenersChanges [$ eventName ] ?? [], "$ eventName event should not be fired " );
505
+ $ this ->assertEmpty ( $ event ->observersChanges [$ eventName ] ?? [], "$ eventName event should not be fired " );
506
+ $ this ->assertEmpty ( $ event ->classListenersChanges [$ eventName ] ?? [], "$ eventName event should not be fired " );
507
+ $ this ->assertFalse ( $ event ->exists , "model should not be saved " );
508
+
509
+ $ event ->save ();//the creating event in above should have no affect
510
+
511
+ $ this ->assertCount ( 1 , $ event ->listenersChanges [$ eventName ] ?? [], "$ eventName event should be fired only once " );
512
+ $ this ->assertCount ( 1 , $ event ->observersChanges [$ eventName ] ?? [], "$ eventName event should be fired by observer only once " );
513
+ $ this ->assertCount ( 1 , $ event ->classListenersChanges [$ eventName ] ?? [], "$ eventName event should be fired by class listener only once " );
514
+
515
+ $ event ->bar = 'bar ' ;
516
+
517
+ $ event ->save ();//model already created. so everything should be the same
518
+
519
+ $ this ->assertCount ( 1 , $ event ->listenersChanges [$ eventName ] ?? [], "$ eventName event should be fired only once " );
520
+ $ this ->assertCount ( 1 , $ event ->observersChanges [$ eventName ] ?? [], "$ eventName event should be fired by observer only once " );
521
+ $ this ->assertCount ( 1 , $ event ->classListenersChanges [$ eventName ] ?? [], "$ eventName event should be fired by class listener only once " );
522
+
523
+ $ event ->delete ();
524
+ }
525
+
526
+ public function testUpdatedWithMetasEvent () {
527
+ $ eventName = 'updatedWithMetas ' ;
528
+ $ event = new EventTest ;
529
+
530
+ $ this ->assertContains ( $ eventName , $ event ->getObservableEvents (), "$ eventName event should be observable " );
531
+
532
+ $ event ->foo = 'bar ' ;
533
+ $ event ->save ();
534
+
535
+ $ this ->assertEmpty ( $ event ->listenersChanges [$ eventName ] ?? [], "$ eventName event should not be fired " );
536
+ $ this ->assertEmpty ( $ event ->observersChanges [$ eventName ] ?? [], "$ eventName event should not be fired " );
537
+ $ this ->assertEmpty ( $ event ->classListenersChanges [$ eventName ] ?? [], "$ eventName event should not be fired " );
538
+
539
+ $ event ->name = 'foo ' ;
540
+ $ event ->save ();
541
+
542
+ $ this ->assertCount ( 1 , $ event ->listenersChanges [$ eventName ] ?? [], "$ eventName event should be fired only once " );
543
+ $ this ->assertCount ( 1 , $ event ->observersChanges [$ eventName ] ?? [], "$ eventName event should be fired by observer only once " );
544
+ $ this ->assertCount ( 1 , $ event ->classListenersChanges [$ eventName ] ?? [], "$ eventName event should be fired by class listener only once " );
545
+
546
+ EventTest::updating ( function () {
547
+ static $ fired = false ;//make sure event listener fired only once
548
+ if ( ! $ fired ) {
549
+ $ fired = true ;
550
+ return false ;
551
+ }
552
+ return true ;
553
+ } );
554
+
555
+ $ event ->name = 'bar ' ;
556
+
557
+ $ event ->save ();//the updating event in above should prevent model updating process
558
+
559
+ $ this ->assertCount ( 1 , $ event ->listenersChanges [$ eventName ] ?? [], "$ eventName event should be fired only once " );
560
+ $ this ->assertCount ( 1 , $ event ->observersChanges [$ eventName ] ?? [], "$ eventName event should be fired by observer only once " );
561
+ $ this ->assertCount ( 1 , $ event ->classListenersChanges [$ eventName ] ?? [], "$ eventName event should be fired by class listener only once " );
562
+
563
+ $ event ->delete ();
564
+ }
565
+
566
+ public function testSavedWithMetasEvent () {
567
+ $ eventName = 'savedWithMetas ' ;
568
+ $ event = new EventTest ;
569
+
570
+ $ this ->assertContains ( $ eventName , $ event ->getObservableEvents (), "$ eventName event should be observable " );
571
+
572
+ EventTest::saving ( function () {
573
+ static $ fired = false ;//make sure event listener fired only once
574
+ if ( ! $ fired ) {
575
+ $ fired = true ;
576
+ return false ;
577
+ }
578
+ return true ;
579
+ } );
580
+
581
+ $ event ->foo = 'bar ' ;
582
+ $ event ->save ();//the saving event in above should prevent model saving process
583
+
584
+ $ this ->assertEmpty ( $ event ->listenersChanges [$ eventName ] ?? [], "$ eventName event should not be fired " );
585
+ $ this ->assertEmpty ( $ event ->observersChanges [$ eventName ] ?? [], "$ eventName event should not be fired " );
586
+ $ this ->assertEmpty ( $ event ->classListenersChanges [$ eventName ] ?? [], "$ eventName event should not be fired " );
587
+ $ this ->assertFalse ( $ event ->exists , "model should not be saved " );
588
+
589
+ $ event ->save ();//the saving event in above should have no affect
590
+
591
+ $ this ->assertCount ( 1 , $ event ->listenersChanges [$ eventName ] ?? [], "$ eventName event should be fired only once " );
592
+ $ this ->assertCount ( 1 , $ event ->observersChanges [$ eventName ] ?? [], "$ eventName event should be fired by observer only once " );
593
+ $ this ->assertCount ( 1 , $ event ->classListenersChanges [$ eventName ] ?? [], "$ eventName event should be fired by class listener only once " );
594
+
595
+ $ event ->name = 'foo ' ;
596
+
597
+ $ event ->save ();
598
+
599
+ $ this ->assertCount ( 2 , $ event ->listenersChanges [$ eventName ] ?? [], "$ eventName event should be fired twice " );
600
+ $ this ->assertCount ( 2 , $ event ->observersChanges [$ eventName ] ?? [], "$ eventName event should be fired by observer twice " );
601
+ $ this ->assertCount ( 2 , $ event ->classListenersChanges [$ eventName ] ?? [], "$ eventName event should be fired by class listener twice " );
602
+
603
+ $ event ->delete ();
604
+ }
470
605
}
0 commit comments