private void RunDialogAndAddMessage(string message)
        {
            var packageSettings = GetTestPackageSettings();;
            var dialog          = new ManagePluginTriggersDialog(CreateDialogController(), new FakeVisualStudioService(), XrmRecordService, packageSettings);

            dialog.Controller.BeginDialog();
            var entryViewModel  = (ObjectEntryViewModel)dialog.Controller.UiItems.First();
            var triggersSubGrid = entryViewModel.SubGrids.First();

            AddtriggerForMessage(triggersSubGrid, message);
            Assert.IsTrue(entryViewModel.Validate());
            entryViewModel.OnSave();
        }
        public void VsixManagePluginTriggersTest()
        {
            var packageSettings = GetTestPackageSettings();

            DeployAssembly(packageSettings);

            var assemblyRecord = GetTestPluginAssemblyRecords().First();

            DeletePluginTriggers(assemblyRecord);

            //add one update trigger
            RunDialogAndAddMessage("Update");

            //verify trigger created
            var triggers = GetPluginTriggers(assemblyRecord);

            Assert.AreEqual(1, triggers.Count());
            Assert.IsTrue(triggers.First().GetBoolField(Fields.sdkmessageprocessingstep_.asyncautodelete));
            Assert.IsNull(triggers.First().GetStringField(Fields.sdkmessageprocessingstep_.filteringattributes));
            Assert.IsNull(triggers.First().GetStringField(Fields.sdkmessageprocessingstep_.impersonatinguserid));

            //verify preimage created for update with all fields
            var image = XrmRecordService.GetFirst(Entities.sdkmessageprocessingstepimage,
                                                  Fields.sdkmessageprocessingstepimage_.sdkmessageprocessingstepid, triggers.First().Id);

            Assert.IsNotNull(image);
            Assert.IsNull(image.GetStringField(Fields.sdkmessageprocessingstepimage_.attributes));
            Assert.AreEqual("PreImage", image.GetStringField(Fields.sdkmessageprocessingstepimage_.entityalias));

            //add one create trigger
            RunDialogAndAddMessage("Create");

            //verify created
            triggers = GetPluginTriggers(assemblyRecord);
            Assert.AreEqual(2, triggers.Count());

            //delete a trigger
            var dialog = new ManagePluginTriggersDialog(CreateDialogController(), new FakeVisualStudioService(), XrmRecordService, packageSettings);

            dialog.Controller.BeginDialog();

            var entryViewModel  = (ObjectEntryViewModel)dialog.Controller.UiItems.First();
            var triggersSubGrid = entryViewModel.SubGrids.First();

            triggersSubGrid.GridRecords.First().DeleteRow();
            Assert.IsTrue(entryViewModel.Validate());
            entryViewModel.OnSave();

            //verify deleted
            triggers = GetPluginTriggers(assemblyRecord);
            Assert.AreEqual(1, triggers.Count());


            //add 2 update triggers
            RunDialogAndAddMessage("Update");
            RunDialogAndAddMessage("Update");
            triggers = GetPluginTriggers(assemblyRecord);
            Assert.AreEqual(3, triggers.Count());

            //okay now lets inspect and adjust the filtering attributes and preimages and impersonating user in one of the update messages
            dialog = new ManagePluginTriggersDialog(CreateDialogController(), new FakeVisualStudioService(), XrmRecordService, packageSettings);
            dialog.Controller.BeginDialog();
            entryViewModel  = (ObjectEntryViewModel)dialog.Controller.UiItems.First();
            triggersSubGrid = entryViewModel.SubGrids.First();

            var updateRows        = triggersSubGrid.GridRecords.Where(r => r.GetLookupFieldFieldViewModel(nameof(PluginTrigger.Message)).Value.Name == "Update");
            var letsAdjustThisOne = updateRows.First();

            //set no not all preimage fields
            letsAdjustThisOne.GetBooleanFieldFieldViewModel(nameof(PluginTrigger.PreImageAllFields)).Value = false;
            //set some arbitrary other image name
            letsAdjustThisOne.GetStringFieldFieldViewModel(nameof(PluginTrigger.PreImageName)).Value = "FooOthername";
            //set some specific fields in the preimage
            var preImageFieldsField = letsAdjustThisOne.GetFieldViewModel <RecordFieldMultiSelectFieldViewModel>(nameof(PluginTrigger.PreImageFields));

            SelectItems(preImageFieldsField, 1, 3);
            //set some specific filtering attributes
            var filteringAttributesField = letsAdjustThisOne.GetFieldViewModel <RecordFieldMultiSelectFieldViewModel>(nameof(PluginTrigger.FilteringFields));

            SelectItems(filteringAttributesField, 1, 3);
            //set impersonating user
            var impersonatingUserField = letsAdjustThisOne.GetLookupFieldFieldViewModel(nameof(PluginTrigger.SpecificUserContext));

            impersonatingUserField.SelectedItem = impersonatingUserField.ItemsSource.First(p => p.Record?.Id == CurrentUserId.ToString());


            //save
            Assert.IsTrue(entryViewModel.Validate());
            entryViewModel.OnSave();

            //verify still 3 triggers
            triggers = GetPluginTriggers(assemblyRecord);
            Assert.AreEqual(3, triggers.Count());

            //get the record we updated
            var updatedTriggerMatches = triggers.Where(t => t.GetStringField(Fields.sdkmessageprocessingstep_.filteringattributes) != null);

            Assert.AreEqual(1, updatedTriggerMatches.Count());
            var updatedTrigger = updatedTriggerMatches.First();

            //verify the filtering and image fields we set got saved correctly
            Assert.IsNotNull(updatedTrigger.GetStringField(Fields.sdkmessageprocessingstep_.filteringattributes));
            Assert.AreEqual(CurrentUserId.ToString(), updatedTrigger.GetLookupId(Fields.sdkmessageprocessingstep_.impersonatinguserid));
            image = XrmRecordService.GetFirst(Entities.sdkmessageprocessingstepimage,
                                              Fields.sdkmessageprocessingstepimage_.sdkmessageprocessingstepid, updatedTrigger.Id);
            Assert.IsNotNull(image);
            Assert.IsNotNull(image.GetStringField(Fields.sdkmessageprocessingstepimage_.attributes));
            Assert.AreEqual("FooOthername", image.GetStringField(Fields.sdkmessageprocessingstepimage_.entityalias));

            //lets just verify if we go through te dialog without touching the record we adjusted that it is still the same after the save
            dialog = new ManagePluginTriggersDialog(CreateDialogController(), new FakeVisualStudioService(), XrmRecordService, packageSettings);
            dialog.Controller.BeginDialog();
            entryViewModel = (ObjectEntryViewModel)dialog.Controller.UiItems.First();
            Assert.IsTrue(entryViewModel.Validate());
            entryViewModel.OnSave();

            updatedTrigger = XrmRecordService.Get(updatedTrigger.Type, updatedTrigger.Id);
            Assert.IsNotNull(updatedTrigger.GetStringField(Fields.sdkmessageprocessingstep_.filteringattributes));
            Assert.AreEqual(CurrentUserId.ToString(), updatedTrigger.GetLookupId(Fields.sdkmessageprocessingstep_.impersonatinguserid));
            XrmRecordService.GetFirst(Entities.sdkmessageprocessingstepimage, Fields.sdkmessageprocessingstepimage_.sdkmessageprocessingstepid, triggers.First().Id);
            Assert.IsNotNull(image);
            Assert.IsNotNull(image.GetStringField(Fields.sdkmessageprocessingstepimage_.attributes));
            Assert.AreEqual("FooOthername", image.GetStringField(Fields.sdkmessageprocessingstepimage_.entityalias));

            //now lets verify deletion of an image if changed to not have one (image deleted) as well as clear impersonating user
            dialog = new ManagePluginTriggersDialog(CreateDialogController(), new FakeVisualStudioService(), XrmRecordService, packageSettings);
            dialog.Controller.BeginDialog();
            entryViewModel  = (ObjectEntryViewModel)dialog.Controller.UiItems.First();
            triggersSubGrid = entryViewModel.SubGrids.First();

            letsAdjustThisOne      = triggersSubGrid.GridRecords.First(r => r.GetRecord().GetStringField(nameof(PluginTrigger.Id)) == updatedTrigger.Id);
            impersonatingUserField = letsAdjustThisOne.GetLookupFieldFieldViewModel(nameof(PluginTrigger.SpecificUserContext));
            impersonatingUserField.SelectedItem = impersonatingUserField.ItemsSource.First(p => p.Record == null);
            //set no not all preimage fields
            letsAdjustThisOne.GetBooleanFieldFieldViewModel(nameof(PluginTrigger.PreImageAllFields)).Value = false;
            //set no fields on the preimage
            preImageFieldsField = letsAdjustThisOne.GetFieldViewModel <RecordFieldMultiSelectFieldViewModel>(nameof(PluginTrigger.PreImageFields));
            DeselectAll(preImageFieldsField);
            //save
            Assert.IsTrue(entryViewModel.Validate());
            entryViewModel.OnSave();

            //verify now no impersonation
            updatedTrigger = XrmRecordService.Get(updatedTrigger.Type, updatedTrigger.Id);
            Assert.IsNull(updatedTrigger.GetLookupId(Fields.sdkmessageprocessingstep_.impersonatinguserid));

            //verify no image
            image = XrmRecordService.GetFirst(Entities.sdkmessageprocessingstepimage, Fields.sdkmessageprocessingstepimage_.sdkmessageprocessingstepid, updatedTrigger.Id);
            Assert.IsNull(image);

            //lets just verify if we go through te dialog without touching the record still doesn't have one
            dialog = new ManagePluginTriggersDialog(CreateDialogController(), new FakeVisualStudioService(), XrmRecordService, packageSettings);
            dialog.Controller.BeginDialog();
            entryViewModel = (ObjectEntryViewModel)dialog.Controller.UiItems.First();
            Assert.IsTrue(entryViewModel.Validate());
            entryViewModel.OnSave();

            //verify still no impersonation
            updatedTrigger = XrmRecordService.Get(updatedTrigger.Type, updatedTrigger.Id);
            Assert.IsNull(updatedTrigger.GetLookupId(Fields.sdkmessageprocessingstep_.impersonatinguserid));
            //verify still no image
            image = XrmRecordService.GetFirst(Entities.sdkmessageprocessingstepimage, Fields.sdkmessageprocessingstepimage_.sdkmessageprocessingstepid, updatedTrigger.Id);
            Assert.IsNull(image);

            //add the image again
            dialog = new ManagePluginTriggersDialog(CreateDialogController(), new FakeVisualStudioService(), XrmRecordService, packageSettings);
            dialog.Controller.BeginDialog();
            entryViewModel  = (ObjectEntryViewModel)dialog.Controller.UiItems.First();
            triggersSubGrid = entryViewModel.SubGrids.First();

            letsAdjustThisOne = triggersSubGrid.GridRecords.First(r => r.GetRecord().GetStringField(nameof(PluginTrigger.Id)) == updatedTrigger.Id);
            //set no not all preimage fields
            letsAdjustThisOne.GetBooleanFieldFieldViewModel(nameof(PluginTrigger.PreImageAllFields)).Value = true;
            //save
            Assert.IsTrue(entryViewModel.Validate());
            entryViewModel.OnSave();

            //verify image created
            image = XrmRecordService.GetFirst(Entities.sdkmessageprocessingstepimage, Fields.sdkmessageprocessingstepimage_.sdkmessageprocessingstepid, updatedTrigger.Id);
            Assert.IsNotNull(image);
            Assert.IsNull(image.GetStringField(Fields.sdkmessageprocessingstepimage_.attributes));

            var solutionComponents = XrmRecordService.GetSolutionComponents(packageSettings.Solution.Id, OptionSets.SolutionComponent.ObjectTypeCode.SDKMessageProcessingStep);

            Assert.IsTrue(triggers.All(t => solutionComponents.Contains(t.Id)));
        }