digital_art_test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package storage
  2. import (
  3. "os"
  4. "path/filepath"
  5. "testing"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func TestDigitalArtMetadataUpdate(t *testing.T) {
  9. dir := t.TempDir()
  10. repo, db := newTestDb(dir, true)
  11. defer db.Close()
  12. id, err := repo.AddImage([]byte("image bytes"), "old", "old desc", DIGITAL_ART, "image/png")
  13. require.NoError(t, err)
  14. other, err := repo.AddImage([]byte("other"), "other", "desc", MISC_ASSET, "image/jpeg")
  15. require.NoError(t, err)
  16. before, err := repo.GetImage(id)
  17. require.NoError(t, err)
  18. require.NoError(t, repo.UpdateDigitalArt(id, "new", "new desc"))
  19. after, err := repo.GetImage(id)
  20. require.NoError(t, err)
  21. require.Equal(t, "new", after.Title)
  22. require.Equal(t, "new desc", after.Desc)
  23. require.Equal(t, before.Data, after.Data)
  24. require.Equal(t, before.Created, after.Created)
  25. require.Equal(t, before.MediaType, after.MediaType)
  26. require.Equal(t, before.Category, after.Category)
  27. require.ErrorIs(t, repo.UpdateDigitalArt(other, "bad", "bad"), ErrNotExists)
  28. otherAfter, err := repo.GetImage(other)
  29. require.NoError(t, err)
  30. require.Equal(t, "other", otherAfter.Title)
  31. require.Equal(t, "desc", otherAfter.Desc)
  32. require.ErrorIs(t, repo.UpdateDigitalArt("missing", "x", "y"), ErrNotExists)
  33. }
  34. func TestDigitalArtUpdateSafety(t *testing.T) {
  35. dir := t.TempDir()
  36. repo, db := newTestDb(dir, true)
  37. defer db.Close()
  38. id, err := repo.AddImage([]byte("preserve"), "art", "desc", DIGITAL_ART, "image/png")
  39. require.NoError(t, err)
  40. // A duplicate ID can share the same file, even across categories.
  41. _, err = db.Exec("INSERT INTO images (id,title,desc,created,category) VALUES (?, 'other', '', '', ?)", id, MISC_ASSET)
  42. require.NoError(t, err)
  43. require.ErrorIs(t, repo.UpdateDigitalArt(id, "bad", "bad"), ErrNotExists)
  44. data, err := os.ReadFile(filepath.Join(dir, string(id)))
  45. require.NoError(t, err)
  46. require.Equal(t, []byte("preserve"), data)
  47. var count int
  48. require.NoError(t, db.QueryRow("SELECT COUNT(*) FROM images WHERE id = ?", id).Scan(&count))
  49. require.Equal(t, 2, count)
  50. for _, bad := range []Identifier{"", ".", "..", "../outside", "nested/name", `..\outside`} {
  51. require.Error(t, repo.UpdateDigitalArt(bad, "x", "y"))
  52. }
  53. }
  54. func TestArchiveDigitalArtPreservesMedia(t *testing.T) {
  55. dir := t.TempDir()
  56. repo, db := newTestDb(dir, true)
  57. defer db.Close()
  58. id, err := repo.AddImage([]byte("image bytes"), "art", "description", DIGITAL_ART, "image/png")
  59. require.NoError(t, err)
  60. before, err := repo.GetImage(id)
  61. require.NoError(t, err)
  62. require.NoError(t, repo.ArchiveDigitalArt(id))
  63. after, err := repo.GetImage(id)
  64. require.NoError(t, err)
  65. before.Category = MISC_ASSET
  66. require.Equal(t, before, after)
  67. data, err := os.ReadFile(filepath.Join(dir, string(id)))
  68. require.NoError(t, err)
  69. require.Equal(t, []byte("image bytes"), data)
  70. art, err := repo.GetImagesByCategoryWithError(DIGITAL_ART)
  71. require.NoError(t, err)
  72. require.Empty(t, art)
  73. misc, err := repo.GetImagesByCategoryWithError(MISC_ASSET)
  74. require.NoError(t, err)
  75. require.Len(t, misc, 1)
  76. require.Equal(t, id, misc[0].Ident)
  77. require.ErrorIs(t, repo.ArchiveDigitalArt(id), ErrNotExists)
  78. require.ErrorIs(t, repo.ArchiveDigitalArt("missing"), ErrNotExists)
  79. }
  80. func TestArchiveDigitalArtSafety(t *testing.T) {
  81. dir := t.TempDir()
  82. repo, db := newTestDb(dir, true)
  83. defer db.Close()
  84. other, err := repo.AddImage([]byte("other"), "other", "desc", MISC_ASSET, "image/jpeg")
  85. require.NoError(t, err)
  86. require.ErrorIs(t, repo.ArchiveDigitalArt(other), ErrNotExists)
  87. id, err := repo.AddImage([]byte("preserve"), "art", "desc", DIGITAL_ART, "image/png")
  88. require.NoError(t, err)
  89. _, err = db.Exec("INSERT INTO images (id,title,desc,created,category) VALUES (?, 'other', '', '', ?)", id, MISC_ASSET)
  90. require.NoError(t, err)
  91. require.ErrorIs(t, repo.ArchiveDigitalArt(id), ErrNotExists)
  92. var artCount, total int
  93. require.NoError(t, db.QueryRow("SELECT COUNT(*), COUNT(CASE WHEN category = ? THEN 1 END) FROM images WHERE id = ?", DIGITAL_ART, id).Scan(&total, &artCount))
  94. require.Equal(t, 2, total)
  95. require.Equal(t, 1, artCount)
  96. data, err := os.ReadFile(filepath.Join(dir, string(id)))
  97. require.NoError(t, err)
  98. require.Equal(t, []byte("preserve"), data)
  99. for _, bad := range []Identifier{"", ".", "..", "../outside", "nested/name", `..\outside`} {
  100. require.Error(t, repo.ArchiveDigitalArt(bad))
  101. }
  102. }
  103. func TestArchiveDigitalArtDatabaseFailure(t *testing.T) {
  104. repo, db := newTestDb(t.TempDir(), true)
  105. require.NoError(t, db.Close())
  106. require.Error(t, repo.ArchiveDigitalArt("valid-id"))
  107. }