Files
danbooru/test/components/post_preview_component_test.rb
evazion df0e9bc4a7 uploads: fix it being possible to upload .mkv files as .webm.
Fix it being possible to upload arbitrary .mkv files and have them
be treated as .webm. This was possible because WebM uses the Matroska
container format, and we only checked for the Matroska header, not that
the file was actually a WebM.

There were only 6 such files in production:

* https://danbooru.donmai.us/posts?tags=exif:Matroska:DocType=matroska
* https://danbooru.donmai.us/posts/5522036
* https://danbooru.donmai.us/posts/4743498
* https://danbooru.donmai.us/posts/3925427
* https://danbooru.donmai.us/posts/3147897
* https://danbooru.donmai.us/posts/2965862
* https://danbooru.donmai.us/posts/2430436

These videos are playable in Chrome, but not in Firefox, since Firefox
doesn't support .mkv files (it supports some, depending on which codecs
are used, but not .mkv files in general).
2022-10-25 19:32:31 -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: "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