mirror of
https://github.com/microsoft/SkillOpt.git
synced 2026-07-03 14:02:58 +08:00
test: add unit tests for CopilotCliBackend (parsing + alias + isolated home)
Covers _parse_jsonl_response (multi-message concat, junk-line skipping, empty/non-assistant events), get_backend alias resolution, and the isolated-COPILOT_HOME / full-env opt-out behavior. Pure logic, no CLI required. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -509,5 +509,77 @@ class TestFullCycleAndAdopt(unittest.TestCase):
|
||||
self.assertIn("answer", f.read().lower())
|
||||
|
||||
|
||||
class TestCopilotBackend(unittest.TestCase):
|
||||
"""Pure-logic tests for CopilotCliBackend — no `copilot` CLI required."""
|
||||
|
||||
def test_alias_resolution(self):
|
||||
from skillopt_sleep.backend import CopilotCliBackend, get_backend
|
||||
for name in ("copilot", "github_copilot", "copilot_cli", "gh_copilot"):
|
||||
self.assertIsInstance(get_backend(name), CopilotCliBackend, name)
|
||||
|
||||
def test_parse_jsonl_concatenates_assistant_messages(self):
|
||||
from skillopt_sleep.backend import CopilotCliBackend
|
||||
raw = "\n".join([
|
||||
'{"type":"session.info","data":{}}',
|
||||
'{"type":"assistant.message","data":{"content":"hello"}}',
|
||||
'not-json-noise',
|
||||
'{"type":"user.message","data":{"content":"ignored"}}',
|
||||
'{"type":"assistant.message","data":{"content":"world"}}',
|
||||
])
|
||||
self.assertEqual(CopilotCliBackend._parse_jsonl_response(raw), "hello\nworld")
|
||||
|
||||
def test_parse_jsonl_ignores_non_assistant_and_blank(self):
|
||||
from skillopt_sleep.backend import CopilotCliBackend
|
||||
self.assertEqual(CopilotCliBackend._parse_jsonl_response(""), "")
|
||||
self.assertEqual(
|
||||
CopilotCliBackend._parse_jsonl_response('{"type":"result","data":{"content":"x"}}'),
|
||||
"",
|
||||
)
|
||||
# assistant.message with empty/missing content contributes nothing
|
||||
self.assertEqual(
|
||||
CopilotCliBackend._parse_jsonl_response(
|
||||
'{"type":"assistant.message","data":{"content":""}}\n'
|
||||
'{"type":"assistant.message","data":{}}'
|
||||
),
|
||||
"",
|
||||
)
|
||||
|
||||
def test_isolated_home_by_default(self):
|
||||
from skillopt_sleep.backend import CopilotCliBackend
|
||||
be = CopilotCliBackend()
|
||||
self.assertFalse(be.full_env)
|
||||
self.assertTrue(be.copilot_home) # an isolated COPILOT_HOME is set
|
||||
|
||||
def test_full_env_opt_out(self):
|
||||
from skillopt_sleep.backend import CopilotCliBackend
|
||||
prev = os.environ.get("SKILLOPT_SLEEP_COPILOT_FULL_ENV")
|
||||
os.environ["SKILLOPT_SLEEP_COPILOT_FULL_ENV"] = "1"
|
||||
try:
|
||||
be = CopilotCliBackend()
|
||||
self.assertTrue(be.full_env)
|
||||
self.assertEqual(be.copilot_home, "") # real user environment used
|
||||
finally:
|
||||
if prev is None:
|
||||
os.environ.pop("SKILLOPT_SLEEP_COPILOT_FULL_ENV", None)
|
||||
else:
|
||||
os.environ["SKILLOPT_SLEEP_COPILOT_FULL_ENV"] = prev
|
||||
|
||||
def test_home_override_env(self):
|
||||
from skillopt_sleep.backend import CopilotCliBackend
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
target = os.path.join(d, "myhome")
|
||||
prev = os.environ.get("SKILLOPT_SLEEP_COPILOT_HOME")
|
||||
os.environ["SKILLOPT_SLEEP_COPILOT_HOME"] = target
|
||||
try:
|
||||
be = CopilotCliBackend()
|
||||
self.assertEqual(be.copilot_home, target)
|
||||
self.assertTrue(os.path.isdir(target)) # created on init
|
||||
finally:
|
||||
if prev is None:
|
||||
os.environ.pop("SKILLOPT_SLEEP_COPILOT_HOME", None)
|
||||
else:
|
||||
os.environ["SKILLOPT_SLEEP_COPILOT_HOME"] = prev
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main(verbosity=2)
|
||||
|
||||
Reference in New Issue
Block a user