github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/asset/asset_test.go (about) 1 package asset 2 3 import ( 4 "errors" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "testing" 9 10 "github.com/ngocphuongnb/tetua/app/config" 11 "github.com/ngocphuongnb/tetua/app/test" 12 "github.com/ngocphuongnb/tetua/app/utils" 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func checkBundledAssets() { 17 if _, err := os.Stat("./bundled.js.go"); errors.Is(err, os.ErrNotExist) { 18 panic(err) 19 } 20 if _, err := os.Stat("./bundled.css.go"); errors.Is(err, os.ErrNotExist) { 21 panic(err) 22 } 23 if _, err := os.Stat("./bundled.other.go"); errors.Is(err, os.ErrNotExist) { 24 panic(err) 25 } 26 } 27 28 func TestLoadWithBundledAssets(t *testing.T) { 29 checkBundledAssets() 30 themeDir := "../themes/default" 31 Load(themeDir, true) 32 33 assert.Equal(t, true, themeAssetsBundled) 34 assert.Equal(t, 14, len(bundledAssets)) 35 assert.Equal(t, len(assets), len(bundledAssets)) 36 } 37 38 func TestLoadWithoutBundledAssets(t *testing.T) { 39 checkBundledAssets() 40 themeDir := "../themes/default" 41 config.DEVELOPMENT = false 42 themeAssetsBundled = false 43 assets = []*StaticAsset{} 44 Load(themeDir, true) 45 assert.Equal(t, true, true) 46 } 47 48 func TestCssFileLink(t *testing.T) { 49 checkBundledAssets() 50 themeDir := "../themes/default" 51 config.DEVELOPMENT = true 52 Load(themeDir, true) 53 assert.Equal(t, "<link rel=\"stylesheet\" href=\"/assets/css/style.css\" />", CssFile("css/style.css")) 54 } 55 56 func TestCssFileInline(t *testing.T) { 57 checkBundledAssets() 58 themeDir := "../themes/default" 59 config.DEVELOPMENT = false 60 assetName := "css/inline-file.css" 61 62 bundledAssets = append(bundledAssets, &StaticAsset{Name: assetName, Content: "body{color:red}", Type: "css"}) 63 Load(themeDir, true) 64 styleFile := getStaticFile(assetName, "css") 65 assert.Equal(t, fmt.Sprintf(`<style type="text/css" data-file="%s">%s</style>`, assetName, styleFile.Content), CssFile(assetName)) 66 67 bundledAssets = utils.SliceFilter(bundledAssets, func(asset *StaticAsset) bool { 68 return asset.Name != assetName 69 }) 70 } 71 72 func TestJsFileLink(t *testing.T) { 73 checkBundledAssets() 74 themeDir := "../themes/default" 75 config.DEVELOPMENT = true 76 Load(themeDir, true) 77 assert.Equal(t, "<script charset=\"utf-8\" src=\"/assets/js/main.js\"></script>", JsFile("js/main.js")) 78 } 79 80 func TestJsFileInline(t *testing.T) { 81 checkBundledAssets() 82 themeDir := "../themes/default" 83 config.DEVELOPMENT = false 84 assetName := "js/main.js" 85 Load(themeDir, true) 86 jsFile := getStaticFile(assetName, "js") 87 assert.Equal(t, fmt.Sprintf(`<script charset="utf-8" data-file="%s">%s</script>`, assetName, jsFile.Content), JsFile(assetName)) 88 } 89 90 func TestOtherFileLink(t *testing.T) { 91 checkBundledAssets() 92 themeDir := "../themes/default" 93 config.DEVELOPMENT = true 94 Load(themeDir, true) 95 assert.Equal(t, utils.Url("/assets/images/sample-image-file.png"), OtherFile("images/sample-image-file.png")) 96 } 97 98 func TestPanicInvalidThemeDir(t *testing.T) { 99 defer test.RecoverPanic(t, "open ../themes/notfound/theme.json: no such file or directory", "theme error") 100 themeDir := "../themes/notfound" 101 Load(themeDir, true) 102 } 103 104 func TestAssetFileNotFound(t *testing.T) { 105 themeDir := "../themes/default" 106 Load(themeDir, true) 107 file := getStaticFile("css/notfound.css", "css") 108 assert.Equal(t, "", file.Name) 109 } 110 111 func TestAssetFunctions(t *testing.T) { 112 themeDir := "../themes/default" 113 Load(themeDir, true) 114 AppendAsset(&StaticAsset{Name: "css/style.css", Content: "", Type: "css"}) 115 assert.Equal(t, 14, len(assets)) 116 117 AppendAsset(&StaticAsset{Name: "css/style1.css", Content: "", Type: "css"}) 118 assert.Equal(t, 15, len(All())) 119 assert.Equal(t, "", decodeBase64("invalid base64 string")) 120 121 bundledAssets = append(bundledAssets, &StaticAsset{Name: "css/append_file.css", Content: "", Type: "css"}) 122 Load(themeDir, true) 123 assert.Equal(t, len(bundledAssets), len(assets)) 124 125 themeAssetsBundled = true 126 config.DEVELOPMENT = false 127 assets = []*StaticAsset{} 128 bundledAssets = []*StaticAsset{} 129 Load(themeDir, false) 130 assert.Equal(t, 0, len(assets)) 131 } 132 133 func TestPanicInvalidThemeFile(t *testing.T) { 134 defer test.RecoverPanic(t, "unexpected end of JSON input", "theme error") 135 themeDir, err := ioutil.TempDir("../../private/tmp", "theme-") 136 137 if err != nil { 138 panic(err) 139 } 140 141 defer os.RemoveAll(themeDir) 142 143 themeConfig := `` 144 145 if err := os.WriteFile(themeDir+"/theme.json", []byte(themeConfig), 0644); err != nil { 146 panic(err) 147 } 148 149 Load(themeDir, true) 150 } 151 152 func TestAssets(t *testing.T) { 153 defer test.RecoverPanic(t, "syntax error in pattern", "theme error") 154 themeDir, err := ioutil.TempDir("../../private/tmp", "theme-") 155 156 if err != nil { 157 panic(err) 158 } 159 160 defer os.RemoveAll(themeDir) 161 162 themeConfig := `{ 163 "asset": { 164 "dir": "[-]", 165 "disable_inline": [ 166 "js/highlight-11.5.0.min.js" 167 ], 168 "disable_minify": [ 169 "js/highlight-11.5.0.min.js" 170 ] 171 } 172 } 173 ` 174 175 if err := os.WriteFile(themeDir+"/theme.json", []byte(themeConfig), 0644); err != nil { 176 panic(err) 177 } 178 179 Load(themeDir, true) 180 }