204 lines
5.0 KiB
Go
204 lines
5.0 KiB
Go
package media
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestFormatDuration(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
seconds int
|
|
expected string
|
|
}{
|
|
{"zero", 0, "00:00:00"},
|
|
{"one second", 1, "00:00:01"},
|
|
{"one minute", 60, "00:01:00"},
|
|
{"one hour", 3600, "01:00:00"},
|
|
{"mixed", 3661, "01:01:01"},
|
|
{"large", 86399, "23:59:59"},
|
|
{"negative", -5, "00:00:00"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := FormatDuration(tt.seconds); got != tt.expected {
|
|
t.Errorf("FormatDuration(%d) = %q, want %q", tt.seconds, got, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIsAllowedExtension(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
expected bool
|
|
}{
|
|
{"video.mp4", true},
|
|
{"video.mov", true},
|
|
{"video.mkv", true},
|
|
{"video.webm", true},
|
|
{"video.m4v", true},
|
|
{"video.ts", true},
|
|
{"video.MP4", true},
|
|
{"video.avi", false},
|
|
{"video.flv", false},
|
|
{"video.wmv", false},
|
|
{"video", false},
|
|
{"", false},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := IsAllowedExtension(tt.name); got != tt.expected {
|
|
t.Errorf("IsAllowedExtension(%q) = %v, want %v", tt.name, got, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestIsAllowedMime(t *testing.T) {
|
|
tests := []struct {
|
|
mime string
|
|
expected bool
|
|
}{
|
|
{"video/mp4", true},
|
|
{"video/quicktime", true},
|
|
{"video/x-matroska", true},
|
|
{"video/webm", true},
|
|
{"application/octet-stream", true},
|
|
{"", true},
|
|
{"image/jpeg", false},
|
|
{"audio/mpeg", false},
|
|
{"text/plain", false},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.mime, func(t *testing.T) {
|
|
if got := IsAllowedMime(tt.mime); got != tt.expected {
|
|
t.Errorf("IsAllowedMime(%q) = %v, want %v", tt.mime, got, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestValidateUploadID(t *testing.T) {
|
|
tests := []struct {
|
|
id string
|
|
expected bool
|
|
}{
|
|
{"abcdef0123456789", true}, // 16 hex chars
|
|
{"abcdef0123456789abcdef0123456789", true}, // 32 hex chars
|
|
{"abc", false}, // too short
|
|
{"abcdef012345678", false}, // 15 chars (too short)
|
|
{"abcdef0123456789g", false}, // non-hex char
|
|
{"ABCDEF0123456789", false}, // uppercase (not allowed)
|
|
{"", false},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.id, func(t *testing.T) {
|
|
if got := ValidateUploadID(tt.id); got != tt.expected {
|
|
t.Errorf("ValidateUploadID(%q) = %v, want %v", tt.id, got, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestParsePlaylist(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
content string
|
|
expected int
|
|
first string
|
|
}{
|
|
{
|
|
name: "simple",
|
|
content: "/videos/video1.mp4\n/videos/video2.mp4\n",
|
|
expected: 2,
|
|
first: "/videos/video1.mp4",
|
|
},
|
|
{
|
|
name: "with file prefix",
|
|
content: "file /videos/video1.mp4\nfile '/videos/video2.mp4'\n",
|
|
expected: 2,
|
|
first: "/videos/video1.mp4",
|
|
},
|
|
{
|
|
name: "with comments and blanks",
|
|
content: "# comment\n\n/videos/video1.mp4\n\n# another comment\n/videos/video2.mp4\n",
|
|
expected: 2,
|
|
first: "/videos/video1.mp4",
|
|
},
|
|
{
|
|
name: "empty",
|
|
content: "",
|
|
expected: 0,
|
|
},
|
|
{
|
|
name: "only comments",
|
|
content: "# comment\n# another\n",
|
|
expected: 0,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
entries := ParsePlaylist(tt.content)
|
|
if len(entries) != tt.expected {
|
|
t.Errorf("ParsePlaylist() len = %d, want %d", len(entries), tt.expected)
|
|
}
|
|
if tt.expected > 0 && entries[0].Path != tt.first {
|
|
t.Errorf("ParsePlaylist()[0].Path = %q, want %q", entries[0].Path, tt.first)
|
|
}
|
|
// Check indices
|
|
for i, e := range entries {
|
|
if e.Index != i+1 {
|
|
t.Errorf("ParsePlaylist()[%d].Index = %d, want %d", i, e.Index, i+1)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGetMediaIDFromPath(t *testing.T) {
|
|
tests := []struct {
|
|
path string
|
|
prefix string
|
|
expected uint
|
|
expectErr bool
|
|
}{
|
|
{"/api/admin/media/123", "/api/admin/media/", 123, false},
|
|
{"/api/admin/media/1", "/api/admin/media/", 1, false},
|
|
{"/api/admin/media/", "/api/admin/media/", 0, true},
|
|
{"/api/admin/media/abc", "/api/admin/media/", 0, true},
|
|
{"/api/admin/media/0", "/api/admin/media/", 0, true},
|
|
{"/other/path", "/api/admin/media/", 0, true},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.path, func(t *testing.T) {
|
|
id, err := GetMediaIDFromPath(tt.path, tt.prefix)
|
|
if tt.expectErr && err == nil {
|
|
t.Errorf("GetMediaIDFromPath(%q) expected error, got nil", tt.path)
|
|
}
|
|
if !tt.expectErr && err != nil {
|
|
t.Errorf("GetMediaIDFromPath(%q) error = %v", tt.path, err)
|
|
}
|
|
if id != tt.expected {
|
|
t.Errorf("GetMediaIDFromPath(%q) = %d, want %d", tt.path, id, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUniqueTargetPath(t *testing.T) {
|
|
// Test that the function returns a path with the mediaDir prefix
|
|
// and the correct filename. We can't easily test collision behavior
|
|
// without filesystem setup, but we can verify the basic path.
|
|
expected := filepath.Join("/tmp/media", "video.mp4")
|
|
path := UniqueTargetPath("/tmp/media", "video.mp4")
|
|
if path != expected {
|
|
t.Errorf("UniqueTargetPath() = %q, want %q", path, expected)
|
|
}
|
|
} |