public void ImportSome_EmptyDatabase_OnlyInserts() { var incoming = new List <LocalizationResource> { new LocalizationResource("key1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 1" } } }, new LocalizationResource("key2") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 2" } } } }; var sut = new ResourceImportWorkflow(); var result = sut.DetectChanges(incoming, new List <LocalizationResource>()); Assert.Equal(incoming.Count, result.Count(c => c.ChangeType == ChangeType.Insert)); }
public ViewResult CommitImportResources(bool?previewImport, bool?showMenu, ICollection <DetectedImportChange> changes) { var model = new ImportResourcesViewModel { ShowMenu = showMenu ?? false }; try { // prepare incoming model a bit // if change is selected and translation and/or language is `null` -> most probably this means that translation was empty // but Mvc model binder set it to `null` -> we need to fix this to get functionality to set empty translations via import process var importer = new ResourceImportWorkflow(); var detectedImportChanges = changes.Where(c => c.Selected) .ForEach(c => { c.ImportingResource.Translations.ForEach(t => { t.Value = t.Value ?? (t.Value = string.Empty); t.Language = t.Language ?? (t.Language = string.Empty); }); }) .ToList(); var result = importer.ImportChanges(detectedImportChanges); ViewData["LocalizationProvider_ImportResult"] = string.Join("<br/>", result); } catch (Exception e) { ModelState.AddModelError("importFailed", $"Import failed! Reason: {e.Message}"); } return(View("ImportResources", model)); }
public void ImportOne_WithSameTranslation_HasMoreTranslationsAlready() { var incoming = new List <LocalizationResource> { new LocalizationResource("key1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "no", Value = "Resurs 1" } } } }; var existing = new List <LocalizationResource> { new LocalizationResource("key1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = null }, new LocalizationResourceTranslation { Language = "no", Value = "Resurs 1" } } } }; var sut = new ResourceImportWorkflow(); var result = sut.DetectChanges(incoming, existing); Assert.Empty(result); }
public ViewResult ImportResources(bool?previewImport, HttpPostedFileBase importFile, bool?showMenu) { var model = new ImportResourcesViewModel { ShowMenu = showMenu ?? false }; if (importFile == null || importFile.ContentLength == 0) { return(View("ImportResources", model)); } var fileInfo = new FileInfo(importFile.FileName); var potentialParser = ConfigurationContext.Current.Import.Providers.FindByExtension(fileInfo.Extension); if (potentialParser == null) { ModelState.AddModelError("file", $"Unknown file extension - `{fileInfo.Extension}`"); return(View("ImportResources", model)); } var workflow = new ResourceImportWorkflow(); var streamReader = new StreamReader(importFile.InputStream); var fileContent = streamReader.ReadToEnd(); var allLanguages = new AvailableLanguages.Query().Execute(); try { var parseResult = potentialParser.Parse(fileContent); var differentLanguages = parseResult.DetectedLanguages.Except(allLanguages); if (differentLanguages.Any()) { ModelState.AddModelError("file", $"Importing language `{string.Join(", ", differentLanguages.Select(c => c.Name))}` is not available in current EPiServer installation"); return(View("ImportResources", model)); } if (previewImport.HasValue && previewImport.Value) { var changes = workflow.DetectChanges(parseResult.Resources, new GetAllResources.Query(true).Execute()); var changedLanguages = changes.SelectMany(c => c.ChangedLanguages).Distinct().Select(l => new CultureInfo(l)); var previewModel = new PreviewImportResourcesViewModel(changes, showMenu ?? false, changedLanguages); return(View("ImportPreview", previewModel)); } var result = workflow.Import(parseResult.Resources, previewImport ?? true); ViewData["LocalizationProvider_ImportResult"] = result; } catch (Exception e) { ModelState.AddModelError("importFailed", $"Import failed! Reason: {e.Message}"); } return(View("ImportResources", model)); }
public void ImportSome_TheSameWithDifferentTranslationInDatabase_InsertsAndUpdates() { var incoming = new List <LocalizationResource> { new LocalizationResource("key1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 1" } } }, new LocalizationResource("key2") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 2 - Changed!" } } } }; var existing = new List <LocalizationResource> { new LocalizationResource("key1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 1 English" }, new LocalizationResourceTranslation { Language = "no", Value = "Resurs 1 Norsk" } } } }; var sut = new ResourceImportWorkflow(); var result = sut.DetectChanges(incoming, existing); Assert.Equal(1, result.Count(c => c.ChangeType == ChangeType.Insert)); Assert.Equal(1, result.Count(c => c.ChangeType == ChangeType.Update)); }
public void ImportNewResource_OneDelete_InsertsAndDeletes() { var incoming = new List <LocalizationResource> { new LocalizationResource("new1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 1" } } }, new LocalizationResource("new2") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 2" } } } }; var existing = new List <LocalizationResource> { new LocalizationResource("existing") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 1" } } } }; var sut = new ResourceImportWorkflow(); var result = sut.DetectChanges(incoming, existing); Assert.Equal(2, result.Count(c => c.ChangeType == ChangeType.Insert)); Assert.Equal(1, result.Count(c => c.ChangeType == ChangeType.Delete)); }
public void ImportNewResource_OneAlreadyExists_OnlyInserts() { var incoming = new List <LocalizationResource> { new LocalizationResource("key1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 1" } } }, new LocalizationResource("key2") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 2" } } } }; var existing = new List <LocalizationResource> { new LocalizationResource("key1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 1" } } } }; var sut = new ResourceImportWorkflow(); var result = sut.DetectChanges(incoming, existing); Assert.Equal(1, result.Count(c => c.ChangeType == ChangeType.Insert)); Assert.Equal(0, result.Count(c => c.ChangeType == ChangeType.Update)); }
public void DetectChanges_ImportingWithNonExistingSingleLanguage_ExistingWithMultipleDifferentLanguages() { var existing = new List <LocalizationResource> { new LocalizationResource("KEY") { Translations = { new LocalizationResourceTranslation { Language = "", Value = "invariant" }, new LocalizationResourceTranslation { Language = "en", Value = "English" } } } }; var importing = new List <LocalizationResource> { new LocalizationResource("KEY") { Translations = { new LocalizationResourceTranslation { Language = "en-GB", Value = "Great Britain" } } } }; var sut = new ResourceImportWorkflow(); var changes = sut.DetectChanges(importing, existing); Assert.NotEmpty(changes); }
public void DetectChanges_ImportingWithSingleLanguage_ExistingWithSameTranslation() { var existing = new List <LocalizationResource> { new LocalizationResource("KEY") { Translations = { new LocalizationResourceTranslation { Language = "", Value = "invariant" }, new LocalizationResourceTranslation { Language = "en", Value = "English" } } } }; var importing = new List <LocalizationResource> { new LocalizationResource("KEY") { Translations = { new LocalizationResourceTranslation { Language = "en", Value = "English" } } } }; var sut = new ResourceImportWorkflow(); var changes = sut.DetectChanges(importing, existing); Assert.Empty(changes); }
public void ImportOne_CheckChangedLanguageWithDifferentTranslations() { var incoming = new List <LocalizationResource> { new LocalizationResource("key1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 1 CHANGED" }, new LocalizationResourceTranslation { Language = "no", Value = "Resurs 1 CHANGED" } } } }; var existing = new List <LocalizationResource> { new LocalizationResource("key1") { Translations = new List <LocalizationResourceTranslation> { new LocalizationResourceTranslation { Language = "en", Value = "Resource 1 English" }, new LocalizationResourceTranslation { Language = "no", Value = "Resurs 1 Norsk" } } } }; var sut = new ResourceImportWorkflow(); var result = sut.DetectChanges(incoming, existing); Assert.Equal(1, result.Count(c => c.ChangeType == ChangeType.Update)); var firstChange = result.First(); Assert.Equal(new[] { "en", "no" }, firstChange.ChangedLanguages.ToArray()); }
public ViewResult CommitImportResources(bool?previewImport, bool?showMenu, ICollection <DetectedImportChange> changes) { var model = new ImportResourcesViewModel { ShowMenu = showMenu ?? false }; try { var importer = new ResourceImportWorkflow(); var result = importer.ImportChanges(changes.Where(c => c.Selected).ToList()); ViewData["LocalizationProvider_ImportResult"] = string.Join("<br/>", result); } catch (Exception e) { ModelState.AddModelError("importFailed", $"Import failed! Reason: {e.Message}"); } return(View("ImportResources", model)); }