Beispiel #1
0
 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, '/');
 }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        /// <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));
                    }
                }
            }
        }
Beispiel #6
0
        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));
        }