You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

layered_test.go 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package assetfs
  4. import (
  5. "io"
  6. "io/fs"
  7. "os"
  8. "path/filepath"
  9. "testing"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. func TestLayered(t *testing.T) {
  13. dir := filepath.Join(t.TempDir(), "assetfs-layers")
  14. dir1 := filepath.Join(dir, "l1")
  15. dir2 := filepath.Join(dir, "l2")
  16. mkdir := func(elems ...string) {
  17. assert.NoError(t, os.MkdirAll(filepath.Join(elems...), 0o755))
  18. }
  19. write := func(content string, elems ...string) {
  20. assert.NoError(t, os.WriteFile(filepath.Join(elems...), []byte(content), 0o644))
  21. }
  22. // d1 & f1: only in "l1"; d2 & f2: only in "l2"
  23. // da & fa: in both "l1" and "l2"
  24. mkdir(dir1, "d1")
  25. mkdir(dir1, "da")
  26. mkdir(dir1, "da/sub1")
  27. mkdir(dir2, "d2")
  28. mkdir(dir2, "da")
  29. mkdir(dir2, "da/sub2")
  30. write("dummy", dir1, ".DS_Store")
  31. write("f1", dir1, "f1")
  32. write("fa-1", dir1, "fa")
  33. write("d1-f", dir1, "d1/f")
  34. write("da-f-1", dir1, "da/f")
  35. write("f2", dir2, "f2")
  36. write("fa-2", dir2, "fa")
  37. write("d2-f", dir2, "d2/f")
  38. write("da-f-2", dir2, "da/f")
  39. assets := Layered(Local("l1", dir1), Local("l2", dir2))
  40. f, err := assets.Open("f1")
  41. assert.NoError(t, err)
  42. bs, err := io.ReadAll(f)
  43. assert.NoError(t, err)
  44. assert.EqualValues(t, "f1", string(bs))
  45. _ = f.Close()
  46. assertRead := func(expected string, expectedErr error, elems ...string) {
  47. bs, err := assets.ReadFile(elems...)
  48. if err != nil {
  49. assert.ErrorAs(t, err, &expectedErr)
  50. } else {
  51. assert.NoError(t, err)
  52. assert.Equal(t, expected, string(bs))
  53. }
  54. }
  55. assertRead("f1", nil, "f1")
  56. assertRead("f2", nil, "f2")
  57. assertRead("fa-1", nil, "fa")
  58. assertRead("d1-f", nil, "d1/f")
  59. assertRead("d2-f", nil, "d2/f")
  60. assertRead("da-f-1", nil, "da/f")
  61. assertRead("", fs.ErrNotExist, "no-such")
  62. files, err := assets.ListFiles(".", true)
  63. assert.NoError(t, err)
  64. assert.EqualValues(t, []string{"f1", "f2", "fa"}, files)
  65. files, err = assets.ListFiles(".", false)
  66. assert.NoError(t, err)
  67. assert.EqualValues(t, []string{"d1", "d2", "da"}, files)
  68. files, err = assets.ListFiles(".")
  69. assert.NoError(t, err)
  70. assert.EqualValues(t, []string{"d1", "d2", "da", "f1", "f2", "fa"}, files)
  71. files, err = assets.ListAllFiles(".", true)
  72. assert.NoError(t, err)
  73. assert.EqualValues(t, []string{"d1/f", "d2/f", "da/f", "f1", "f2", "fa"}, files)
  74. files, err = assets.ListAllFiles(".", false)
  75. assert.NoError(t, err)
  76. assert.EqualValues(t, []string{"d1", "d2", "da", "da/sub1", "da/sub2"}, files)
  77. files, err = assets.ListAllFiles(".")
  78. assert.NoError(t, err)
  79. assert.EqualValues(t, []string{
  80. "d1", "d1/f",
  81. "d2", "d2/f",
  82. "da", "da/f", "da/sub1", "da/sub2",
  83. "f1", "f2", "fa",
  84. }, files)
  85. assert.Empty(t, assets.GetFileLayerName("no-such"))
  86. assert.EqualValues(t, "l1", assets.GetFileLayerName("f1"))
  87. assert.EqualValues(t, "l2", assets.GetFileLayerName("f2"))
  88. }