@@ -3,7 +3,7 @@ import { tmpdir } from 'node:os'
|
||||
import { join } from 'node:path'
|
||||
import { afterEach, describe, expect, it } from 'vitest'
|
||||
import { simpleGit } from 'simple-git'
|
||||
import { buildTreeFromPaths, createProjectFile, readAll, readProjectFile, readTree, writeProjectFile } from '../src/main/fs-service'
|
||||
import { buildTreeFromPaths, createProjectFile, readAll, readDirChildren, readProjectFile, readTree, writeProjectFile } from '../src/main/fs-service'
|
||||
|
||||
let dir = ''
|
||||
afterEach(async () => { if (dir) await rm(dir, { recursive: true, force: true }) })
|
||||
@@ -33,6 +33,51 @@ describe('readTree', () => {
|
||||
expect(top.indexOf('src')).toBeLessThan(top.indexOf('README.md'))
|
||||
expect(top.indexOf('src')).toBeLessThan(top.indexOf('logo.bin'))
|
||||
})
|
||||
|
||||
it('shows an empty folder (no files yet) that rg --files can not emit', async () => {
|
||||
dir = await fixture()
|
||||
await mkdir(join(dir, 'empty'), { recursive: true })
|
||||
await mkdir(join(dir, 'src', 'nested', 'deep'), { recursive: true }) // file-empty nested chain
|
||||
const tree = await readTree(dir)
|
||||
const top = (tree.children || []).map((c) => c.name)
|
||||
expect(top).toContain('empty')
|
||||
const empty = (tree.children || []).find((c) => c.name === 'empty')!
|
||||
expect(empty.type).toBe('dir')
|
||||
// the nested empty chain shows under the (file-bearing) src folder
|
||||
const src = (tree.children || []).find((c) => c.name === 'src')!
|
||||
const nested = (src.children || []).find((c) => c.name === 'nested')!
|
||||
expect(nested.type).toBe('dir')
|
||||
expect((nested.children || []).map((c) => c.name)).toEqual(['deep'])
|
||||
})
|
||||
})
|
||||
|
||||
describe('readDirChildren', () => {
|
||||
it('returns a single folder\'s children (root and subdir), ignoring node_modules', async () => {
|
||||
dir = await fixture()
|
||||
const top = (await readDirChildren(dir, '')).map((c) => c.name)
|
||||
expect(top).toContain('src')
|
||||
expect(top).toContain('README.md')
|
||||
expect(top).not.toContain('node_modules')
|
||||
const src = await readDirChildren(dir, 'src')
|
||||
expect(src.map((c) => c.name)).toEqual(['a.ts'])
|
||||
expect(src[0].path).toBe('src/a.ts')
|
||||
})
|
||||
|
||||
it('shows an empty subfolder created since the initial tree read', async () => {
|
||||
dir = await fixture()
|
||||
await mkdir(join(dir, 'src', 'fresh'), { recursive: true })
|
||||
const src = await readDirChildren(dir, 'src')
|
||||
const fresh = src.find((c) => c.name === 'fresh')
|
||||
expect(fresh?.type).toBe('dir')
|
||||
expect(fresh?.path).toBe('src/fresh')
|
||||
})
|
||||
|
||||
it('reflects files added/removed since the initial tree read', async () => {
|
||||
dir = await fixture()
|
||||
await writeFile(join(dir, 'src', 'b.ts'), 'export const b = 2\n')
|
||||
await rm(join(dir, 'src', 'a.ts'))
|
||||
expect((await readDirChildren(dir, 'src')).map((c) => c.name)).toEqual(['b.ts'])
|
||||
})
|
||||
})
|
||||
|
||||
describe('readAll', () => {
|
||||
@@ -67,6 +112,15 @@ describe('buildTreeFromPaths', () => {
|
||||
expect((src.children || []).map((c) => c.name)).toEqual(['util', 'a.ts', 'b.ts'])
|
||||
expect((src.children || []).find((c) => c.name === 'util')!.path).toBe('src/util')
|
||||
})
|
||||
|
||||
it('forces dirPaths in as empty folders, deduped against file-derived dirs', () => {
|
||||
const t = buildTreeFromPaths('proj', ['src/a.ts'], ['empty', 'src/sub', 'src'])
|
||||
const top = (t.children || []).map((c) => c.name)
|
||||
expect(top).toEqual(['empty', 'src']) // dirs alphabetical, both present once
|
||||
const src = (t.children || []).find((c) => c.name === 'src')!
|
||||
expect((src.children || []).map((c) => c.name)).toEqual(['sub', 'a.ts'])
|
||||
expect((src.children || []).find((c) => c.name === 'sub')!.type).toBe('dir')
|
||||
})
|
||||
})
|
||||
|
||||
describe('read/write round-trip', () => {
|
||||
|
||||
Reference in New Issue
Block a user