public void OnAddingNewAttributeTest()
        {
            // Arrange.
            var target = new LdapDirectoryDataProviderViewModel();
            var eventArgs = new GridViewAddingNewEventArgs(null);

            // Act.
            target.OnAddingNewAttribute(null, eventArgs);
            var newAttribute = (LdapAttributeEdit)eventArgs.NewObject;

            // Assert.
            Assert.IsNotNull(newAttribute);
            Assert.IsTrue(newAttribute.IsChild);
            Assert.IsTrue(newAttribute.IsNew);
        }
        public void TestFilterCommandTest()
        {
            // Arrange.
            const string Filter = "Test Filter";
            const string Message1 = "Error 1";
            const string Message2 = "Error 2";
            const string Message3 = "Success {0}";
            const string ErrorDetails = "Error Details";
            const int EntryCount = 123;

            Mock.Arrange(() => LanguageService.Translate("Msg_LdapFilterTestFailed")).Returns(Message1);
            Mock.Arrange(() => LanguageService.Translate("Msg_InvalidLdapFilter")).Returns(Message2);
            Mock.Arrange(() => LanguageService.Translate("Msg_LdapEntriesFound")).Returns(Message3);

            var popupFactory = Mock.Create<PopupFactory>(Behavior.Loose);
            var sourceViewModel = Mock.Create<ISourceViewModel>(Behavior.Loose);

            var target = new LdapDirectoryDataProviderViewModel { PopupFactory = popupFactory };
            var model = Mock.Create<LdapDirectoryDataProviderEdit>(Behavior.Loose);
            Mock.Arrange(model, dp => dp.Filter).Returns(Filter);
            target.Initialize(model, sourceViewModel);

            var dataPortalException = new Exception();

            Mock.Arrange(() => TestLdapFilterCommand.BeginExecute(Filter, Arg.AnyInt, Arg.IsAny<Action<DataPortalResult<TestLdapFilterCommand>>>()))
                .DoInstead<string, int, Action<DataPortalResult<TestLdapFilterCommand>>>(
                    (filter, ldapProfileId, callback) => callback(new DataPortalResult<TestLdapFilterCommand>(null, dataPortalException, null)));

            // Act.
            target.TestFilterCommand.Execute(null);

            // Assert.
            Mock.Assert(() => popupFactory.NotifyFailure(Message1, dataPortalException), Occurs.Once());

            // Arrange.
            Mock.Arrange(() => TestLdapFilterCommand.BeginExecute(Filter, Arg.AnyInt, Arg.IsAny<Action<DataPortalResult<TestLdapFilterCommand>>>()))
                .DoInstead<string, int, Action<DataPortalResult<TestLdapFilterCommand>>>(
                    (filter, ldapProfileId, callback) =>
                    {
                        var error = Mock.Create<ErrorInfo>(Behavior.Loose);
                        Mock.Arrange(error, e => e.Details).Returns(ErrorDetails);
                        var cmd = Mock.Create<TestLdapFilterCommand>(Behavior.Loose);
                        Mock.Arrange(cmd, c => c.Error).Returns(error);

                        callback(new DataPortalResult<TestLdapFilterCommand>(cmd, null, null));
                    });

            // Act.
            target.TestFilterCommand.Execute(null);

            // Assert.
            Mock.Assert(() => popupFactory.NotifyFailure(Message1, ErrorDetails), Occurs.Once());

            // Arrange.
            Mock.Arrange(() => TestLdapFilterCommand.BeginExecute(Filter, Arg.AnyInt, Arg.IsAny<Action<DataPortalResult<TestLdapFilterCommand>>>()))
                .DoInstead<string, int, Action<DataPortalResult<TestLdapFilterCommand>>>(
                    (filter, ldapProfileId, callback) =>
                    {
                        var cmd = Mock.Create<TestLdapFilterCommand>(Behavior.Loose);
                        Mock.Arrange(cmd, c => c.IsFilterValid).Returns(false);
                        Mock.Arrange(cmd, c => c.Error).Returns(() => null);

                        callback(new DataPortalResult<TestLdapFilterCommand>(cmd, null, null));
                    });

            // Act.
            target.TestFilterCommand.Execute(null);

            // Assert.
            Mock.Assert(() => popupFactory.NotifyFailure(Message2, Arg.AnyString, Arg.AnyInt, Arg.AnyBool));

            // Arrange.
            Mock.Arrange(() => TestLdapFilterCommand.BeginExecute(Filter, Arg.AnyInt, Arg.IsAny<Action<DataPortalResult<TestLdapFilterCommand>>>()))
                .DoInstead<string, int, Action<DataPortalResult<TestLdapFilterCommand>>>(
                    (filter, ldapProfileId, callback) =>
                    {
                        var cmd = Mock.Create<TestLdapFilterCommand>(Behavior.Loose);
                        Mock.Arrange(cmd, c => c.IsFilterValid).Returns(true);
                        Mock.Arrange(cmd, c => c.Error).Returns(() => null);
                        Mock.Arrange(cmd, c => c.EntryCount).Returns(EntryCount);

                        callback(new DataPortalResult<TestLdapFilterCommand>(cmd, null, null));
                    });

            // Act.
            target.TestFilterCommand.Execute(null);

            // Assert.
            Mock.Assert(() => popupFactory.NotifySuccess(string.Format(Message3, EntryCount), Arg.AnyString), Occurs.Once());
        }
        public void GetDataProviderFieldsCommandTest()
        {
            // Arrange.
            const string Message1 = "Test Error 1";
            const string Message2 = "Test Success";
            const string ErrorDetails = "Error Details";

            Mock.Arrange(() => LanguageService.Translate("Msg_LoadLdapAttributesFailed")).Returns(Message1);
            Mock.Arrange(() => LanguageService.Translate("Msg_FieldsRetrieved")).Returns(Message2);

            var popupFactory = Mock.Create<PopupFactory>(Behavior.Loose);
            var sourceViewModel = Mock.Create<ISourceViewModel>(Behavior.Loose);
            var sourceFieldsViewModel = Mock.Create<ISourceFieldsViewModel>(Behavior.Loose);
            Mock.Arrange(sourceViewModel, vm => vm.SourceFieldsViewModel).Returns(sourceFieldsViewModel);

            var model = Mock.Create<LdapDirectoryDataProviderEdit>(Behavior.Loose);
            
            var attribute1 = Mock.Create<LdapAttributeEdit>(Behavior.Loose);
            Mock.Arrange(attribute1, a => a.IsChild).Returns(true);
            Mock.Arrange(attribute1, a => a.Name).Returns("Attribute1");

            var attribute2 = Mock.Create<LdapAttributeEdit>(Behavior.Loose);
            Mock.Arrange(attribute2, a => a.IsChild).Returns(true);
            Mock.Arrange(attribute2, a => a.Name).Returns("Attribute2");

            var attributeList = new LdapAttributeEditList { attribute1, attribute2 };

            Mock.Arrange(() => model.AttributesToLoad).Returns(attributeList);

            var target = new LdapDirectoryDataProviderViewModel { PopupFactory = popupFactory };
            target.Initialize(model, sourceViewModel);

            // DataPortalResult.Error != null.
            var dpException = new Exception();

            Mock.Arrange(
                () =>
                LdapDirectoryFieldsRetriever.GetFields(
                    Arg.IsAny<IEnumerable<string>>(), Arg.IsAny<Action<DataPortalResult<LdapDirectoryFieldsRetriever>>>()))
                .DoInstead<IEnumerable<string>, Action<DataPortalResult<LdapDirectoryFieldsRetriever>>>(
                    (fields, callback) =>
                        {
                            if (!fields.SequenceEqual(new[] { "Attribute1", "Attribute2" }))
                                throw new InvalidOperationException("Invalid fields.");

                            callback(new DataPortalResult<LdapDirectoryFieldsRetriever>(null, dpException, null));
                        });

            // Act.
            target.GetDataProviderFieldsCommand.Execute(null);

            // Assert.
            Mock.Assert(() => popupFactory.NotifyFailure(Message1, dpException), Occurs.Once());

            // LdapDirectoryFieldsRetriever.Error != null.
            Mock.Arrange(
                () =>
                LdapDirectoryFieldsRetriever.GetFields(
                    Arg.IsAny<IEnumerable<string>>(), Arg.IsAny<Action<DataPortalResult<LdapDirectoryFieldsRetriever>>>()))
                .DoInstead<IEnumerable<string>, Action<DataPortalResult<LdapDirectoryFieldsRetriever>>>(
                    (fields, callback) =>
                        {
                            if (!fields.SequenceEqual(new[] { "Attribute1", "Attribute2" }))
                                throw new InvalidOperationException("Invalid fields.");

                            var error = Mock.Create<ErrorInfo>(Behavior.Loose);
                            Mock.Arrange(() => error.Details).Returns(ErrorDetails);
                            var result = Mock.Create<LdapDirectoryFieldsRetriever>(Behavior.Loose);
                            Mock.Arrange(() => result.Error).Returns(error);

                            callback(new DataPortalResult<LdapDirectoryFieldsRetriever>(result, null, null));
                        });

            // Act.
            target.GetDataProviderFieldsCommand.Execute(null);

            // Assert.
            Mock.Assert(() => popupFactory.NotifyFailure(Message1, ErrorDetails), Occurs.Once());

            // Retriever executes successfuly.
            var providerFields = new ProviderFieldInfoList();

            Mock.Arrange(
                () =>
                LdapDirectoryFieldsRetriever.GetFields(
                    Arg.IsAny<IEnumerable<string>>(), Arg.IsAny<Action<DataPortalResult<LdapDirectoryFieldsRetriever>>>()))
                .DoInstead<IEnumerable<string>, Action<DataPortalResult<LdapDirectoryFieldsRetriever>>>(
                    (fields, callback) =>
                        {
                            if (!fields.SequenceEqual(new[] { "Attribute1", "Attribute2" }))
                                throw new InvalidOperationException("Invalid fields.");

                            var result = Mock.Create<LdapDirectoryFieldsRetriever>(Behavior.Loose);
                            Mock.Arrange(() => result.Error).Returns(() => null);
                            Mock.Arrange(() => result.ProviderFields).Returns(providerFields);

                            callback(new DataPortalResult<LdapDirectoryFieldsRetriever>(result, null, null));
                        });

            // Act.
            target.GetDataProviderFieldsCommand.Execute(null);
            
            // Assert.
            Mock.Assert(() => sourceFieldsViewModel.SetSourceFields(providerFields), Occurs.Once());
            Mock.Assert(() => popupFactory.NotifySuccess(Message2, Arg.AnyString), Occurs.Once());
        }