ChatHistoryStoreTests.cscsharp

Documentation

Version 1 design tests

Automated checks for chat and saved history (/history, /new, XML sessions under %AppData%/AgentCore/Version 1/ChatHistory).

Quick run

# From repo root (builds + offline unit tests)
python src/Version1/DesignTests/run-design-tests.py

# With live Ollama chat (localhost:11434, model gemma4)
python src/Version1/DesignTests/run-design-tests.py --live
.\src\Version1\DesignTests\run-design-tests.ps1
.\src\Version1\DesignTests\run-design-tests.ps1 -Live

What runs

| Suite | Needs network | Covers | |-------|----------------|--------| | ChatHistoryStoreTests | No | Save, list, load, session ids | | OllamaClientHistoryTests | No | Client save/load without HTTP | | OllamaLiveTests | Yes (--live) | Real StreamReply against Ollama |

dotnet only

dotnet test src/Version1/DesignTests/AgentCore.DesignTests.csproj
dotnet test src/Version1/DesignTests/AgentCore.DesignTests.csproj --filter "Category=Integration"

Set RUN_LIVE_TESTS=1 for integration tests without the Python runner.

Console video (testers)

Manual evidence runs use the shared test manager (records Lilith.exe):

python src/TestManager/test_manager.py list
python src/TestManager/test_manager.py record v1 chat-basic --build

See src/TestManager/README.md.

using Agent.Core.Ollama;using Xunit;namespace Agent.Core.DesignTests;public class ChatHistoryStoreTests{    [Fact]    public void SaveSession_persists_messages_and_lists_summary()    {        string root = CreateTempHistoryRoot();        try        {            var store = new ChatHistoryStore(root);            var history = new ChatHistory            {                new ChatMessage("user", "Design test ping"),                new ChatMessage("assistant", "Design test pong", Tokens: 12)            };            string id = store.SaveSession("gemma4", history);            Assert.True(File.Exists(Path.Combine(root, id + ".xml")));            IReadOnlyList<ChatSessionSummary> sessions = store.ListSessions();            Assert.Single(sessions);            Assert.Equal("Design test ping", sessions[0].Title);            Assert.Equal(2, sessions[0].MessageCount);            Assert.Equal("gemma4", sessions[0].Model);        }        finally        {            TryDeleteDirectory(root);        }    }    [Fact]    public void LoadSession_restores_messages_and_updates_current_id()    {        string root = CreateTempHistoryRoot();        try        {            var store = new ChatHistoryStore(root);            var history = new ChatHistory            {                new ChatMessage("user", "Remember this"),                new ChatMessage("assistant", "Acknowledged")            };            string id = store.SaveSession("gemma4", history);            store.StartNewSession();            SavedChatSession? loaded = store.LoadSession(id);            Assert.NotNull(loaded);            Assert.Equal(id, store.CurrentSessionId);            Assert.Equal(2, loaded!.Messages.Count);            Assert.Equal("Remember this", loaded.Messages[0].Content);        }        finally        {            TryDeleteDirectory(root);        }    }    [Fact]    public void StartNewSession_changes_current_id_without_deleting_files()    {        string root = CreateTempHistoryRoot();        try        {            var store = new ChatHistoryStore(root);            string first = store.SaveSession("gemma4", new ChatHistory { new ChatMessage("user", "one") });            store.StartNewSession();            string second = store.CurrentSessionId;            Assert.NotEqual(first, second);            Assert.Single(store.ListSessions());        }        finally        {            TryDeleteDirectory(root);        }    }    [Fact]    public void SaveSession_overwrites_same_id_and_bumps_message_count()    {        string root = CreateTempHistoryRoot();        try        {            var store = new ChatHistoryStore(root);            string id = store.SaveSession("gemma4", new ChatHistory { new ChatMessage("user", "first line") });            store.UseSession(id);            store.SaveSession("gemma4", new ChatHistory            {                new ChatMessage("user", "first line"),                new ChatMessage("assistant", "second line")            });            SavedChatSession? loaded = store.LoadSession(id);            Assert.NotNull(loaded);            Assert.Equal(2, loaded!.Messages.Count);            Assert.Equal(2, store.ListSessions().Single().MessageCount);        }        finally        {            TryDeleteDirectory(root);        }    }    private static string CreateTempHistoryRoot()    {        string path = Path.Combine(Path.GetTempPath(), "AgentCore-DesignTests", Guid.NewGuid().ToString("N"));        Directory.CreateDirectory(path);        return path;    }    private static void TryDeleteDirectory(string path)    {        try        {            if (Directory.Exists(path))            {                Directory.Delete(path, recursive: true);            }        }        catch        {            // Best-effort cleanup for temp design-test folders.        }    }}