public void Init()
        {
            // arrange
            var eventAggregator = Mock.Create<IEventAggregator>(Behavior.Loose);
            var vm = new EmailViewModel { EventAggregator = eventAggregator };

            // act
            vm.Init(new RootStub());

            // assert
            Assert.AreEqual("This is action name", (string)vm.ActionList[0].Name);
            Assert.AreEqual("This is action subject", (string)vm.ActionList[0].SubjectTemplate.Template);
        }
        public void SelectedActionProperty()
        {
            // arrange
            const string Subject = "Test Subject";
            const string Message = "Test Message";
            const string Email1 = "*****@*****.**";
            const string Email2 = "*****@*****.**";
            const string Email3 = "*****@*****.**";
            var actionGuid = new Guid("EB8CCBA8-5903-4AB4-9CD4-192E7790B68D");

            var actionBuilder = new ApprovalActionDefinition.Builder
                                    {
                                        Guid = actionGuid,
                                        SubjectTemplate = new ActionSubjectTemplate("x"),
                                        MessageTemplate = new ActionMessageTemplate("y")
                                    };
            var selectedAction = actionBuilder.Build();
            var dynamicManagerMock = Mock.Create<IDynamicTypeManager>();
            var logger = Mock.Create<ILogger>(Behavior.Loose);
            var popupFactory = Mock.Create<PopupFactory>(Behavior.Loose);
            var windowManager = Mock.Create<IShell>(Behavior.Loose);

            var editableRoot = new RootStub { Id = 1, ProcessName = "AnyProcessName" };

            var command = Mock.Create<IGetActionInfoCommand>(Behavior.Loose);
            var commandResult = Mock.Create<IGetActionInfoResult>(Behavior.Loose);
            Mock.Arrange(() => commandResult.Subject).Returns(Subject);
            Mock.Arrange(() => commandResult.Message).Returns(Message);
            Mock.Arrange(() => commandResult.EmailList).Returns(new[] { Email1, Email2, Email3 });
            Mock.Arrange(() => command.ExecuteAsync(actionGuid, editableRoot)).Returns(TaskHelper.FromResult(commandResult));

            var eventAggregator = Mock.Create<IEventAggregator>(Behavior.Loose);

            var vm = new EmailViewModel
                         {
                             EventAggregator = eventAggregator,
                             DynamicManager = dynamicManagerMock,
                             Logger = logger,
                             ThePopupFactory = new Lazy<PopupFactory>(() => popupFactory),
                             WindowManager = new Lazy<IShell>(() => windowManager),
                             GetActionInfoCommand = command
                         };
            vm.Init(editableRoot);

            vm.SelectedAction = selectedAction;

            // assert
            Assert.AreEqual(Subject, vm.Subject);
            Assert.AreEqual(Message, vm.HtmlContent);

            // assert getter
            Assert.AreEqual(selectedAction, vm.SelectedAction);

            Mock.Assert(() => logger.Log(LogSeverity.Error, Arg.AnyString, Arg.IsAny<Exception>()), Occurs.Never());
            Mock.Assert(() => popupFactory.NotifyFailure(Arg.IsAny<Exception>(), Arg.AnyString, Arg.AnyBool), Occurs.Never());
        }
        public void SendEmailCommand()
        {
            // test 1: if possible execute the command
            // arrange
            var eventAggregator = Mock.Create<IEventAggregator>(Behavior.Loose);
            var emailSettings = Mock.Create<IEmailSettings>(Behavior.Loose);
            Mock.Arrange(() => emailSettings.CanSendFromDetails).Returns(true);
            var emailViewModel = new EmailViewModel
                                     {
                                         EventAggregator = eventAggregator,
                                         EmailSettings = emailSettings,
                                         ReceiverCarbonCopyEmail = "*****@*****.**"
                                     };

            // assert
            Assert.IsTrue(emailViewModel.SendEmailCommand.CanExecute(null));

            // test 2. command body
            // mock returns the normal, working object
            // arrange
            var emailMock = Mock.Create<ISendEmailCommand>();
            Mock.Arrange(
                () => emailMock.BeginSendEmail(Arg.IsAny<string>(), Arg.IsAny<string>(), Arg.IsAny<string>(), Arg.IsAny<string>(), Arg.IsAny<IEnumerable<EmailLinkedResource>>(), Arg.IsAny<EventHandler<DataPortalResult<SendEmailCommand>>>()))
                .DoInstead<string, string, string, string, IEnumerable<EmailLinkedResource>, EventHandler<DataPortalResult<SendEmailCommand>>>(
                    (receiver, receiverCC, subject, message, linkedResources, callback) =>
                        {
                            var result = new DataPortalResult<SendEmailCommand>(new SendEmailCommand(), null, null);
                            callback(null, result);
                        });

            emailViewModel.SendEmailCslaCommand = emailMock;

            // when close window stub setup
            var windowManager = Mock.Create<IShell>();
            emailViewModel.WindowManager = new Lazy<IShell>(() => windowManager);

            // popup stub setup
            var popupMock = Mock.Create<PopupFactory>();
            Mock.Arrange(() => popupMock.NotifySuccess(Arg.IsAny<string>(), Arg.IsAny<string>()));
            emailViewModel.ThePopupFactory = new Lazy<PopupFactory>(() => popupMock);

            // dynamic type manager stub setup
            var type = new ReflectionStub().GetType();
            var dynamicManager = Mock.Create<IDynamicTypeManager>();
            Mock.Arrange(() => dynamicManager.GetCustomType(Arg.IsAny<string>(), "AuditLogCommand", false)).Returns(type);
            emailViewModel.DynamicManager = dynamicManager;

            // editable root stub setup
            emailViewModel.Init(new RootStub());

            // act
            emailViewModel.SendEmailCommand.Execute(null);

            // assert
            Mock.Assert(() => windowManager.CloseWindow(emailViewModel), Occurs.Once());
        }