Skip to content

Commit dcb425d

Browse files
committed
test(replay/unit): better setup of streaming_renderer
Now that streaming_renderer uses state.active_session, have to extract a session from the replay data
1 parent 01b353c commit dcb425d

File tree

3 files changed

+68
-32
lines changed

3 files changed

+68
-32
lines changed

tests/helpers.lua

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ local M = {}
66
-- Create a temporary file with content
77
function M.create_temp_file(content)
88
local tmp_file = vim.fn.tempname()
9-
local file = io.open(tmp_file, "w")
10-
file:write(content or "Test file content")
9+
local file = io.open(tmp_file, 'w')
10+
file:write(content or 'Test file content')
1111
file:close()
1212
return tmp_file
1313
end
@@ -19,21 +19,21 @@ end
1919

2020
-- Open a buffer for a file
2121
function M.open_buffer(file)
22-
vim.cmd("edit " .. file)
22+
vim.cmd('edit ' .. file)
2323
return vim.api.nvim_get_current_buf()
2424
end
2525

2626
-- Close a buffer
2727
function M.close_buffer(bufnr)
2828
if bufnr and vim.api.nvim_buf_is_valid(bufnr) then
29-
pcall(vim.cmd, "bdelete! " .. bufnr)
29+
pcall(vim.cmd, 'bdelete! ' .. bufnr)
3030
end
3131
end
3232

3333
-- Set visual selection programmatically
3434
function M.set_visual_selection(start_line, start_col, end_line, end_col)
3535
-- Enter visual mode
36-
vim.cmd("normal! " .. start_line .. "G" .. start_col .. "lv" .. end_line .. "G" .. end_col .. "l")
36+
vim.cmd('normal! ' .. start_line .. 'G' .. start_col .. 'lv' .. end_line .. 'G' .. end_col .. 'l')
3737
end
3838

3939
-- Reset editor state
@@ -42,11 +42,11 @@ function M.reset_editor()
4242
for _, bufnr in ipairs(vim.api.nvim_list_bufs()) do
4343
-- Skip non-existing or invalid buffers
4444
if vim.api.nvim_buf_is_valid(bufnr) then
45-
pcall(vim.cmd, "bdelete! " .. bufnr)
45+
pcall(vim.cmd, 'bdelete! ' .. bufnr)
4646
end
4747
end
4848
-- Reset any other editor state as needed
49-
pcall(vim.cmd, "silent! %bwipeout!")
49+
pcall(vim.cmd, 'silent! %bwipeout!')
5050
end
5151

5252
-- Mock input function
@@ -64,15 +64,15 @@ end
6464
function M.mock_notify()
6565
local notifications = {}
6666
local original_notify = vim.notify
67-
67+
6868
vim.notify = function(msg, level, opts)
6969
table.insert(notifications, {
7070
msg = msg,
7171
level = level,
72-
opts = opts
72+
opts = opts,
7373
})
7474
end
75-
75+
7676
return {
7777
reset = function()
7878
vim.notify = original_notify
@@ -82,21 +82,21 @@ function M.mock_notify()
8282
end,
8383
clear = function()
8484
notifications = {}
85-
end
85+
end,
8686
}
8787
end
8888

8989
function M.mock_time_ago()
9090
local util = require('opencode.util')
9191
local original_time_ago = util.time_ago
92-
92+
9393
util.time_ago = function(timestamp)
9494
if timestamp > 1e12 then
9595
timestamp = math.floor(timestamp / 1000)
9696
end
9797
return os.date('%Y-%m-%d %H:%M:%S', timestamp)
9898
end
99-
99+
100100
return function()
101101
util.time_ago = original_time_ago
102102
end
@@ -112,22 +112,37 @@ function M.load_test_data(filename)
112112
return vim.json.decode(content)
113113
end
114114

115+
function M.get_session_from_events(events)
116+
-- streaming_renderer needs a valid session id
117+
for _, event in ipairs(events) do
118+
-- find the session id in a message or part event
119+
local properties = event.properties
120+
local session_id = properties.info and properties.info.sessionID or properties.part and properties.part.sessionID
121+
if session_id then
122+
---@diagnostic disable-next-line: missing-fields
123+
return { id = session_id }
124+
end
125+
end
126+
127+
return nil
128+
end
129+
115130
function M.replay_event(event)
116131
local streaming_renderer = require('opencode.ui.streaming_renderer')
117132
if event.type == 'message.updated' then
118-
streaming_renderer.handle_message_updated(event)
133+
streaming_renderer.on_message_updated(event)
119134
elseif event.type == 'message.part.updated' then
120-
streaming_renderer.handle_part_updated(event)
135+
streaming_renderer.on_part_updated(event)
121136
elseif event.type == 'message.removed' then
122-
streaming_renderer.handle_message_removed(event)
137+
streaming_renderer.on_message_removed(event)
123138
elseif event.type == 'message.part.removed' then
124-
streaming_renderer.handle_part_removed(event)
139+
streaming_renderer.on_part_removed(event)
125140
elseif event.type == 'session.compacted' then
126-
streaming_renderer.handle_session_compacted()
141+
streaming_renderer.on_session_compacted()
127142
elseif event.type == 'permission.updated' then
128-
streaming_renderer.handle_permission_updated(event)
143+
streaming_renderer.on_permission_updated(event)
129144
elseif event.type == 'permission.replied' then
130-
streaming_renderer.handle_permission_replied(event)
145+
streaming_renderer.on_permission_replied(event)
131146
end
132147
end
133148

@@ -154,4 +169,4 @@ function M.capture_output(output_buf, namespace)
154169
}
155170
end
156171

157-
return M
172+
return M

tests/manual/streaming_renderer_replay.lua

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
local state = require('opencode.state')
22
local streaming_renderer = require('opencode.ui.streaming_renderer')
33
local ui = require('opencode.ui.ui')
4+
local config_file = require('opencode.config_file')
45
local helpers = require('tests.helpers')
56

67
local M = {}
@@ -34,6 +35,10 @@ function M.load_events(file_path)
3435
M.reset()
3536
M.last_loaded_file = file_path
3637
vim.notify('Loaded ' .. #M.events .. ' events from ' .. data_file, vim.log.levels.INFO)
38+
39+
---@diagnostic disable-next-line: missing-fields
40+
state.active_session = helpers.get_session_from_events(M.events)
41+
3742
return true
3843
end
3944

@@ -47,16 +52,16 @@ function M.setup_windows(opts)
4752
config.config = vim.deepcopy(config.defaults)
4853
end
4954

50-
local ok, err = pcall(function()
51-
state.windows = ui.create_windows()
52-
end)
55+
-- disable the config_file apis because topbar uses them
56+
local empty_promise = require('opencode.promise').new():resolve(nil)
57+
config_file.config_promise = empty_promise
58+
config_file.project_promise = empty_promise
59+
config_file.providers_promise = empty_promise
5360

54-
if not ok then
55-
vim.notify('Failed to create UI windows: ' .. tostring(err), vim.log.levels.ERROR)
56-
return false
57-
end
61+
state.windows = ui.create_windows()
5862

59-
local empty_fn = function() end
63+
-- we don't want output_renderer responding to setting the session id
64+
require('opencode.ui.output_renderer')._cleanup_subscriptions()
6065

6166
vim.schedule(function()
6267
if state.windows and state.windows.output_win then
@@ -68,9 +73,6 @@ function M.setup_windows(opts)
6873
end
6974
pcall(vim.api.nvim_buf_del_keymap, state.windows.output_buf, 'n', '<esc>')
7075
end
71-
72-
state.api_client = state.api_client or {}
73-
state.api_client._call = empty_fn
7476
end)
7577

7678
return true

tests/unit/streaming_renderer_spec.lua

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,27 @@ local streaming_renderer = require('opencode.ui.streaming_renderer')
22
local state = require('opencode.state')
33
local ui = require('opencode.ui.ui')
44
local helpers = require('tests.helpers')
5+
local output_renderer = require('opencode.ui.output_renderer')
6+
local config_file = require('opencode.config_file')
57

68
describe('streaming_renderer', function()
79
local restore_time_ago
810

911
before_each(function()
1012
streaming_renderer.reset()
13+
14+
-- disable the config_file apis because topbar uses them
15+
local empty_promise = require('opencode.promise').new():resolve(nil)
16+
config_file.config_promise = empty_promise
17+
config_file.project_promise = empty_promise
18+
config_file.providers_promise = empty_promise
19+
1120
state.windows = ui.create_windows()
1221

22+
-- we don't want output_renderer responding to setting
23+
-- the session id
24+
output_renderer._cleanup_subscriptions()
25+
1326
restore_time_ago = helpers.mock_time_ago()
1427

1528
local config = require('opencode.config')
@@ -30,6 +43,7 @@ describe('streaming_renderer', function()
3043

3144
it('replays simple-session correctly', function()
3245
local events = helpers.load_test_data('tests/data/simple-session.json')
46+
state.active_session = helpers.get_session_from_events(events)
3347
local expected = helpers.load_test_data('tests/data/simple-session.expected.json')
3448

3549
helpers.replay_events(events)
@@ -44,6 +58,7 @@ describe('streaming_renderer', function()
4458

4559
it('replays updating-text correctly', function()
4660
local events = helpers.load_test_data('tests/data/updating-text.json')
61+
state.active_session = helpers.get_session_from_events(events)
4762
local expected = helpers.load_test_data('tests/data/updating-text.expected.json')
4863

4964
helpers.replay_events(events)
@@ -58,6 +73,7 @@ describe('streaming_renderer', function()
5873

5974
it('replays planning correctly', function()
6075
local events = helpers.load_test_data('tests/data/planning.json')
76+
state.active_session = helpers.get_session_from_events(events)
6177
local expected = helpers.load_test_data('tests/data/planning.expected.json')
6278

6379
helpers.replay_events(events)
@@ -72,6 +88,7 @@ describe('streaming_renderer', function()
7288

7389
it('replays permission correctly', function()
7490
local events = helpers.load_test_data('tests/data/permission.json')
91+
state.active_session = helpers.get_session_from_events(events)
7592
local expected = helpers.load_test_data('tests/data/permission.expected.json')
7693

7794
helpers.replay_events(events)
@@ -86,6 +103,7 @@ describe('streaming_renderer', function()
86103

87104
it('replays permission denied correctly', function()
88105
local events = helpers.load_test_data('tests/data/permission-denied.json')
106+
state.active_session = helpers.get_session_from_events(events)
89107
local expected = helpers.load_test_data('tests/data/permission-denied.expected.json')
90108

91109
helpers.replay_events(events)
@@ -100,6 +118,7 @@ describe('streaming_renderer', function()
100118

101119
it('replays diff correctly', function()
102120
local events = helpers.load_test_data('tests/data/diff.json')
121+
state.active_session = helpers.get_session_from_events(events)
103122
local expected = helpers.load_test_data('tests/data/diff.expected.json')
104123

105124
helpers.replay_events(events)

0 commit comments

Comments
 (0)