Skip to content

Commit bbc6f48

Browse files
adding error handling to image rendering (#201)
1 parent 3b307f2 commit bbc6f48

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

cmd/card/imageviewer.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
type ImageModel struct {
88
CardName string
99
ImageURL string
10+
Error error
1011
}
1112

1213
func (m ImageModel) Init() tea.Cmd {
@@ -29,10 +30,11 @@ func (m ImageModel) View() string {
2930
}
3031

3132
func ImageRenderer(cardName string, imageURL string) ImageModel {
32-
imageData, _ := CardImage(imageURL)
33+
imageData, err := CardImage(imageURL)
3334

3435
return ImageModel{
3536
CardName: cardName,
3637
ImageURL: imageData,
38+
Error: err,
3739
}
3840
}

cmd/card/imageviewer_test.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package card
22

33
import (
4+
"image"
5+
"image/color"
6+
"image/png"
7+
"net/http"
8+
"net/http/httptest"
49
"testing"
510

611
tea "github.com/charmbracelet/bubbletea"
@@ -94,3 +99,81 @@ func TestImageModel_View_Empty(t *testing.T) {
9499
t.Errorf("View() with empty ImageURL should return empty string, got %v", result)
95100
}
96101
}
102+
103+
func TestImageRenderer_Success(t *testing.T) {
104+
// Create a test HTTP server that serves a valid PNG image
105+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
106+
img := image.NewRGBA(image.Rect(0, 0, 10, 10))
107+
blue := color.RGBA{R: 0, G: 0, B: 255, A: 255}
108+
for y := 0; y < 10; y++ {
109+
for x := 0; x < 10; x++ {
110+
img.Set(x, y, blue)
111+
}
112+
}
113+
114+
w.Header().Set("Content-Type", "image/png")
115+
w.WriteHeader(http.StatusOK)
116+
_ = png.Encode(w, img)
117+
}))
118+
defer server.Close()
119+
120+
model := ImageRenderer("Pikachu", server.URL)
121+
122+
if model.CardName != "Pikachu" {
123+
t.Errorf("ImageRenderer() CardName = %v, want %v", model.CardName, "Pikachu")
124+
}
125+
126+
if model.Error != nil {
127+
t.Errorf("ImageRenderer() Error should be nil on success, got %v", model.Error)
128+
}
129+
130+
if model.ImageURL == "" {
131+
t.Error("ImageRenderer() ImageURL should not be empty on success")
132+
}
133+
}
134+
135+
func TestImageRenderer_Error(t *testing.T) {
136+
// Create a test HTTP server that returns an error
137+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
138+
w.WriteHeader(http.StatusNotFound)
139+
}))
140+
defer server.Close()
141+
142+
model := ImageRenderer("Charizard", server.URL)
143+
144+
if model.CardName != "Charizard" {
145+
t.Errorf("ImageRenderer() CardName = %v, want %v", model.CardName, "Charizard")
146+
}
147+
148+
if model.Error == nil {
149+
t.Error("ImageRenderer() Error should not be nil when image fetch fails")
150+
}
151+
152+
if model.ImageURL != "" {
153+
t.Errorf("ImageRenderer() ImageURL should be empty on error, got %v", model.ImageURL)
154+
}
155+
}
156+
157+
func TestImageRenderer_InvalidImage(t *testing.T) {
158+
// Create a test HTTP server that returns invalid image data
159+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
160+
w.Header().Set("Content-Type", "image/png")
161+
w.WriteHeader(http.StatusOK)
162+
_, _ = w.Write([]byte("not a valid image"))
163+
}))
164+
defer server.Close()
165+
166+
model := ImageRenderer("Mewtwo", server.URL)
167+
168+
if model.CardName != "Mewtwo" {
169+
t.Errorf("ImageRenderer() CardName = %v, want %v", model.CardName, "Mewtwo")
170+
}
171+
172+
if model.Error == nil {
173+
t.Error("ImageRenderer() Error should not be nil when image decoding fails")
174+
}
175+
176+
if model.ImageURL != "" {
177+
t.Errorf("ImageRenderer() ImageURL should be empty on error, got %v", model.ImageURL)
178+
}
179+
}

0 commit comments

Comments
 (0)