Skip to content

Commit 9ff0213

Browse files
test(sync): compare claude shadow parity
Claude is shadow-compared on this branch, so add source-level migration coverage that compares provider observation with ParseClaudeSessionWithExclusions. The fixture exercises the project-directory source shape and verifies session, message, usage, exclusion, and data-version planning parity while preserving provider-computed file hashes. Validation: go test -tags "fts5" ./internal/sync -run TestObserveProviderSourceMatchesClaudeLegacyParser -count=1
1 parent 76f07fc commit 9ff0213

1 file changed

Lines changed: 59 additions & 0 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package sync
2+
3+
import (
4+
"context"
5+
"path/filepath"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
11+
"go.kenn.io/agentsview/internal/parser"
12+
"go.kenn.io/agentsview/internal/testjsonl"
13+
)
14+
15+
func TestObserveProviderSourceMatchesClaudeLegacyParser(t *testing.T) {
16+
root := t.TempDir()
17+
projectDir := "-Users-dev-code-demo"
18+
sourcePath := filepath.Join(root, projectDir, "claude-shadow.jsonl")
19+
writeProviderShadowSourceFile(t, sourcePath, claudeShadowFixture())
20+
21+
provider, ok := parser.NewProvider(parser.AgentClaude, parser.ProviderConfig{
22+
Roots: []string{root},
23+
Machine: "devbox",
24+
})
25+
require.True(t, ok)
26+
sources, err := provider.Discover(context.Background())
27+
require.NoError(t, err)
28+
require.Len(t, sources, 1)
29+
30+
legacyResults, legacyExcluded, err := parser.ParseClaudeSessionWithExclusions(
31+
sourcePath,
32+
"demo",
33+
"devbox",
34+
)
35+
require.NoError(t, err)
36+
require.Len(t, legacyResults, 1)
37+
38+
observation, err := ObserveProviderSource(context.Background(), provider, ProviderObserveRequest{
39+
Source: sources[0],
40+
Machine: "devbox",
41+
})
42+
require.NoError(t, err)
43+
require.Len(t, observation.Results, 1)
44+
legacyResults[0].Session.File.Hash = observation.Fingerprint.Hash
45+
46+
assert.Equal(t, legacyResults[0].Session, observation.Results[0].Session)
47+
assert.Equal(t, legacyResults[0].Messages, observation.Results[0].Messages)
48+
assert.Equal(t, legacyResults[0].UsageEvents, observation.Results[0].UsageEvents)
49+
assert.Equal(t, legacyExcluded, observation.ExcludedSessionIDs)
50+
assert.Equal(t, []string{legacyResults[0].Session.ID}, observation.Planned.DataVersionSessionIDs())
51+
assert.Empty(t, observation.Planned.Diagnostics)
52+
}
53+
54+
func claudeShadowFixture() string {
55+
return testjsonl.JoinJSONL(
56+
testjsonl.ClaudeUserJSON("provider question", "2026-01-02T03:04:05Z"),
57+
testjsonl.ClaudeAssistantJSON("Done.", "2026-01-02T03:04:06Z"),
58+
)
59+
}

0 commit comments

Comments
 (0)