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
145 lines
5.0 KiB
Ruby
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
|