// 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
}