bend_puzzle/test/server-backup-test.js
33333-33333 9d70afb4cc
Some checks failed
BEND FIELD CI / release (push) Has been cancelled
BEND FIELD CI / production-bridge (push) Has been cancelled
t
2026-08-01 22:31:04 +09:00

26 lines
1.8 KiB
JavaScript

'use strict';
const assert=require('assert/strict');
const fs=require('fs');
const fsp=fs.promises;
const os=require('os');
const path=require('path');
const {createWorldBackup,verifyWorldBackup,restoreWorldBackup}=require('../server/world-backup');
(async()=>{
const root=await fsp.mkdtemp(path.join(os.tmpdir(),'linkfield-backup-')),world=path.join(root,'world'),backups=path.join(root,'backups');
try{
await fsp.mkdir(path.join(world,'shared-world.boards'),{recursive:true});
const board={meta:{id:'B0'},state:{solved:false}},record={revision:3,global:{worldGeneration:'test'},boardVersions:{B0:3}};
await fsp.writeFile(path.join(world,'shared-world.json'),JSON.stringify(record));
await fsp.writeFile(path.join(world,'shared-world.boards','B0.3.json'),JSON.stringify(board));
await fsp.writeFile(path.join(world,`${'a'.repeat(24)}.json`),JSON.stringify({playerId:'a'.repeat(24)}));
const created=await createWorldBackup(world,backups,{retain:2,appVersion:'test'});assert.equal(created.manifest.worldRevision,3);assert.equal(created.manifest.fileCount,3);
const verified=await verifyWorldBackup(backups,created.name);assert.equal(verified.manifest.app,'LinkField');
await fsp.writeFile(path.join(world,'shared-world.json'),JSON.stringify({...record,revision:4}));
const restored=await restoreWorldBackup(world,backups,created.name);assert(fs.existsSync(restored.previous));
assert.equal(JSON.parse(await fsp.readFile(path.join(world,'shared-world.json'),'utf8')).revision,3);
assert.deepEqual(JSON.parse(await fsp.readFile(path.join(world,'shared-world.boards','B0.3.json'),'utf8')),board);
console.log('Server backup checksum and recoverable restore test passed');
}finally{await fsp.rm(root,{recursive:true,force:true})}
})().catch(error=>{console.error(error);process.exitCode=1});