static_cache_test.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. //go:build unit
  2. package web
  3. import (
  4. "net/http"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func TestIsFingerprintedEmbeddedAssetPath(t *testing.T) {
  9. t.Parallel()
  10. cases := []struct {
  11. name string
  12. path string
  13. want bool
  14. }{
  15. {name: "fingerprinted_js", path: "assets/index-AbCd1234.js", want: true},
  16. {name: "fingerprinted_css", path: "assets/app-a1B2c3D4.css", want: true},
  17. {name: "fingerprinted_url_safe_hash", path: "assets/app-aB1-2_Cd.css", want: true},
  18. {name: "nested_fingerprinted_asset", path: "assets/vendor/chunk-AbCd1234.js", want: true},
  19. {name: "leading_slash_fingerprinted_asset", path: "/assets/index-AbCd1234.js", want: true},
  20. {name: "unhashed_asset", path: "assets/index.js", want: false},
  21. {name: "short_suffix", path: "assets/index-abc123.js", want: false},
  22. {name: "logo", path: "logo.png", want: false},
  23. {name: "favicon", path: "favicon.ico", want: false},
  24. {name: "fingerprint_outside_assets", path: "downloads/index-AbCd1234.js", want: false},
  25. {name: "index_html", path: "index.html", want: false},
  26. {name: "spa_route", path: "dashboard", want: false},
  27. {name: "assets_prefix_only", path: "assets", want: false},
  28. {name: "similar_name", path: "assets-backup/x.js", want: false},
  29. {name: "empty", path: "", want: false},
  30. }
  31. for _, tc := range cases {
  32. t.Run(tc.name, func(t *testing.T) {
  33. t.Parallel()
  34. assert.Equal(t, tc.want, isFingerprintedEmbeddedAssetPath(tc.path))
  35. })
  36. }
  37. }
  38. func TestApplyStaticAssetCacheHeaders(t *testing.T) {
  39. t.Parallel()
  40. t.Run("sets_immutable_cache_for_fingerprinted_asset", func(t *testing.T) {
  41. t.Parallel()
  42. header := make(http.Header)
  43. applyStaticAssetCacheHeaders(header, "assets/index-AbCd1234.js")
  44. assert.Equal(t, staticAssetsCacheControl, header.Get("Cache-Control"))
  45. })
  46. for _, path := range []string{"assets/index.js", "logo.png", "favicon.ico", "index.html"} {
  47. path := path
  48. t.Run("skips_"+path, func(t *testing.T) {
  49. t.Parallel()
  50. header := make(http.Header)
  51. applyStaticAssetCacheHeaders(header, path)
  52. assert.Empty(t, header.Get("Cache-Control"))
  53. })
  54. }
  55. t.Run("nil_header_is_noop", func(t *testing.T) {
  56. t.Parallel()
  57. assert.NotPanics(t, func() {
  58. applyStaticAssetCacheHeaders(nil, "assets/index-AbCd1234.js")
  59. })
  60. })
  61. }