package model import "testing" func TestTextMessage(t *testing.T) { t.Parallel() msg := TextMessage(RoleUser, "hi") if msg.Role != RoleUser { t.Fatalf("role = %q, want %q", msg.Role, RoleUser) } if len(msg.Content) != 1 || msg.Content[0].Type != ContentTypeText || msg.Content[0].Text != "hi" { t.Fatalf("content = %+v, want a single text part", msg.Content) } } func TestImageMessage(t *testing.T) { t.Parallel() msg := ImageMessage(RoleUser, "look", "data:image/png;base64,abc") if len(msg.Content) != 2 { t.Fatalf("content len = %d, want 2 (text + image)", len(msg.Content)) } if msg.Content[1].Type != ContentTypeImage || msg.Content[1].ImageURL != "data:image/png;base64,abc" { t.Fatalf("image part = %+v", msg.Content[1]) } } func TestImageMessage_NoText(t *testing.T) { t.Parallel() msg := ImageMessage(RoleUser, "", "data:image/png;base64,abc") if len(msg.Content) != 1 || msg.Content[0].Type != ContentTypeImage { t.Fatalf("content = %+v, want a single image part", msg.Content) } } func TestHasImage(t *testing.T) { t.Parallel() cases := []struct { name string msgs []Message want bool }{ {"empty", nil, false}, {"text only", []Message{TextMessage(RoleUser, "hi")}, false}, {"image", []Message{ImageMessage(RoleUser, "", "data:image/png;base64,x")}, true}, {"text and image", []Message{ImageMessage(RoleUser, "desc", "data:image/png;base64,x")}, true}, } for _, c := range cases { c := c t.Run(c.name, func(t *testing.T) { t.Parallel() if got := HasImage(c.msgs); got != c.want { t.Fatalf("HasImage = %v, want %v", got, c.want) } }) } }