public void Test_BillingMessageMachine_Constructor_Successful()
        {
            // arrange
            var printJobService = MockRepository.GenerateMock <IPrintJobService>();

            // act
            var machine = new BillingMessageMachine(printJobService);

            // assert
            machine.ShouldNotBeNull();
        }
        public void Test_IsValidIssueSystemCode_Success(string issueSystemCode)
        {
            // arrange
            var printService = MockRepository.GenerateMock <IPrintJobService>();
            var logger       = MockRepository.GenerateMock <IMessageLogger>();
            var machine      = new BillingMessageMachine(printService, logger);

            // act
            var result = machine.IsValidIssueSystemCode(issueSystemCode, "A123456", logger);

            // assert
            result.ShouldBeTrue();
        }
        public void Test_IsValidActivityType_Failure(string activityTypeCode)
        {
            // arrange
            var printService = MockRepository.GenerateMock <IPrintJobService>();
            var logger       = MockRepository.GenerateMock <IMessageLogger>();
            var machine      = new BillingMessageMachine(printService, logger);

            // act
            var result = machine.IsValidActivityType(activityTypeCode, "A123456", logger);

            // assert
            result.ShouldBeFalse();
        }
        public void Test_BillingMessageMachine_SendMessage(string printJobName, string activityTypeCode, string issueSystemCode)
        {
            // arrange
            var printJobService = MockRepository.GenerateMock <IPrintJobService>();
            var logger          = MockRepository.GenerateMock <IMessageLogger>();
            var harness         = new InMemoryTestHarness();
            var machine         = new BillingMessageMachine(printJobService, logger);
            var saga            = harness.StateMachineSaga <BillingMessageState, BillingMessageMachine>(machine);

            printJobService
            .Expect(p => p.GetPolicyTransactions("A123456", "58f31946b12b441892cd798973aab87e"))
            .Return(Task.FromResult <string>(this.transactionStatusValidXml.ToString()));

            printJobService
            .Expect(p => p.PostPrintJobRequest(Arg.Is("A123456"), Arg.Is("00"), Arg.Is("1"), Arg.Is(printJobName), Arg <string> .Is.Anything, Arg.Is("58f31946b12b441892cd798973aab87e")))
            .Return(Task.FromResult <string>("printed!"));

            var accountActivity = new AccountActivity
            {
                ActivityTypeCode = activityTypeCode,
                Policy           = new Policy
                {
                    PolicyNumber    = "A123456",
                    Mod             = "00",
                    IssueSystemCode = issueSystemCode
                }
            };

            // act
            harness.Start().Wait();

            harness.Bus.Publish <IAccountActivity>(accountActivity).Wait();

            // wait for the publish to do its thing, the Wait() above doesn't guarantee much.
            var receivedMessage = harness.Consumed.Select <IAccountActivity>().FirstOrDefault();

            // assert
            printJobService.VerifyAllExpectations();
            logger.VerifyAllExpectations();

            receivedMessage.Exception.ShouldBeNull();
            harness.Consumed.Count().ShouldEqual(1);
            harness.Published.Count().ShouldEqual(1);
            harness.Sent.Count().ShouldEqual(0);
            saga.Consumed.Count().ShouldEqual(1);

            // cleanup
            harness.Stop().Wait();
        }
        public void Test_BillingMessageMachine_SendMessage_InvalidCode(string printJobName, string activityTypeCode, string issueSystemCode)
        {
            // arrange
            var printJobService = MockRepository.GenerateMock <IPrintJobService>();
            var logger          = MockRepository.GenerateMock <IMessageLogger>();
            var harness         = new InMemoryTestHarness();
            var machine         = new BillingMessageMachine(printJobService, logger);
            var saga            = harness.StateMachineSaga <BillingMessageState, BillingMessageMachine>(machine);

            var accountActivity = new AccountActivity
            {
                ActivityTypeCode = activityTypeCode,
                Policy           = new Policy
                {
                    PolicyNumber    = "A123456",
                    Mod             = "00",
                    IssueSystemCode = issueSystemCode
                }
            };

            // act
            harness.Start().Wait();

            harness.Bus.Publish <IAccountActivity>(accountActivity).Wait();

            // wait for the publish to do its thing, the Wait() above doesn't guarantee much.
            var receivedMessage = harness.Consumed.Select <IAccountActivity>().FirstOrDefault();

            // assert
            var        message     = logger.GetArgumentsForCallsMadeOn <IMessageLogger>(x => x.Log(Arg <Log> .Is.Anything, Arg <string> .Is.Null, Arg <string> .Is.Null, Arg <string> .Is.Null));
            Log        argumentLog = (Log)message[0][0];
            LogMessage logMessage  = argumentLog.Messages[0];

            Assert.AreEqual(logMessage.Category, Constants.Logging.CATEGORY);
            Assert.AreEqual(logMessage.Severity, SeverityType.Information);

            printJobService.AssertWasNotCalled(p => p.GetPolicyTransactions(Arg <string> .Is.Anything, Arg <string> .Is.Anything));
            printJobService.VerifyAllExpectations();
            receivedMessage.Exception.ShouldBeNull();
            harness.Consumed.Count().ShouldEqual(1);
            harness.Published.Count().ShouldEqual(1);
            harness.Sent.Count().ShouldEqual(0);
            saga.Consumed.Count().ShouldEqual(1);

            // cleanup
            harness.Stop().Wait();
        }