Fix conversation failure handling and confirmed delivery memories
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
const {test}=require('node:test');
|
||||
const assert=require('node:assert/strict');
|
||||
const queue=require('../.test-build/conversation-store.js');
|
||||
const ale=require('../.test-build/ale-store.js');
|
||||
const {runConversationTick}=require('../.test-build/conversation.js');
|
||||
|
||||
test('conversation failure, queued delivery, confirmed memory and replay safety',async()=>{
|
||||
const request={id:'request-1',speakerName:'Player',message:'Hi',channel:'whisper',receiver:'Resident',nearbyBots:[]};
|
||||
const bot={id:'bot-1',name:'Resident',status:'online',autonomy:{managed:true},memories:[],personality:{},race:'Orc',role:'Warrior'};
|
||||
const state={revision:0,sequence:0,events:[],bots:[bot],settings:{provider:'ollama',model:'test',brains:{enabled:false,residentMemoryLimit:5,residentMaxTokens:100}}};
|
||||
const store={load:async()=>state,save:async()=>{}};
|
||||
let pending=request,delivery=[],queued=0,failed='',completed=0;
|
||||
queue.pendingDeliveries=async()=>delivery;
|
||||
queue.leaseConversation=async()=>{const r=pending;pending=null;return r;};
|
||||
queue.failConversation=async(_db,_id,error)=>{failed=error;};
|
||||
queue.completeConversation=async()=>{completed++;};
|
||||
queue.cleanupConversations=async()=>{};
|
||||
queue.awaitDelivery=async(_db,r,botId,reply,commandId)=>{delivery=[{request:r,botId,reply,commandId,status:'pending'}];};
|
||||
ale.queueAleCommand=async()=>{queued++;return {id:'command-1'};};
|
||||
const originalFetch=global.fetch;
|
||||
try{
|
||||
await assert.rejects(runConversationTick(store,{},{}),/not configured/);
|
||||
assert.match(failed,/no canned reply/);assert.equal(queued,0);assert.equal(bot.memories.length,0);
|
||||
pending=request;global.fetch=async()=>({ok:false,status:503});
|
||||
await assert.rejects(runConversationTick(store,{}, {LLM_URL:'http://model'}),/503/);
|
||||
assert.equal(queued,0);
|
||||
pending=request;global.fetch=async()=>({ok:true,json:async()=>({message:{content:'{"reply":"Hello, traveler."}'}})});
|
||||
await runConversationTick(store,{}, {LLM_URL:'http://model'});
|
||||
assert.equal(queued,1);assert.equal(bot.memories.length,0);assert.equal(completed,0);
|
||||
await runConversationTick(store,{},{});
|
||||
assert.equal(bot.memories.length,0);
|
||||
delivery[0].status='completed';
|
||||
await runConversationTick(store,{},{});
|
||||
assert.equal(bot.memories.length,1);assert.equal(completed,1);
|
||||
await runConversationTick(store,{},{});
|
||||
assert.equal(bot.memories.length,1);
|
||||
delivery=[{...delivery[0],request:{...request,id:'request-2'},status:'failed',error:'Bot offline'}];
|
||||
await runConversationTick(store,{},{});
|
||||
assert.equal(failed,'Bot offline');assert.equal(bot.memories.length,1);
|
||||
}finally{global.fetch=originalFetch;}
|
||||
});
|
||||
Reference in New Issue
Block a user