import {fireEvent,render,screen,within} from '@testing-library/react'; import {buildProjectTree,ProjectTree} from './ProjectTree'; const files=[ {path:'robot/meshes/arm.obj',size:2048}, {path:'robot/model.xml',size:512}, {path:'robot/textures/body.png',size:4096}, {path:'README.txt',size:10}, ]; describe('ProjectTree',()=>{ it('按路径构建多级目录,并将目录排在文件前面',()=>{ const tree=buildProjectTree(files); expect(tree.map(node=>[node.kind,node.name])).toEqual([['directory','robot'],['file','README.txt']]); const robot=tree[0]; expect(robot.children?.map(node=>[node.kind,node.name])).toEqual([ ['directory','meshes'],['directory','textures'],['file','model.xml'], ]); expect(robot.children?.[0].children?.[0]).toMatchObject({kind:'file',name:'arm.obj',path:'robot/meshes/arm.obj'}); }); it('以可折叠目录显示文件名,而不是平铺完整路径',()=>{ render(); const tree=screen.getByRole('navigation',{name:'工程文件树'}),robot=within(tree).getByText('robot'),meshes=within(tree).getByText('meshes'); expect(robot.closest('details')).toHaveAttribute('open'); expect(meshes.closest('details')).not.toHaveAttribute('open'); fireEvent.click(meshes); expect(within(tree).getByText('arm.obj')).toBeVisible(); expect(within(tree).queryByText('robot/meshes/arm.obj')).not.toBeInTheDocument(); expect(within(tree).getByText('urdf')).toBeVisible(); }); });