code.gitea.io/gitea@v1.22.3/modules/assetfs/layered_test.go (about)

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