Skip to content

Commit 11bfc10

Browse files
test(sync): compare opencode family shadow parity
OpenCode, Kilo, and MiMoCode share the OpenCode-format provider implementation on this branch, so add source-level migration coverage for all three storage-mode source shapes. The table test compares provider observation with each legacy parser and verifies session/message/data-version parity while preserving provider-computed storage fingerprints. Validation: go test -tags "fts5" ./internal/parser ./internal/sync -run 'TestObserveProviderSourceMatchesOpenCodeFamilyLegacyParsers|TestOpenCode|TestParseOpenCode|TestParseKilo|TestParseMiMoCode|TestDiscoverKilo|TestDiscoverMiMoCode|TestProviderMigrationModes' -count=1; go test -tags "fts5" ./internal/parser ./internal/sync -count=1; go fmt ./...; go vet ./...; ./custom-gcl run --config .golangci.nilaway.yml ./internal/parser/... ./internal/sync/...; git diff --check
1 parent be1674c commit 11bfc10

1 file changed

Lines changed: 129 additions & 0 deletions

File tree

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
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+
)
13+
14+
func TestObserveProviderSourceMatchesOpenCodeFamilyLegacyParsers(t *testing.T) {
15+
tests := []struct {
16+
name string
17+
agent parser.AgentType
18+
sessionSubdir string
19+
sessionID string
20+
project string
21+
parse func(string, string) (*parser.ParsedSession, []parser.ParsedMessage, error)
22+
}{
23+
{
24+
name: "opencode",
25+
agent: parser.AgentOpenCode,
26+
sessionSubdir: "session",
27+
sessionID: "ses_opencode_shadow",
28+
project: "opencode-shadow",
29+
parse: parser.ParseOpenCodeFile,
30+
},
31+
{
32+
name: "kilo",
33+
agent: parser.AgentKilo,
34+
sessionSubdir: "session",
35+
sessionID: "ses_kilo_shadow",
36+
project: "kilo-shadow",
37+
parse: parser.ParseKiloFile,
38+
},
39+
{
40+
name: "mimocode",
41+
agent: parser.AgentMiMoCode,
42+
sessionSubdir: "session_diff",
43+
sessionID: "ses_mimo_shadow",
44+
project: "mimo-shadow",
45+
parse: parser.ParseMiMoCodeFile,
46+
},
47+
}
48+
49+
for _, tc := range tests {
50+
t.Run(tc.name, func(t *testing.T) {
51+
root := t.TempDir()
52+
sessionPath := writeOpenCodeFamilyShadowStorage(
53+
t,
54+
root,
55+
tc.sessionSubdir,
56+
tc.sessionID,
57+
tc.project,
58+
"provider question",
59+
)
60+
61+
provider, ok := parser.NewProvider(tc.agent, parser.ProviderConfig{
62+
Roots: []string{root},
63+
Machine: "devbox",
64+
})
65+
require.True(t, ok)
66+
sources, err := provider.Discover(context.Background())
67+
require.NoError(t, err)
68+
require.Len(t, sources, 1)
69+
70+
legacySession, legacyMessages, err := tc.parse(sessionPath, "devbox")
71+
require.NoError(t, err)
72+
require.NotNil(t, legacySession)
73+
74+
observation, err := ObserveProviderSource(context.Background(), provider, ProviderObserveRequest{
75+
Source: sources[0],
76+
Machine: "devbox",
77+
})
78+
require.NoError(t, err)
79+
require.Len(t, observation.Results, 1)
80+
legacySession.File.Hash = observation.Fingerprint.Hash
81+
82+
assert.Equal(t, *legacySession, observation.Results[0].Session)
83+
assert.Equal(t, legacyMessages, observation.Results[0].Messages)
84+
assert.Equal(t, []string{legacySession.ID}, observation.Planned.DataVersionSessionIDs())
85+
assert.Empty(t, observation.Planned.Diagnostics)
86+
})
87+
}
88+
}
89+
90+
func writeOpenCodeFamilyShadowStorage(
91+
t *testing.T,
92+
root,
93+
sessionSubdir,
94+
sessionID,
95+
project,
96+
firstMessage string,
97+
) string {
98+
t.Helper()
99+
100+
sessionPath := filepath.Join(
101+
root,
102+
"storage",
103+
sessionSubdir,
104+
"global",
105+
sessionID+".json",
106+
)
107+
writeProviderShadowSourceFile(
108+
t,
109+
sessionPath,
110+
`{"id":"`+sessionID+`",`+
111+
`"directory":"/home/user/code/`+project+`",`+
112+
`"title":"Provider Session",`+
113+
`"time":{"created":1700000000000,"updated":1700000060000}}`,
114+
)
115+
writeProviderShadowSourceFile(
116+
t,
117+
filepath.Join(root, "storage", "message", sessionID, "msg_1.json"),
118+
`{"id":"msg_1","sessionID":"`+sessionID+`","role":"user",`+
119+
`"time":{"created":1700000000000}}`,
120+
)
121+
writeProviderShadowSourceFile(
122+
t,
123+
filepath.Join(root, "storage", "part", "msg_1", "prt_1.json"),
124+
`{"id":"prt_1","sessionID":"`+sessionID+`","messageID":"msg_1",`+
125+
`"type":"text","text":"`+firstMessage+`",`+
126+
`"time":{"created":1700000000000}}`,
127+
)
128+
return sessionPath
129+
}

0 commit comments

Comments
 (0)