media_stream_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package storage
  2. import (
  3. "errors"
  4. "io"
  5. "os"
  6. "testing"
  7. "github.com/stretchr/testify/require"
  8. )
  9. type legacyImageIO struct {
  10. reads int
  11. data []byte
  12. err error
  13. }
  14. func (l *legacyImageIO) Put(b []byte, id Identifier) error { l.data = b; return nil }
  15. func (l *legacyImageIO) Get(id Identifier) ([]byte, error) { l.reads++; return l.data, l.err }
  16. func TestImageListsMetadataAndLegacyOpen(t *testing.T) {
  17. repo, db := newTestDb(t.TempDir(), true)
  18. defer db.Close()
  19. legacy := &legacyImageIO{data: []byte("0123456789")}
  20. repo.imageIO = legacy
  21. _, err := db.Exec(`INSERT INTO images (id,title,desc,created,category,media_type) VALUES ('x','title','desc','today','digital_art','video/webm')`)
  22. require.NoError(t, err)
  23. all := repo.GetAllImages()
  24. category := repo.GetImagesByCategory(DIGITAL_ART)
  25. require.Len(t, all, 1)
  26. require.Equal(t, all, category)
  27. require.Nil(t, all[0].Data)
  28. require.Equal(t, 0, legacy.reads)
  29. img, stream, err := repo.OpenImage("x")
  30. require.NoError(t, err)
  31. defer stream.Close()
  32. require.Equal(t, "video/webm", img.MediaType)
  33. require.Nil(t, img.Data)
  34. _, err = stream.Seek(2, io.SeekStart)
  35. require.NoError(t, err)
  36. b, err := io.ReadAll(stream)
  37. require.NoError(t, err)
  38. require.Equal(t, "23456789", string(b))
  39. require.Equal(t, 1, legacy.reads)
  40. legacy.err = errors.New("failed")
  41. _, _, err = repo.OpenImage("x")
  42. require.ErrorIs(t, err, legacy.err)
  43. _, _, err = repo.OpenImage("missing")
  44. require.ErrorIs(t, err, ErrNotExists)
  45. _, _, err = repo.OpenImage("../escape")
  46. require.ErrorIs(t, err, ErrNotExists)
  47. }
  48. func TestFilesystemImageOpen(t *testing.T) {
  49. f := FilesystemImageIO{RootDir: t.TempDir()}
  50. require.NoError(t, f.Put([]byte("0123456789"), "x"))
  51. require.NoError(t, f.Put([]byte("abc"), "x"))
  52. stream, err := f.Open("x")
  53. require.NoError(t, err)
  54. defer stream.Close()
  55. b, err := io.ReadAll(stream)
  56. require.NoError(t, err)
  57. require.Equal(t, "abc", string(b))
  58. _, err = f.Open("missing")
  59. require.ErrorIs(t, err, os.ErrNotExist)
  60. _, err = f.Open("../escape")
  61. require.Error(t, err)
  62. }
  63. func TestImageListQueryFailure(t *testing.T) {
  64. repo, db := newTestDb(t.TempDir(), true)
  65. require.NoError(t, db.Close())
  66. require.Nil(t, repo.GetAllImages())
  67. require.Nil(t, repo.GetImagesByCategory(DIGITAL_ART))
  68. }