-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathnormalizer_test.go
More file actions
70 lines (60 loc) · 46.9 KB
/
normalizer_test.go
File metadata and controls
70 lines (60 loc) · 46.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main
import (
"encoding/json"
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/toon-format/toon-go"
)
func Test_Normalizer(t *testing.T) {
type testCase struct {
name string
rawJSON string
errFn assert.ErrorAssertionFunc
}
cases := []testCase{
{
name: "valid flat payload",
rawJSON: `[{"name":"Miro","age":30,"active":true},{"name":"John","age":31,"active":false}]`,
errFn: assert.NoError,
},
{
name: "valid2",
rawJSON: `[{"id":"ss","title":"aa","status":"open","priority":2,"issue_type":"task","assignee":null,"labels":["e2e"],"dependency_count":3,"dependent_count":0},{"id":"ss","title":"hh","status":"open","priority":2,"issue_type":"task","assignee":null,"labels":["e2e","helm"],"dependency_count":1,"dependent_count":1},{"id":"pp","title":"gg","status":"open","priority":2,"issue_type":"task","assignee":null,"labels":["e2e"],"dependency_count":1,"dependent_count":1}]`,
errFn: assert.NoError,
},
{
name: "vali3",
rawJSON: `{"jsonrpc":"2.0","id":3,"result":{"tools":[{"name":"discover_tools","description":"List available beads tools (names and brief descriptions only). Use get_tool_info() for full details.","inputSchema":{"additionalProperties":false,"properties":{},"type":"object"},"outputSchema":{"additionalProperties":true,"type":"object"},"_meta":{"fastmcp":{"tags":[]}}},{"name":"get_tool_info","description":"Get detailed information about a specific beads tool including parameters.","inputSchema":{"additionalProperties":false,"properties":{"tool_name":{"type":"string"}},"required":["tool_name"],"type":"object"},"outputSchema":{"additionalProperties":true,"type":"object"},"_meta":{"fastmcp":{"tags":[]}}},{"name":"context","description":"Manage workspace context for beads operations.\nActions:\n- set: Set the workspace root directory (default when workspace_root provided)\n- show: Show current workspace context and database path (default when no args)\n- init: Initialize beads in the current workspace directory","inputSchema":{"additionalProperties":false,"properties":{"action":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"type":"object"},"outputSchema":{"properties":{"result":{"type":"string"}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"ready","description":"Find tasks that have no blockers and are ready to be worked on. Returns minimal format for context efficiency.","inputSchema":{"additionalProperties":false,"properties":{"limit":{"default":10,"type":"integer"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"labels_any":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"unassigned":{"default":false,"type":"boolean"},"sort_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"brief":{"default":false,"type":"boolean"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"max_description_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null}},"type":"object"},"outputSchema":{"properties":{"result":{"anyOf":[{"items":{"description":"Minimal issue model for list views (~80% smaller than full Issue).\n\nUse this for ready_work, list_issues, and other bulk operations.\nFor full details including dependencies, use Issue model via show().","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"}},"required":["id","title","status","priority","issue_type"],"type":"object"},"type":"array"},{"items":{"description":"Ultra-minimal issue for scanning (4 fields).\n\nUse for quick scans where only identification + priority needed.\n~95% smaller than full Issue.","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"}},"required":["id","title","status","priority"],"type":"object"},"type":"array"},{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"description":"Result container for compacted list responses.\n\nWhen results exceed threshold, returns preview + metadata instead of full data.\nThis prevents context window overflow for large issue lists.","properties":{"compacted":{"default":true,"type":"boolean"},"total_count":{"type":"integer"},"preview":{"items":{"description":"Minimal issue model for list views (~80% smaller than full Issue).\n\nUse this for ready_work, list_issues, and other bulk operations.\nFor full details including dependencies, use Issue model via show().","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"}},"required":["id","title","status","priority","issue_type"],"type":"object"},"type":"array"},"preview_count":{"type":"integer"},"hint":{"default":"Use show(issue_id) for full issue details","type":"string"}},"required":["total_count","preview","preview_count"],"type":"object"}]}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"list","description":"List all issues with optional filters. When status='blocked', returns BlockedIssue with blocked_by info.","inputSchema":{"additionalProperties":false,"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null},"issue_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"labels_any":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"unassigned":{"default":false,"type":"boolean"},"limit":{"default":20,"type":"integer"},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"brief":{"default":false,"type":"boolean"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"max_description_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null}},"type":"object"},"outputSchema":{"properties":{"result":{"anyOf":[{"items":{"description":"Minimal issue model for list views (~80% smaller than full Issue).\n\nUse this for ready_work, list_issues, and other bulk operations.\nFor full details including dependencies, use Issue model via show().","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"}},"required":["id","title","status","priority","issue_type"],"type":"object"},"type":"array"},{"items":{"description":"Ultra-minimal issue for scanning (4 fields).\n\nUse for quick scans where only identification + priority needed.\n~95% smaller than full Issue.","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"}},"required":["id","title","status","priority"],"type":"object"},"type":"array"},{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"description":"Result container for compacted list responses.\n\nWhen results exceed threshold, returns preview + metadata instead of full data.\nThis prevents context window overflow for large issue lists.","properties":{"compacted":{"default":true,"type":"boolean"},"total_count":{"type":"integer"},"preview":{"items":{"description":"Minimal issue model for list views (~80% smaller than full Issue).\n\nUse this for ready_work, list_issues, and other bulk operations.\nFor full details including dependencies, use Issue model via show().","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"}},"required":["id","title","status","priority","issue_type"],"type":"object"},"type":"array"},"preview_count":{"type":"integer"},"hint":{"default":"Use show(issue_id) for full issue details","type":"string"}},"required":["total_count","preview","preview_count"],"type":"object"}]}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"show","description":"Show detailed information about a specific issue including dependencies and dependents.","inputSchema":{"additionalProperties":false,"properties":{"issue_id":{"type":"string"},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"brief":{"default":false,"type":"boolean"},"brief_deps":{"default":false,"type":"boolean"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"max_description_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null}},"required":["issue_id"],"type":"object"},"outputSchema":{"properties":{"result":{"anyOf":[{"description":"Issue model matching bd JSON output.","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependencies":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},"dependents":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},{"description":"Ultra-minimal issue for scanning (4 fields).\n\nUse for quick scans where only identification + priority needed.\n~95% smaller than full Issue.","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"}},"required":["id","title","status","priority"],"type":"object"},{"additionalProperties":true,"type":"object"}]}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"create","description":"Create a new issue (bug, feature, task, epic, chore, or decision) with optional design,\nacceptance criteria, and dependencies.","inputSchema":{"additionalProperties":false,"properties":{"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"priority":{"default":2,"type":"integer"},"issue_type":{"default":"task","type":"string"},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"deps":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"brief":{"default":true,"type":"boolean"}},"required":["title"],"type":"object"},"outputSchema":{"properties":{"result":{"anyOf":[{"description":"Issue model matching bd JSON output.","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependencies":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},"dependents":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},{"description":"Minimal confirmation for write operations.\n\nDefault response for create/update/close/reopen when verbose=False.\n~97% smaller than returning full Issue object.","properties":{"id":{"type":"string"},"action":{"enum":["created","updated","closed","reopened"],"type":"string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"required":["id","action"],"type":"object"}]}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"update","description":"Update an existing issue's status, priority, assignee, description, design notes,\nor acceptance criteria. Use this to claim work (set status=in_progress).","inputSchema":{"additionalProperties":false,"properties":{"issue_id":{"type":"string"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"brief":{"default":true,"type":"boolean"}},"required":["issue_id"],"type":"object"},"outputSchema":{"properties":{"result":{"anyOf":[{"description":"Issue model matching bd JSON output.","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependencies":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},"dependents":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},{"description":"Minimal confirmation for write operations.\n\nDefault response for create/update/close/reopen when verbose=False.\n~97% smaller than returning full Issue object.","properties":{"id":{"type":"string"},"action":{"enum":["created","updated","closed","reopened"],"type":"string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"required":["id","action"],"type":"object"},{"items":{"description":"Issue model matching bd JSON output.","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependencies":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},"dependents":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},{"items":{"description":"Minimal confirmation for write operations.\n\nDefault response for create/update/close/reopen when verbose=False.\n~97% smaller than returning full Issue object.","properties":{"id":{"type":"string"},"action":{"enum":["created","updated","closed","reopened"],"type":"string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"required":["id","action"],"type":"object"},"type":"array"},{"type":"null"}]}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"close","description":"Close (complete) an issue. Mark work as done when you've finished implementing/fixing it.","inputSchema":{"additionalProperties":false,"properties":{"issue_id":{"type":"string"},"reason":{"default":"Completed","type":"string"},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"brief":{"default":true,"type":"boolean"}},"required":["issue_id"],"type":"object"},"outputSchema":{"properties":{"result":{"anyOf":[{"items":{"description":"Issue model matching bd JSON output.","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependencies":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},"dependents":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},{"items":{"description":"Minimal confirmation for write operations.\n\nDefault response for create/update/close/reopen when verbose=False.\n~97% smaller than returning full Issue object.","properties":{"id":{"type":"string"},"action":{"enum":["created","updated","closed","reopened"],"type":"string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"required":["id","action"],"type":"object"},"type":"array"}]}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"reopen","description":"Reopen one or more closed issues. Sets status to 'open' and clears closed_at timestamp.","inputSchema":{"additionalProperties":false,"properties":{"issue_ids":{"items":{"type":"string"},"type":"array"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"brief":{"default":true,"type":"boolean"}},"required":["issue_ids"],"type":"object"},"outputSchema":{"properties":{"result":{"anyOf":[{"items":{"description":"Issue model matching bd JSON output.","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependencies":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},"dependents":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},{"items":{"description":"Minimal confirmation for write operations.\n\nDefault response for create/update/close/reopen when verbose=False.\n~97% smaller than returning full Issue object.","properties":{"id":{"type":"string"},"action":{"enum":["created","updated","closed","reopened"],"type":"string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"required":["id","action"],"type":"object"},"type":"array"}]}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"dep","description":"Add a dependency between issues. Types: blocks (hard blocker),\nrelated (soft link), parent-child (epic/subtask), discovered-from (found during work).","inputSchema":{"additionalProperties":false,"properties":{"issue_id":{"type":"string"},"depends_on_id":{"type":"string"},"dep_type":{"default":"blocks","enum":["blocks","related","parent-child","discovered-from"],"type":"string"},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"required":["issue_id","depends_on_id"],"type":"object"},"outputSchema":{"properties":{"result":{"type":"string"}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"stats","description":"Get statistics: total issues, open, in_progress, closed, blocked, ready, and average lead time.","inputSchema":{"additionalProperties":false,"properties":{"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"type":"object"},"outputSchema":{"description":"Beads task statistics matching bd stats --json output.","properties":{"summary":{"description":"Summary statistics from bd stats.","properties":{"total_issues":{"type":"integer"},"open_issues":{"type":"integer"},"in_progress_issues":{"type":"integer"},"closed_issues":{"type":"integer"},"blocked_issues":{"type":"integer"},"deferred_issues":{"default":0,"type":"integer"},"ready_issues":{"type":"integer"},"tombstone_issues":{"default":0,"type":"integer"},"pinned_issues":{"default":0,"type":"integer"},"epics_eligible_for_closure":{"default":0,"type":"integer"},"average_lead_time_hours":{"type":"number"}},"required":["total_issues","open_issues","in_progress_issues","closed_issues","blocked_issues","ready_issues","average_lead_time_hours"],"type":"object"},"recent_activity":{"anyOf":[{"description":"Recent activity from bd stats.","properties":{"hours_tracked":{"default":24,"type":"integer"},"commit_count":{"default":0,"type":"integer"},"issues_created":{"default":0,"type":"integer"},"issues_closed":{"default":0,"type":"integer"},"issues_updated":{"default":0,"type":"integer"},"issues_reopened":{"default":0,"type":"integer"},"total_changes":{"default":0,"type":"integer"}},"type":"object"},{"type":"null"}],"default":null}},"required":["summary"],"type":"object"},"_meta":{"fastmcp":{"tags":[]}}},{"name":"blocked","description":"Get blocked issues showing what dependencies are blocking them from being worked on.","inputSchema":{"additionalProperties":false,"properties":{"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"brief":{"default":false,"type":"boolean"},"brief_deps":{"default":false,"type":"boolean"}},"type":"object"},"outputSchema":{"properties":{"result":{"anyOf":[{"items":{"description":"Blocked issue with blocking information.","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependencies":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},"dependents":{"items":{"description":"Issue reference in dependencies/dependents (avoids recursion).","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"default":"","type":"string"},"design":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"acceptance_criteria":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"external_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"},"issue_type":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","type":"string"},"closed_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"default":null},"assignee":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"labels":{"items":{"type":"string"},"type":"array"},"dependency_count":{"default":0,"type":"integer"},"dependent_count":{"default":0,"type":"integer"},"dependency_type":{"anyOf":[{"enum":["blocks","related","parent-child","discovered-from"],"type":"string"},{"type":"null"}],"default":null}},"required":["id","title","status","priority","issue_type","created_at","updated_at"],"type":"object"},"type":"array"},"blocked_by_count":{"type":"integer"},"blocked_by":{"items":{"type":"string"},"type":"array"}},"required":["id","title","status","priority","issue_type","created_at","updated_at","blocked_by_count","blocked_by"],"type":"object"},"type":"array"},{"items":{"description":"Ultra-minimal issue for scanning (4 fields).\n\nUse for quick scans where only identification + priority needed.\n~95% smaller than full Issue.","properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"priority":{"maximum":4,"minimum":0,"type":"integer"}},"required":["id","title","status","priority"],"type":"object"},"type":"array"},{"items":{"additionalProperties":true,"type":"object"},"type":"array"}]}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}},{"name":"admin","description":"Administrative and diagnostic operations.\nActions:\n- validate: Run database health checks (checks=orphans,duplicates,pollution,conflicts)\n- repair: Fix orphaned dependency references (fix=True to apply)\n- schema: Show database schema info\n- debug: Show environment and working directory info\n- migration: Get migration plan and database state\n- pollution: Detect/clean test issues (clean=True to delete)","inputSchema":{"additionalProperties":false,"properties":{"action":{"type":"string"},"checks":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"fix_all":{"default":false,"type":"boolean"},"fix":{"default":false,"type":"boolean"},"clean":{"default":false,"type":"boolean"},"workspace_root":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"required":["action"],"type":"object"},"outputSchema":{"properties":{"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"string"}]}},"required":["result"],"type":"object","x-fastmcp-wrap-result":true},"_meta":{"fastmcp":{"tags":[]}}}]}}`,
errFn: assert.NoError,
},
{
name: "valid recursive payload",
rawJSON: `[{"name":"Miro","meta":{"city":"London","code":7},"tags":[{"k":"a","c":1},{"k":"b"}]}]`,
errFn: assert.NoError,
},
{
name: "empty rows",
rawJSON: `[]`,
errFn: assert.NoError,
},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
var data any
err := json.Unmarshal([]byte(tc.rawJSON), &data)
require.NoError(t, err)
if err != nil {
return
}
data = normalizeAny(data)
jData, err := json.Marshal(data)
require.NoError(t, err)
tData, err := toon.Marshal(data, toon.WithLengthMarkers(true))
require.NoError(t, err)
fmt.Println(string(jData))
fmt.Println(string(tData))
})
}
}