Files
danbooru/test/components/post_preview_component_test.rb
evazion a9d586e93a Fix #3615: Unsupported video codecs.
Don't allow uploading videos with unsupported video codecs.

The only video codecs we allow for MP4 files are H.264 and VP9. Other
codecs, including H.265 (aka HEVC), MPEG-4 part 2, and AV1, are
disallowed because they're not universally supported by browsers.
Firefox doesn't support H.265 or MPEG-4 part 2, and Safari doesn't
support AV1.

Additionally, don't allow videos with multiple video tracks, multiple
audio tracks, or no video tracks. Multiple video and audio tracks are
disallowed because they're rare and for moderation purposes, we don't
want people hiding content in extra tracks.

These restrictions really only apply to MP4 videos, since WebM files
don't support multiple video or audio tracks and only support a limited
number of codecs (VP8 and VP9 for videos, Vorbis and Opus for audio).

There are currently 22 posts with unsupported video codecs:

* https://danbooru.donmai.us/posts?tags=video+is:mp4+-exif:Track1:CompressorID=avc1+-exif:Track2:CompressorID=avc1+-exif:Track1:CompressorID=vp09+-exif:Track2:CompressorID=vp09 # AVC1 is H.264

There is one post that has multiple audio tracks:

* https://danbooru.donmai.us/posts/2382057
2022-10-27 01:43:33 -05:00

145 lines
5.0 KiB
Ruby

require "test_helper"
class PostPreviewComponentTest < ViewComponent::TestCase
include Rails.application.routes.url_helpers
def render_preview(post, **options)
render_inline(PostPreviewComponent.new(post: post, **options))
end
context "The PostPreviewComponent" do
context "for a post visible to the current user" do
should "render" do
@post = create(:post)
node = render_preview(@post, current_user: User.anonymous)
assert_equal(post_path(@post), node.css("article a").attr("href").value)
assert_equal(@post.media_asset.variant("180x180").file_url, node.css("article img").attr("src").value)
end
end
context "for a video post" do
should "render" do
@post = create(:post_with_file, filename: "webm/test-512x512.webm").reload
node = render_preview(@post, current_user: User.anonymous)
assert_equal(post_path(@post), node.css("article a").attr("href").value)
assert_equal(@post.media_asset.variant("180x180").file_url, node.css("article img").attr("src").value)
assert_equal("0:01", node.css("article .post-duration").text.strip)
end
end
context "for a video post with sound" do
should "render" do
@post = create(:post_with_file, tag_string: "sound", filename: "mp4/test-audio.mp4").reload
node = render_preview(@post, current_user: User.anonymous)
assert_equal(post_path(@post), node.css("article a").attr("href").value)
assert_equal(@post.media_asset.variant("180x180").file_url, node.css("article img").attr("src").value)
assert(node.css("article .sound-icon").present?)
end
end
context "for a post with restricted tags" do
setup do
@post = create(:post, tag_string: "touhou")
end
should "should be visible to Gold users" do
@post.stubs(:levelblocked?).returns(false)
node = render_preview(@post, current_user: create(:gold_user))
assert_equal(post_path(@post), node.css("article a").attr("href").value)
assert_equal(@post.media_asset.variant("180x180").file_url, node.css("article img").attr("src").value)
end
should "not be visible to Members" do
@post.stubs(:levelblocked?).returns(true)
node = render_preview(@post, current_user: create(:user))
assert_equal("", node.to_s)
end
end
context "for a banned post" do
setup do
@post = create(:post, is_banned: true)
end
should "should only be visible to approvers" do
node = render_preview(@post, current_user: create(:approver))
assert_equal(post_path(@post), node.css("article a").attr("href").value)
assert_equal(@post.media_asset.variant("180x180").file_url, node.css("article img").attr("src").value)
end
should "should be not visible to Gold users" do
node = render_preview(@post, current_user: create(:gold_user))
assert_equal("", node.to_s)
end
should "not be visible to Members" do
node = render_preview(@post, current_user: create(:user))
assert_equal("", node.to_s)
end
end
context "for a banned paid reward" do
setup do
@post = create(:post, tag_string: "paid_reward", is_banned: true)
end
should "should be visible to Approver users" do
node = render_preview(@post, current_user: create(:approver))
assert_equal(post_path(@post), node.css("article a").attr("href").value)
assert_equal(@post.media_asset.variant("180x180").file_url, node.css("article img").attr("src").value)
end
should "not be visible to Gold users" do
node = render_preview(@post, current_user: create(:gold_user))
assert_equal("", node.to_s)
end
end
context "for a non-safe post" do
setup do
@post = create(:post, rating: "q")
end
should "should be visible to users with safe mode off" do
node = render_preview(@post, current_user: User.anonymous)
assert_equal(post_path(@post), node.css("article a").attr("href").value)
assert_equal(@post.media_asset.variant("180x180").file_url, node.css("article img").attr("src").value)
end
should "not be visible to users with safe mode on" do
CurrentUser.stubs(:safe_mode?).returns(true)
node = render_preview(@post, current_user: User.anonymous)
assert_equal("", node.to_s)
end
end
context "for a deleted post" do
setup do
@post = create(:post, is_deleted: true)
end
should "should be visible when the show_deleted flag is set" do
node = render_preview(@post, current_user: User.anonymous, show_deleted: true)
assert_equal(post_path(@post), node.css("article a").attr("href").value)
assert_equal(@post.media_asset.variant("180x180").file_url, node.css("article img").attr("src").value)
end
should "not be visible to users normally" do
node = render_preview(@post, current_user: User.anonymous)
assert_equal("", node.to_s)
end
end
end
end