github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/pkg/assets/dynamic/dynamic_test.go (about)

     1  package dynamic
     2  
     3  import (
     4  	"context"
     5  	"crypto/sha256"
     6  	"encoding/hex"
     7  	"fmt"
     8  	"io"
     9  	"log"
    10  	"net/url"
    11  	"os"
    12  	"path/filepath"
    13  	"testing"
    14  
    15  	"github.com/cozy/cozy-stack/pkg/assets/model"
    16  	"github.com/cozy/cozy-stack/pkg/config/config"
    17  	"github.com/ncw/swift/v2/swifttest"
    18  
    19  	"github.com/spf13/viper"
    20  	"github.com/stretchr/testify/assert"
    21  	"github.com/stretchr/testify/require"
    22  )
    23  
    24  func TestDynamic(t *testing.T) {
    25  	if testing.Short() {
    26  		t.Skip("an instance is required for this test: test skipped due to the use of --short flag")
    27  	}
    28  
    29  	config.UseTestFile(t)
    30  	ctx := context.Background()
    31  
    32  	// We cannot use setup.SetupSwiftTest() here because testutils relies on
    33  	// stack.Start(), resulting in a circular import
    34  	// dynamic => testutils => stack => dynamic
    35  	swiftSrv, err := swifttest.NewSwiftServer("localhost")
    36  	require.NoError(t, err, "failed to create swift server")
    37  
    38  	viper.Set("swift.username", "swifttest")
    39  	viper.Set("swift.api_key", "swifttest")
    40  	viper.Set("swift.auth_url", swiftSrv.AuthURL)
    41  
    42  	swiftURL := url.URL{
    43  		Scheme:   "swift",
    44  		Host:     "localhost",
    45  		RawQuery: "UserName=swifttest&Password=swifttest&AuthURL=" + url.QueryEscape(swiftSrv.AuthURL),
    46  	}
    47  
    48  	require.NoError(t, config.InitSwiftConnection(config.Fs{URL: &swiftURL}), "Could not init swift connection")
    49  	require.NoError(t, config.GetSwiftConnection().ContainerCreate(ctx, DynamicAssetsContainerName, nil), "Could not create dynamic container")
    50  
    51  	require.NoError(t, InitDynamicAssetFS(swiftURL.String()), "Could not initialize dynamic FS")
    52  
    53  	t.Run("AddCustomAsset", func(t *testing.T) {
    54  		var err error
    55  
    56  		tmpfile, err := os.OpenFile(filepath.Join(os.TempDir(), "foo.js"), os.O_CREATE, 0600)
    57  		if err != nil {
    58  			t.Error(err)
    59  		}
    60  		defer tmpfile.Close()
    61  
    62  		h := sha256.New()
    63  		if _, err := io.Copy(h, tmpfile); err != nil {
    64  			log.Fatal(err)
    65  		}
    66  		sum := h.Sum(nil)
    67  
    68  		a := model.AssetOption{
    69  			Name:    "/foo.js",
    70  			Context: "bar",
    71  			URL:     fmt.Sprintf("file:%s", tmpfile.Name()),
    72  			Shasum:  hex.EncodeToString(sum),
    73  		}
    74  
    75  		err = registerCustomExternal(a)
    76  		assert.NoError(t, err)
    77  		asset, err := GetAsset("bar", "/foo.js")
    78  
    79  		assert.NoError(t, err)
    80  		assert.True(t, asset.IsCustom)
    81  		assert.Equal(t, asset.Shasum, a.Shasum)
    82  
    83  		content, err := assetFS.Get("bar", "/foo.js")
    84  		assert.NoError(t, err)
    85  		assert.Empty(t, content)
    86  	})
    87  
    88  	t.Run("RemoveCustomAsset", func(t *testing.T) {
    89  		// Cleaning if existing
    90  		asset := model.AssetOption{
    91  			Name:    "/foo2.js",
    92  			Context: "bar",
    93  		}
    94  
    95  		assetsList, err := ListAssets()
    96  		assert.NoError(t, err)
    97  
    98  		// Adding the asset
    99  		tmpfile, err := os.OpenFile(filepath.Join(os.TempDir(), "foo2.js"), os.O_CREATE, 0600)
   100  		assert.NoError(t, err)
   101  		asset.URL = fmt.Sprintf("file://%s", tmpfile.Name())
   102  
   103  		assets := []model.AssetOption{asset}
   104  
   105  		err = RegisterCustomExternals(assets, 1)
   106  		assert.NoError(t, err)
   107  
   108  		assert.NoError(t, err)
   109  		newAssetsList, err := ListAssets()
   110  		assert.NoError(t, err)
   111  		assert.Equal(t, len(newAssetsList["bar"]), len(assetsList["bar"])+1)
   112  
   113  		// Removing
   114  		err = RemoveAsset(asset.Context, asset.Name)
   115  		assert.NoError(t, err)
   116  		finalAssetsList, err := ListAssets()
   117  		assert.NoError(t, err)
   118  		assert.Equal(t, len(finalAssetsList["bar"]), len(assetsList["bar"]))
   119  	})
   120  }