public ScreenDto(ScreenInBuild sib) { Id = sib.ScreenInBuildId; Name = sib.ScreenName; Project = sib.ProjectName; Build = sib.Build.BuildName; Locale = sib.LocaleCode; TimeStamp = sib.ModificationTime; Path = StorageHelper.GetScreenPath(Project, Locale, Build, Name, '/'); }
public async Task <IActionResult> Get(string project, Guid id) { if (!ModelState.IsValid || id == null || string.IsNullOrWhiteSpace(project)) { return(BadRequest("Invalid or missing parameters")); } GenericRepository <ScreenInBuild> screenInBuildRepo = _unitOfWork.ScreenInBuildRepository; ScreenInBuild sib = (await screenInBuildRepo.GetAsync(s => s.ScreenInBuildId == id && s.ProjectName.Equals(project), includeProperties: "Build")).FirstOrDefault(); if (sib == null) { return(NotFound()); } ScreenDto screen = new ScreenDto(sib); return(Ok(screen)); }
public static GarbContext GetSeededContext(IMapper mapper) { string project1Name = "Velocity"; string project2Name = "Test2"; string project1Version0 = "0.1"; string project1Version1 = "1.0"; string project2Version1 = "2.2"; string project2Version2 = "2.3"; string userName = TestInitializer.UserName; var options = new DbContextOptionsBuilder <GarbContext>() .UseInMemoryDatabase(databaseName: $"GarbTestDb-{Guid.NewGuid()}") .Options; var context = new GarbContext(options, mapper); var users = new User [] { new User { UserName = userName } }; foreach (User u in users) { context.Users.Add(u); } context.SaveChanges(); var projects = new Project[] { new Project { ProjectName = project1Name }, new Project { ProjectName = project2Name } }; foreach (Project p in projects) { context.Projects.Add(p); } context.SaveChanges(); var oldBuilds = new Build[] { new Build { ProjectName = project1Name, BuildName = project1Version0 }, new Build { ProjectName = project2Name, BuildName = project2Version1 }, }; foreach (Build b in oldBuilds) { context.Builds.Add(b); } context.SaveChanges(userName); Thread.Sleep(10); // slight delay, so the new builds have new timestamps var newBuilds = new Build[] { new Build { ProjectName = project1Name, BuildName = project1Version1 }, new Build { ProjectName = project2Name, BuildName = project2Version2 } }; foreach (Build b in newBuilds) { context.Builds.Add(b); } context.SaveChanges(userName); var locales = new Locale[] { new Locale { LocaleCode = "en-US", LocaleName = "English (United States)" }, new Locale { LocaleCode = "pl-PL", LocaleName = "Polish" } }; foreach (Locale l in locales) { context.Locales.Add(l); } context.SaveChanges(); string screen1Name = "Install"; string screen2Name = "Uninstall"; var screens = new Screen[] { new Screen { ProjectName = project1Name, ScreenName = screen1Name }, new Screen { ProjectName = project1Name, ScreenName = screen2Name }, }; foreach (Screen s in screens) { context.Screens.Add(s); } context.SaveChanges(); var previousBuildId = context.Builds.FirstOrDefault(b => b.BuildName == project1Version0).Id; var currentBuildId = context.Builds.FirstOrDefault(b => b.BuildName == project1Version1).Id; var screensInBuild = new ScreenInBuild[] { new ScreenInBuild { ProjectName = project1Name, ScreenName = screen1Name, BuildId = previousBuildId, LocaleCode = "pl-PL" }, new ScreenInBuild { ProjectName = project1Name, ScreenName = screen1Name, BuildId = previousBuildId, LocaleCode = "en-US" }, new ScreenInBuild { ProjectName = project1Name, ScreenName = screen1Name, BuildId = currentBuildId, LocaleCode = "pl-PL" }, new ScreenInBuild { ProjectName = project1Name, ScreenName = screen1Name, BuildId = currentBuildId, LocaleCode = "en-US" }, }; foreach (ScreenInBuild sb in screensInBuild) { context.ScreensInBuilds.Add(sb); } context.SaveChanges(userName); var issues = new Issue[] { new Issue { ProjectName = project1Name, ScreenName = screen1Name, LocaleCode = "en-US", IssueType = IssueType.Hardcode, Identifier = "1", Value = "Hardcode", ModifiedInBuildId = currentBuildId, IssueStatus = IssueStatus.Active }, new Issue { ProjectName = project1Name, ScreenName = screen1Name, LocaleCode = "pl-PL", IssueType = IssueType.Hardcode, Identifier = "1", Value = "Hardcode", ModifiedInBuildId = currentBuildId, IssueStatus = IssueStatus.Active }, new Issue { ProjectName = project1Name, ScreenName = screen1Name, LocaleCode = "pl-PL", IssueType = IssueType.Linguistic, Identifier = "2", Value = "Test1", ModifiedInBuildId = currentBuildId, IssueStatus = IssueStatus.FalsePositive }, new Issue { ProjectName = project1Name, ScreenName = screen1Name, LocaleCode = "pl-PL", IssueType = IssueType.Overlapping, Identifier = "3", Value = "", ModifiedInBuildId = currentBuildId, IssueStatus = IssueStatus.Active, X = 0, Y = 0, Width = 10, Height = 10 }, new Issue { ProjectName = project1Name, ScreenName = screen1Name, LocaleCode = "pl-PL", IssueType = IssueType.CharacterCorruption, Identifier = "7", Value = "C0rrpu4Ed!", ModifiedInBuildId = previousBuildId, IssueStatus = IssueStatus.Active }, }; foreach (Issue i in issues) { context.Issues.Add(i); } context.SaveChanges(userName); return(context); }
/// <summary> /// Get list of comparisons /// </summary> /// <param name="unitOfWork">Unit of work</param> /// <param name="project">Project name</param> /// <param name="build1Id">ID of the "from" build</param> /// <param name="locale1">Locale of the "from" build</param> /// <param name="build2Id">ID of the "to" build</param> /// <param name="locale2">Locale of the "to" build</param> /// <returns></returns> public async Task <IList <Comparison> > GetComparisons(UnitOfWork unitOfWork, string project, Guid build1Id, string locale1, Guid build2Id, string locale2) { IList <Comparison> comparisons = new List <Comparison>(); GenericRepository <Build> buildRepo = unitOfWork.BuildRepository; GenericRepository <Comparison> comparisonRepo = unitOfWork.ComparisonRepository; GenericRepository <ScreenInBuild> screenInBuildRepo = unitOfWork.ScreenInBuildRepository; List <ScreenInBuild> sourceScreens = (await screenInBuildRepo.GetAsync(s => s.ProjectName.Equals(project) && s.LocaleCode.Equals(locale1) && s.BuildId == build1Id, includeProperties: "Build")).ToList(); if (build1Id.Equals(build2Id) && locale1.Equals(locale2)) { foreach (ScreenInBuild sourceScreen in sourceScreens) { comparisons.Add(new Comparison() { SourceScreenInBuildId = sourceScreen.ScreenInBuildId, TargetScreenInBuildId = sourceScreen.ScreenInBuildId, Difference = 0 }); } return(comparisons); } List <ScreenInBuild> targetScreens = (await screenInBuildRepo.GetAsync(s => s.ProjectName.Equals(project) && s.LocaleCode.Equals(locale2) && s.BuildId == build2Id, includeProperties: "Build")).ToList(); HashSet <Guid> sourceBuildIds = new HashSet <Guid>(sourceScreens.Select(s => s.ScreenInBuildId).ToList()); Dictionary <Guid, List <Comparison> > comparisonsDict = (await comparisonRepo.GetAsync(c => sourceBuildIds.Contains(c.SourceScreenInBuildId), includeProperties: "SourceScreenInBuild,TargetScreenInBuild")).GroupBy(c => c.SourceScreenInBuildId).ToDictionary(c => c.Key, c => c.ToList()); foreach (ScreenInBuild sourceScreen in sourceScreens) { ScreenInBuild targetScreen = targetScreens.FirstOrDefault(s => s.ScreenName.Equals(sourceScreen.ScreenName)); if (targetScreen != null) { //Comparison comparison = (await comparisonRepo.GetAsync(c => c.SourceScreenInBuildId == sourceScreen.ScreenInBuildId && c.TargetScreenInBuildId == targetScreen.ScreenInBuildId, includeProperties: "SourceScreenInBuild,TargetScreenInBuild")).FirstOrDefault(); Comparison comparison = null; if (comparisonsDict.ContainsKey(sourceScreen.ScreenInBuildId)) { comparison = comparisonsDict[sourceScreen.ScreenInBuildId].FirstOrDefault(c => c.TargetScreenInBuildId == targetScreen.ScreenInBuildId); } string diffImagePath = StorageHelper.GetDiffImagePath(sourceScreen.ScreenInBuildId, targetScreen.ScreenInBuildId); string diffAbsImagePath = StorageHelper.GetScreenAbsPath(diffImagePath); bool diffImageExists = ImageHelper.CheckImage(diffAbsImagePath); // reverse comparison paths string revDiffAbsImagePath = StorageHelper.GetScreenAbsPath(StorageHelper.GetDiffImagePath(targetScreen.ScreenInBuildId, sourceScreen.ScreenInBuildId)); if (comparison != null) { comparisons.Add(comparison); } else { Comparison newComparison = new Comparison(); newComparison.SourceScreenInBuildId = sourceScreen.ScreenInBuildId; newComparison.TargetScreenInBuildId = targetScreen.ScreenInBuildId; string screenAbsFromPath = StorageHelper.GetScreenAbsPath(StorageHelper.GetScreenPath(project, sourceScreen.LocaleCode, sourceScreen.Build.BuildName, sourceScreen.ScreenName)); string screenAbsToPath = StorageHelper.GetScreenAbsPath(StorageHelper.GetScreenPath(project, targetScreen.LocaleCode, targetScreen.Build.BuildName, targetScreen.ScreenName)); bool diffImageFolderCreated = StorageHelper.GenerateDiffImageFolder(Path.GetDirectoryName(diffAbsImagePath)); bool srcImageExists = ImageHelper.CheckImage(screenAbsFromPath) && ImageHelper.CheckImage(screenAbsToPath); if (diffImageFolderCreated && srcImageExists) { newComparison.Difference = ImageHelper.CompareImages(screenAbsFromPath, screenAbsToPath, diffAbsImagePath); comparisonRepo.Insert(newComparison); //copy diff image for reverse comparison if (System.IO.File.Exists(diffAbsImagePath)) { System.IO.File.Copy(diffAbsImagePath, revDiffAbsImagePath); } //add reverse comparison to the database Comparison revComparison = new Comparison() { Difference = newComparison.Difference, SourceScreenInBuildId = newComparison.TargetScreenInBuildId, TargetScreenInBuildId = newComparison.SourceScreenInBuildId }; comparisonRepo.Insert(revComparison); await unitOfWork.SaveAsync(); comparisons.Add( new Comparison() { SourceScreenInBuildId = sourceScreen.ScreenInBuildId, TargetScreenInBuildId = targetScreen.ScreenInBuildId, Difference = newComparison.Difference }); } else { string errorMessage = "Error comparing images!"; if (!srcImageExists) { errorMessage += "\nscreenFromPath or screenToPath doesn't exists."; } if (!diffImageFolderCreated) { errorMessage += "\nCreate diff image folder failure."; } throw new Exception(errorMessage); } } } else { comparisons.Add(new Comparison() { SourceScreenInBuildId = sourceScreen.ScreenInBuildId, Difference = 1 }); } } return(comparisons); }
public async Task <IActionResult> Get(string project, [FromQuery] Guid screen1Id, [FromQuery] Guid screen2Id) { //Build buildFrom = await _buildRepo.GetByIDAsync(screen1Id); //Build buildTo = await _buildRepo.GetByIDAsync(screen2Id); _logger.LogInformation(string.Format("screen1Id:{0},screen2Id:{1}", screen1Id.ToString(), screen2Id.ToString())); //if (buildFrom == null || buildTo == null) // return NotFound($"Invalid build [{screen1Id}] or [{screen2Id}]"); ScreenInBuild screenFrom = (await _screenInBuildRepo.GetAsync(s => s.ScreenInBuildId == screen1Id, includeProperties: "Build")).FirstOrDefault(); ScreenInBuild screenTo = (await _screenInBuildRepo.GetAsync(s => s.ScreenInBuildId == screen2Id, includeProperties: "Build")).FirstOrDefault(); if (screenFrom == null || screenTo == null) { return(NotFound($"Cannot find build screen [{screen1Id}] or [{screen2Id}]!")); } else if (screenFrom.ScreenInBuildId == screenTo.ScreenInBuildId) { return(Ok(new ComparisonDto() { Difference = 0, DiffImagePath = null, SourceScreenInBuildId = screenFrom.ScreenInBuildId, TargetScreenInBuildId = screenTo.ScreenInBuildId, SourceScreenName = screenFrom.ScreenName, TargetScreenName = screenTo.ScreenName })); } else { Comparison comparison = (await _comparisonRepo.GetAsync(c => c.SourceScreenInBuildId == screenFrom.ScreenInBuildId && c.TargetScreenInBuildId == screenTo.ScreenInBuildId, includeProperties: "SourceScreenInBuild,TargetScreenInBuild")).FirstOrDefault(); string diffImagePath = StorageHelper.GetDiffImagePath(screenFrom.ScreenInBuildId, screenTo.ScreenInBuildId); string diffAbsImagePath = StorageHelper.GetScreenAbsPath(diffImagePath); bool diffImageExists = ImageHelper.CheckImage(diffAbsImagePath); // reverse comparison paths string revDiffAbsImagePath = StorageHelper.GetScreenAbsPath(StorageHelper.GetDiffImagePath(screenTo.ScreenInBuildId, screenFrom.ScreenInBuildId)); if (comparison != null && diffImageExists) { return(Ok(new ComparisonDto(comparison))); } else { Comparison newComparison = new Comparison(); newComparison.SourceScreenInBuildId = screenFrom.ScreenInBuildId; newComparison.TargetScreenInBuildId = screenTo.ScreenInBuildId; string screenAbsFromPath = StorageHelper.GetScreenAbsPath(StorageHelper.GetScreenPath(project, screenFrom.LocaleCode, screenFrom.Build.BuildName, screenFrom.ScreenName)); string screenAbsToPath = StorageHelper.GetScreenAbsPath(StorageHelper.GetScreenPath(project, screenTo.LocaleCode, screenTo.Build.BuildName, screenTo.ScreenName)); bool diffImageFolderCreated = StorageHelper.GenerateDiffImageFolder(Path.GetDirectoryName(diffAbsImagePath)); bool srcImageExists = ImageHelper.CheckImage(screenAbsFromPath) && ImageHelper.CheckImage(screenAbsToPath); if (diffImageFolderCreated && srcImageExists) { newComparison.Difference = ImageHelper.CompareImages(screenAbsFromPath, screenAbsToPath, diffAbsImagePath); //copy diff image for reverse comparison if (System.IO.File.Exists(diffAbsImagePath)) { System.IO.File.Copy(diffAbsImagePath, revDiffAbsImagePath); } if (comparison == null) { _comparisonRepo.Insert(newComparison); //add reverse comparison to the database Comparison revComparison = new Comparison() { Difference = newComparison.Difference, SourceScreenInBuildId = newComparison.TargetScreenInBuildId, TargetScreenInBuildId = newComparison.SourceScreenInBuildId }; _comparisonRepo.Insert(revComparison); } else { comparison.Difference = newComparison.Difference; } await _unitOfWork.SaveAsync(); return(Ok(new ComparisonDto(newComparison))); } else { string errorMessage = "Error comparing images!"; if (!srcImageExists) { errorMessage += "\nscreenFromPath or screenToPath doesn't exists."; } if (!diffImageFolderCreated) { errorMessage += "\nCreate diff image folder failure."; } _logger.LogError(errorMessage); return(StatusCode((int)HttpStatusCode.InternalServerError, errorMessage)); } } } }
public async Task <IActionResult> Post(string project, string name, string locale, string build, [FromBody] CreateScreenDto screenData) { GenericRepository <Build> buildRepo = _unitOfWork.BuildRepository; Build buildEntity; string currentUser = User.Identity.Name; // Workaround for local readonly user if (!Authentication.LdapHelper.CanWrite(currentUser)) { return(Unauthorized()); } try { Guid buildId; if (!Guid.TryParse(build, out buildId)) { buildEntity = (await buildRepo.GetAsync(b => b.BuildName.Equals(build))).FirstOrDefault(); } else { buildEntity = buildRepo.GetByID(buildId); } } catch (Exception ex) { _logger.LogError(ex, "Error in screens controller"); return(BadRequest()); } if (buildEntity == null) { return(BadRequest($"Build with id {build} doesn't exist!")); } if (!ModelState.IsValid || buildEntity == null || string.IsNullOrWhiteSpace(project) || string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(locale) || screenData == null) { return(BadRequest("Invalid or missing parameters")); } GenericRepository <Project> projectRepo = _unitOfWork.ProjectRepository; Project projectEntity = projectRepo.GetByID(project); if (projectEntity == null) { return(BadRequest($"Project {project} doesn't exist!")); } GenericRepository <Locale> localeRepo = _unitOfWork.LocaleRepository; if (localeRepo.GetByID(locale) == null) { return(BadRequest($"Unknown locale {locale}!")); } GenericRepository <Screen> screenRepo = _unitOfWork.ScreenRepository; if (screenRepo.GetByID(name, project) == null) { Screen screen = new Screen() { Project = projectEntity, ScreenName = name }; screenRepo.Insert(screen); await _unitOfWork.SaveAsync(currentUser); } GenericRepository <ScreenInBuild> screenInBuildRepo = _unitOfWork.ScreenInBuildRepository; var existingScreen = screenInBuildRepo.Get(sr => sr.BuildId == buildEntity.Id && sr.ProjectName.Equals(project) && sr.LocaleCode.Equals(locale) && sr.ScreenName.Equals(name)).FirstOrDefault(); bool missingFile = false; if (existingScreen != null) { string existingScreenLocalPath = StorageHelper.GetScreenAbsPath(StorageHelper.GetScreenPath(project, locale, buildEntity.BuildName, name)); if (System.IO.File.Exists(existingScreenLocalPath)) { byte[] existingContent = System.IO.File.ReadAllBytes(existingScreenLocalPath); if (!screenData.Content.SequenceEqual(existingContent)) { return(StatusCode((int)HttpStatusCode.Conflict)); } else { return(StatusCode((int)HttpStatusCode.NoContent)); } } else { missingFile = true; } } string screenLocalPath = _storageHelper.StoreScreen(project, locale, buildEntity.BuildName, name, screenData.Content); ScreenDto newScreen; if (!missingFile) { ScreenInBuild newScreenInBuild = new ScreenInBuild() { ProjectName = project, ScreenName = name, BuildId = buildEntity.Id, LocaleCode = locale }; screenInBuildRepo.Insert(newScreenInBuild); await _unitOfWork.SaveAsync(currentUser); newScreen = new ScreenDto(newScreenInBuild); } else { newScreen = new ScreenDto(existingScreen); } return(CreatedAtRoute(routeName: "GetScreenRoute", routeValues: new { project = project, id = newScreen.Id }, value: newScreen)); }