package storage import "testing" func TestS3StorageKeyFromURL_CustomEndpointPreservesNestedKey(t *testing.T) { s := &S3Storage{ bucket: "test-bucket", endpointURL: "http://localhost:9000", } rawURL := "http://localhost:9000/test-bucket/uploads/abc/file.png" if got := s.KeyFromURL(rawURL); got != "uploads/abc/file.png" { t.Fatalf("KeyFromURL(%q) = %q, want %q", rawURL, got, "uploads/abc/file.png") } } func TestS3StorageKeyFromURL_CustomEndpointWithTrailingSlash(t *testing.T) { s := &S3Storage{ bucket: "test-bucket", endpointURL: "http://localhost:9000/", } rawURL := "http://localhost:9000/test-bucket/uploads/abc/file.png" if got := s.KeyFromURL(rawURL); got != "uploads/abc/file.png" { t.Fatalf("KeyFromURL(%q) = %q, want %q", rawURL, got, "uploads/abc/file.png") } } func TestS3StorageUploadedURL(t *testing.T) { const key = "uploads/abc/file.png" cases := []struct { name string bucket string cdnDomain string endpointURL string want string }{ { name: "bucket only", bucket: "test-bucket", want: "https://test-bucket/uploads/abc/file.png", }, { name: "cdn only", bucket: "test-bucket", cdnDomain: "cdn.example.com", want: "https://cdn.example.com/uploads/abc/file.png", }, { name: "endpoint only", bucket: "test-bucket", endpointURL: "http://localhost:9000", want: "http://localhost:9000/test-bucket/uploads/abc/file.png", }, { name: "endpoint with trailing slash", bucket: "test-bucket", endpointURL: "http://localhost:9000/", want: "http://localhost:9000/test-bucket/uploads/abc/file.png", }, { name: "endpoint and cdn both set prefers cdn", bucket: "test-bucket", cdnDomain: "cdn.example.com", endpointURL: "http://localhost:9000", want: "https://cdn.example.com/uploads/abc/file.png", }, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { s := &S3Storage{ bucket: tc.bucket, cdnDomain: tc.cdnDomain, endpointURL: tc.endpointURL, } if got := s.uploadedURL(key); got != tc.want { t.Fatalf("uploadedURL() = %q, want %q", got, tc.want) } }) } }