private TaxCategory InitializeItem(TaxCategory item, IEnumerable<ImportItem> systemValues)
		{
			if (item == null)
				item = new CatalogEntityFactory().CreateEntity<TaxCategory>();
			var itemProperties = item.GetType().GetProperties();
			if (string.IsNullOrEmpty(systemValues.First(x => x.Name == "TaxCategoryId").Value))
				systemValues.First(x => x.Name == "TaxCategoryId").Value = item.TaxCategoryId;
			systemValues.ToList().ForEach(x => SetPropertyValue(item, itemProperties.FirstOrDefault(y => y.Name == x.Name), x.Value));

			return item;
		}
		public void Can_create_catalogviewmodel_in_wizardmode()
		{
			var vmFactory = new TestCatalogViewModelFactory<ICatalogOverviewStepViewModel>(
				ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));

			var repositoryFactory =
				new DSRepositoryFactory<ICatalogRepository, DSCatalogClient, CatalogEntityFactory>(
					ServManager.GetUri(ServiceNameEnum.Catalog));

			//create item using entity factory
			var entityFactory = new CatalogEntityFactory();
			var item = entityFactory.CreateEntity<Catalog>();

			var createViewModel = new CreateCatalogViewModel(vmFactory, item);
			var overviewViewModel = createViewModel.AllRegisteredSteps[0] as ViewModelDetailAndWizardBase<Catalog>;
			overviewViewModel.InitializeForOpen();

			//check the default values in stepViewModel
			Assert.False(createViewModel.AllRegisteredSteps[0].IsValid);

			// step 1
			//fill the properties for the first step
			overviewViewModel.InnerItem.CatalogId = "TestCatalog";
			overviewViewModel.InnerItem.Name = "TestName";
			overviewViewModel.InnerItem.CatalogLanguages.Add(new CatalogLanguage()
			{
				Language = "ru-ru",
				CatalogId = overviewViewModel.InnerItem.CatalogId
			});
			overviewViewModel.InnerItem.DefaultLanguage = "ru-ru";

			Assert.True(createViewModel.AllRegisteredSteps[0].IsValid);

			// final actions: save
			createViewModel.PrepareAndSave();

			using (var repository = repositoryFactory.GetRepositoryInstance())
			{
				var itemFromDb = repository.Catalogs.Where(s => s.CatalogId == item.CatalogId).OfType<Catalog>().Expand(x => x.CatalogLanguages).SingleOrDefault();

				Assert.NotNull(itemFromDb);
				Assert.True(itemFromDb.Name == "TestName");
				Assert.True(itemFromDb.DefaultLanguage == "ru-ru");
				Assert.True(itemFromDb.CatalogLanguages.Any(x => x.Language == "ru-ru"));
			}
		}
		private static Price InitializeItem(Price item, IEnumerable<ImportItem> systemValues)
		{
			if (item == null)
				item = new CatalogEntityFactory().CreateEntity<Price>();
			var priceId = systemValues.FirstOrDefault(price => price.Name == "PriceId");
			if (priceId != null)
				systemValues.FirstOrDefault(price => price.Name == "PriceId").Value = priceId.Value ?? item.PriceId;
			var itemProperties = item.GetType().GetProperties();
			systemValues.ToList().ForEach(x => SetPropertyValue(item, itemProperties.FirstOrDefault(y => y.Name == x.Name), x.Value));

			return item;
		}
		private static IEnumerable<ItemPropertyValue> InitializeProperties(PropertySetProperty[] props, IEnumerable<ImportItem> customValues, string itemId)
		{
			var retVal = new List<ItemPropertyValue>();
			foreach(var item in customValues)
			{
				if (item.Value != null)
				{
					var val = new CatalogEntityFactory().CreateEntity<ItemPropertyValue>();
					var propSetProp = props.FirstOrDefault(x => x.Property.Name == item.Name);
					val.ItemId = itemId;
					val.ValueType = propSetProp.Property.PropertyValueType;
					val.Name = item.Name;
					val.Locale = item.Locale;

					if (propSetProp.Property.IsEnum)
					{
						var propVal = propSetProp.Property.PropertyValues.FirstOrDefault(value => value.ToString() == item.Value);
						val.KeyValue = propVal != null ? propVal.PropertyValueId : null;
					}
					else
					{
						switch ((PropertyValueType)val.ValueType)
						{
							case PropertyValueType.DateTime:
								val.DateTimeValue = DateTime.Parse(item.Value);
								break;
							case PropertyValueType.Integer:
								val.IntegerValue = Convert.ToInt32(item.Value.Replace(',', '.'), CultureInfo.InvariantCulture.NumberFormat);
								break;
							case PropertyValueType.Decimal:
								val.DecimalValue = Convert.ToDecimal(item.Value.Replace(',', '.'), CultureInfo.InvariantCulture.NumberFormat);
								break;
							case PropertyValueType.ShortString:
								val.ShortTextValue = item.Value;
								break;
							case PropertyValueType.LongString:
								val.LongTextValue = item.Value;
								break;
							case PropertyValueType.Boolean:
								val.BooleanValue = Convert.ToBoolean(item.Value);
								break;
						}
					}
					retVal.Add(val);
				}
			}
			return retVal.ToArray();
		}
		private object InitializeItem(object item, IEnumerable<ImportItem> systemValues)
		{
			if (item == null)
				item = new CatalogEntityFactory().CreateEntityForType(Name);
			var itemProperties = item.GetType().GetProperties();
			systemValues.ToList().ForEach(x => SetPropertyValue(item, itemProperties.FirstOrDefault(y => y.Name == x.Name), x.Value));
			
			return item;
		}
		private Item SetupItem(Item item, string containerId, string propertySetId, ImportItem[] systemValues, IEnumerable<ImportItem> customValues, ICatalogRepository repository, string taxCategory)
		{
			var retVal = (Item)InitializeItem(item, systemValues);
			retVal.CatalogId = containerId;
			var propSet = repository.PropertySets.Expand("PropertySetProperties/Property/PropertyValues").Where(x => x.PropertySetId == propertySetId).First();
			var resProps = InitializeProperties(propSet.PropertySetProperties.ToArray(), customValues, retVal.ItemId);
			retVal.ItemPropertyValues.Add(resProps);
			retVal.PropertySetId = propSet.PropertySetId;

			if (!string.IsNullOrEmpty(taxCategory))
			{
				var cat =
					repository.TaxCategories.Where(x => x.TaxCategoryId == taxCategory || x.Name == taxCategory).FirstOrDefault();
				retVal.TaxCategory = cat != null ? cat.TaxCategoryId : null;
			}

			if (!string.IsNullOrEmpty(systemValues.First(x => x.Name == "ItemAsset").Value))
			{
				var itemAsset = new ItemAsset
				{
					AssetType = "image",
					ItemId = retVal.ItemId,
					AssetId = systemValues.First(x => x.Name == "ItemAsset").Value,
					GroupName = "primaryimage"
				};
				retVal.ItemAssets.Add(itemAsset);
			}

			if (!string.IsNullOrEmpty(systemValues.First(x => x.Name == "EditorialReview").Value))
			{
				var editorial = new CatalogEntityFactory().CreateEntity<EditorialReview>();
				editorial.ReviewState = (int) ReviewState.Active;
				editorial.Content = systemValues.First(x => x.Name == "EditorialReview").Value;
				editorial.ItemId = retVal.ItemId;
				retVal.EditorialReviews.Add(editorial);
			}

			return retVal;
		}
		private static string SetupCategoryRelation(string categoryId, string catalogId, ICatalogRepository repository, Item item)
		{
			var retVal = string.Empty;

			if (categoryId != null)
			{
				var category =
					repository.Categories.Where(
						cat => cat.CatalogId == catalogId && (cat.CategoryId == categoryId || cat.Code == categoryId))
							   .FirstOrDefault();
				if (category != null)
				{
					var relation = new CatalogEntityFactory().CreateEntity<CategoryItemRelation>();
					relation.CatalogId = catalogId;
					relation.ItemId = item.ItemId;
					relation.CategoryId = category.CategoryId;
					repository.Add(relation);
				}
				else
				{
					retVal = string.Format(noCategoryError, categoryId, item.Code);
				}
			}

			return retVal;
		}
		public void Can_add_pricelist()
		{
			// create ViewModelsFactory ( it should be resolve all view models for the test)
			var overviewVmFactory = new TestCatalogViewModelFactory<IPriceListOverviewStepViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));

			// create Item using EntityFactory
			var entityFactory = new CatalogEntityFactory();
			var item = entityFactory.CreateEntity<Pricelist>();

			// create Wizard main class. Constructor of the class creates wizard steps with help vmFactory
			var createPriceListViewModel = new CreatePriceListViewModel(overviewVmFactory, item);

			// IsValid of wizard step should be false at the begin.
			Assert.False(createPriceListViewModel.AllRegisteredSteps[0].IsValid);

			var step = createPriceListViewModel.AllRegisteredSteps[0] as PriceListOverviewStepViewModel;
			step.InitializeForOpen();
			step.InnerItem.Name = "New test PriceList";
			Assert.Null(step.AllAvailableCurrencies);
			step.InnerItem.Currency = "USD";
			Assert.True(step.IsValid);
			createPriceListViewModel.PrepareAndSave();

			var priceListRepositoryFactory = new DSRepositoryFactory<IPricelistRepository, DSCatalogClient, CatalogEntityFactory>(ServManager.GetUri(ServiceNameEnum.Catalog));
			using (var repository = priceListRepositoryFactory.GetRepositoryInstance())
			{
				var checkItem = repository.Pricelists.Where(x => x.Name == "New test PriceList").FirstOrDefault();
				Assert.NotNull(checkItem);
			}
		}
		public void Can_delete_pricelist()
		{
			#region Init parameters for PriceListHomeViewModel

			var priceListRepositoryFactory =
				new DSRepositoryFactory<IPricelistRepository, DSCatalogClient, CatalogEntityFactory>(
					ServManager.GetUri(ServiceNameEnum.Catalog));
			IAuthenticationContext authenticationContext = new TestAuthenticationContext();
			var navigationManager = new TestNavigationManager();

			// create ViewModelsFactory ( it should be resolve all view models for the test)
			var itemVmFactory = new TestCatalogViewModelFactory<IPriceListViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog),
																		   ServManager.GetUri(ServiceNameEnum.AppConfig));

			var wizardVmFactory = new TestCatalogViewModelFactory<ICreatePriceListViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog),
																		   ServManager.GetUri(ServiceNameEnum.AppConfig));

			// create Item using EntityFactory
			var entityFactory = new CatalogEntityFactory();

			#endregion

			#region Add price list to DB

			using (var repository = priceListRepositoryFactory.GetRepositoryInstance())
			{
				var pricelist = entityFactory.CreateEntity<Pricelist>();
				pricelist.Name = "Test price (Can_delete_pricelist)";
				pricelist.Currency = "USD";

				repository.Add(pricelist);
				repository.UnitOfWork.Commit();
			}

			#endregion

			#region VM test

			var priceListHomeViewModel = new PriceListHomeViewModel(entityFactory, itemVmFactory, wizardVmFactory,
																	priceListRepositoryFactory, authenticationContext,
																	navigationManager, null);
			priceListHomeViewModel.InitializeForOpen();

			Thread.Sleep(3000); // waiting for InitializeForOpen to finish in background thread

			priceListHomeViewModel.CommonConfirmRequest.Raised += DeletePriceListConfirmation;
			priceListHomeViewModel.ListItemsSource.MoveCurrentToFirst();
			var item = priceListHomeViewModel.ListItemsSource.CurrentItem as VirtualListItem<IPriceListViewModel>;
			var itemsToDelete = new List<VirtualListItem<IPriceListViewModel>>() { item };
			priceListHomeViewModel.ItemDeleteCommand.Execute(itemsToDelete);

			Thread.Sleep(1000);// waiting for ItemDeleteCommand to finish in background thread

			#endregion

			#region Check

			using (var repository = priceListRepositoryFactory.GetRepositoryInstance())
			{
				var checkItem = repository.Pricelists.Where(x => x.Name == "Test price (Can_delete_pricelist)").SingleOrDefault();
				Assert.Null(checkItem);
			}

			#endregion
		}
		public void Can_add_update_delete_item_property_values()
		{
			var catalogName = "Test catalog";
			var catalogBuilder = CatalogBuilder.BuildCatalog(catalogName).WithCategory("category").WithProducts(1);
			var catalog = catalogBuilder.GetCatalog() as Catalog;
			var item = catalogBuilder.GetItems()[0];

			var property1 = new Property { Name = "bool", PropertyValueType = PropertyValueType.Boolean.GetHashCode() };
			var property2 = new Property { Name = "datetime", PropertyValueType = PropertyValueType.DateTime.GetHashCode() };
			var property3 = new Property { Name = "Decimal", PropertyValueType = PropertyValueType.Decimal.GetHashCode() };
			var property4 = new Property { Name = "int", PropertyValueType = PropertyValueType.Integer.GetHashCode() };
			var property5 = new Property { Name = "longstr", PropertyValueType = PropertyValueType.LongString.GetHashCode() };
			var property6 = new Property { Name = "shorttext", PropertyValueType = PropertyValueType.ShortString.GetHashCode() };

			var propertySet = catalog.PropertySets[0];
			propertySet.PropertySetProperties.Add(new PropertySetProperty { Property = property1 });
			propertySet.PropertySetProperties.Add(new PropertySetProperty { Property = property2 });
			propertySet.PropertySetProperties.Add(new PropertySetProperty { Property = property3 });
			propertySet.PropertySetProperties.Add(new PropertySetProperty { Property = property4 });
			propertySet.PropertySetProperties.Add(new PropertySetProperty { Property = property5 });
			propertySet.PropertySetProperties.Add(new PropertySetProperty { Property = property6 });
			propertySet.PropertySetProperties.ToList().ForEach(x =>
			{
				x.Property.IsRequired = true;
				x.Property.CatalogId = catalogName;
			});

			var repositoryFactory = new DSRepositoryFactory<ICatalogRepository, DSCatalogClient, CatalogEntityFactory>(ServManager.GetUri(ServiceNameEnum.Catalog));
			using (var repository = repositoryFactory.GetRepositoryInstance())
			{
				repository.Add(catalog);
				repository.Add(item);
				repository.UnitOfWork.Commit();
			}

			IRepositoryFactory<IPricelistRepository> pricelistRepositoryFactory = new DSRepositoryFactory<IPricelistRepository, DSCatalogClient, CatalogEntityFactory>(ServManager.GetUri(ServiceNameEnum.Catalog));
			IViewModelsFactory<IPropertyValueBaseViewModel> propertyValueVmFactory = new TestCatalogViewModelFactory<IPropertyValueBaseViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));
			IViewModelsFactory<IPriceViewModel> priceVmFactory = new TestCatalogViewModelFactory<IPriceViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));
			IViewModelsFactory<IItemAssetViewModel> assetVmFactory = new TestCatalogViewModelFactory<IItemAssetViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));
			IViewModelsFactory<IAssociationGroupEditViewModel> associationGroupEditVmFactory = new TestCatalogViewModelFactory<IAssociationGroupEditViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));
			IViewModelsFactory<IAssociationGroupViewModel> associationGroupVmFactory = new TestCatalogViewModelFactory<IAssociationGroupViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));
			IViewModelsFactory<IItemRelationViewModel> itemRelationVmFactory = new TestCatalogViewModelFactory<IItemRelationViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));
			IViewModelsFactory<IEditorialReviewViewModel> reviewVmFactory = new TestCatalogViewModelFactory<IEditorialReviewViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));
			IViewModelsFactory<ICategoryItemRelationViewModel> categoryVmFactory = new TestCatalogViewModelFactory<ICategoryItemRelationViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));
			ICatalogEntityFactory entityFactory = new CatalogEntityFactory();
			IAuthenticationContext authContext = new TestAuthenticationContext();
			INavigationManager navManager = new TestNavigationManager();

			var itemViewModel = new ItemViewModel(null, null, repositoryFactory, pricelistRepositoryFactory, propertyValueVmFactory, priceVmFactory, assetVmFactory, associationGroupEditVmFactory, associationGroupVmFactory, itemRelationVmFactory, reviewVmFactory, categoryVmFactory, entityFactory, item, authContext, navManager);
			itemViewModel.InitializeForOpen();

			// property change should set IsModified to true
			itemViewModel.InnerItem.EndDate = DateTime.UtcNow;
			Assert.True(itemViewModel.IsModified);

			Assert.False(itemViewModel.PropertyValueEditCommand.CanExecute(null));
			Assert.True(itemViewModel.PropertyValueEditCommand.CanExecute(itemViewModel.PropertiesAndValues[0]));

			itemViewModel.CommonConfirmRequest.Raised += EditValueSetConfirmation;

			foreach (var propItem in itemViewModel.PropertiesAndValues)
			{
				itemViewModel.PropertyValueEditCommand.Execute(propItem);
			}

			itemViewModel.SaveChangesCommand.Execute(null);
			Thread.Sleep(1000);// waiting for SaveChangesCommand to finish in background thread

			using (var repository = repositoryFactory.GetRepositoryInstance())
			{
				var itemFromDb = repository.Items.Expand(x => x.ItemPropertyValues).Single();

				Assert.True(itemFromDb.ItemPropertyValues.Count > 0);
				Assert.Equal(itemViewModel.PropertiesAndValues.Count, itemFromDb.ItemPropertyValues.Count);
			}

			// test if values are saved when updated in UI
			DecimalValue = 123123m;
			var valueToEdit =
				itemViewModel.PropertiesAndValues.First(x => x.Property.PropertyValueType == PropertyValueType.Decimal.GetHashCode());
			itemViewModel.PropertyValueEditCommand.Execute(valueToEdit);

			LongTextValue = "other long text";
			valueToEdit = itemViewModel.PropertiesAndValues.First(x => x.Property.PropertyValueType == PropertyValueType.LongString.GetHashCode());
			itemViewModel.PropertyValueEditCommand.Execute(valueToEdit);

			itemViewModel.SaveChangesCommand.Execute(null);
			Thread.Sleep(1000);// waiting for SaveChangesCommand to finish in background thread

			using (var repository = repositoryFactory.GetRepositoryInstance())
			{
				var itemFromDb = repository.Items.Expand(x => x.ItemPropertyValues).Single();

				Assert.Equal(DecimalValue, itemFromDb.ItemPropertyValues.First(x => x.ValueType == PropertyValueType.Decimal.GetHashCode()).DecimalValue);
				Assert.Equal(LongTextValue, itemFromDb.ItemPropertyValues.First(x => x.ValueType == PropertyValueType.LongString.GetHashCode()).LongTextValue);
			}

			// check if item can be saved without required property value
			var valueToDelete =
				itemViewModel.PropertiesAndValues.First(x => x.Property.PropertyValueType == PropertyValueType.Decimal.GetHashCode());
			itemViewModel.PropertyValueDeleteCommand.Execute(valueToDelete);

			itemViewModel.SaveChangesCommand.CanExecute(null);
			Thread.Sleep(1000);// waiting for SaveChangesCommand to finish in background thread

			//Assert True as the last Save command execution failed as the validation failed
			Assert.True(itemViewModel.IsModified);
		}
		public void Can_create_categoryviewmodel_in_wizardmode()
		{
			var repositoryFactory =
				new DSRepositoryFactory<ICatalogRepository, DSCatalogClient, CatalogEntityFactory>(ServManager.GetUri(ServiceNameEnum.Catalog));

			const string catalogId = "testcatalog";
			var catalogBuilder = CatalogBuilder.BuildCatalog(catalogId);
			var catalog = catalogBuilder.GetCatalog() as Catalog;

			using (var repository = repositoryFactory.GetRepositoryInstance())
			{
				repository.Add(catalog);
				repository.UnitOfWork.Commit();
			}

			var propertiesVmFactory = new TestCatalogViewModelFactory<ICategoryPropertiesStepViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));
			var overviewVmFactory = new TestCatalogViewModelFactory<ICategoryOverviewStepViewModel>(ServManager.GetUri(ServiceNameEnum.Catalog), ServManager.GetUri(ServiceNameEnum.AppConfig));

			//create item using entity factory
			var entityFactory = new CatalogEntityFactory();
			var item = entityFactory.CreateEntity<Category>();
			item.CatalogId = catalogId;
			item.Catalog = catalog;

			var createViewModel = new CreateCategoryViewModel(propertiesVmFactory, overviewVmFactory, item);
			var overviewViewModel = createViewModel.AllRegisteredSteps[0] as CategoryViewModel;
			overviewViewModel.InitializeForOpen();
			var propertyValuesViewModel = createViewModel.AllRegisteredSteps[1] as CategoryViewModel;
			propertyValuesViewModel.InitializeForOpen();

			//check the default values in stepViewModel
			Assert.False(createViewModel.AllRegisteredSteps[0].IsValid);
			Assert.True(createViewModel.AllRegisteredSteps[1].IsValid);

			// step 1
			//fill the properties for the first step
			overviewViewModel.InnerItem.Name = "TestName";
			overviewViewModel.InnerItem.Code = "TestCode";
			var propertySet = overviewViewModel.AvailableCategoryTypes.First();
			overviewViewModel.InnerItem.PropertySet = propertySet;
			overviewViewModel.InnerItem.PropertySetId = propertySet.PropertySetId;

			Assert.True(createViewModel.AllRegisteredSteps[0].IsValid);

			// step 2
			//fill the values for the property values step
			propertyValuesViewModel.PropertiesAndValues[0].Value = new CategoryPropertyValue()
				{
					ShortTextValue = "short text",
					Name = propertyValuesViewModel.PropertiesAndValues[0].Property.Name,
					ValueType = propertyValuesViewModel.PropertiesAndValues[0].Property.PropertyValueType
				};
			propertyValuesViewModel.InnerItem.CategoryPropertyValues.Add((CategoryPropertyValue)propertyValuesViewModel.PropertiesAndValues[0].Value);

			Assert.True(createViewModel.AllRegisteredSteps[1].IsValid);

			// final actions: save
			propertyValuesViewModel.InnerItem.Catalog = null;
			createViewModel.PrepareAndSave();

			using (var repository = repositoryFactory.GetRepositoryInstance())
			{
				var itemFromDb = repository.Categories.Where(s => s.CategoryId == item.CategoryId).OfType<Category>().ExpandAll().SingleOrDefault();

				Assert.NotNull(itemFromDb);
				Assert.True(itemFromDb.Name == "TestName");
				Assert.True(itemFromDb.CategoryPropertyValues.Any(x => x.ShortTextValue == "short text"));
			}
		}