Files
im_server/server/media/media_test.go
T

240 lines
6.4 KiB
Go

package media
import (
"strings"
"testing"
)
func TestMatchCORSOrigin(t *testing.T) {
cases := []struct {
allowed []string
origin string
expected string
expectError bool
errorMessage string
}{
{
allowed: []string{"https://example.com"},
origin: "https://example.com",
expected: "https://example.com",
},
{
allowed: []string{"https://example2.com", "https://example.com"},
origin: "https://example.com",
expected: "https://example.com",
},
{
allowed: []string{"*"},
origin: "https://example.com",
expected: "https://example.com",
},
{
allowed: []string{""},
origin: "https://example.com",
expected: "",
},
{
allowed: []string{},
origin: "",
expected: "",
},
{
allowed: []string{"https://example.com"},
origin: "",
expected: "",
},
{
allowed: []string{},
origin: "https://example.com",
expected: "",
},
{
allowed: []string{"http://example.com"},
origin: "https://example.com",
expected: "",
},
{
allowed: []string{"https://example.com"},
origin: "http://example.com",
expected: "",
},
{
allowed: []string{"http://example.com:8000"},
origin: "http://example.com:8000",
expected: "http://example.com:8000",
},
{
allowed: []string{"http://localhost:8090"},
origin: "http://localhost:8090",
expected: "http://localhost:8090",
},
{
allowed: []string{"http://localhost:8090"},
origin: "http://localhost:8080",
expected: "",
},
{
allowed: []string{"https://example.com"},
origin: "https://sub.example.com",
expected: "",
},
{
allowed: []string{"https://*.example.com"},
origin: "https://sub.example.com",
expected: "https://sub.example.com",
},
{
allowed: []string{"https://*.example.com"},
origin: "https://pre.sub.example.com",
expected: "",
},
{
allowed: []string{"https://*.example.com", "https://*.sub.example.com"},
origin: "https://pre.sub.example.com",
expected: "https://pre.sub.example.com",
},
{
allowed: []string{"https://*.*.example.com"},
origin: "https://pre.sub.example.com",
expected: "https://pre.sub.example.com",
},
{
allowed: []string{"https://*.sub.example.com"},
origin: "https://pre.asd.example.com",
expected: "",
},
{
allowed: []string{"https://pre.*.example.com"},
origin: "https://pre.sub.example.com",
expected: "https://pre.sub.example.com",
},
{
allowed: []string{"https://*.*.*.example.com"},
origin: "https://www.pre.sub.example.com",
expected: "https://www.pre.sub.example.com",
},
{
allowed: []string{"*"},
origin: "",
expected: "*", // Should allow any origin, including empty
},
// Error cases - these should fail during ParseCORSAllow
{
allowed: []string{"*", "https://example.com"},
origin: "https://example.com",
expectError: true,
errorMessage: "wildcard origin '*' must be the only entry",
},
{
allowed: []string{"not-a-valid-url"},
origin: "https://example.com",
expectError: true,
errorMessage: "invalid URI for request",
},
{
allowed: []string{"://invalid-url"},
origin: "https://example.com",
expectError: true,
errorMessage: "missing protocol scheme",
},
{
allowed: []string{"https://", "example.com"},
origin: "https://example.com",
expectError: true,
errorMessage: "invalid URI for request",
},
// Valid cases that should not error
{
allowed: []string{"", "https://example.com"},
origin: "https://example.com",
expectError: true,
errorMessage: "empty allowed origin '' must be the only entry", // Empty string should make all origins disallowed
},
{
allowed: []string{"https://Example.com"},
origin: "https://example.com",
expected: "", // Should not match due to case sensitivity
},
{
allowed: []string{"https://example.com/"},
origin: "https://example.com",
expected: "", // Should not match due to trailing slash
},
{
allowed: []string{"https://example.com"},
origin: "not-a-valid-url",
expected: "", // Should handle malformed origin gracefully
},
{
allowed: []string{"https://example.*.com"},
origin: "https://example.sub.com",
expected: "https://example.sub.com",
},
{
allowed: []string{"https://*.com"},
origin: "https://example.com",
expected: "https://example.com",
},
{
allowed: []string{"http://*.example.com"},
origin: "https://sub.example.com",
expected: "", // Should not match due to protocol difference
},
{
allowed: []string{"https://example.com", "https://example.com"},
origin: "https://example.com",
expected: "https://example.com", // Should still work with duplicates
},
}
for i, tc := range cases {
allowedOrigins, err := ParseCORSAllow(tc.allowed)
if tc.expectError {
if err == nil {
t.Errorf("Test case %d: Expected error but got none. Allowed: %v", i, tc.allowed)
continue
}
if tc.errorMessage != "" && !containsSubstring(err.Error(), tc.errorMessage) {
t.Errorf("Test case %d: Expected error containing '%s', got '%s'", i, tc.errorMessage, err.Error())
}
// For error cases, we don't test the matching logic
continue
}
if err != nil {
t.Errorf("Test case %d: Unexpected error parsing allowed origins: %v. Allowed: %v", i, err, tc.allowed)
continue
}
result := matchCORSOrigin(allowedOrigins, tc.origin)
if result != tc.expected {
t.Errorf("Test case %d: Match CORS origin got wrong result. Expected '%s', got '%s'. Allowed: %v, Origin: '%s'",
i, tc.expected, result, tc.allowed, tc.origin)
}
}
}
// Helper function to check if a string contains a substring (case-insensitive)
func containsSubstring(str, substr string) bool {
return strings.Contains(strings.ToLower(str), strings.ToLower(substr))
}
func TestExtensionByMimeType(t *testing.T) {
cases := map[string]string{
"audio/x-m4a": ".m4a",
"audio/x-m4a; charset=utf": ".m4a",
"audio/mp4": ".m4a",
"audio/aac": ".aac",
"audio/mpeg": ".mp3",
"image/jpeg": ".jpg",
"image/jfif": ".jfif",
"video/mp4": ".mp4",
}
for mimeType, want := range cases {
if got := ExtensionByMimeType(mimeType); got != want {
t.Fatalf("ExtensionByMimeType(%q)=%q, want %q", mimeType, got, want)
}
}
}