Files
Meldwork/desktop/test/security/private-file.test.cjs
T
Ryder Sun ec6674d96a feat: ship concurrent collaboration harness
Implement frozen concurrent responses, Agent-negotiated V4 discussion work, strict durable receipts and recovery, validated runtime phase UI, and the animated return-to-bottom control. Prepare the 0.1.2 prerelease metadata and documentation.\n\nChecks before commit: frontend 299/299; desktop 1270/1270; deterministic eval 6 cases/18 results; web and desktop renderer builds; desktop pack; staged and unstaged diff checks.
2026-08-17 11:35:32 +08:00

51 lines
1.8 KiB
JavaScript

const test = require('node:test')
const assert = require('node:assert/strict')
const fs = require('node:fs')
const os = require('node:os')
const path = require('node:path')
const { atomicWritePrivateFile } = require('../../src/security/private-file.cjs')
function fixture(t) {
const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'meldwork-private-file-'))
t.after(() => fs.rmSync(directory, { recursive: true, force: true }))
return directory
}
test('private file writes replace contents atomically with restrictive permissions', (t) => {
const directory = fixture(t)
const filename = path.join(directory, 'nested', 'private.json')
atomicWritePrivateFile(filename, 'first')
atomicWritePrivateFile(filename, 'second')
assert.equal(fs.readFileSync(filename, 'utf8'), 'second')
assert.equal(fs.statSync(filename).mode & 0o777, 0o600)
assert.deepEqual(fs.readdirSync(path.dirname(filename)), ['private.json'])
})
test('private file writes remove their temporary file when replacement fails', (t) => {
const directory = fixture(t)
const filename = path.join(directory, 'occupied')
fs.mkdirSync(filename)
assert.throws(() => atomicWritePrivateFile(filename, 'blocked'))
assert.deepEqual(fs.readdirSync(directory), ['occupied'])
})
test('permission failures leave the previous destination unchanged', (t) => {
const directory = fixture(t)
const filename = path.join(directory, 'private.json')
atomicWritePrivateFile(filename, 'first')
const chmodSync = fs.chmodSync
fs.chmodSync = () => { throw new Error('CHMOD_FAILED') }
t.after(() => { fs.chmodSync = chmodSync })
assert.throws(
() => atomicWritePrivateFile(filename, 'second'),
{ message: 'CHMOD_FAILED' },
)
assert.equal(fs.readFileSync(filename, 'utf8'), 'first')
assert.deepEqual(fs.readdirSync(directory), ['private.json'])
})