(t *testing.T)
| 242 | } |
| 243 | |
| 244 | func TestBranchSession(t *testing.T) { |
| 245 | t.Parallel() |
| 246 | t.Run("nil parent returns error", func(t *testing.T) { |
| 247 | t.Parallel() |
| 248 | _, err := BranchSession(nil, 0) |
| 249 | require.Error(t, err) |
| 250 | assert.Contains(t, err.Error(), "parent session is nil") |
| 251 | }) |
| 252 | |
| 253 | t.Run("negative position returns error", func(t *testing.T) { |
| 254 | t.Parallel() |
| 255 | parent := &Session{Messages: []Item{NewMessageItem(UserMessage("test"))}} |
| 256 | _, err := BranchSession(parent, -1) |
| 257 | require.Error(t, err) |
| 258 | assert.Contains(t, err.Error(), "out of range") |
| 259 | }) |
| 260 | |
| 261 | t.Run("position beyond messages returns error", func(t *testing.T) { |
| 262 | t.Parallel() |
| 263 | parent := &Session{Messages: []Item{NewMessageItem(UserMessage("test"))}} |
| 264 | _, err := BranchSession(parent, 2) |
| 265 | require.Error(t, err) |
| 266 | assert.Contains(t, err.Error(), "out of range") |
| 267 | }) |
| 268 | |
| 269 | t.Run("position equal to messages length no error", func(t *testing.T) { |
| 270 | t.Parallel() |
| 271 | parent := &Session{Messages: []Item{NewMessageItem(UserMessage("test"))}} |
| 272 | _, err := BranchSession(parent, 1) |
| 273 | require.NoError(t, err) |
| 274 | }) |
| 275 | |
| 276 | t.Run("branches across a persisted error item", func(t *testing.T) { |
| 277 | t.Parallel() |
| 278 | // Regression: a session containing a recorded failure must remain |
| 279 | // branchable. cloneSessionItem previously errored on error items, |
| 280 | // breaking branch/fork for any failed session. |
| 281 | parent := &Session{ |
| 282 | Messages: []Item{ |
| 283 | NewMessageItem(UserMessage("hi")), |
| 284 | NewErrorItem(&Error{Message: "boom", Code: "model_error"}), |
| 285 | NewMessageItem(UserMessage("again")), |
| 286 | }, |
| 287 | } |
| 288 | |
| 289 | branched, err := BranchSession(parent, 3) |
| 290 | require.NoError(t, err) |
| 291 | require.Len(t, branched.Messages, 3) |
| 292 | require.True(t, branched.Messages[1].IsError()) |
| 293 | assert.Equal(t, "boom", branched.Messages[1].Error.Message) |
| 294 | |
| 295 | // Deep copy: mutating the branch must not touch the parent. |
| 296 | branched.Messages[1].Error.Message = "mutated" |
| 297 | assert.Equal(t, "boom", parent.Messages[1].Error.Message) |
| 298 | }) |
| 299 | |
| 300 | t.Run("valid branch copies messages up to position", func(t *testing.T) { |
| 301 | t.Parallel() |
nothing calls this directly
no test coverage detected