test_css_files_building.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import pytest
  2. from ....cache.test import assert_invalidates_cache
  3. from ... import THEME_CACHE
  4. from ..css import change_css_source, get_theme_media_map, rebuild_css
  5. from ..tasks import build_single_theme_css, build_theme_css
  6. @pytest.fixture
  7. def assert_snapshot_match(snapshot, theme):
  8. def _assert_snapshot_match(result):
  9. result = result.replace(theme.dirname, "themedir")
  10. snapshot.assert_match(result)
  11. return _assert_snapshot_match
  12. @pytest.fixture
  13. def media_map(theme, image):
  14. return get_theme_media_map(theme)
  15. def test_tasks_builds_single_css_file(theme, image, css_needing_build):
  16. build_single_theme_css(css_needing_build.pk)
  17. css_needing_build.refresh_from_db()
  18. assert css_needing_build.build_file
  19. def test_tasks_skips_single_css_file_that_doesnt_require_build(theme, css):
  20. build_single_theme_css(css.pk)
  21. css.refresh_from_db()
  22. assert not css.build_file
  23. def test_tasks_handles_nonexisting_css_file(db):
  24. build_single_theme_css(1)
  25. def test_tasks_builds_theme_css_files_that_require_it(theme, image, css_needing_build):
  26. build_theme_css(theme.pk)
  27. css_needing_build.refresh_from_db()
  28. assert css_needing_build.build_file
  29. def test_tasks_skips_theme_css_files_that_dont_require_build(theme, css):
  30. build_theme_css(theme.pk)
  31. css.refresh_from_db()
  32. assert not css.build_file
  33. def test_tasks_handles_nonexisting_theme(nonexisting_theme):
  34. build_theme_css(nonexisting_theme.pk)
  35. def test_media_map_for_theme_without_any_media_files_returns_empty_dict(theme):
  36. assert get_theme_media_map(theme) == {}
  37. def test_media_map_for_theme_with_media_files_returns_dict_with_data(
  38. theme, image, media
  39. ):
  40. assert get_theme_media_map(theme)
  41. def test_css_file_is_build(media_map, css_needing_build):
  42. rebuild_css(media_map, css_needing_build)
  43. css_needing_build.refresh_from_db()
  44. assert css_needing_build.build_file
  45. def test_build_css_file_is_hashed(media_map, css_needing_build):
  46. rebuild_css(media_map, css_needing_build)
  47. css_needing_build.refresh_from_db()
  48. assert css_needing_build.build_hash
  49. def test_build_css_file_includes_hash_in_filename(media_map, css_needing_build):
  50. rebuild_css(media_map, css_needing_build)
  51. css_needing_build.refresh_from_db()
  52. assert css_needing_build.build_hash in str(css_needing_build.build_file)
  53. def test_build_css_file_has_size_set(media_map, css_needing_build):
  54. rebuild_css(media_map, css_needing_build)
  55. css_needing_build.refresh_from_db()
  56. assert css_needing_build.size
  57. def test_simple_url_to_file_is_replaced_with_valid_url(
  58. assert_snapshot_match, media_map, image
  59. ):
  60. css = ".page-header { background-image: url(%s); }" % image.name
  61. result = change_css_source(media_map, css)
  62. assert_snapshot_match(result)
  63. def test_relative_url_to_file_is_replaced_with_valid_url(
  64. assert_snapshot_match, media_map, image
  65. ):
  66. css = ".page-header { background-image: url(./%s); }" % image.name
  67. result = change_css_source(media_map, css)
  68. assert_snapshot_match(result)
  69. def test_url_to_file_from_create_react_app_is_replaced_with_valid_url(
  70. assert_snapshot_match, media_map, image
  71. ):
  72. hashed_name = str(image.file).split("/")[-1]
  73. css = ".page-header { background-image: url(/static/media/%s); }" % hashed_name
  74. result = change_css_source(media_map, css)
  75. assert_snapshot_match(result)
  76. def test_quoted_url_to_file_is_replaced_with_valid_url(
  77. assert_snapshot_match, media_map, image
  78. ):
  79. css = '.page-header { background-image: url("%s"); }' % image.name
  80. result = change_css_source(media_map, css)
  81. assert_snapshot_match(result)
  82. def test_single_quoted_url_to_file_is_replaced_with_valid_url(
  83. assert_snapshot_match, media_map, image
  84. ):
  85. css = ".page-header { background-image: url('%s'); }" % image.name
  86. result = change_css_source(media_map, css)
  87. assert_snapshot_match(result)
  88. def test_absolute_https_url_to_file_is_not_replaced(media_map):
  89. css = ".page-header { background-image: url(https://cdn.example.com/bg.png); }"
  90. result = change_css_source(media_map, css)
  91. assert result == css
  92. def test_absolute_http_url_to_file_is_not_replaced(media_map):
  93. css = ".page-header { background-image: url(http://cdn.example.com/bg.png); }"
  94. result = change_css_source(media_map, css)
  95. assert result == css
  96. def test_absolute_protocol_relative_url_to_file_is_not_replaced(media_map):
  97. css = ".page-header { background-image: url(://cdn.example.com/bg.png); }"
  98. result = change_css_source(media_map, css)
  99. assert result == css
  100. def test_css_file_with_multiple_different_urls_is_correctly_replaced(
  101. assert_snapshot_match, media_map, image
  102. ):
  103. css = (
  104. ".page-header { background-image: url(http://cdn.example.com/bg.png); }"
  105. '\n.container { background-image: url("%s"); }'
  106. '\n.alert { background-image: url("%s"); }'
  107. ) % (image.name, str(image.file).strip("/")[-1])
  108. result = change_css_source(media_map, css)
  109. assert_snapshot_match(result)
  110. def test_building_single_theme_css_invalidates_theme_cache(
  111. theme, image, css_needing_build
  112. ):
  113. with assert_invalidates_cache(THEME_CACHE):
  114. build_single_theme_css(css_needing_build.pk)
  115. def test_building_theme_css_invalidates_theme_cache(theme):
  116. with assert_invalidates_cache(THEME_CACHE):
  117. build_theme_css(theme.pk)