@@ -3,6 +3,8 @@ package markdown
33import (
44 "image"
55 "image/png"
6+ "net/http"
7+ "net/http/httptest"
68 "os"
79 "path/filepath"
810 "testing"
@@ -204,3 +206,133 @@ func TestEmbedMarkdownImages_AvoidsCopyWhenAllImagesFail(t *testing.T) {
204206 // Verify it returns the same slice when all images fail to convert
205207 assert .Equal (t , & input [0 ], & result [0 ], "Should return the same slice when all conversions fail" )
206208}
209+
210+ func TestEmbedMarkdownImages_URLImage (t * testing.T ) {
211+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
212+ img := createTestImage (50 , 50 )
213+ w .Header ().Set ("Content-Type" , "image/png" )
214+ if err := png .Encode (w , img ); err != nil {
215+ t .Errorf ("failed to encode PNG: %v" , err )
216+ }
217+ }))
218+ defer server .Close ()
219+
220+ content := ``
221+ result , err := EmbedMarkdownImages ([]byte (content ), "" , 0 , 0 )
222+ require .NoError (t , err )
223+
224+ assert .Contains (t , string (result ), "data:image/png;base64," )
225+ assert .NotContains (t , string (result ), "](`+server.URL+`)" )
226+ }
227+
228+ func TestEmbedMarkdownImages_URLImageWithLimits (t * testing.T ) {
229+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
230+ img := createTestImage (200 , 150 )
231+ w .Header ().Set ("Content-Type" , "image/png" )
232+ if err := png .Encode (w , img ); err != nil {
233+ t .Errorf ("failed to encode PNG: %v" , err )
234+ }
235+ }))
236+ defer server .Close ()
237+
238+ content := ``
239+ result , err := EmbedMarkdownImages ([]byte (content ), "" , 100 , 100 )
240+ require .NoError (t , err )
241+
242+ // Should keep original since image exceeds limits
243+ assert .Contains (t , string (result ), "" )
244+ assert .NotContains (t , string (result ), "data:image/png;base64," )
245+ }
246+
247+ func TestEmbedMarkdownImages_URLImageError (t * testing.T ) {
248+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
249+ w .WriteHeader (http .StatusNotFound )
250+ }))
251+ defer server .Close ()
252+
253+ content := ``
254+ result , err := EmbedMarkdownImages ([]byte (content ), "" , 0 , 0 )
255+ require .NoError (t , err )
256+
257+ // Should keep original since URL returns error
258+ assert .Contains (t , string (result ), "" )
259+ assert .NotContains (t , string (result ), "data:image/png;base64," )
260+ }
261+
262+ func TestEmbedMarkdownImages_MixedLocalAndURL (t * testing.T ) {
263+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
264+ img := createTestImage (50 , 50 )
265+ w .Header ().Set ("Content-Type" , "image/png" )
266+ if err := png .Encode (w , img ); err != nil {
267+ t .Errorf ("failed to encode PNG: %v" , err )
268+ }
269+ }))
270+ defer server .Close ()
271+
272+ tempDir := t .TempDir ()
273+ imgPath := filepath .Join (tempDir , "local.png" )
274+ f , err := os .Create (imgPath )
275+ require .NoError (t , err )
276+ img := createTestImage (30 , 30 )
277+ require .NoError (t , png .Encode (f , img ))
278+ require .NoError (t , f .Close ())
279+
280+ content := ` and `
281+ result , err := EmbedMarkdownImages ([]byte (content ), tempDir , 0 , 0 )
282+ require .NoError (t , err )
283+
284+ // Both should be converted to data URIs
285+ assert .Contains (t , string (result ), "data:image/png;base64," )
286+ assert .NotContains (t , string (result ), "](local.png)" )
287+ assert .NotContains (t , string (result ), "](" + server .URL + ")" )
288+ }
289+
290+ func TestEmbedMarkdownImages_URLWithDifferentFormats (t * testing.T ) {
291+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
292+ img := createTestImage (50 , 50 )
293+ w .Header ().Set ("Content-Type" , "image/png" )
294+ if err := png .Encode (w , img ); err != nil {
295+ t .Errorf ("failed to encode image: %v" , err )
296+ }
297+ }))
298+ defer server .Close ()
299+
300+ content := ``
301+ result , err := EmbedMarkdownImages ([]byte (content ), "" , 0 , 0 )
302+ require .NoError (t , err )
303+
304+ assert .Contains (t , string (result ), "data:image/png;base64," )
305+ assert .NotContains (t , string (result ), "](" + server .URL + ")" )
306+ }
307+
308+ func TestFindImageReferences_URLImages (t * testing.T ) {
309+ content := ` and `
310+
311+ refs := findImageReferences (content )
312+
313+ require .Len (t , refs , 2 )
314+
315+ // Check local image
316+ assert .Equal (t , "local" , refs [0 ].AltText )
317+ assert .Equal (t , "./image.png" , refs [0 ].ImagePath )
318+
319+ // Check URL image
320+ assert .Equal (t , "remote" , refs [1 ].AltText )
321+ assert .Equal (t , "https://example.com/image.jpg" , refs [1 ].ImagePath )
322+ }
323+
324+ func TestFindImageReferences_DataURLSkipped (t * testing.T ) {
325+ content := ` and `
326+
327+ refs := findImageReferences (content )
328+
329+ // Only URL should be found, data URL should be skipped
330+ require .Len (t , refs , 1 )
331+ assert .Equal (t , "url" , refs [0 ].AltText )
332+ assert .Equal (t , "https://example.com/image.png" , refs [0 ].ImagePath )
333+ }
334+
335+ func createTestImage (width , height int ) image.Image {
336+ img := image .NewRGBA (image .Rect (0 , 0 , width , height ))
337+ return img
338+ }
0 commit comments