### # Copyright (c) 2021, John Burwell # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions, and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions, and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the author of this software nor the name of # contributors to this software may be used to endorse or promote products # derived from this software without specific prior written consent. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. ### from supybot.test import PluginTestCase class ChatTestCase(PluginTestCase): plugins = ('Chat',) def test_truncate_messages_within_limit(self): from plugins.Chat.plugin import truncate_messages messages = [{"role": "user", "content": "Hello"}] result = truncate_messages(messages, max_tokens=10) self.assertEqual(result, messages) def test_truncate_messages_exceeds_limit(self): from plugins.Chat.plugin import truncate_messages messages = [ {"role": "user", "content": "Hello"}, {"role": "user", "content": "This is a very long message that exceeds the token limit."} ] result = truncate_messages(messages, max_tokens=5) self.assertEqual(result, [{"role": "user", "content": "Hello"}]) def test_truncate_messages_empty(self): from plugins.Chat.plugin import truncate_messages messages = [] result = truncate_messages(messages, max_tokens=10) self.assertEqual(result, []) def test_system_prompt_replacement(self): # Simulate system prompt replacement from plugins.Chat.plugin import Chat plugin = self.irc.getCallback('Chat') plugin.registryValue = lambda key: { "system_prompt": "You are $bot_name in $channel_name." }.get(key, "") system_prompt = plugin.registryValue("system_prompt") system_prompt = system_prompt.replace("$bot_name", "TestBot").replace("$channel_name", "#test") self.assertEqual(system_prompt, "You are TestBot in #test.") def test_join_logic(self): # Simulate join logic for multi-line responses from plugins.Chat.plugin import Chat plugin = self.irc.getCallback('Chat') plugin.registryValue = lambda key: { "join_string": " / " }.get(key, "") response = "Line 1\nLine 2\nLine 3" lines = response.splitlines() joined_response = plugin.registryValue("join_string").join(line.strip() for line in lines if line.strip()) self.assertEqual(joined_response, "Line 1 / Line 2 / Line 3") # vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: