Merge pull request #7444 from N-Shar-ma/file-path-split-bug-fix

Fix FileExplorer Path Splitting Bug
This commit is contained in:
Fredrik Adelöw
2021-10-28 13:41:35 +02:00
committed by GitHub
3 changed files with 259 additions and 20 deletions
@@ -0,0 +1,222 @@
/*
* Copyright 2021 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { groupByPath, buildFileStructure } from './FileExplorer';
const dummyFiles = [
{
filename: 'dir1/file1',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
{
filename: 'dir1/file2',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
{
filename: 'dir2/file3',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
{
filename: 'dir3/dir2/dir1/file4',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
{
filename: 'dir3/dir2/dir3/file4',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
];
const dummyDataGroupedByPath = {
dir1: [
{
filename: 'dir1/file1',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
{
filename: 'dir1/file2',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
],
dir2: [
{
filename: 'dir2/file3',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
],
dir3: [
{
filename: 'dir3/dir2/dir1/file4',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
{
filename: 'dir3/dir2/dir3/file4',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
},
],
};
const coverageTableRow = {
files: dummyFiles,
coverage: 1,
missing: 1,
tracked: 1,
path: '',
};
const coverageTableRowResults = {
files: [
{
path: 'dir1',
files: [
{
path: 'file1',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
},
{
path: 'file2',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
},
],
coverage: 1,
missing: 2,
tracked: 2,
},
{
path: 'dir2',
files: [
{
path: 'file3',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
},
],
coverage: 1,
missing: 1,
tracked: 1,
},
{
path: 'dir3',
files: [
{
path: 'dir2',
files: [
{
path: 'dir1',
files: [
{
path: 'file4',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
},
],
coverage: 1,
missing: 1,
tracked: 1,
},
{
path: 'dir3',
files: [
{
path: 'file4',
files: [],
coverage: 1,
missing: 1,
tracked: 1,
},
],
coverage: 1,
missing: 1,
tracked: 1,
},
],
coverage: 1,
missing: 2,
tracked: 2,
},
],
coverage: 1,
missing: 2,
tracked: 2,
},
],
coverage: 1,
missing: 1,
tracked: 1,
path: '',
};
describe('groupByPath function', () => {
it('should group files by their root directory,as per their filename', () => {
expect(groupByPath(dummyFiles)).toStrictEqual(dummyDataGroupedByPath);
});
});
describe('buildFileStructure function', () => {
it('should group files by their root directory,as per their filename', () => {
expect(buildFileStructure(coverageTableRow)).toStrictEqual(
coverageTableRowResults,
);
});
});
@@ -30,7 +30,6 @@ import { useAsync } from 'react-use';
import { codeCoverageApiRef } from '../../api';
import { FileEntry } from '../../types';
import { FileContent } from './FileContent';
import {
Progress,
ResponseErrorPanel,
@@ -51,33 +50,46 @@ type CoverageTableRow = {
tableData?: { id: number };
};
const buildFileStructure = (row: CoverageTableRow) => {
const dataGroupedByPath: FileStructureObject = row.files.reduce(
(acc: FileStructureObject, cur: CoverageTableRow) => {
let path = cur.filename;
if (row.path) {
path = path?.split(`${row.path}/`)[1];
}
const pathArray = path?.split('/');
if (!pathArray) {
return acc;
}
export const groupByPath = (files: CoverageTableRow[]) => {
const acc: FileStructureObject = {};
files.forEach(file => {
const filename = file.filename;
if (!file.filename) return;
const pathArray = filename?.split('/').filter(el => el !== '');
if (pathArray) {
if (!acc.hasOwnProperty(pathArray[0])) {
acc[pathArray[0]] = [];
}
acc[pathArray[0]].push(cur);
return acc;
},
{},
);
acc[pathArray[0]].push(file);
}
});
return acc;
};
const removeVisitedPathGroup = (
files: CoverageTableRow[],
pathGroup: string,
) => {
return files.map(file => {
return {
...file,
filename: file.filename
? file.filename.substring(
file.filename?.indexOf(pathGroup) + pathGroup.length + 1,
)
: file.filename,
};
});
};
export const buildFileStructure = (row: CoverageTableRow) => {
const dataGroupedByPath: FileStructureObject = groupByPath(row.files);
row.files = Object.keys(dataGroupedByPath).map(pathGroup => {
return buildFileStructure({
path: pathGroup,
files: dataGroupedByPath.hasOwnProperty('files')
? dataGroupedByPath.files
: dataGroupedByPath[pathGroup],
? removeVisitedPathGroup(dataGroupedByPath.files, pathGroup)
: removeVisitedPathGroup(dataGroupedByPath[pathGroup], pathGroup),
coverage:
dataGroupedByPath[pathGroup].reduce(
(acc: number, cur: CoverageTableRow) => acc + cur.coverage,