111 lines
3.2 KiB
Ruby
111 lines
3.2 KiB
Ruby
|
require 'test_helper'
|
||
|
require "mechanize"
|
||
|
require "nokogiri"
|
||
|
|
||
|
class AssetsAccessibilityTest < Minitest::Test
|
||
|
include WebserverHelper
|
||
|
|
||
|
def test_rss_feeds
|
||
|
on_home_page do |page, doc|
|
||
|
feeds = doc.search("//head/link[@type='application/rss+xml']")
|
||
|
|
||
|
# Il y a au moins 1 flux RSS
|
||
|
assert feeds.size >= 1, "Expected to find an RSS feed"
|
||
|
|
||
|
feeds.each do |feed|
|
||
|
url = feed["href"]
|
||
|
assert_status_ok agent.get(url), "for #{url}"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_head_stylelsheets
|
||
|
on_home_page do |page, doc|
|
||
|
stylesheets = doc.search("//head/link[@rel='stylesheet']")
|
||
|
|
||
|
# Il y a au moins 1 CSS "application"
|
||
|
assert stylesheets.any? { |stylesheet|
|
||
|
path = URI.parse(stylesheet["href"]).path
|
||
|
%r(\A/assets/application-\w+\.css\Z) =~ path
|
||
|
}, "Expected to find the application CSS"
|
||
|
|
||
|
# Tous les CSS sont accessibles et correctement configurés
|
||
|
stylesheets.each do |stylesheet|
|
||
|
url = stylesheet["href"]
|
||
|
if internal_url?(url)
|
||
|
assert_cachable_asset agent.get(url), "for #{url}"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_head_scripts
|
||
|
on_home_page do |page, doc|
|
||
|
scripts = doc.search("//head/script[@src]")
|
||
|
|
||
|
# Il y a au moins 1 JS "application"
|
||
|
assert scripts.any? { |script|
|
||
|
path = URI.parse(script["src"]).path
|
||
|
%r|\A/assets/application-\w+\.js\Z| =~ path
|
||
|
}, "Expected to find the application JS"
|
||
|
|
||
|
# Tous les scripts externes sont accessibles
|
||
|
scripts.each do |script|
|
||
|
url = script["src"]
|
||
|
if internal_url?(url)
|
||
|
assert_cachable_asset agent.get(url), "for #{url}"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_images
|
||
|
on_home_page do |page, doc|
|
||
|
doc.search("body img").each do |image|
|
||
|
url = image["src"]
|
||
|
if internal_url?(url)
|
||
|
assert_cachable_asset agent.get(url), "for #{url}"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_https_src
|
||
|
on_home_page do |page, doc|
|
||
|
doc.search("[src]").each do |element|
|
||
|
assert_scheme "https", element["src"], "on page #{page.uri}"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_cors
|
||
|
on_home_page do |page, doc|
|
||
|
stylesheets = doc.search("//head/link[@rel='stylesheet']")
|
||
|
|
||
|
# On récupère la feuille de style qui contient les appels aux polices web
|
||
|
vendor_stylesheet = stylesheets.detect { |stylesheet|
|
||
|
path = URI.parse(stylesheet["href"]).path
|
||
|
%r(\A/assets/vendor_bootstrap-\w+\.css\Z) =~ path
|
||
|
}
|
||
|
refute_nil vendor_stylesheet, "Expected to find a \"vendor_bootstrap\" CSS file"
|
||
|
|
||
|
# On extrait toutes les URL de polices web
|
||
|
css_url = vendor_stylesheet["href"]
|
||
|
pattern = /url\((?:"|')?([^\)"']+)(?:"|')?\)/
|
||
|
font_urls = agent.get(css_url).body.scan(pattern).flatten
|
||
|
|
||
|
refute font_urls.empty?, "Expected to find webfonts in #{css_url}"
|
||
|
|
||
|
# On vérifie que les en-têtes sont présents
|
||
|
origin = "https://www.example.com/"
|
||
|
font_urls.each do |font_url|
|
||
|
page = agent.get(font_url, [], nil, { "Origin" => origin })
|
||
|
actual = header(page, "access-control-allow-origin")
|
||
|
|
||
|
assert_equal origin, actual, "Expected CORS header to match the request origin for #{font_url}"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|