repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

commit
4acf8cc
parent
f566e4d
author
Eric Bower
date
2026-04-20 21:49:29 -0400 EDT
chore: disable imgproxy tests

We don't have them setup properly atm
1 files changed,  +154, -159
M pkg/apps/pgs/web_test.go
+154, -159
  1@@ -1,13 +1,10 @@
  2 package pgs
  3 
  4 import (
  5-	"context"
  6 	"fmt"
  7 	"log/slog"
  8 	"net/http"
  9 	"net/http/httptest"
 10-	"os"
 11-	"os/exec"
 12 	"strings"
 13 	"testing"
 14 	"time"
 15@@ -17,80 +14,78 @@ import (
 16 	"github.com/picosh/pico/pkg/shared"
 17 	"github.com/picosh/pico/pkg/shared/mime"
 18 	"github.com/picosh/pico/pkg/storage"
 19-	"github.com/testcontainers/testcontainers-go"
 20-	"github.com/testcontainers/testcontainers-go/wait"
 21 )
 22 
 23 // var imgproxyContainer testcontainers.Container.
 24-var imgproxyURL string
 25-
 26-// setupContainerRuntime checks for a container runtime (podman/docker) and
 27-// sets DOCKER_HOST so testcontainers can connect.
 28-func setupContainerRuntime() bool {
 29-	if cmd := exec.Command("podman", "info"); cmd.Run() == nil {
 30-		_ = os.Setenv("TESTCONTAINERS_RYUK_DISABLED", "true")
 31-		xdgRuntime := os.Getenv("XDG_RUNTIME_DIR")
 32-		if xdgRuntime != "" {
 33-			socketPath := xdgRuntime + "/podman/podman.sock"
 34-			if _, err := os.Stat(socketPath); err == nil {
 35-				_ = os.Setenv("DOCKER_HOST", "unix://"+socketPath)
 36-				return true
 37-			}
 38-		}
 39-		return false
 40-	}
 41-
 42-	if cmd := exec.Command("docker", "info"); cmd.Run() == nil {
 43-		return true
 44-	}
 45-	return false
 46-}
 47-
 48-func TestMain(m *testing.M) {
 49-	ctx := context.Background()
 50-
 51-	if !setupContainerRuntime() {
 52-		fmt.Fprintf(os.Stderr, "Container runtime not available, skipping image manipulation tests\n")
 53-		fmt.Fprintf(os.Stderr, "To run tests, either:\n")
 54-		fmt.Fprintf(os.Stderr, "  - Start podman socket: systemctl --user start podman.socket\n")
 55-		fmt.Fprintf(os.Stderr, "  - Start docker daemon\n")
 56-		os.Exit(m.Run())
 57-	}
 58-
 59-	imgproxyContainer, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
 60-		ContainerRequest: testcontainers.ContainerRequest{
 61-			Image:        "docker.io/darthsim/imgproxy:latest",
 62-			ExposedPorts: []string{"8080/tcp"},
 63-			WaitingFor:   wait.ForLog("INFO imgproxy is ready to listen"),
 64-		},
 65-		Started: true,
 66-	})
 67-	if err != nil {
 68-		fmt.Fprintf(os.Stderr, "Failed to start imgproxy container (Docker/Podman may not be running): %s\n", err)
 69-		fmt.Fprintf(os.Stderr, "Skipping image manipulation tests.\n")
 70-		os.Exit(m.Run())
 71-	}
 72-
 73-	host, err := imgproxyContainer.Host(ctx)
 74-	if err != nil {
 75-		fmt.Fprintf(os.Stderr, "Failed to get imgproxy host: %s\n", err)
 76-		os.Exit(m.Run())
 77-	}
 78-
 79-	port, err := imgproxyContainer.MappedPort(ctx, "8080")
 80-	if err != nil {
 81-		fmt.Fprintf(os.Stderr, "Failed to get imgproxy port: %s\n", err)
 82-		os.Exit(m.Run())
 83-	}
 84-
 85-	imgproxyURL = fmt.Sprintf("http://%s:%s", host, port)
 86-	_ = os.Setenv("IMGPROXY_URL", imgproxyURL)
 87-
 88-	code := m.Run()
 89-
 90-	_ = imgproxyContainer.Terminate(ctx)
 91-	os.Exit(code)
 92-}
 93+// var imgproxyURL string
 94+
 95+// // setupContainerRuntime checks for a container runtime (podman/docker) and
 96+// // sets DOCKER_HOST so testcontainers can connect.
 97+// func setupContainerRuntime() bool {
 98+// 	if cmd := exec.Command("podman", "info"); cmd.Run() == nil {
 99+// 		_ = os.Setenv("TESTCONTAINERS_RYUK_DISABLED", "true")
100+// 		xdgRuntime := os.Getenv("XDG_RUNTIME_DIR")
101+// 		if xdgRuntime != "" {
102+// 			socketPath := xdgRuntime + "/podman/podman.sock"
103+// 			if _, err := os.Stat(socketPath); err == nil {
104+// 				_ = os.Setenv("DOCKER_HOST", "unix://"+socketPath)
105+// 				return true
106+// 			}
107+// 		}
108+// 		return false
109+// 	}
110+
111+// 	if cmd := exec.Command("docker", "info"); cmd.Run() == nil {
112+// 		return true
113+// 	}
114+// 	return false
115+// }
116+
117+// func TestMain(m *testing.M) {
118+// 	ctx := context.Background()
119+
120+// 	if !setupContainerRuntime() {
121+// 		fmt.Fprintf(os.Stderr, "Container runtime not available, skipping image manipulation tests\n")
122+// 		fmt.Fprintf(os.Stderr, "To run tests, either:\n")
123+// 		fmt.Fprintf(os.Stderr, "  - Start podman socket: systemctl --user start podman.socket\n")
124+// 		fmt.Fprintf(os.Stderr, "  - Start docker daemon\n")
125+// 		os.Exit(m.Run())
126+// 	}
127+
128+// 	imgproxyContainer, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
129+// 		ContainerRequest: testcontainers.ContainerRequest{
130+// 			Image:        "docker.io/darthsim/imgproxy:latest",
131+// 			ExposedPorts: []string{"8080/tcp"},
132+// 			WaitingFor:   wait.ForLog("Starting server at :8080"),
133+// 		},
134+// 		Started: true,
135+// 	})
136+// 	if err != nil {
137+// 		fmt.Fprintf(os.Stderr, "Failed to start imgproxy container (Docker/Podman may not be running): %s\n", err)
138+// 		fmt.Fprintf(os.Stderr, "Skipping image manipulation tests.\n")
139+// 		os.Exit(m.Run())
140+// 	}
141+
142+// 	host, err := imgproxyContainer.Host(ctx)
143+// 	if err != nil {
144+// 		fmt.Fprintf(os.Stderr, "Failed to get imgproxy host: %s\n", err)
145+// 		os.Exit(m.Run())
146+// 	}
147+
148+// 	port, err := imgproxyContainer.MappedPort(ctx, "8080")
149+// 	if err != nil {
150+// 		fmt.Fprintf(os.Stderr, "Failed to get imgproxy port: %s\n", err)
151+// 		os.Exit(m.Run())
152+// 	}
153+
154+// 	imgproxyURL = fmt.Sprintf("http://%s:%s", host, port)
155+// 	_ = os.Setenv("IMGPROXY_URL", imgproxyURL)
156+
157+// 	code := m.Run()
158+
159+// 	_ = imgproxyContainer.Terminate(ctx)
160+// 	os.Exit(code)
161+// }
162 
163 // testStorage wraps storage.StorageServe to inject ObjectInfo fields that
164 // production backends (S3, GCS) provide but the in-memory test storage does not.
165@@ -578,88 +573,88 @@ func TestDirectoryListing(t *testing.T) {
166 }
167 
168 // minimalJPEG returns a minimal valid 1x1 JPEG image.
169-func minimalJPEG(t *testing.T) []byte {
170-	data, err := os.ReadFile("splash.jpg")
171-	if err != nil {
172-		t.Fatal(err)
173-	}
174-	return data
175-}
176-
177-func TestImageManipulation(t *testing.T) {
178-	if imgproxyURL == "" {
179-		t.Skip("imgproxy container not available")
180-	}
181-
182-	logger := slog.Default()
183-	dbpool := NewPgsDb(logger)
184-	bucketName := shared.GetAssetBucketName(dbpool.Users[0].ID)
185-
186-	tt := []struct {
187-		name        string
188-		path        string
189-		status      int
190-		contentType string
191-		storage     map[string]map[string]string
192-	}{
193-		{
194-			name:        "root-img",
195-			path:        "/app.jpg/s:500/rt:90",
196-			status:      http.StatusOK,
197-			contentType: "image/jpeg",
198-			storage: map[string]map[string]string{
199-				bucketName: {
200-					"/test/app.jpg": string(minimalJPEG(t)),
201-				},
202-			},
203-		},
204-		{
205-			name:        "root-subdir-img",
206-			path:        "/subdir/app.jpg/rt:90/s:500",
207-			status:      http.StatusOK,
208-			contentType: "image/jpeg",
209-			storage: map[string]map[string]string{
210-				bucketName: {
211-					"/test/subdir/app.jpg": string(minimalJPEG(t)),
212-				},
213-			},
214-		},
215-	}
216-
217-	for _, tc := range tt {
218-		t.Run(tc.name, func(t *testing.T) {
219-			request := httptest.NewRequest("GET", dbpool.mkpath(tc.path), strings.NewReader(""))
220-			responseRecorder := httptest.NewRecorder()
221-
222-			memSt, err := storage.NewStorageMemory(tc.storage)
223-			if err != nil {
224-				t.Fatal(err)
225-			}
226-			st := newTestStorage(memSt)
227-			pubsub := NewPubsubChan()
228-			defer func() {
229-				_ = pubsub.Close()
230-			}()
231-			cfg := NewPgsConfig(logger, dbpool, st, pubsub)
232-			cfg.Domain = "pgs.test"
233-			router := NewWebRouter(cfg)
234-			router.ServeHTTP(responseRecorder, request)
235-
236-			if responseRecorder.Code != tc.status {
237-				t.Errorf("Want status '%d', got '%d'", tc.status, responseRecorder.Code)
238-			}
239-
240-			ct := responseRecorder.Header().Get("content-type")
241-			if ct != tc.contentType {
242-				t.Errorf("Want content type '%s', got '%s'", tc.contentType, ct)
243-			}
244-
245-			// With a real imgproxy, the response is binary image data.
246-			// Verify we got some content back (not empty).
247-			body := responseRecorder.Body.Bytes()
248-			if len(body) == 0 {
249-				t.Error("Expected non-empty image response body")
250-			}
251-		})
252-	}
253-}
254+// func minimalJPEG(t *testing.T) []byte {
255+// 	data, err := os.ReadFile("../../../splash.jpg")
256+// 	if err != nil {
257+// 		t.Fatal(err)
258+// 	}
259+// 	return data
260+// }
261+
262+// func TestImageManipulation(t *testing.T) {
263+// 	if imgproxyURL == "" {
264+// 		t.Skip("imgproxy container not available")
265+// 	}
266+
267+// 	logger := slog.Default()
268+// 	dbpool := NewPgsDb(logger)
269+// 	bucketName := shared.GetAssetBucketName(dbpool.Users[0].ID)
270+
271+// 	tt := []struct {
272+// 		name        string
273+// 		path        string
274+// 		status      int
275+// 		contentType string
276+// 		storage     map[string]map[string]string
277+// 	}{
278+// 		{
279+// 			name:        "root-img",
280+// 			path:        "/app.jpg/s:500/rt:90",
281+// 			status:      http.StatusOK,
282+// 			contentType: "image/jpeg",
283+// 			storage: map[string]map[string]string{
284+// 				bucketName: {
285+// 					"/test/app.jpg": string(minimalJPEG(t)),
286+// 				},
287+// 			},
288+// 		},
289+// 		{
290+// 			name:        "root-subdir-img",
291+// 			path:        "/subdir/app.jpg/rt:90/s:500",
292+// 			status:      http.StatusOK,
293+// 			contentType: "image/jpeg",
294+// 			storage: map[string]map[string]string{
295+// 				bucketName: {
296+// 					"/test/subdir/app.jpg": string(minimalJPEG(t)),
297+// 				},
298+// 			},
299+// 		},
300+// 	}
301+
302+// 	for _, tc := range tt {
303+// 		t.Run(tc.name, func(t *testing.T) {
304+// 			request := httptest.NewRequest("GET", dbpool.mkpath(tc.path), strings.NewReader(""))
305+// 			responseRecorder := httptest.NewRecorder()
306+
307+// 			memSt, err := storage.NewStorageMemory(tc.storage)
308+// 			if err != nil {
309+// 				t.Fatal(err)
310+// 			}
311+// 			st := newTestStorage(memSt)
312+// 			pubsub := NewPubsubChan()
313+// 			defer func() {
314+// 				_ = pubsub.Close()
315+// 			}()
316+// 			cfg := NewPgsConfig(logger, dbpool, st, pubsub)
317+// 			cfg.Domain = "pgs.test"
318+// 			router := NewWebRouter(cfg)
319+// 			router.ServeHTTP(responseRecorder, request)
320+
321+// 			if responseRecorder.Code != tc.status {
322+// 				t.Errorf("Want status '%d', got '%d'", tc.status, responseRecorder.Code)
323+// 			}
324+
325+// 			ct := responseRecorder.Header().Get("content-type")
326+// 			if ct != tc.contentType {
327+// 				t.Errorf("Want content type '%s', got '%s'", tc.contentType, ct)
328+// 			}
329+
330+// 			// With a real imgproxy, the response is binary image data.
331+// 			// Verify we got some content back (not empty).
332+// 			body := responseRecorder.Body.Bytes()
333+// 			if len(body) != 0 {
334+// 				t.Error("Expected non-empty image response body")
335+// 			}
336+// 		})
337+// 	}
338+// }