Files
danbooru/test/functional/wiki_pages_controller_test.rb
evazion 90be15e0b5 Fix #4973: Wiki pages json index returns 404.
Fix regression introduced in 0db20e0ca. Setting `format: false` on the
wiki pages resource disabled format negotiation on all wiki page routes,
not just the show page, which meant /wiki_pages.json no longer worked.

The fix to monkey patch the internal Rails method that parses the file
extension from the URL, and have it ignore everything but the .html,
.json, .js, and .xml extensions. This is really hacky and may break in
future Rails releases.
2022-01-22 16:52:20 -06:00

316 lines
10 KiB
Ruby

require 'test_helper'
class WikiPagesControllerTest < ActionDispatch::IntegrationTest
context "The wiki pages controller" do
setup do
@user = create(:user)
@mod = create(:moderator_user)
end
context "index action" do
setup do
as(@user) do
@tagme = create(:wiki_page, title: "tagme")
@deleted = create(:wiki_page, title: "deleted", is_deleted: true)
@vocaloid = create(:wiki_page, title: "vocaloid")
@miku = create(:wiki_page, title: "hatsune_miku", other_names: ["初音ミク"], body: "miku is a [[vocaloid]]")
@picasso = create(:wiki_page, title: "picasso")
create(:artist, name: "picasso", is_banned: true)
create(:character_tag, name: "hatsune_miku")
end
end
should "render" do
get wiki_pages_path
assert_response :success
end
should "render for a sitemap" do
get wiki_pages_path(format: :sitemap)
assert_response :success
assert_equal(WikiPage.count, response.parsed_body.css("urlset url loc").size)
end
should "render for a JSON response" do
get wiki_pages_path(format: :json)
assert_response :success
assert_equal("application/json", response.media_type)
end
should "redirect the legacy title param to the show page" do
get wiki_pages_path(title: "tagme")
assert_redirected_to wiki_pages_path(search: { title_normalize: "tagme" }, redirect: true)
end
should respond_to_search({}).with { [@picasso, @miku, @vocaloid, @deleted, @tagme] }
should respond_to_search(title: "tagme").with { @tagme }
should respond_to_search(title: "tagme", order: "post_count").with { @tagme }
should respond_to_search(title_normalize: "TAGME ").with { @tagme }
should respond_to_search(hide_deleted: "true").with { [@picasso, @miku, @vocaloid, @tagme] }
should respond_to_search(linked_to: "vocaloid").with { @miku }
should respond_to_search(not_linked_to: "vocaloid").with { [@picasso, @vocaloid, @deleted, @tagme] }
should respond_to_search(other_names_match: "初音ミク").with { @miku }
should respond_to_search(other_names_match: "初*").with { @miku }
should respond_to_search(other_names_present: "true").with { @miku }
should respond_to_search(other_names_present: "false").with { [@picasso, @vocaloid, @deleted, @tagme] }
context "using includes" do
should respond_to_search(has_tag: "true").with { @miku }
should respond_to_search(tag: { category: Tag.categories.character }).with { @miku }
should respond_to_search(has_dtext_links: "true").with { @miku }
should respond_to_search(has_artist: "true").with { @picasso }
should respond_to_search(artist: {is_banned: "true"}).with { @picasso }
end
end
context "search action" do
should "work" do
get search_wiki_pages_path
assert_response :success
end
end
context "show action" do
setup do
@wiki_page = as(@user) { create(:wiki_page) }
end
should "redirect to the title for an id" do
get wiki_page_path(@wiki_page.id)
assert_redirected_to wiki_page_path(@wiki_page.title)
get wiki_page_path(@wiki_page.id), as: :json
assert_response :success
end
should "distinguish between an id and a title" do
as(@user) { @wiki_page.update(title: "2019") }
get wiki_page_path("~2019")
assert_response :success
get wiki_page_path(@wiki_page.id)
assert_redirected_to wiki_page_path("~2019")
get wiki_page_path("2019")
assert_response 404
end
should "render for a title" do
get wiki_page_path(@wiki_page.title)
assert_response :success
end
should "show the 'does not exist' page for a nonexistent title" do
get wiki_page_path("what")
assert_response 404
assert_select "#wiki-page-body", text: /This wiki page does not exist/
end
should "return 404 to api requests for a nonexistent title" do
get wiki_page_path("what"), as: :json
assert_response 404
end
should "work for a title containing dots" do
as(@user) { create(:wiki_page, title: "...") }
get wiki_page_path("...")
assert_response :success
get wiki_page_path("....json")
assert_response :success
get wiki_page_path("....xml")
assert_response :success
end
should "work for a title containing a file extension" do
as(@user) { create(:wiki_page, title: "rnd.jpg") }
as(@user) { create(:wiki_page, title: "touhou") }
get wiki_page_path("rnd.jpg")
assert_response :success
assert_equal("text/html", response.media_type)
get wiki_page_path("rnd.jpg.json")
assert_response :success
assert_equal("application/json", response.media_type)
get wiki_page_path("rnd.jpg.xml")
assert_response :success
assert_equal("application/xml", response.media_type)
get wiki_page_path("rnd.jpg.html")
assert_response :success
assert_equal("text/html", response.media_type)
get wiki_page_path("rnd.jpg", format: "json")
assert_response :success
assert_equal("application/json", response.media_type)
get wiki_page_path("touhou.json")
assert_response :success
assert_equal("application/json", response.media_type)
end
should "mark banned artists as noindex" do
@artist = create(:artist, name: @wiki_page.title, is_banned: true)
get wiki_page_path(@wiki_page.title)
assert_response :success
assert_select "meta[name=robots][content=noindex]"
end
end
context "show_or_new action" do
setup do
@wiki_page = as(@user) { create(:wiki_page) }
end
should "redirect when given a title" do
get show_or_new_wiki_pages_path, params: { title: @wiki_page.title }
assert_redirected_to(@wiki_page)
end
should "redirect when given a nonexistent title" do
get show_or_new_wiki_pages_path, params: { title: "what" }
assert_redirected_to wiki_page_path("what")
end
should "redirect when given a blank title" do
get show_or_new_wiki_pages_path
assert_redirected_to new_wiki_page_path
end
end
context "new action" do
should "render" do
get_auth new_wiki_page_path, @mod, params: { wiki_page: { title: "test" }}
assert_response :success
end
should "render without a title" do
get_auth new_wiki_page_path, @mod
assert_response :success
end
end
context "edit action" do
should "render" do
@wiki_page = as(@user) { create(:wiki_page) }
get_auth edit_wiki_page_path(@wiki_page), @user
assert_response :success
end
end
context "create action" do
should "create a wiki_page" do
assert_difference("WikiPage.count", 1) do
post_auth wiki_pages_path, @user, params: {:wiki_page => {:title => "abc", :body => "abc"}}
assert_redirected_to(wiki_page_path(WikiPage.last))
end
end
end
context "update action" do
setup do
as(@user) do
@tag = create(:tag, name: "foo", post_count: 42)
@wiki_page = create(:wiki_page, title: "foo")
@builder = create(:builder_user)
end
end
should "update a wiki_page" do
put_auth wiki_page_path(@wiki_page), @user, params: {:wiki_page => {:body => "xyz"}}
assert_redirected_to wiki_page_path(@wiki_page)
assert_equal("xyz", @wiki_page.reload.body)
end
should "not allow members to edit locked wiki pages" do
as(@user) { @wiki_page.update!(is_locked: true) }
put_auth wiki_page_path(@wiki_page), @user, params: { wiki_page: { body: "xyz" }}
assert_response 403
assert_not_equal("xyz", @wiki_page.reload.body)
end
should "allow builders to edit locked wiki pages" do
as(@builder) { @wiki_page.update!(is_locked: true) }
put_auth wiki_page_path(@wiki_page), @builder, params: { wiki_page: { body: "xyz" }}
assert_redirected_to wiki_page_path(@wiki_page)
assert_equal("xyz", @wiki_page.reload.body)
end
should "not allow members to edit the is_locked flag" do
put_auth wiki_page_path(@wiki_page), @user, params: { wiki_page: { is_locked: true }}
assert_response 403
assert_equal(false, @wiki_page.reload.is_locked)
end
should "allow builders to edit the is_locked flag" do
put_auth wiki_page_path(@wiki_page), @builder, params: { wiki_page: { is_locked: true }}
assert_redirected_to wiki_page_path(@wiki_page)
assert_equal(true, @wiki_page.reload.is_locked)
end
should "warn about renaming a wiki page with a non-empty tag" do
put_auth wiki_page_path(@wiki_page), @mod, params: { wiki_page: { title: "bar" }}
assert_match(/still has 42 posts/, flash[:notice])
end
end
context "destroy action" do
setup do
@wiki_page = as(@user) { create(:wiki_page) }
@mod = create(:mod_user)
end
should "destroy a wiki_page" do
delete_auth wiki_page_path(@wiki_page), @mod
@wiki_page.reload
assert_equal(true, @wiki_page.is_deleted?)
end
end
context "revert action" do
setup do
as(@user) do
@wiki_page = create(:wiki_page, body: "1")
travel(1.day)
@wiki_page.update(body: "1 2")
travel(2.days)
@wiki_page.update(body: "1 2 3")
end
end
should "revert to a previous version" do
version = @wiki_page.versions.first
assert_equal("1", version.body)
put_auth revert_wiki_page_path(@wiki_page), @user, params: {:version_id => version.id}
@wiki_page.reload
assert_equal("1", @wiki_page.body)
end
should "not allow reverting to a previous version of another wiki page" do
@wiki_page_2 = as(@user) { create(:wiki_page) }
put_auth revert_wiki_page_path(@wiki_page), @user, params: { :version_id => @wiki_page_2.versions.first.id }
@wiki_page.reload
assert_not_equal(@wiki_page.body, @wiki_page_2.body)
assert_response :missing
end
end
end
end