OpenClaw .NET
Test Dashboard — Unit Tests + E2E (Playwright + Aspire)
650 / 652 650 Passing • 0 Failing • 2 Skipped
652
Total Tests
60 E2E • 527 Unit • 54 Integration • 11 Live
650
Passed
60 E2E • 526 Unit • 53 Integration • 11 Live
0
Failed
0 E2E • 0 Unit • 0 Integration • 0 Live
5m 0s
Duration
E2E: 3m 49s • Unit: 7s • Integration: 23s • Live: 40s
Dashboard generated: April 23, 2026 at 10:19 PM UTC

🎭 E2E Tests (Playwright + Aspire) 60 tests • 3m 49s

Full-stack tests with Aspire AppHost + headless Chromium. Requires Ollama for model-dependent tests.

Demo 01 Launch & Dashboard 5 tests Validates the Aspire AppHost launches correctly and core health/version endpoints respond.
Dashboard_GatewayHealth_IsAccessibleFromWeb
Verifies Gateway health endpoint is reachable through Aspire service discovery
8ms
Dashboard_WebAppHomePage_IsReachable
Confirms the Blazor Web UI loads from the Aspire dashboard URL
630ms
Health_GetEndpoint_ReturnsHealthy
GET /health returns "healthy" status
14ms
OpenApi_GetSpec_ReturnsValidJson
GET /openapi/v1.json returns valid OpenAPI specification
123ms
Version_GetEndpoint_ReturnsVersionInfo
GET /api/version returns version and name
8ms
Demo 02 First Chat 8 tests Validates session creation, chat messaging with Ollama, streaming UI, and session persistence.
Sessions_CreateSession_ReturnsCreated
POST /api/sessions creates a new session in SQLite
19ms
Sessions_GetById_ReturnsFullSession
GET /api/sessions/{id} returns full session object with metadata
71ms
Sessions_GetMessages_ReturnsHistory
GET /api/sessions/{id}/messages returns ordered message history after multi-turn chat
20.2s
Sessions_ListSessions_ReturnsArray
GET /api/sessions returns the sessions list
31ms
Chat_SendMessage_ReturnsResponseWithContent
POST /api/chat with Ollama returns a response with content and token count
9.3s
MultiTurn_CreateChatRenameDelete_FullLifecycle
Full lifecycle: create session, multi-turn chat, rename, delete
48.8s
Chat_NewChat_ShowsStreamingResponse
Blazor UI: click New Chat, type message, see streaming response
2.0s
Chat_SessionAppearsInPanel
After sending a message, session appears in the sidebar
660ms
Demo 03 Tool Use & Tracing 2 tests Validates tool registration and that asking about files triggers actual tool calls.
Tools_GetList_ReturnsRegisteredTools
GET /api/tools returns the registered tool list
10ms
Chat_FileQuestion_TriggersToolUse
Asking about files triggers tool calls (toolCallCount > 0)
1m 13s
Demo 04 Skills 5 tests Validates the skills API (list, toggle, reload) and that the Blazor Skills page renders.
Skills_GetList_ReturnsSkills
GET /api/skills returns the skills list
8ms
Skills_EnableDisable_TogglesState
PUT /api/skills/{id}/toggle changes skill state
8ms
Skills_Reload_ReturnsSuccess
POST /api/skills/reload refreshes skill definitions from disk
9ms
SkillsPage_Loads_ShowsSkillsList
Blazor Skills page renders with skill entries
2.9s
SkillsPage_ShowsSkillDetails_WhenExpanded
Blazor Skills page shows expandable skill detail entries
640ms
Demo 05 Settings & Config 6 tests Validates the Settings UI loads, settings API returns configuration, and provider switching works.
SettingsPage_Loads_ShowsProviderSelector
Blazor Settings page shows model provider selector
697ms
SettingsPage_CanSelectDifferentProvider
Blazor Settings page has a provider selector with multiple options
2.2s
SettingsPage_GatewaySettingsApi_ReturnsCurrentSettings
GET /api/settings returns current model settings
29ms
Settings_GetCurrentSettings_ReturnsProviderInfo
GET /api/settings returns current provider, model, and endpoint info
13ms
Settings_PutSettings_UpdatesProvider
PUT /api/settings changes provider and GET confirms the change
35ms
Settings_UpdateProvider_ChangesRuntime
PUT /api/settings roundtrip: update provider, verify, restore original
12ms
Demo 06 SignalR & Real-time 1 test Validates the SignalR ChatHub is running and accepting negotiate requests.
SignalR_ChatHub_EndpointIsReachable
POST /hubs/chat/negotiate confirms SignalR hub is running
13ms
Demo 07 Web UI Navigation 20 tests Validates all 8 Blazor pages load via direct navigation and sidebar click navigation.
WebApp_HomePage_LoadsSuccessfully
Home page loads with OpenClaw .NET branding
631ms
WebApp_AllNavMenuItems_AreVisible
All 8 sidebar menu items are visible
720ms
ClickNavLink — Chat → /
Clicking "Chat" navigates to chat page
728ms
ClickNavLink — Sessions → /sessions
Clicking sidebar link navigates correctly
709ms
ClickNavLink — Tools → /tools
Clicking sidebar link navigates correctly
734ms
ClickNavLink — Tool Log → /tool-log
Clicking sidebar link navigates correctly
736ms
ClickNavLink — Jobs → /jobs
Clicking sidebar link navigates correctly
747ms
ClickNavLink — Health → /health
Clicking sidebar link navigates correctly
722ms
ClickNavLink — Skills → /skills
Clicking sidebar link navigates correctly
784ms
ClickNavLink — Settings → /settings
Clicking sidebar link navigates correctly
741ms
NavigateTo — / (Chat)
Direct navigation renders Chat page
645ms
NavigateTo — /sessions
Direct navigation renders Sessions page
635ms
NavigateTo — /tools
Direct navigation renders Tools page
666ms
NavigateTo — /tool-log
Direct navigation renders Tool Log page
676ms
NavigateTo — /jobs
Direct navigation renders Jobs page
605ms
NavigateTo — /health
Direct navigation renders Health page
2.7s
NavigateTo — /skills
Direct navigation renders Skills page
685ms
NavigateTo — /settings
Direct navigation renders Settings page
634ms
WebUI_AfterChatInteraction_SessionsListUpdates
Session list updates after chat interaction
636ms
Demo 08 Webhooks 4 tests Validates webhook event processing, payload handling, and listing of processed webhook sessions.
Webhooks_PostEvent_CreatesSession
POST /api/webhooks creates a webhook processing session
9.2s
Webhooks_CodeReviewPayload_CreatesSession
POST /api/webhooks with code-review payload creates processing session
8.7s
Webhooks_GitPushPayload_CreatesSession
POST /api/webhooks with git-push payload creates processing session
8.8s
Webhooks_GetList_ReturnsWebhookSessions
GET /api/webhooks lists processed webhook events
38.2s
Gateway Gateway Only — Standalone Tests 2 tests Validates gateway-specific endpoints that run independently of the full Aspire orchestration.
Gateway_HealthEndpoint_ReturnsDetailedStatus
GET /health returns detailed status with timestamp
11ms
Gateway_ParallelSessions_AreIsolated
Two parallel sessions maintain independent message histories
44.9s

🧪 Unit Tests 527 tests • 6s total • all passing

Fast isolated tests — no Aspire, no Ollama, no network. Run with dotnet test tests/OpenClawNet.UnitTests

INTEGRATION Integration Tests 19 tests Chat smoke tests, live LLM tests, and streaming endpoint tests
Pipeline — EmptyMessage DoesNotThrow
1s
Pipeline — SendMessage ReturnsStreamedTokens
7.7ms
Pipeline — WithProviderError YieldsErrorEvent
19.2ms
Post — AllEventTypes MapCorrectly
8.7ms
Post — EmptyMessage Returns400BadRequest
8.2ms
Post — HttpRequestException YieldsErrorEvent
26.4ms
Post — ModelProviderUnavailable YieldsErrorEvent
10.3ms
Post — SessionIdPassedThrough AppearsInEvents
9.4ms
Post — UnexpectedException YieldsErrorEventWithMessage
15.1ms
Post — UsesCamelCaseJsonNaming
453.6ms
Post — ValidMessage ReturnsNdjsonContentEvents
10ms
Post — ValidMessage SetsNdjsonContentType
30.7ms
Post — WhitespaceMessage Returns400BadRequest
9.2ms
AzureOpenAI — CompleteAsync ReturnsResponse
8s
AzureOpenAI — Pipeline SendMessage ReturnsStreamedContent
5s
AzureOpenAI — StreamAsync YieldsTokens
4.2s
Ollama — CompleteAsync ReturnsResponse
3.2s
Ollama — Pipeline SendMessage ReturnsStreamedContent
9.5s
Ollama — StreamAsync YieldsTokens
3s
GATEWAY Gateway & Routing 41 tests Chat hub, model client routing, runtime settings, and service registration
AddAzureOpenAI — DefaultDeploymentName IsGpt5Mini
< 1ms
AddAzureOpenAI — ReadsEndpointFromAzureOpenAISection TakingPrecedence
2.5ms
AddAzureOpenAI — ReadsEndpointFromModelSection
< 1ms
AddAzureOpenAI — RegistersIModelClient
4.7ms
CompleteAsync — Throws WhenNotConfigured
2.2ms
Constructor — DoesNotThrow WhenApiKeyModeFullyConfigured
< 1ms
Constructor — DoesNotThrow WhenIntegratedModeWithEndpointOnly
1.2ms
Constructor — HandlesIntegratedAuthMode CaseInsensitively(authMode: "INTEGRATED")
< 1ms
Constructor — HandlesIntegratedAuthMode CaseInsensitively(authMode: "integrated")
198.3ms
Constructor — HandlesIntegratedAuthMode CaseInsensitively(authMode: "Integrated")
2.1ms
Constructor — ThrowsInvalidOperation WhenApiKeyMissingInApiKeyMode
1ms
Constructor — ThrowsInvalidOperation WhenEndpointNotConfigured
1.6ms
Constructor — ThrowsInvalidOperation WhenIntegratedModeButNoEndpoint
< 1ms
DefaultOptions — HaveGpt5MiniDeployment
< 1ms
DefaultOptions — UseApiKeyAuthMode
< 1ms
Options — EmptyDeploymentKeepsDefault WhenNotSetInConfig
< 1ms
ProviderName — IsAzureOpenAI
< 1ms
StreamAsync — Throws WhenNotConfigured
1.3ms
StreamChat — CatchesGenericException YieldsError
8.5ms
StreamChat — CatchesProviderException YieldsError
4.9ms
StreamChat — EmptyQuestion StillProcesses
5ms
StreamChat — HttpRequestException YieldsProviderUnavailableError
5.9ms
StreamChat — MapsAllEventTypes
7.2ms
StreamChat — YieldsContentEvents
44ms
CreateAzureOpenAI — ThrowsWhenApiKeyMissing
7ms
GetOrCreate — CachesClient
3.7ms
GetOrCreate — DefaultsToOllama ForUnknownProvider
4.9ms
GetOrCreate — RecreatesClient WhenSettingsChange
15.8ms
GetOrCreate — ReturnsAzureClient WhenProviderIsAzureOpenAI
179.1ms
GetOrCreate — ReturnsOllamaClient WhenProviderIsOllama
3.8ms
Load — BackfillsApiKeyFromConfig WhenFileHasNullApiKey
34ms
Load — FallsBackToConfig WhenNoFile
3.1ms
Load — HandlesMissingFile Gracefully
4.2ms
Load — IConfigOverridesFileForProviderEndpointDeployment
5.8ms
Update — PersistsConfig WithApiKey
5.2ms
Update — PreservesApiKey InMemory
3.2ms
AllAgentProviders — AreResolvable
19ms
ModelOptions — BoundFromConfiguration
9.7ms
RuntimeAgentProvider — CanRouteToOllama
168.2ms
RuntimeModelClient — IsSingleton
3.3ms
RuntimeModelSettings — IsSingleton
2ms
AGENT Agent Runtime & Prompts 23 tests Streaming agent execution, prompt composition, and chat client adapters
AgentStreamEventType — ContainsToolApprovalRequest
< 1ms
ExecuteStreamAsync — DoesNotEmitToolApprovalRequest ForNonApprovalTools
921.2ms
ExecuteStreamAsync — EmitsToolApprovalRequest BeforeToolCallStart ForApprovalRequiredTools
19.9ms
ExecuteStreamAsync — YieldsError WhenPromptComposeThrows
5.5ms
ExecuteStreamAsync — YieldsError WhenStorageFailsOnUserMessage
7.7ms
GetResponseAsync — ConvertsMessages Correctly
24.6ms
GetResponseAsync — PropagatesExceptions
21.8ms
GetStreamingResponseAsync — WithToolCalls YieldsFunctionContent
186.1ms
GetStreamingResponseAsync — YieldsUpdates
18.2ms
ParseArguments — HandlesEmptyString
38.1ms
ParseArguments — HandlesInvalidJson
1.6ms
ParseArguments — HandlesValidJson
< 1ms
ToOpenClawMessage — ExtractsFunctionCallContent
17.8ms
ToOpenClawMessage — MapsRoles Correctly(meaiRole: "assistant", expectedOcRole: Assistant)
< 1ms
ToOpenClawMessage — MapsRoles Correctly(meaiRole: "system", expectedOcRole: System)
< 1ms
ToOpenClawMessage — MapsRoles Correctly(meaiRole: "tool", expectedOcRole: Tool)
< 1ms
ToOpenClawMessage — MapsRoles Correctly(meaiRole: "user", expectedOcRole: User)
< 1ms
ComposeAsync — FallbackPrompt ContainsWorkspacePath
2.4ms
ComposeAsync — FallbackPrompt InstructsFileSystemToolUsage
1.7ms
ComposeAsync — IncludesHistory
31ms
ComposeAsync — IncludesSessionSummary
2.5ms
ComposeAsync — IncludesSystemPrompt
21.2ms
ComposeAsync — UsesAgentsMd WhenWorkspaceProvides
5.7ms
MODELS Model Providers 36 tests Ollama, Azure OpenAI, GitHub Copilot provider configuration and request handling
AllProperties — CanBeAssigned
8.1ms
DefaultValues — AreSetCorrectly
20.3ms
RequiredName — CanBeSetAndRetrieved
< 1ms
CreateChatClient — Throws WhenEndpointNotConfigured
26.8ms
IsAvailableAsync — ReturnsFalse WhenNoEndpoint
< 1ms
IsAvailableAsync — ReturnsTrue WhenEndpointAndIntegratedAuth
1.6ms
IsAvailableAsync — ReturnsTrue WhenEndpointAndKeyConfigured
1.5ms
ProviderName — ReturnsAzureOpenAI
5.3ms
CompleteAsync — ReturnsNonEmptyResponse
4.3s
IsAvailableAsync — ReturnsTrueWhenConfigured
5.9s
StreamAsync — WithTools YieldsToolCallChunk
4.2s
StreamAsync — YieldsChunksAndCompletesSuccessfully
4.5s
CreateChatClient — ReturnsNonNull
< 1ms
CreateChatClient — UsesDefaultModel WhenProfileHasNone
2.9ms
DisposeAsync — CanBeCalledMultipleTimes
< 1ms
IsAvailableAsync — DoesNotThrow WhenNoToken
130.1ms
IsAvailableAsync — ReturnsTrueWhenTokenConfigured
< 1ms
ProviderName — ReturnsGitHubCopilot
1.7ms
CreateChatClient — ReturnsNonNull WithDefaultOptions
3.3ms
CreateChatClient — UsesProfileModel WhenSpecified
< 1ms
IsAvailableAsync — ReturnsFalse WhenEndpointUnreachable
4.2s
ProviderName — ReturnsOllama
33.3ms
CompleteAsync — MapsChatMessageRoles Correctly
4.9ms
CompleteAsync — MapsToolCallsFromResponse
5.4ms
CompleteAsync — ReturnsUsageInfo
3.3ms
CompleteAsync — SendsModelAndMessages
1.7ms
CompleteAsync — SendsStreamFalse ForNonStreaming
24.7ms
CompleteAsync — SerializesTools WhenProvided
16.1ms
StreamAsync — ExtractsToolCalls FromDoneFalseChunk
3.6ms
StreamAsync — GeneratesSyntheticId WhenOllamaOmitsId
2.4ms
StreamAsync — MultipleToolCalls InSingleChunk
2.5ms
StreamAsync — PreservesToolCallIds FromOllama
2ms
StreamAsync — SendsStreamTrue InRequest
3.2ms
StreamAsync — ToolCallsInDoneTrueChunk StillExtracted
90.8ms
StreamAsync — ToolCallsThenContent BothPreserved
2.2ms
StreamAsync — WithTools YieldsToolCallChunk
7.5s
STORAGE Storage & Persistence 16 tests Conversation store, agent profile store, and EF Core data access
DeleteAsync — RemovesProfile
14.5ms
GetAsync — ReturnsNull WhenNotFound
< 1ms
GetDefaultAsync — ReturnsExistingDefault
1s
GetDefaultAsync — SeedsDefault WhenNoneExists
1.8ms
ListAsync — ReturnsAllProfiles OrderedByName
11.6ms
SaveAsync — ThenGetAsync ReturnsProfile
2ms
SaveAsync — UpdatesExistingProfile
3.6ms
AddMessage — AutoCreatedSession HasDefaultTitle
76ms
AddMessage — AutoCreatesSession WhenSessionNotFound
14ms
AddMessage — IncrementsOrderIndex
2.9ms
AddMessage — StoresMessage
2.3ms
CreateSession — ReturnsNewSession
1.1ms
DeleteSession — RemovesSession
4.3ms
GetSession — ReturnsNullWhenNotFound
< 1ms
ListSessions — ReturnsOrderedByUpdatedAt
971.3ms
UpdateSessionTitle — ChangesTitle
2.7ms
JOBS Job Lifecycle 67 tests State machine validation for job status transitions
IsAllowed — ActiveToCancelled ReturnsTrue
< 1ms
IsAllowed — ActiveToCompleted ReturnsTrue
< 1ms
IsAllowed — ActiveToDraft ReturnsFalse
8.4ms
IsAllowed — ActiveToPaused ReturnsTrue
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Active, to: Draft)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Cancelled, to: Active)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Cancelled, to: Completed)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Cancelled, to: Draft)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Cancelled, to: Paused)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Completed, to: Active)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Completed, to: Cancelled)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Completed, to: Draft)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Completed, to: Paused)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Draft, to: Completed)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Draft, to: Paused)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Paused, to: Completed)
< 1ms
IsAllowed — AllInvalidTransitions ReturnFalse(from: Paused, to: Draft)
< 1ms
IsAllowed — AllValidTransitions ReturnTrue(from: Active, to: Cancelled)
< 1ms
IsAllowed — AllValidTransitions ReturnTrue(from: Active, to: Completed)
< 1ms
IsAllowed — AllValidTransitions ReturnTrue(from: Active, to: Paused)
< 1ms
IsAllowed — AllValidTransitions ReturnTrue(from: Draft, to: Active)
3.7ms
IsAllowed — AllValidTransitions ReturnTrue(from: Draft, to: Cancelled)
< 1ms
IsAllowed — AllValidTransitions ReturnTrue(from: Paused, to: Active)
< 1ms
IsAllowed — AllValidTransitions ReturnTrue(from: Paused, to: Cancelled)
< 1ms
IsAllowed — CancelledToActive ReturnsFalse
< 1ms
IsAllowed — CancelledToAnyState ReturnsFalse(to: Active)
< 1ms
IsAllowed — CancelledToAnyState ReturnsFalse(to: Cancelled)
< 1ms
IsAllowed — CancelledToAnyState ReturnsFalse(to: Completed)
< 1ms
IsAllowed — CancelledToAnyState ReturnsFalse(to: Draft)
< 1ms
IsAllowed — CancelledToAnyState ReturnsFalse(to: Paused)
< 1ms
IsAllowed — CancelledToDraft ReturnsFalse
< 1ms
IsAllowed — CompletedToActive ReturnsFalse
< 1ms
IsAllowed — CompletedToAnyState ReturnsFalse(to: Active)
< 1ms
IsAllowed — CompletedToAnyState ReturnsFalse(to: Cancelled)
< 1ms
IsAllowed — CompletedToAnyState ReturnsFalse(to: Completed)
< 1ms
IsAllowed — CompletedToAnyState ReturnsFalse(to: Draft)
< 1ms
IsAllowed — CompletedToAnyState ReturnsFalse(to: Paused)
18ms
IsAllowed — CompletedToDraft ReturnsFalse
< 1ms
IsAllowed — DraftToActive ReturnsTrue
< 1ms
IsAllowed — DraftToCancelled ReturnsTrue
< 1ms
IsAllowed — DraftToCompleted ReturnsFalse
< 1ms
IsAllowed — DraftToPaused ReturnsFalse
< 1ms
IsAllowed — PausedToActive ReturnsTrue
< 1ms
IsAllowed — PausedToCancelled ReturnsTrue
< 1ms
IsAllowed — PausedToCompleted ReturnsFalse
< 1ms
IsAllowed — PausedToDraft ReturnsFalse
< 1ms
IsAllowed — SameStateToSameState ReturnsFalse(status: Active)
< 1ms
IsAllowed — SameStateToSameState ReturnsFalse(status: Cancelled)
< 1ms
IsAllowed — SameStateToSameState ReturnsFalse(status: Completed)
< 1ms
IsAllowed — SameStateToSameState ReturnsFalse(status: Draft)
< 1ms
IsAllowed — SameStateToSameState ReturnsFalse(status: Paused)
< 1ms
IsEditable — Draft ReturnsTrue
< 1ms
IsEditable — NonEditableStates ReturnFalse(status: Active)
< 1ms
IsEditable — NonEditableStates ReturnFalse(status: Cancelled)
< 1ms
IsEditable — NonEditableStates ReturnFalse(status: Completed)
1.1ms
IsEditable — Paused ReturnsTrue
< 1ms
IsTerminal — Cancelled ReturnsTrue
< 1ms
IsTerminal — Completed ReturnsTrue
< 1ms
IsTerminal — NonTerminalStates ReturnFalse(status: Active)
< 1ms
IsTerminal — NonTerminalStates ReturnFalse(status: Draft)
2.9ms
IsTerminal — NonTerminalStates ReturnFalse(status: Paused)
< 1ms
JobStatus — Active HasValue1
< 1ms
JobStatus — Cancelled HasValue3
< 1ms
JobStatus — Completed HasValue4
< 1ms
JobStatus — Draft HasValue0
< 1ms
JobStatus — HasExactlyFiveValues
2.5ms
JobStatus — Paused HasValue2
< 1ms
TOOLS File System & Tool Registry 17 tests File operations, tool execution, and registry management
FindProjects — ExcludesBinAndObjDirectories
11.4ms
FindProjects — ReturnsFailure WhenDirectoryNotFound
2.9ms
FindProjects — ReturnsProjectFiles WhenCsprojExists
69.7ms
List — RelativePath ListsWorkspaceDirectory
5.7ms
List — WithAbsolutePath ListsDirectory
9ms
Read — BlockedPath AlsoBlocksAbsoluteVariants
57ms
Read — BlockedPath ReturnsFailure
12.5ms
Read — WithAbsolutePath ReadsFile
11.7ms
Write — ThenRead RoundTrips
11.4ms
ExecuteAsync — CallsTool WhenFound
7.3ms
ExecuteAsync — ReturnsFail WhenToolNotFound
1.9ms
ExecuteBatchAsync — ExecutesAllTools
20.4ms
GetAllTools — ReturnsRegisteredTools
33.2ms
GetTool — IsCaseInsensitive
< 1ms
GetTool — ReturnsNull WhenNotFound
< 1ms
GetToolManifest — ReturnsMetadata
5.6ms
Register — AddsToolToRegistry
4.8ms
SKILLS Skill Loading & Parsing 16 tests Skill discovery, installation, and metadata parsing
BuiltInSkills — HaveSourceBuiltIn
29.8ms
DisableSkill — ExcludesItFromActiveSkills
28.1ms
EnableSkill — RestoresItToActiveSkills
20.2ms
InstallSkillAsync — CreatesSkillMdInInstalledDirectory
10.6ms
InstallSkillAsync — SetsSourceToInstalled
12.9ms
InstallSkillAsync — SkillAppearsInListAfterInstall
7.9ms
ReloadAsync — IgnoresSubdirectoriesWithoutSkillMd
8.4ms
ReloadAsync — LoadsFlatMdFiles
7.9ms
ReloadAsync — LoadsSubdirectorySkillMd
11.4ms
UninstallSkillAsync — DeletesDirectory
9ms
UninstallSkillAsync — DoesNotThrow WhenSkillNotFound
16ms
UninstallSkillAsync — RemovesSkillFromList
8.6ms
Parse — WithDisabledFlag SetsEnabled
< 1ms
Parse — WithEmptyContent ReturnsEmptyBody
1.8ms
Parse — WithoutFrontmatter UsesFileName
1.4ms
Parse — WithValidFrontmatter ExtractsMetadata
1.2ms
SCHEDULER Job Scheduler 10 tests Concurrent task scheduling and settings persistence
Decrement — DecreasesCount
< 1ms
Increment — IncreasesCount
< 1ms
InitialCount — IsZero
< 1ms
IsThreadSafe — UnderConcurrentIncrementDecrement
48.2ms
GetSettings — ReadsFromConfiguration
2.9ms
GetSettings — ReturnsDefaults WhenNoFileOrConfig
2.1ms
Update — ClampsValues WhenOutOfRange
65.3ms
Update — IsThreadSafe UnderConcurrentWrites
40.1ms
Update — LoadedFileOverridesConfig OnRestart
3.8ms
Update — PersistsToFile
12.3ms
SERVICES Runtime Services 5 tests Agent provider routing and runtime service wiring
CreateChatClient — RoutesToCorrectProvider BasedOnSettings
7.8ms
CreateChatClient — Throws WhenUnknownProviderName
3.4ms
CreateChatClient — UsesProfileProvider WhenSpecified
257.7ms
IsAvailableAsync — DelegatesToActiveProvider
8.8ms
ProviderName — ReturnsActiveProvidersName
1.6ms
DEMOS Document Pipeline 12 tests End-to-end document processing, file system demos, and extraction
CreateJobRequest — WithAllowConcurrentRuns MapsCorrectly
9.4ms
FileSystemTool — FindProjects FindsCsproj
9.2ms
FileSystemTool — ListDirectory ReturnsDirectoriesAndFiles
8.2ms
FileSystemTool — ListDirectory ReturnsSampleDocs
8.4ms
FileSystemTool — ReadFile BlocksSensitivePaths(sensitiveRelPath: ".env")
8.7ms
FileSystemTool — ReadFile BlocksSensitivePaths(sensitiveRelPath: ".git/config")
2.1ms
FileSystemTool — ReadFile BlocksSensitivePaths(sensitiveRelPath: "appsettings.Production.json")
1.7ms
ScheduledJob — DefaultAllowConcurrentRuns IsFalse
2.4ms
SchedulerPollingService — CalculateNextRun RespectsEndAt
5.8ms
SchedulerPollingService — CalculateNextRun StandardCron
1.9ms
SchedulerPollingService — CalculateNextRun WithSeconds
26.8ms
SchedulerPollingService — ProcessDueJobs WithConcurrencyDisabled SkipsRunningJob
5.2ms
AGENT PROFILES Agent Profiles & Import 32 tests Markdown parser, profile store, API endpoints, default enforcement
Parser — PlainMarkdown ExtractsHeadingAsName
< 1ms
Parser — YamlFrontMatter ExtractsAllFields
< 1ms
Parser — FrontMatterWithoutName FallsBackToHeading
< 1ms
Parser — EmptyInput UsesFallbackName
< 1ms
Parser — ToolsArray ParsedToCommaSeparated
< 1ms
Parser — MalformedYaml TreatsAsInstructions
< 1ms
Parser — PartialFrontMatter UnsetFieldsAreNull
< 1ms
Parser — HeadingSlugification Theory (7 cases)
< 1ms
Store — SaveAsync WithDefault ClearsOtherDefaults
2ms
Store — OnlyOneDefault AfterMultipleSaves
1ms
Store — NonDefault DoesNotAffectExisting
< 1ms
Store — GetDefaultAsync SeedsWhenEmpty
1ms
Store — GetAsync ReturnsNull ForNonExistent
< 1ms
Store — DeleteAsync RemovesProfile
< 1ms
Store — ListAsync ReturnsOrdered
< 1ms
API — Import PlainMarkdown ReturnsProfile
5ms
API — Import YamlFrontMatter ParsesCorrectly
3ms
API — Get ListReturnsAll
2ms
API — Put CreatesAndUpdates
3ms
API — Delete RemovesProfile
2ms
MODEL PROVIDERS Model Provider Definitions 22 tests Multi-instance model provider store, REST API endpoints, chat profile resolution, orchestrator passthrough
Store — SaveAsync ThenGetAsync ReturnsDefinition
2ms
Store — GetAsync ReturnsNull WhenNotFound
< 1ms
Store — ListAsync ReturnsAll OrderedByName
1ms
Store — ListByTypeAsync ReturnsOnlyMatchingType
1ms
Store — DeleteAsync RemovesDefinition
< 1ms
Store — SaveAsync UpdatesExisting
1ms
Store — SeedDefaultsAsync CreatesDefaults WhenEmpty
3ms
Store — SeedDefaultsAsync DoesNotDuplicate
2ms
API — GetList ReturnsAllProviders
5ms
API — GetByName ExistingProvider ReturnsOk
3ms
API — GetByName NonExistent ReturnsNotFound
2ms
API — PutProvider CreatesNew
4ms
API — PutProvider UpdatesExisting
3ms
API — PutProvider PreservesApiKey WhenNotProvided
4ms
API — DeleteProvider RemovesProvider
3ms
API — DeleteProvider NonExistent ReturnsNoContent
2ms
API — GetList MasksApiKey ReturnsHasApiKeyFlag
4ms
ChatStream — WithExplicitProfileName UsesSpecifiedProfile
8ms
ChatStream — WithNonExistentProfile FallsBackToDefault
6ms
ChatStream — WithoutProfileName UsesDefaultProfile
5ms
Orchestrator — StreamAsync PassesProfileInstructions ToContext
3ms
Store — SeededDefault HasOllamaDefaultProvider
1ms

🔥 Live Provider Tests 11 tests • ~2m 7s total • 2 failing (Ollama timeouts)

Real LLM calls against local Ollama and Azure OpenAI. Run with dotnet test --filter "Category=Live"

OLLAMA Ollama Live Tests 5 tests Real calls to local Ollama (gemma4:e2b) — streaming, completion, tool calls
Ollama — CompleteAsync ReturnsResponse
HttpClient timeout (100s) — Ollama slow/cold
100s
Ollama — StreamAsync YieldsTokens
3.0s
Ollama — Pipeline SendMessage ReturnsStreamedContent
9.5s
Ollama — StreamAsync WithTools YieldsToolCallChunk
HttpClient timeout (100s) — Ollama slow/cold
100s
Ollama — IsAvailableAsync ReturnsTrue
< 1s
AZURE OPENAI Azure OpenAI Live Tests 6 tests Real calls to Azure OpenAI (gpt-4o-mini) — streaming, completion, pipeline
AzureOpenAI — CompleteAsync ReturnsResponse
7s
AzureOpenAI — StreamAsync YieldsTokens
4.2s
AzureOpenAI — Pipeline SendMessage ReturnsStreamedContent
5s
AzureOpenAI — IsAvailableAsync ReturnsTrueWhenConfigured
3s
AzureOpenAI — CreateChatClient ReturnsNonNull
< 1s
AzureOpenAI — ProviderName IsAzureOpenAI
< 1s
ℹ️ About this Dashboard — How to Run Tests & Environment Info

Running Tests Locally

  • Set NuGet packages: $env:NUGET_PACKAGES = "$env:USERPROFILE\.nuget\packages2"
  • Run unit tests only: dotnet test tests/OpenClawNet.UnitTests
  • Run E2E tests only: dotnet test tests/OpenClawNet.PlaywrightTests/
  • Run live tests (Ollama + Azure): dotnet test --filter "Category=Live"
  • Skip model-dependent tests: dotnet test --filter "Category!=RequiresModel"
  • Generate HTML report: dotnet test --logger "html;LogFileName=results.html"

Environment

  • Aspire — orchestrates Gateway, WebApp, Ollama, and supporting services
  • Playwright — headless Chromium for browser-based E2E tests
  • Ollama — local LLM provider (tests gracefully handle unavailability with 503)
  • .NET 10 — latest preview runtime and SDK

CI / CD

Tests run in GitHub Actions (private repo). Results are published here automatically via publish-test-dashboard.ps1.

Last Updated

2026-04-23