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 }