| name | obsidian-integration-test |
| description | Run integration tests against a live Obsidian vault using the obsidian CLI. Use for: verifying plugin behavior end-to-end, checking DOM state after commands, asserting no runtime errors, creating/reading/deleting test fixtures in the vault, taking screenshots, inspecting console output. Do NOT use for unit tests or mocked environments. |
| argument-hint | Describe the user flow or behavior to verify |
Obsidian CLI Integration Testing
Use the obsidian CLI to drive end-to-end tests against a live Obsidian instance. This enables testing real plugin behavior: command execution, DOM rendering, vault file operations, and error detection.
Prerequisites
- Obsidian desktop app must be running with the target vault open
- The plugin must be built and installed in the vault
- Plugin ID:
smart-second-brain
Quick Start
bun run build
obsidian plugin:reload id=smart-second-brain
obsidian dev:errors
Command Reference
Plugin Lifecycle
obsidian plugin id=smart-second-brain
obsidian plugin:enable id=smart-second-brain
obsidian plugin:disable id=smart-second-brain
obsidian plugin:reload id=smart-second-brain
Execute Plugin Commands
obsidian command id=smart-second-brain:new-chat
obsidian command id=smart-second-brain:open-chat
obsidian command id=smart-second-brain:open-smart-graph
obsidian command id=smart-second-brain:search-notes
To discover all available commands:
obsidian commands filter=smart-second-brain
Vault File Operations (Test Fixtures)
obsidian create name="Integration Test Note" content="Test content with [[wikilinks]]"
obsidian read file="Integration Test Note"
obsidian append file="Integration Test Note" content="\nMore content"
obsidian prepend file="Integration Test Note" content="Header\n"
obsidian search query="test content" format=json
obsidian delete file="Integration Test Note"
DOM Inspection (Assertions)
obsidian dev:dom selector=".chat-view-container" total
obsidian dev:dom selector=".chat-message" text
obsidian dev:dom selector=".chat-message" all text
obsidian dev:dom selector=".some-button" attr=disabled
obsidian dev:dom selector=".modal" css=display
obsidian dev:dom selector=".workspace-leaf-content" inner
Console & Error Inspection
obsidian dev:errors
obsidian dev:console
obsidian dev:console level=error
obsidian dev:console level=warn limit=10
obsidian dev:errors clear
obsidian dev:console clear
Screenshots
obsidian dev:screenshot path=screenshot.png
Chrome DevTools Protocol (Advanced)
For interactions not covered by other commands (clicking buttons, typing text, evaluating JS in the app context):
obsidian dev:cdp method=Runtime.evaluate params='{"expression": "app.workspace.activeLeaf?.view?.getViewType()"}'
obsidian dev:cdp method=Input.dispatchMouseEvent params='{"type":"mousePressed","x":100,"y":200,"button":"left","clickCount":1}'
Targeting a Specific Vault
If multiple vaults are open, target one by name:
obsidian plugin:reload id=smart-second-brain vault="My Vault"
Integration Test Pattern
A typical test flow:
bun run build
obsidian plugin:reload id=smart-second-brain
obsidian dev:errors clear
obsidian dev:console clear
obsidian create name="Test Note A" content="Content about topic A with [[Test Note B]]"
obsidian create name="Test Note B" content="Content about topic B"
obsidian command id=smart-second-brain:open-chat
sleep 1
obsidian dev:dom selector="[data-type='chat']" total
obsidian dev:errors
obsidian delete file="Test Note A"
obsidian delete file="Test Note B"
Writing Scripted Tests
You can run integration tests from a shell script or from vitest using child_process.execSync:
import { execSync } from "child_process";
function obsidian(cmd: string): string {
return execSync(`obsidian ${cmd}`, { encoding: "utf-8" }).trim();
}
const errors = obsidian("dev:errors");
expect(errors).toBe("");
const chatViewCount = obsidian('dev:dom selector="[data-type=\\"chat\\"]" total');
expect(chatViewCount).toBe("1");
Full CLI Reference
Run obsidian help for all commands, or obsidian help <command> for details on a specific command.