main 6af0a61

client_test.go RawHistoryFolder

1package http
2
3import (
4	"net/http"
5	"net/http/httptest"
6	"strings"
7	"testing"
8	"time"
9)
10
11func TestHTTPClient_NewHTTPClient(t *testing.T) {
12	client := NewHTTPClient()
13	if client == nil {
14		t.Fatal("expected non-nil client")
15	}
16
17	if client.client == nil {
18		t.Fatal("expected non-nil internal client")
19	}
20}
21
22func TestHTTPClient_NewHTTPClientWithTimeout(t *testing.T) {
23	timeout := 5 * time.Second
24	client := NewHTTPClientWithTimeout(timeout)
25
26	if client == nil {
27		t.Fatal("expected non-nil client")
28	}
29
30	if client.client.Timeout != timeout {
31		t.Errorf("expected timeout %v, got %v", timeout, client.client.Timeout)
32	}
33}
34
35func TestHTTPClient_Get_Success(t *testing.T) {
36	// Create a test server
37	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
38		w.WriteHeader(200)
39		if _, err := w.Write([]byte("test response")); err != nil {
40			t.Fatalf("failed to write response: %v", err)
41		}
42	}))
43	defer server.Close()
44
45	client := NewHTTPClient()
46	resp, err := client.Get(server.URL)
47	defer func() {
48		if err := resp.Close(); err != nil {
49			t.Fatalf("failed to close response: %v", err)
50		}
51	}()
52
53	if err != nil {
54		t.Fatalf("expected no error, got %v", err)
55	}
56
57	if resp.StatusCode() != 200 {
58		t.Errorf("expected status 200, got %d", resp.StatusCode())
59	}
60
61	if string(resp.Body()) != "test response" {
62		t.Errorf("expected 'test response', got %s", string(resp.Body()))
63	}
64}
65
66func TestHTTPClient_Get_StatusCode(t *testing.T) {
67	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
68		w.WriteHeader(404)
69	}))
70	defer server.Close()
71
72	client := NewHTTPClient()
73	resp, err := client.Get(server.URL)
74	defer func() {
75		if err := resp.Close(); err != nil {
76			t.Fatalf("failed to close response: %v", err)
77		}
78	}()
79
80	if err != nil {
81		t.Fatalf("expected no error, got %v", err)
82	}
83
84	if resp.StatusCode() != 404 {
85		t.Errorf("expected status 404, got %d", resp.StatusCode())
86	}
87}
88
89func TestHTTPClient_Get_EmptyBody(t *testing.T) {
90	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
91		w.WriteHeader(204)
92	}))
93	defer server.Close()
94
95	client := NewHTTPClient()
96	resp, err := client.Get(server.URL)
97	defer func() {
98		if err := resp.Close(); err != nil {
99			t.Fatalf("failed to close response: %v", err)
100		}
101	}()
102
103	if err != nil {
104		t.Fatalf("expected no error, got %v", err)
105	}
106
107	if len(resp.Body()) != 0 {
108		t.Errorf("expected empty body, got %s", string(resp.Body()))
109	}
110}
111
112func TestHTTPClient_Get_LargeBody(t *testing.T) {
113	largeBody := strings.Repeat("a", 10000)
114
115	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
116		w.WriteHeader(200)
117		if _, err := w.Write([]byte(largeBody)); err != nil {
118			t.Fatalf("failed to write response: %v", err)
119		}
120	}))
121	defer server.Close()
122
123	client := NewHTTPClient()
124	resp, err := client.Get(server.URL)
125	defer func() {
126		if err := resp.Close(); err != nil {
127			t.Fatalf("failed to close response: %v", err)
128		}
129	}()
130
131	if err != nil {
132		t.Fatalf("expected no error, got %v", err)
133	}
134
135	if string(resp.Body()) != largeBody {
136		t.Error("expected body to match large response")
137	}
138}
139
140func TestHTTPClient_Get_InvalidURL(t *testing.T) {
141	client := NewHTTPClient()
142	_, err := client.Get("http://nonexistent.invalid.domain.example/")
143
144	if err == nil {
145		t.Fatal("expected error for invalid URL")
146	}
147}
148
149func TestHTTPClient_Post_Success(t *testing.T) {
150	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
151		w.WriteHeader(201)
152		if _, err := w.Write([]byte("created")); err != nil {
153			t.Fatalf("failed to write response: %v", err)
154		}
155	}))
156	defer server.Close()
157
158	client := NewHTTPClient()
159	resp, err := client.Post(server.URL, "application/json", []byte(`{"key":"value"}`))
160	defer func() {
161		if err := resp.Close(); err != nil {
162			t.Fatalf("failed to close response: %v", err)
163		}
164	}()
165
166	if err != nil {
167		t.Fatalf("expected no error, got %v", err)
168	}
169
170	if resp.StatusCode() != 201 {
171		t.Errorf("expected status 201, got %d", resp.StatusCode())
172	}
173
174	if string(resp.Body()) != "created" {
175		t.Errorf("expected 'created', got %s", string(resp.Body()))
176	}
177}
178
179func TestHTTPClient_Post_InvalidURL(t *testing.T) {
180	client := NewHTTPClient()
181	_, err := client.Post("http://nonexistent.invalid.domain.example/", "application/json", []byte("test"))
182
183	if err == nil {
184		t.Fatal("expected error for invalid URL")
185	}
186}
187
188func TestHTTPClient_Response_Close(t *testing.T) {
189	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
190		w.WriteHeader(200)
191		if _, err := w.Write([]byte("test")); err != nil {
192			t.Fatalf("failed to write response: %v", err)
193		}
194	}))
195	defer server.Close()
196
197	client := NewHTTPClient()
198	resp, _ := client.Get(server.URL)
199
200	err := resp.Close()
201	if err != nil {
202		t.Errorf("expected no error closing response, got %v", err)
203	}
204}
205
206func TestHTTPClient_Get_Timeout(t *testing.T) {
207	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
208		time.Sleep(2 * time.Second)
209		w.WriteHeader(200)
210	}))
211	defer server.Close()
212
213	client := NewHTTPClientWithTimeout(100 * time.Millisecond)
214	_, err := client.Get(server.URL)
215
216	if err == nil {
217		t.Fatal("expected error due to timeout")
218	}
219}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 0

    ↑↓ moveenter openesc close