OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-note / test / unit / drive-gc.test.js

64 lines · javascript ref:
import test from 'brittle'
import fs from 'bare-fs'
import path from 'bare-path'
import os from 'bare-os'
import Corestore from 'corestore'
import Hyperbee from 'hyperbee'
import { DriveManager } from '../../lib/drive-manager.js'

function tmpSetup () {
  const dir = path.join(os.tmpdir(), 'hn-dgc-' + Date.now() + '-' + Math.random().toString(36).slice(2))
  fs.mkdirSync(dir, { recursive: true })
  const store = new Corestore(dir)
  const registry = new Hyperbee(store.get({ name: 'registry' }), { keyEncoding: 'utf-8', valueEncoding: 'json' })
  const dm = new DriveManager(store, registry)
  return { store, registry, dm, dir }
}

function rmrf (dir) {
  try {
    for (const f of fs.readdirSync(dir)) {
      const fp = path.join(dir, f)
      if (fs.statSync(fp).isDirectory()) rmrf(fp)
      else fs.unlinkSync(fp)
    }
    fs.rmdirSync(dir)
  } catch {}
}

test('deleteDrive — writes a tombstone so the orphaned cores stay trackable', async (t) => {
  const { registry, dm, dir } = tmpSetup()
  await registry.ready()

  await dm.createDrive('gone')
  await dm.deleteDrive('gone')

  t.absent((await registry.get('notebook-drive:gone')), 'live registry entry removed')
  const tomb = await registry.get('deleted-drive:gone')
  t.ok(tomb, 'tombstone written')
  t.is(tomb.value.slug, 'gone')
  t.is(tomb.value.isLocal, true)
  t.ok(typeof tomb.value.deletedAt === 'number', 'records deletedAt')

  await dm.closeAll()
  rmrf(dir)
})

test('listDeletedDrives — surfaces every deleted drive (no longer silently orphaned)', async (t) => {
  const { registry, dm, dir } = tmpSetup()
  await registry.ready()

  await dm.createDrive('a')
  await dm.createDrive('b')
  await dm.createDrive('keep')
  await dm.deleteDrive('a')
  await dm.deleteDrive('b')

  const deleted = await dm.listDeletedDrives()
  const slugs = deleted.map(d => d.slug).sort()
  t.alike(slugs, ['a', 'b'], 'both deletions tracked, live "keep" excluded')

  await dm.closeAll()
  rmrf(dir)
})