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  }