cc-libs/tests/trapgpt.lua

156 lines
4.6 KiB
Lua

local createLibTest = require('/apis/libtest');
local createTrapGpt = require('/apis/libtrapgpt');
local testlib = createLibTest({ ... });
local function fakeSettings(values)
values = values or {};
return {
get = function(key) return values[key]; end,
};
end
local function fakeAi(replies)
local calls = {};
local idx = 0;
return {
ask = function(prompt, options)
idx = idx + 1;
calls[#calls + 1] = { prompt = prompt, options = options };
local reply = replies[idx];
if reply == false then return false, 'ai failed'; end
return true, { reply = reply or 'ok' };
end,
calls = calls,
};
end
local function fakeChatBox()
local messages = {};
return {
sendMessage = function(message, prefix)
messages[#messages + 1] = { message = message, prefix = prefix };
return true;
end,
messages = messages,
};
end
testlib.test('trapgpt queues visible chat messages only', function()
local ai = fakeAi({ 'hi' });
local chatBox = fakeChatBox();
local bot = createTrapGpt({
ai = ai,
chatBox = chatBox,
settings = fakeSettings({ trapgpt_throttle_seconds = 0 }),
sleep = function() end,
now = function() return 10; end,
});
testlib.assertEquals(bot.onChat('alice', 'hello', 'uuid-a', false), true);
testlib.assertEquals(bot.onChat('bob', '$secret', 'uuid-b', true), false);
testlib.assertEquals(bot.pendingCount(), 1);
end);
testlib.test('trapgpt sends queued messages in one prompt', function()
local ai = fakeAi({ 'bonjour' });
local chatBox = fakeChatBox();
local bot = createTrapGpt({
ai = ai,
chatBox = chatBox,
settings = fakeSettings({ ['trapgpt.throttle_seconds'] = 0 }),
sleep = function() end,
now = function() return 20; end,
});
bot.onChat('alice', 'one', nil, false);
bot.onChat('bob', 'two', nil, false);
local processed, reply = bot.processOnce();
testlib.assertEquals(processed, true);
testlib.assertEquals(reply, 'bonjour');
testlib.assertEquals(#ai.calls, 1);
testlib.assertTrue(ai.calls[1].prompt:find('alice: one', 1, true) ~= nil);
testlib.assertTrue(ai.calls[1].prompt:find('bob: two', 1, true) ~= nil);
testlib.assertEquals(ai.calls[1].options.sessionSettingKey, 'trapgpt.opencc.session_id');
testlib.assertEquals(#chatBox.messages, 1);
testlib.assertEquals(chatBox.messages[1].prefix, 'TrapGPT');
end);
testlib.test('trapgpt only sends missing messages after success', function()
local ai = fakeAi({ 'first', 'second' });
local bot = createTrapGpt({
ai = ai,
chatBox = fakeChatBox(),
settings = fakeSettings({ ['trapgpt.throttle_seconds'] = 0 }),
sleep = function() end,
now = function() return 30; end,
});
bot.onChat('alice', 'one', nil, false);
bot.processOnce();
bot.onChat('bob', 'two', nil, false);
bot.processOnce();
testlib.assertEquals(#ai.calls, 2);
testlib.assertTrue(ai.calls[2].prompt:find('bob: two', 1, true) ~= nil);
testlib.assertTrue(ai.calls[2].prompt:find('alice: one', 1, true) == nil);
end);
testlib.test('trapgpt keeps queue when ai fails', function()
local ai = fakeAi({ false, 'retry' });
local chatBox = fakeChatBox();
local bot = createTrapGpt({
ai = ai,
chatBox = chatBox,
settings = fakeSettings({ ['trapgpt.throttle_seconds'] = 0 }),
sleep = function() end,
now = function() return 40; end,
log = function() end,
});
bot.onChat('alice', 'one', nil, false);
testlib.assertEquals(bot.processOnce(), false);
testlib.assertEquals(bot.pendingCount(), 1);
testlib.assertEquals(bot.processOnce(), true);
testlib.assertEquals(bot.pendingCount(), 0);
testlib.assertEquals(#chatBox.messages, 1);
end);
testlib.test('trapgpt does not send SILENCE replies', function()
local ai = fakeAi({ 'SILENCE' });
local chatBox = fakeChatBox();
local bot = createTrapGpt({
ai = ai,
chatBox = chatBox,
settings = fakeSettings({ ['trapgpt.throttle_seconds'] = 0 }),
sleep = function() end,
now = function() return 50; end,
});
bot.onChat('alice', 'one', nil, false);
testlib.assertEquals(bot.processOnce(), true);
testlib.assertEquals(#chatBox.messages, 0);
end);
testlib.test('trapgpt truncates long replies', function()
local ai = fakeAi({ 'abcdefghij' });
local chatBox = fakeChatBox();
local bot = createTrapGpt({
ai = ai,
chatBox = chatBox,
settings = fakeSettings({
['trapgpt.throttle_seconds'] = 0,
['trapgpt.max_reply_chars'] = 6,
}),
sleep = function() end,
now = function() return 60; end,
});
bot.onChat('alice', 'one', nil, false);
bot.processOnce();
testlib.assertEquals(chatBox.messages[1].message, 'abc...');
end);
testlib.run();