import { describe } from "mocha"; import { expect } from "chai"; import { AccessStatus, ComponentStats, DriveObject, FileType, } from "../src/trees/treeTypes"; import { calculateComponentStats, addComponentStats, createEmptyComponentStats, } from "../src/trees/treeTools"; import { ResearchObjectComponentType } from "../src/ResearchObject"; describe("TreeTools", () => { describe("addComponentStats", () => { it("adds two empty objects", () => { const res = addComponentStats( createEmptyComponentStats(), createEmptyComponentStats() ); expect(res.code.count).to.eq(0); expect(res.code.size).to.eq(0); expect(res.data.count).to.eq(0); expect(res.data.size).to.eq(0); // expect(res.link.count).to.eq(0); // expect(res.link.size).to.eq(0); expect(res.unknown.count).to.eq(0); expect(res.unknown.size).to.eq(0); }); it("adds an empty object to a nonempty object", () => { const res = addComponentStats( { code: { count: 1, size: 1, dirs: 11, }, data: { count: 2, size: 2, dirs: 21, }, // link: { count: 3, size: 3, dirs: 31 }, pdf: { count: 4, size: 4, dirs: 41, }, unknown: { count: 5, size: 5, dirs: 51 }, }, createEmptyComponentStats() ); expect(res.code.count).to.eq(1); expect(res.code.size).to.eq(1); expect(res.code.dirs).to.eq(11); expect(res.data.count).to.eq(2); expect(res.data.size).to.eq(2); expect(res.data.dirs).to.eq(21); // expect(res.link.count).to.eq(3); // expect(res.link.size).to.eq(3); // expect(res.link.dirs).to.eq(31); expect(res.pdf.count).to.eq(4); expect(res.pdf.size).to.eq(4); expect(res.pdf.dirs).to.eq(41); expect(res.unknown.count).to.eq(5); expect(res.unknown.size).to.eq(5); expect(res.unknown.dirs).to.eq(51); }); }); describe("calculateComponentStats", () => { it("calculates empty case correctly", () => { const emptyDrive: DriveObject = { name: "", lastModified: "", componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, cid: "", type: FileType.DIR, }; const res = calculateComponentStats(emptyDrive); expect(res?.code).to.be.undefined; expect(res?.data).to.be.undefined; // expect(res?.link).to.be.undefined; expect(res?.unknown).to.be.undefined; // expect(res?.video).to.be.undefined; }); it("calculates simple case correctly", () => { const simpleDrive: DriveObject = { name: "", lastModified: "", componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, cid: "", type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 1, cid: "1", accessStatus: AccessStatus.PUBLIC, name: "a", lastModified: "1", metadata: {}, type: FileType.FILE, }, ], }; const res = calculateComponentStats(simpleDrive) as ComponentStats; expect(res).to.exist; expect(res.code).to.not.be.undefined; expect(res.code.size).to.eq(1); expect(res.code.count).to.eq(1); expect(res.data.size).to.eq(0); expect(res.data.count).to.eq(0); // expect(res.link.size).to.eq(0); // expect(res.link.count).to.eq(0); expect(res.unknown.size).to.eq(0); expect(res.unknown.count).to.eq(0); }); it("calculates with every component present in data bucket correctly", () => { const simpleDrive: DriveObject = { name: "", lastModified: "", componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, cid: "", type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 1, cid: "1", accessStatus: AccessStatus.PUBLIC, name: "a", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.DATA, size: 2, cid: "2", accessStatus: AccessStatus.PUBLIC, name: "b", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 3, cid: "3", accessStatus: AccessStatus.PUBLIC, name: "c", lastModified: "1", metadata: {}, type: FileType.FILE, }, // { // componentType: ResearchObjectComponentType.LINK, // size: 0, // cid: '4', // accessStatus: AccessStatus.PUBLIC, // name: 'd', // lastModified: '1', // metadata: {}, // type: FileType.FILE, // }, ], }; const res = calculateComponentStats(simpleDrive) as ComponentStats; expect(res).to.exist; expect(res.code.size).to.eq(1); expect(res.code.count).to.eq(1); expect(res.data.size).to.eq(2); expect(res.data.count).to.eq(1); expect(res.unknown.size).to.eq(3); expect(res.unknown.count).to.eq(1); // expect(res.link.size).to.eq(0); // expect(res.link.count).to.eq(1); }); it("calculates nesting of single component type correctly", () => { const simpleDrive: DriveObject = { name: "", lastModified: "", componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, cid: "", type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 20, cid: "1", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "2", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "3", accessStatus: AccessStatus.PUBLIC, name: "code2", lastModified: "1", metadata: {}, type: FileType.FILE, }, ], }, ], }; const res = calculateComponentStats(simpleDrive) as ComponentStats; expect(res.code.size).to.eq(20); expect(res.code.count).to.eq(2); expect(res.code.dirs).to.eq(1); }); it("calculates nesting of single component type and an additional component nested correctly", () => { const simpleDrive: DriveObject = { name: "", lastModified: "", componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, cid: "", type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 30, cid: "1", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "2", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "3", accessStatus: AccessStatus.PUBLIC, name: "code2", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, cid: "4", accessStatus: AccessStatus.PUBLIC, name: "unknown", lastModified: "1", metadata: {}, type: FileType.FILE, }, ], }, ], }; const res = calculateComponentStats(simpleDrive) as ComponentStats; expect(res.code.size).to.eq(20); expect(res.code.count).to.eq(2); expect(res.code.dirs).to.eq(1); expect(res.unknown.size).to.eq(10); expect(res.unknown.count).to.eq(1); expect(res.unknown.dirs).to.eq(0); }); it("calculates deep complex nesting of multiple component types", () => { const simpleDrive: DriveObject = { name: "", lastModified: "", componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, cid: "", type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 30, cid: "1", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "2", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "3", accessStatus: AccessStatus.PUBLIC, name: "code2", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, cid: "4", accessStatus: AccessStatus.PUBLIC, name: "unknown", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, cid: "5", accessStatus: AccessStatus.PUBLIC, name: "unknown-folder", lastModified: "1", metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 100, cid: "3", accessStatus: AccessStatus.PUBLIC, name: "code3", lastModified: "1", metadata: {}, type: FileType.FILE, }, ], }, ], }, ], }; const res = calculateComponentStats(simpleDrive) as ComponentStats; expect(res.code.size).to.eq(120); expect(res.code.count).to.eq(3); expect(res.code.dirs).to.eq(1); expect(res.unknown.size).to.eq(10); expect(res.unknown.count).to.eq(1); expect(res.unknown.dirs).to.eq(1); }); }); it("defers to cached component stats if available", () => { const simpleDrive: DriveObject = { name: "", lastModified: "", componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, cid: "", type: FileType.DIR, componentStats: { code: { count: 1337, size: 1337, dirs: 1337 }, data: { count: 1337, size: 1337, dirs: 1337 }, // link: { count: 1337, size: 1337, dirs: 1337 }, pdf: { count: 1337, size: 1337, dirs: 1337 }, unknown: { count: 1337, size: 1337, dirs: 1337 }, }, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 30, cid: "1", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "2", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "3", accessStatus: AccessStatus.PUBLIC, name: "code2", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, cid: "4", accessStatus: AccessStatus.PUBLIC, name: "unknown", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, cid: "5", accessStatus: AccessStatus.PUBLIC, name: "unknown-folder", lastModified: "1", metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 100, cid: "3", accessStatus: AccessStatus.PUBLIC, name: "code3", lastModified: "1", metadata: {}, type: FileType.FILE, }, ], }, ], }, ], }; const res = calculateComponentStats(simpleDrive) as ComponentStats; expect(res.code.size).to.eq(1337); expect(res.code.count).to.eq(1337); expect(res.code.dirs).to.eq(1337); expect(res.unknown.size).to.eq(1337); expect(res.unknown.count).to.eq(1337); expect(res.unknown.dirs).to.eq(1337); }); it("defers to nested cached component stats if available", () => { const simpleDrive: DriveObject = { name: "", lastModified: "", componentType: ResearchObjectComponentType.DATA_BUCKET, accessStatus: AccessStatus.PUBLIC, size: 0, metadata: {}, cid: "", type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 30, cid: "1", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.DIR, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "2", accessStatus: AccessStatus.PUBLIC, name: "code", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.CODE, size: 10, cid: "3", accessStatus: AccessStatus.PUBLIC, name: "code2", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, cid: "4", accessStatus: AccessStatus.PUBLIC, name: "unknown", lastModified: "1", metadata: {}, type: FileType.FILE, }, { componentType: ResearchObjectComponentType.UNKNOWN, size: 10, cid: "5", accessStatus: AccessStatus.PUBLIC, name: "unknown-folder", lastModified: "1", metadata: {}, type: FileType.DIR, componentStats: { code: { count: 50, size: 50, dirs: 50 }, data: { count: 0, size: 0, dirs: 0 }, // link: { count: 0, size: 0, dirs: 0 }, pdf: { count: 99, size: 99, dirs: 99 }, unknown: { count: 0, size: 0, dirs: 0 }, }, contains: [ { componentType: ResearchObjectComponentType.CODE, size: 100, cid: "3", accessStatus: AccessStatus.PUBLIC, name: "code3", lastModified: "1", metadata: {}, type: FileType.FILE, }, ], }, ], }, ], }; const res = calculateComponentStats(simpleDrive) as ComponentStats; expect(res.code.size).to.eq(20 + 50); expect(res.code.count).to.eq(2 + 50); expect(res.code.dirs).to.eq(1 + 50); expect(res.unknown.size).to.eq(10); expect(res.unknown.count).to.eq(1); expect(res.unknown.dirs).to.eq(1); expect(res.pdf.size).to.eq(99); expect(res.pdf.count).to.eq(99); expect(res.pdf.dirs).to.eq(99); }); });