@@ -774,14 +774,14 @@ class ReplicatedEventSourcingSpec
774774 val addTransformation : (
775775 EventSourcedBehavior [Command , String , State ],
776776 ActorContext [Command ]) => EventSourcedBehavior [Command , String , State ] = { (behv, context) =>
777- behv.withReplicatedEventTransformation { (_, eventWithMeta) =>
777+ behv.withReplicatedEventsTransformation { (_, eventWithMeta) =>
778778 val resMeta1 = EventSourcedBehavior .currentMetadata[ReplicatedEventMetadata ](context)
779779 val resMeta2 = eventWithMeta.metadata[ReplicatedEventMetadata ]
780780 if (resMeta1 != resMeta2)
781781 throw new IllegalStateException (s " Expected RES metadata to be the same, $resMeta1 != $resMeta2" )
782782
783783 val newMeta = eventWithMeta.metadata[Meta ].map(m => m.copy(m.value.toUpperCase)).toList
784- EventWithMetadata (eventWithMeta.event.toUpperCase, newMeta)
784+ EventWithMetadata (eventWithMeta.event.toUpperCase, newMeta) :: Nil
785785 }
786786 }
787787 val r1 = spawn(
@@ -830,6 +830,140 @@ class ReplicatedEventSourcingSpec
830830 r2 ! GetState (stateProbe.ref)
831831 stateProbe.expectMessage(State (Vector (" FROM R1" , " from r2" )))
832832 }
833+
834+ " transform replicated events and emit additional events" in {
835+ val entityId = nextEntityId
836+ val probe = createTestProbe[Done ]()
837+ val eventProbe1 = createTestProbe[EventAndContext ]()
838+ val eventProbe2 = createTestProbe[EventAndContext ]()
839+ val addTransformation : (
840+ EventSourcedBehavior [Command , String , State ],
841+ ActorContext [Command ]) => EventSourcedBehavior [Command , String , State ] = { (behv, context) =>
842+ behv.withReplicatedEventsTransformation { (_, eventWithMeta) =>
843+ val resMeta1 = EventSourcedBehavior .currentMetadata[ReplicatedEventMetadata ](context)
844+ val resMeta2 = eventWithMeta.metadata[ReplicatedEventMetadata ]
845+ if (resMeta1 != resMeta2)
846+ throw new IllegalStateException (s " Expected RES metadata to be the same, $resMeta1 != $resMeta2" )
847+
848+ if (eventWithMeta.event.startsWith(" transformed" )) {
849+ // break the loop
850+ eventWithMeta :: Nil
851+ } else {
852+ EventWithMetadata (" transformed-1: " + eventWithMeta.event.toUpperCase, Meta (" meta-1" )) ::
853+ EventWithMetadata (" transformed-2: " + eventWithMeta.event.toUpperCase, Meta (" meta-2" )) ::
854+ EventWithMetadata (" transformed-3: " + eventWithMeta.event.toUpperCase, Meta (" meta-3" )) ::
855+ Nil
856+ }
857+ }
858+ }
859+ val r1 = spawn(
860+ testBehaviorWithContext(entityId, " R1" , probe = Some (eventProbe1.ref), modifyBehavior = addTransformation))
861+ val r2 = spawn(
862+ testBehaviorWithContext(entityId, " R2" , probe = Some (eventProbe2.ref), modifyBehavior = addTransformation))
863+
864+ r1 ! StoreMeWithMeta (" from r1" , probe.ref, Meta (" meta from r1" ))
865+ eventProbe1.expectMessage(
866+ EventAndContext (
867+ " from r1" ,
868+ ReplicaId (" R1" ),
869+ recoveryRunning = false ,
870+ concurrent = false ,
871+ Some (Meta (" meta from r1" ))))
872+ // replicated to r2, and transformed
873+ eventProbe2.expectMessage(
874+ EventAndContext (
875+ " transformed-1: FROM R1" ,
876+ ReplicaId (" R1" ),
877+ recoveryRunning = false ,
878+ concurrent = false ,
879+ meta = Some (Meta (" meta-1" ))))
880+ eventProbe2.expectMessage(
881+ EventAndContext (
882+ " transformed-2: FROM R1" ,
883+ ReplicaId (" R2" ), // this is R2 because it was R2 that emitted it
884+ recoveryRunning = false ,
885+ concurrent = false ,
886+ meta = Some (Meta (" meta-2" ))))
887+ eventProbe2.expectMessage(
888+ EventAndContext (
889+ " transformed-3: FROM R1" ,
890+ ReplicaId (" R2" ),
891+ recoveryRunning = false ,
892+ concurrent = false ,
893+ meta = Some (Meta (" meta-3" ))))
894+
895+ // R2 emitted two additional events, and those are replicated back to R1
896+ eventProbe1.expectMessage(
897+ EventAndContext (
898+ " transformed-2: FROM R1" ,
899+ ReplicaId (" R2" ),
900+ recoveryRunning = false ,
901+ concurrent = false ,
902+ meta = Some (Meta (" meta-2" ))))
903+
904+ eventProbe1.expectMessage(
905+ EventAndContext (
906+ " transformed-3: FROM R1" ,
907+ ReplicaId (" R2" ),
908+ recoveryRunning = false ,
909+ concurrent = false ,
910+ meta = Some (Meta (" meta-3" ))))
911+
912+ eventProbe1.expectNoMessage()
913+ eventProbe2.expectNoMessage()
914+
915+ r2 ! StoreMeWithMeta (" from r2" , probe.ref, Meta (" meta from r2" ))
916+ eventProbe2.expectMessage(
917+ EventAndContext (
918+ " from r2" ,
919+ ReplicaId (" R2" ),
920+ recoveryRunning = false ,
921+ concurrent = false ,
922+ Some (Meta (" meta from r2" ))))
923+ // replicated to r1, and transformed
924+ eventProbe1.expectMessage(
925+ EventAndContext (
926+ " transformed-1: FROM R2" ,
927+ ReplicaId (" R2" ),
928+ recoveryRunning = false ,
929+ concurrent = false ,
930+ meta = Some (Meta (" meta-1" ))))
931+ eventProbe1.expectMessage(
932+ EventAndContext (
933+ " transformed-2: FROM R2" ,
934+ ReplicaId (" R1" ),
935+ recoveryRunning = false ,
936+ concurrent = false ,
937+ meta = Some (Meta (" meta-2" ))))
938+ eventProbe1.expectMessage(
939+ EventAndContext (
940+ " transformed-3: FROM R2" ,
941+ ReplicaId (" R1" ),
942+ recoveryRunning = false ,
943+ concurrent = false ,
944+ meta = Some (Meta (" meta-3" ))))
945+
946+ // R1 emitted two additional events, and those are replicated back to R2
947+ eventProbe2.expectMessage(
948+ EventAndContext (
949+ " transformed-2: FROM R2" ,
950+ ReplicaId (" R1" ),
951+ recoveryRunning = false ,
952+ concurrent = false ,
953+ meta = Some (Meta (" meta-2" ))))
954+
955+ eventProbe2.expectMessage(
956+ EventAndContext (
957+ " transformed-3: FROM R2" ,
958+ ReplicaId (" R1" ),
959+ recoveryRunning = false ,
960+ concurrent = false ,
961+ meta = Some (Meta (" meta-3" ))))
962+
963+ eventProbe1.expectNoMessage()
964+ eventProbe2.expectNoMessage()
965+
966+ }
833967 }
834968
835969}
0 commit comments