File size: 3,484 Bytes
6bc074c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package sseparser

import (
	"testing"

	chatgpt_types "aurora/typings/chatgpt"
)

func TestDataPayloads_SingleDataLine(t *testing.T) {
	line := "data: {\"key\":\"value\"}\n\n"
	payloads := DataPayloads(line)
	if len(payloads) != 1 {
		t.Fatalf("expected 1 payload, got %d", len(payloads))
	}
	if payloads[0] != `{"key":"value"}` {
		t.Errorf("unexpected payload: %s", payloads[0])
	}
}

func TestDataPayloads_MultipleDataLines(t *testing.T) {
	line := "data: {\"a\":1}\ndata: {\"b\":2}\n\n"
	payloads := DataPayloads(line)
	if len(payloads) != 2 {
		t.Fatalf("expected 2 payloads, got %d", len(payloads))
	}
}

func TestDataPayloads_DoneMarker(t *testing.T) {
	line := "data: [DONE]\n\n"
	payloads := DataPayloads(line)
	if len(payloads) != 1 || payloads[0] != "[DONE]" {
		t.Fatalf("expected [DONE], got %v", payloads)
	}
}

func TestDataPayloads_EmptyLine(t *testing.T) {
	payloads := DataPayloads("")
	if len(payloads) != 0 {
		t.Fatalf("expected 0 payloads, got %d", len(payloads))
	}
}

func TestSplitDataPayloads_JSON(t *testing.T) {
	payloads := SplitDataPayloads(`{"key":"value"}`)
	if len(payloads) != 1 || payloads[0] != `{"key":"value"}` {
		t.Fatalf("unexpected: %v", payloads)
	}
}

func TestSplitDataPayloads_Done(t *testing.T) {
	payloads := SplitDataPayloads("[DONE]")
	if len(payloads) != 1 || payloads[0] != "[DONE]" {
		t.Fatalf("unexpected: %v", payloads)
	}
}

func TestEventName_Present(t *testing.T) {
	line := "event: response.created\ndata: {}\n\n"
	name, ok := EventName(line)
	if !ok || name != "response.created" {
		t.Fatalf("expected response.created, got %q (ok=%v)", name, ok)
	}
}

func TestEventName_Absent(t *testing.T) {
	line := "data: {}\n\n"
	name, ok := EventName(line)
	if ok {
		t.Fatalf("expected no event, got %q", name)
	}
}

func TestNumberToInt64_Float64(t *testing.T) {
	v, ok := NumberToInt64(float64(42.5))
	if !ok || v != 42 {
		t.Fatalf("expected 42, got %d (ok=%v)", v, ok)
	}
}

func TestNumberToInt64_Int(t *testing.T) {
	v, ok := NumberToInt64(int(100))
	if !ok || v != 100 {
		t.Fatalf("expected 100, got %d (ok=%v)", v, ok)
	}
}

func TestNumberToInt64_String(t *testing.T) {
	_, ok := NumberToInt64("not a number")
	if ok {
		t.Fatal("expected false for string input")
	}
}

func TestChannelFromValue_Nested(t *testing.T) {
	value := map[string]interface{}{
		"delta": map[string]interface{}{
			"channel": "test-channel",
		},
	}
	ch := ChannelFromValue(value)
	if ch != "test-channel" {
		t.Fatalf("expected test-channel, got %q", ch)
	}
}

func TestChannelFromValue_Empty(t *testing.T) {
	ch := ChannelFromValue(map[string]interface{}{})
	if ch != "" {
		t.Fatalf("expected empty, got %q", ch)
	}
}

func TestFirstStringPart(t *testing.T) {
	parts := []interface{}{"hello", "world"}
	if s := FirstStringPart(parts); s != "hello" {
		t.Fatalf("expected hello, got %q", s)
	}
	if s := FirstStringPart(nil); s != "" {
		t.Fatalf("expected empty, got %q", s)
	}
}

func TestNormalizeContentDelta(t *testing.T) {
	if d := NormalizeContentDelta("", "hello"); d != "hello" {
		t.Fatalf("expected hello, got %q", d)
	}
	if d := NormalizeContentDelta("hel", "hello"); d != "lo" {
		t.Fatalf("expected lo, got %q", d)
	}
	if d := NormalizeContentDelta("hello", ""); d != "" {
		t.Fatalf("expected empty, got %q", d)
	}
}

func TestIsUsableConversationResponse(t *testing.T) {
	// Empty response is not usable
	if IsUsableConversationResponse(chatgpt_types.ChatGPTResponse{}) {
		t.Fatal("empty response should not be usable")
	}
}