private void LoadComponentItems(IEnumerable <string> ids, XrmRecordService xrmRecordService)
            {
                if (ComponentTypeKey == OptionSets.SolutionComponent.ObjectTypeCode.Entity)
                {
                    AllItems = xrmRecordService
                               .GetAllRecordTypes()
                               .Select(r => xrmRecordService.GetRecordTypeMetadata(r))
                               .Where(m => ids.Contains(m.MetadataId))
                               .Select(m => new AddToSolutionComponentItem(m.MetadataId, m.DisplayName))
                               .ToArray();
                }
                else if (ComponentTypeKey == OptionSets.SolutionComponent.ObjectTypeCode.OptionSet)
                {
                    AllItems = xrmRecordService
                               .GetSharedPicklists()
                               .Where(m => ids.Contains(m.MetadataId))
                               .Select(m => new AddToSolutionComponentItem(m.MetadataId, m.DisplayName))
                               .ToArray();
                }
                else
                {
                    var propTypeMaps = new Dictionary <int, string>();
                    propTypeMaps.Add(OptionSets.SolutionComponent.ObjectTypeCode.SystemForm, Entities.systemform);
                    propTypeMaps.Add(OptionSets.SolutionComponent.ObjectTypeCode.EmailTemplate, Entities.template);
                    propTypeMaps.Add(OptionSets.SolutionComponent.ObjectTypeCode.PluginAssembly, Entities.pluginassembly);
                    propTypeMaps.Add(OptionSets.SolutionComponent.ObjectTypeCode.SDKMessageProcessingStep, Entities.sdkmessageprocessingstep);
                    propTypeMaps.Add(OptionSets.SolutionComponent.ObjectTypeCode.Report, Entities.report);
                    propTypeMaps.Add(OptionSets.SolutionComponent.ObjectTypeCode.Role, Entities.role);
                    propTypeMaps.Add(OptionSets.SolutionComponent.ObjectTypeCode.WebResource, Entities.webresource);
                    propTypeMaps.Add(OptionSets.SolutionComponent.ObjectTypeCode.Workflow, Entities.workflow);
                    if (!propTypeMaps.ContainsKey(ComponentTypeKey))
                    {
                        throw new NotImplementedException($"Component Type {ComponentTypeKey} Is Not Implemented");
                    }

                    var recordType      = propTypeMaps[ComponentTypeKey];
                    var primaryKeyField = xrmRecordService.GetPrimaryKey(recordType);
                    var nameField       = xrmRecordService.GetPrimaryField(recordType);

                    AllItems = xrmRecordService
                               .RetrieveAllOrClauses(recordType, ids.Select(i => new Condition(primaryKeyField, ConditionType.Equal, i)))
                               .Select(e => new AddToSolutionComponentItem(e.Id, e.GetStringField(nameField)))
                               .OrderBy(c => c.Name)
                               .ToArray();
                }

                ItemsSelection = AllItems
                                 .Select(i => new SelectableAddToSolutionComponentItem(i.Id, i.Name))
                                 .ToArray();
            }
        private void VerifyRecordTypes(CustomisationImportRequest request)
        {
            var response = new CustomisationImportResponse();

            var optionMetadata =
                CustomisationImportService.ExtractOptionSetsFromExcel(request.ExcelFile.FileName, Controller, response);
            var fieldMetadata =
                CustomisationImportService.ExtractFieldMetadataFromExcel(request.ExcelFile.FileName, Controller,
                                                                         optionMetadata, response).Values;
            var recordMetadata =
                CustomisationImportService.ExtractRecordMetadataFromExcel(request.ExcelFile.FileName, Controller,
                                                                          fieldMetadata, response).Values;

            foreach (var metadata in recordMetadata)
            {
                Assert.IsTrue(XrmRecordService.RecordTypeExists(metadata.SchemaName));
                Assert.IsTrue(metadata.DisplayName == XrmRecordService.GetRecordTypeMetadata(metadata.SchemaName).DisplayName);
                Assert.IsTrue(metadata.CollectionName ==
                              XrmRecordService.GetRecordTypeMetadata(metadata.SchemaName).CollectionName);
                Assert.IsTrue(metadata.Audit == XrmRecordService.GetRecordTypeMetadata(metadata.SchemaName).Audit);
            }
        }
        public void CustomisationImportTestImportServiceAddToSolution()
        {
            //verifies that entities or shared option sets
            //are added to solution for customisation import where selected
            PrepareTests();

            var testSolution = ReCreateTestSolution();

            //initial verifies created entity, field, shared option set and n2n relationship
            var request = new CustomisationImportRequest
            {
                ExcelFile        = new FileReference("TestCustomisationsAddToSolution.xlsx"),
                Entities         = true,
                Fields           = true,
                Relationships    = true,
                Views            = false,
                FieldOptionSets  = true,
                SharedOptionSets = true,
                AddToSolution    = true,
                Solution         = testSolution.ToLookup()
            };

            var importService =
                new XrmCustomisationImportService(XrmRecordService);

            var response = importService.Execute(request, CreateServiceRequestController());

            if (response.HasError)
            {
                Assert.Fail(response.GetResponseItemsWithError().First().Exception.DisplayString());
            }

            Assert.IsFalse(response.ExcelReadErrors);
            Assert.IsNull(response.Exception);

            var currentComponentIds = XrmRecordService.RetrieveAllAndClauses(Entities.solutioncomponent, new[]
            {
                new Condition(Fields.solutioncomponent_.solutionid, ConditionType.Equal, testSolution.Id)
            }, null).Select(c => c.GetIdField(Fields.solutioncomponent_.objectid));

            var dummyResponse        = new CustomisationImportResponse();
            var relationShipmetadata =
                CustomisationImportService.ExtractRelationshipMetadataFromExcel(request.ExcelFile.FileName, Controller, response).Values;
            var optionMetadata =
                CustomisationImportService.ExtractOptionSetsFromExcel(request.ExcelFile.FileName, Controller, response)
                .Where(o => o.IsSharedOptionSet);

            var fieldMetadata =
                CustomisationImportService.ExtractFieldMetadataFromExcel(request.ExcelFile.FileName, Controller, optionMetadata, response).Values;

            var typeMetadata =
                CustomisationImportService.ExtractRecordMetadataFromExcel(request.ExcelFile.FileName, Controller, fieldMetadata, response).Values;

            Assert.IsTrue(relationShipmetadata.All(r => currentComponentIds.Contains(XrmRecordService.GetRecordTypeMetadata(r.RecordType1).MetadataId)));
            Assert.IsTrue(relationShipmetadata.All(r => currentComponentIds.Contains(XrmRecordService.GetRecordTypeMetadata(r.RecordType2).MetadataId)));
            Assert.IsTrue(optionMetadata.All(r => currentComponentIds.Contains(XrmRecordService.GetSharedPicklist(r.SchemaName).MetadataId)));
            Assert.IsTrue(fieldMetadata.All(r => currentComponentIds.Contains(XrmRecordService.GetRecordTypeMetadata(r.RecordType).MetadataId)));
            Assert.IsTrue(typeMetadata.All(r => currentComponentIds.Contains(XrmRecordService.GetRecordTypeMetadata(r.SchemaName).MetadataId)));

            //this one verifies where just fields picklist options and entity views
            testSolution = ReCreateTestSolution();

            request = new CustomisationImportRequest
            {
                ExcelFile        = new FileReference("TestCustomisationsAddToSolution.xlsx"),
                Entities         = false,
                Fields           = false,
                Relationships    = false,
                Views            = true,
                FieldOptionSets  = true,
                SharedOptionSets = true,
                AddToSolution    = true,
                Solution         = testSolution.ToLookup()
            };

            importService =
                new XrmCustomisationImportService(XrmRecordService);

            response = importService.Execute(request, CreateServiceRequestController());
            if (response.HasError)
            {
                Assert.Fail(response.GetResponseItemsWithError().First().Exception.DisplayString());
            }

            Assert.IsFalse(response.ExcelReadErrors);
            Assert.IsNull(response.Exception);

            currentComponentIds = XrmRecordService.RetrieveAllAndClauses(Entities.solutioncomponent, new[]
            {
                new Condition(Fields.solutioncomponent_.solutionid, ConditionType.Equal, testSolution.Id)
            }, null).Select(c => c.GetIdField(Fields.solutioncomponent_.objectid));
            //addded for field picklist change
            Assert.IsTrue(currentComponentIds.Contains(XrmRecordService.GetRecordTypeMetadata(Entities.account).MetadataId));
            //addded for field change
            Assert.IsTrue(currentComponentIds.Contains(XrmRecordService.GetRecordTypeMetadata("new_testentitysolutionadd").MetadataId));
        }