1616use Kodeine \Metable \Tests \Observers \EventObserver ;
1717use Kodeine \Metable \Tests \Events \MetaDeletingTestEvent ;
1818use 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 ;
1922use Kodeine \Metable \Tests \Listeners \HandleMetaSavedTestEvent ;
2023use Kodeine \Metable \Tests \Listeners \HandleMetaSavingTestEvent ;
2124use Kodeine \Metable \Tests \Listeners \HandleMetaCreatedTestEvent ;
2427use Kodeine \Metable \Tests \Listeners \HandleMetaUpdatingTestEvent ;
2528use Kodeine \Metable \Tests \Listeners \HandleMetaDeletingTestEvent ;
2629use 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 ;
2733
2834class HasMetaEventsTest extends TestCase
2935{
@@ -86,6 +92,15 @@ public static function setUpBeforeClass(): void {
8692 MetaDeletedTestEvent::class => [
8793 HandleMetaDeletedTestEvent::class,
8894 ],
95+ CreatedWithMetasTestEvent::class => [
96+ HandleCreatedWithMetasTestEvent::class,
97+ ],
98+ UpdatedWithMetasTestEvent::class => [
99+ HandleUpdatedWithMetasTestEvent::class,
100+ ],
101+ SavedWithMetasTestEvent::class => [
102+ HandleSavedWithMetasTestEvent::class,
103+ ],
89104 ];
90105 foreach ($ listen as $ event => $ listeners ) {
91106 foreach ($ listeners as $ listener ) {
@@ -467,4 +482,124 @@ public function testMetaDeletedEvent() {
467482 $ event ->listenerShouldReturnFalse ['metaDeleting ' ] = false ;
468483 $ event ->delete ();
469484 }
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+ }
470605}
0 commit comments