Skip to content

Commit 38c9a89

Browse files
committed
test(e2e): guard derived content correctness
1 parent e8435a2 commit 38c9a89

1 file changed

Lines changed: 37 additions & 1 deletion

File tree

tests/e2e/test-session-convert-derived.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,15 @@ async function convertAndAssertListed(api, tmpHome, source, target, params = {},
6161
}
6262

6363
module.exports = async function testSessionConvertDerived(ctx) {
64-
const { api, tmpHome, sessionId, sessionPath } = ctx;
64+
const {
65+
api,
66+
tmpHome,
67+
sessionId,
68+
sessionPath,
69+
daudeSessionPath,
70+
claudeSessionId,
71+
claudeSessionPath
72+
} = ctx;
6573

6674
const beforeHash = sha256File(sessionPath);
6775

@@ -97,6 +105,34 @@ module.exports = async function testSessionConvertDerived(ctx) {
97105
const afterHash = sha256File(sessionPath);
98106
assert(afterHash === beforeHash, 'source codex session should remain unchanged after conversions');
99107

108+
if (daudeSessionPath) {
109+
const beforeDaudeHash = sha256File(daudeSessionPath);
110+
const { outPath: daudeDerivedClaudePath } = await convertAndAssertListed(api, tmpHome, 'codex', 'claude', {
111+
filePath: daudeSessionPath,
112+
maxMessages: 'all'
113+
});
114+
const daudeDetail = await api('session-detail', { source: 'claude', filePath: daudeDerivedClaudePath, maxMessages: 20 });
115+
const daudeTexts = (daudeDetail.messages || []).map((m) => m.text);
116+
assert(daudeTexts.length === 2, 'daude derived claude session should keep message count');
117+
assert(daudeTexts[0] === 'daude code quick start 222', 'daude derived claude user text mismatch');
118+
assert(daudeTexts[1] === 'sharing daude-code bootstrap', 'daude derived claude assistant text mismatch');
119+
assert(sha256File(daudeSessionPath) === beforeDaudeHash, 'daude source session should remain unchanged after conversion');
120+
}
121+
122+
if (claudeSessionId && claudeSessionPath) {
123+
const beforeClaudeHash = sha256File(claudeSessionPath);
124+
const { outPath: claudeDerivedCodexPath } = await convertAndAssertListed(api, tmpHome, 'claude', 'codex', {
125+
sessionId: claudeSessionId,
126+
maxMessages: 'all'
127+
});
128+
const detail = await api('session-detail', { source: 'codex', filePath: claudeDerivedCodexPath, maxMessages: 50 });
129+
const texts = (detail.messages || []).map((m) => m.text);
130+
assert(texts.length === 2, 'claude derived codex session should keep message count');
131+
assert(texts[0] === 'hello from claude code session', 'claude derived codex user text mismatch');
132+
assert(texts[1] === 'initialized project', 'claude derived codex assistant text mismatch');
133+
assert(sha256File(claudeSessionPath) === beforeClaudeHash, 'claude source session should remain unchanged after conversion');
134+
}
135+
100136
const invalidSame = await api('convert-session', { source: 'codex', target: 'codex', sessionId, maxMessages: 'all' });
101137
assert(invalidSame.error, 'convert-session should reject same source/target');
102138
const invalidTarget = await api('convert-session', { source: 'codex', target: 'gemini', sessionId, maxMessages: 'all' });

0 commit comments

Comments
 (0)