Created
April 12, 2020 16:18
-
-
Save mickaelw/3e779ddd192e774988923783edb4ea39 to your computer and use it in GitHub Desktop.
POC Saga
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class PhoneNumbersSaga(eventPublisher: EventPublisher) extends EventListener { | |
private var tracker = new PhoneNumberStateTracker | |
def handle(phoneNumbers: List[String]): PhoneNumberStateTracker = { | |
eventPublisher.publish(AllPhoneNumberListed(phoneNumbers)) | |
tracker | |
} | |
override def execute(event: Event): Unit = event match { | |
case apnc: AllPhoneNumbersCounted => tracker = PhoneNumberStateTracker(apnc.total, tracker.totalMatchedPhoneNumbers) | |
case mpnc: MatchedPhoneNumbersCounted => tracker = PhoneNumberStateTracker(tracker.totalPhoneNumbersCount, mpnc.total) | |
} | |
} | |
case class PhoneNumberStateTracker(totalPhoneNumbersCount: Int = 0, totalMatchedPhoneNumbers: Int = 0) | |
class TotalPhoneNumbersCounter(eventPublisher: EventPublisher) extends EventListener { | |
override def execute(event: Event): Unit = event match { | |
case apnl: AllPhoneNumberListed => eventPublisher.publish(AllPhoneNumbersCounted(apnl.phoneNumbers.length)) | |
case _ => | |
} | |
} | |
class PhoneNumberFinder(eventPublisher: EventPublisher) extends EventListener { | |
override def execute(event: Event): Unit = event match { | |
case apnl: AllPhoneNumberListed => eventPublisher.publish(PhoneNumberMatched(apnl.phoneNumbers.filter(_.startsWith("(377)")))) | |
case _ => | |
} | |
} | |
class MatchedPhoneNumberCounter(eventPublisher: EventPublisher) extends EventListener { | |
override def execute(event: Event): Unit = event match { | |
case pnm: PhoneNumberMatched => eventPublisher.publish(MatchedPhoneNumbersCounted(pnm.phoneNumberMatched.length)) | |
case _ => | |
} | |
} | |
case class AllPhoneNumberListed(phoneNumbers: List[String], createdAt: LocalDateTime = LocalDateTime.now()) extends Event { | |
override val name: String = AllPhoneNumberListed.name | |
} | |
object AllPhoneNumberListed { | |
val name = "AllPhoneNumberListed" | |
} | |
case class AllPhoneNumbersCounted(total: Int, createdAt: LocalDateTime = LocalDateTime.now()) extends Event { | |
override val name: String = "AllPhoneNumbersCounted" | |
} | |
object AllPhoneNumbersCounted { | |
val name = "AllPhoneNumbersCounted" | |
} | |
case class PhoneNumberMatched(phoneNumberMatched: List[String], createdAt: LocalDateTime = LocalDateTime.now()) extends Event { | |
override val name: String = "PhoneNumberMatched" | |
} | |
object PhoneNumberMatched { | |
val name = "PhoneNumberMatched" | |
} | |
case class MatchedPhoneNumbersCounted(total: Int,createdAt: LocalDateTime = LocalDateTime.now()) extends Event { | |
override val name: String = "MatchedPhoneNumbersCounted" | |
} | |
object MatchedPhoneNumbersCounted { | |
val name = "MatchedPhoneNumbersCounted" | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ProcessManagerTest extends AnyWordSpec with Matchers with BeforeAndAfterEach { | |
var phoneNumberExecutive: PhoneNumbersSaga = _ | |
val phoneNumbers: List[String] = List("(250) 839-7238", "(978) 918-2349", "(852) 984-5973", "(587) 711-6327", "(629) 252-8255", | |
"(839) 508-9619", "(552) 929-1262", "(465) 724-0980", "(377) 487-7659", "(904) 956-1940", "(548) 625-9604", "(876) 292-7936", | |
"(219) 999-2245", "(304) 676-3186", "(843) 566-0331", "(271) 598-0007", "(690) 962-7373", "(847) 592-9224", "(409) 599-6776", | |
"(622) 745-9762", "(224) 414-8909", "(847) 751-3825", "(636) 927-0375", "(959) 788-2139", "(626) 772-2022", "(956) 667-4484", | |
"(576) 456-4131", "(631) 447-6943", "(377) 925-4951", "(632) 613-2484", "(760) 206-1358", "(332) 557-9519", "(564) 496-7593", | |
"(412) 636-3117", "(234) 531-1641", "(962) 833-1373", "(932) 684-1527", "(557) 566-5129", "(688) 582-2933", "(211) 402-3009", | |
"(429) 837-9386", "(373) 504-1841", "(933) 700-8717", "(858) 617-0738", "(611) 548-5575", "(358) 634-8586", "(838) 673-2329", | |
"(389) 586-6491", "(482) 706-4909", "(277) 762-8216") | |
override protected def beforeEach(): Unit = { | |
val eventPublisher = InternalEventPublisher(new InMemoryEventStore()) | |
phoneNumberExecutive = new PhoneNumbersSaga(eventPublisher) | |
eventPublisher.registerHandlers(Map( | |
AllPhoneNumberListed.name -> Set(new TotalPhoneNumbersCounter(eventPublisher), new PhoneNumberFinder(eventPublisher)), | |
AllPhoneNumbersCounted.name -> Set(phoneNumberExecutive), | |
PhoneNumberMatched.name -> Set(new MatchedPhoneNumberCounter(eventPublisher)), | |
MatchedPhoneNumbersCounted.name -> Set(phoneNumberExecutive) | |
)) | |
} | |
"Saga" when { | |
"Process Manager" should { | |
"Count total phone numbers" in { | |
val tracker = phoneNumberExecutive.handle(phoneNumbers) | |
tracker.totalPhoneNumbersCount should be(50) | |
} | |
"Count total matched phone numbers to start with 377" in { | |
val tracker = phoneNumberExecutive.handle(phoneNumbers) | |
tracker.totalMatchedPhoneNumbers should be(2) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment