OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-wallet-desktop / test / mocks / fs-mock.cjs

128 lines · javascript ref:
// test/mocks/fs-mock.cjs - In-Memory Filesystem Mock for Testing

const { Volume } = require('memfs')

/**
 * Create mock filesystem with initial structure
 * @param {Object} initialFiles - Initial file structure (optional)
 * @returns {Object} - Mock fs object with standard fs methods
 */
function createMockFS(initialFiles = {}) {
  // Create default hyper-wallet directory structure
  const defaultStructure = {
    '/home/user/.hyper-wallet/': null,
    '/tmp/': null,
    ...initialFiles
  }

  const vol = Volume.fromJSON(defaultStructure)

  return {
    // File read/write operations
    readFileSync: vol.readFileSync.bind(vol),
    writeFileSync: vol.writeFileSync.bind(vol),
    appendFileSync: vol.appendFileSync.bind(vol),
    readFile: vol.readFile.bind(vol),
    writeFile: vol.writeFile.bind(vol),
    appendFile: vol.appendFile.bind(vol),

    // File existence and stats
    existsSync: vol.existsSync.bind(vol),
    statSync: vol.statSync.bind(vol),
    lstatSync: vol.lstatSync.bind(vol),
    stat: vol.stat.bind(vol),
    lstat: vol.lstat.bind(vol),

    // Directory operations
    mkdirSync: vol.mkdirSync.bind(vol),
    rmdirSync: vol.rmdirSync.bind(vol),
    readdirSync: vol.readdirSync.bind(vol),
    mkdir: vol.mkdir.bind(vol),
    rmdir: vol.rmdir.bind(vol),
    readdir: vol.readdir.bind(vol),

    // File manipulation
    unlinkSync: vol.unlinkSync.bind(vol),
    renameSync: vol.renameSync.bind(vol),
    copyFileSync: vol.copyFileSync.bind(vol),
    unlink: vol.unlink.bind(vol),
    rename: vol.rename.bind(vol),
    copyFile: vol.copyFile.bind(vol),

    // Permissions (mocked - memfs doesn't enforce but tracks)
    chmodSync: vol.chmodSync.bind(vol),
    chownSync: vol.chownSync.bind(vol),
    chmod: vol.chmod.bind(vol),
    chown: vol.chown.bind(vol),

    // Access the underlying Volume for advanced operations
    __vol: vol,

    // Helper: Reset filesystem to initial state
    reset() {
      vol.reset()
      const newVol = Volume.fromJSON(defaultStructure)
      Object.assign(vol, newVol)
    },

    // Helper: Dump current filesystem state (for debugging)
    dump() {
      return vol.toJSON()
    }
  }
}

/**
 * Create mock fs with wallet files already present
 * @param {Object} options - Configuration
 * @param {string} options.identityMnemonic - Identity mnemonic content
 * @param {string} options.walletMnemonic - Wallet mnemonic content
 * @param {string} options.token - API token content
 * @returns {Object} - Mock fs object
 */
function createMockFSWithWallet(options = {}) {
  const {
    identityMnemonic = 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art',
    walletMnemonic = 'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about',
    token = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'
  } = options

  const initialFiles = {
    '/home/user/.hyper-wallet/.identity-mnemonic': identityMnemonic,
    '/home/user/.hyper-wallet/.wallet-mnemonic': walletMnemonic,
    '/home/user/.hyper-wallet/.token': token,
    '/home/user/.hyper-wallet/devices.json': JSON.stringify([])
  }

  return createMockFS(initialFiles)
}

/**
 * Mock fs.promises API
 * @param {Object} mockFS - Mock fs object from createMockFS
 * @returns {Object} - Promises-based fs API
 */
function createMockFSPromises(mockFS) {
  return {
    readFile: (...args) => Promise.resolve(mockFS.readFileSync(...args)),
    writeFile: (...args) => { mockFS.writeFileSync(...args); return Promise.resolve() },
    appendFile: (...args) => { mockFS.appendFileSync(...args); return Promise.resolve() },
    unlink: (...args) => { mockFS.unlinkSync(...args); return Promise.resolve() },
    mkdir: (...args) => { mockFS.mkdirSync(...args); return Promise.resolve() },
    rmdir: (...args) => { mockFS.rmdirSync(...args); return Promise.resolve() },
    readdir: (...args) => Promise.resolve(mockFS.readdirSync(...args)),
    stat: (...args) => Promise.resolve(mockFS.statSync(...args)),
    lstat: (...args) => Promise.resolve(mockFS.lstatSync(...args)),
    rename: (...args) => { mockFS.renameSync(...args); return Promise.resolve() },
    copyFile: (...args) => { mockFS.copyFileSync(...args); return Promise.resolve() },
    chmod: (...args) => { mockFS.chmodSync(...args); return Promise.resolve() },
    chown: (...args) => { mockFS.chownSync(...args); return Promise.resolve() }
  }
}

module.exports = {
  createMockFS,
  createMockFSWithWallet,
  createMockFSPromises
}