Files
minecraft-lab/tests/helpers/deployment-fixture.mjs
2026-10-04 00:30:09 +07:00

46 lines
2.8 KiB
JavaScript

import fs from 'node:fs';
import path from 'node:path';
import { fixture, seal } from './runtime-fixture.mjs';
import { runtime } from '../../platform/runtime.mjs';
import { deployOnHost, deployableRelease, releaseName, sha256 } from '../../platform/deployment.mjs';
export function setup(t){
const f=fixture(t);
const manifest=JSON.parse(fs.readFileSync(path.join(f.release,'manifest.json')));
manifest.git={dirty:false,commit:'1'.repeat(40)};manifest.managed_files={server:[]};
fs.writeFileSync(path.join(f.release,'manifest.json'),JSON.stringify(manifest));seal(f.release);
// Health's actual waiting/state machine is tested separately. This adapter
// substitutes readiness, while retaining real binding/lock/Compose checks.
f.execute=options=>{
const args=options.args[0]==='health'?['ps']:options.args.filter((item,index,array)=>item!=='--wait'&&item!=='--wait-timeout'&&array[index-1]!=='--wait-timeout');
const result=runtime({...options,args});
if(result===0&&args[0]==='up'){
const config=path.join(options.env.MC_RELEASE_DIR,'server/config');
for(const file of fs.readdirSync(config)){
fs.mkdirSync(path.join(options.env.MC_ROOT,'runtime/config'),{recursive:true});fs.copyFileSync(path.join(config,file),path.join(options.env.MC_ROOT,'runtime/config',file));
}
}
return result;
};
f.deploy=(release=f.release,receive)=>{
const verified=deployableRelease(release);
return deployOnHost({repository:f.root,root:f.host,targetName:releaseName(verified.manifest),targetIdentity:verified.identity,targetChecksums:sha256(path.join(release,'SHA256SUMS')),releaseBytes:1024,timeout:30,env:f.env,execute:f.execute,receive:receive??(stage=>fs.cpSync(release,stage,{recursive:true}))});
};
f.next=(version='2.0.0',edit=()=>{})=>{
const release=path.join(f.root,'release-'+version);fs.cpSync(f.release,release,{recursive:true});
const manifest=JSON.parse(fs.readFileSync(path.join(release,'manifest.json')));manifest.pack.version=version;
fs.writeFileSync(path.join(release,'manifest.json'),JSON.stringify(manifest));edit(release);seal(release);return release;
};
f.state=()=>JSON.parse(fs.readFileSync(path.join(f.host,'deployment-state.json')));
f.events=()=>JSON.parse(fs.readFileSync(path.join(f.root,'.tools/events.json')));
return f;
}
export function addConfig(release,value='original'){
fs.writeFileSync(path.join(release,'server/config/marker.txt'),value);
const manifest=JSON.parse(fs.readFileSync(path.join(release,'manifest.json')));
manifest.release_files.push({path:'server/config/marker.txt'});
manifest.managed_files.server.push({path:'config/marker.txt',owner:'server',policy:'replace',hashes:{sha256:sha256(path.join(release,'server/config/marker.txt'))}});
fs.writeFileSync(path.join(release,'manifest.json'),JSON.stringify(manifest));seal(release);
}