185 lines
5.0 KiB
Ruby
185 lines
5.0 KiB
Ruby
require "test_helper"
|
|
|
|
class Admin::RequestsControllerTest < ActionDispatch::IntegrationTest
|
|
setup do
|
|
@admin = users(:admin_user)
|
|
@requested_entry = entries(:requested_entry)
|
|
@approved_entry = entries(:approved_entry)
|
|
login_as(@admin)
|
|
end
|
|
|
|
test "should require admin authentication" do
|
|
logout
|
|
get admin_requests_path
|
|
assert_redirected_to login_path
|
|
end
|
|
|
|
test "should show requests index" do
|
|
get admin_requests_path
|
|
|
|
assert_response :success
|
|
assert_select "h1", "Entry Requests"
|
|
assert_select "h2", /Pending Review/
|
|
assert_select "h2", /Approved/
|
|
end
|
|
|
|
test "should list requested entries" do
|
|
get admin_requests_path
|
|
|
|
assert_response :success
|
|
assert_select "td", text: @requested_entry.fi
|
|
assert_select "a[href=?]", admin_request_path(@requested_entry)
|
|
end
|
|
|
|
test "should list approved entries" do
|
|
get admin_requests_path
|
|
|
|
assert_response :success
|
|
assert_select "td", text: @approved_entry.fi
|
|
end
|
|
|
|
test "should show request details" do
|
|
get admin_request_path(@requested_entry)
|
|
|
|
assert_response :success
|
|
assert_select "h1", "Entry Request Details"
|
|
assert_select "div", text: @requested_entry.fi
|
|
assert_select "div", text: @requested_entry.en
|
|
assert_select "span", text: @requested_entry.requested_by.name
|
|
end
|
|
|
|
test "should show edit form for requested entry" do
|
|
get edit_admin_request_path(@requested_entry)
|
|
|
|
assert_response :success
|
|
assert_select "h1", "Edit Entry Request"
|
|
assert_select "form[action=?]", admin_request_path(@requested_entry)
|
|
assert_select "input[name='entry[fi]'][value=?]", @requested_entry.fi
|
|
end
|
|
|
|
test "should update entry details" do
|
|
patch admin_request_path(@requested_entry), params: {
|
|
entry: {
|
|
category: "phrase",
|
|
fi: "päivitetty sana",
|
|
en: "updated word",
|
|
notes: "Updated notes"
|
|
}
|
|
}
|
|
|
|
@requested_entry.reload
|
|
assert_equal "phrase", @requested_entry.category
|
|
assert_equal "päivitetty sana", @requested_entry.fi
|
|
assert_equal "updated word", @requested_entry.en
|
|
assert_equal "Updated notes", @requested_entry.notes
|
|
assert_redirected_to admin_request_path(@requested_entry)
|
|
assert_equal "Request updated successfully.", flash[:notice]
|
|
end
|
|
|
|
test "should not update with invalid data" do
|
|
patch admin_request_path(@requested_entry), params: {
|
|
entry: {
|
|
fi: "",
|
|
en: "",
|
|
sv: "",
|
|
no: "",
|
|
ru: "",
|
|
de: ""
|
|
}
|
|
}
|
|
|
|
assert_response :unprocessable_entity
|
|
@requested_entry.reload
|
|
assert_equal "testisana", @requested_entry.fi # Unchanged
|
|
end
|
|
|
|
test "should approve request and send invitation" do
|
|
user = @requested_entry.requested_by
|
|
assert_nil user.invitation_token
|
|
assert_nil user.invitation_sent_at
|
|
|
|
assert_enqueued_emails 1 do
|
|
post approve_admin_request_path(@requested_entry)
|
|
end
|
|
|
|
user.reload
|
|
@requested_entry.reload
|
|
|
|
assert_equal "approved", @requested_entry.status
|
|
assert_not_nil user.invitation_token
|
|
assert_not_nil user.invitation_sent_at
|
|
assert_equal @admin, user.invited_by
|
|
assert_redirected_to admin_requests_path
|
|
assert_match(/invitation sent/i, flash[:notice])
|
|
end
|
|
|
|
test "should not approve already approved entry" do
|
|
# Try to approve an already approved entry
|
|
user = @approved_entry.requested_by
|
|
|
|
post approve_admin_request_path(@approved_entry)
|
|
|
|
@approved_entry.reload
|
|
assert_equal "approved", @approved_entry.status
|
|
end
|
|
|
|
test "should reject request and delete entry and user" do
|
|
user = @requested_entry.requested_by
|
|
entry_id = @requested_entry.id
|
|
user_id = user.id
|
|
|
|
assert_difference("Entry.count", -1) do
|
|
assert_difference("User.count", -1) do
|
|
delete reject_admin_request_path(@requested_entry)
|
|
end
|
|
end
|
|
|
|
assert_not Entry.exists?(entry_id)
|
|
assert_not User.exists?(user_id)
|
|
assert_redirected_to admin_requests_path
|
|
assert_match(/rejected and deleted/i, flash[:notice])
|
|
end
|
|
|
|
test "should reject but not delete user with multiple entries" do
|
|
user = @requested_entry.requested_by
|
|
|
|
# Create another entry for the same user
|
|
another_entry = Entry.create!(
|
|
category: :word,
|
|
fi: "toinen sana",
|
|
en: "another word",
|
|
status: :requested,
|
|
requested_by: user
|
|
)
|
|
|
|
assert_difference("Entry.count", -1) do
|
|
assert_no_difference("User.count") do
|
|
delete reject_admin_request_path(@requested_entry)
|
|
end
|
|
end
|
|
|
|
assert User.exists?(user.id)
|
|
assert Entry.exists?(another_entry.id)
|
|
end
|
|
|
|
test "contributors should not access admin requests" do
|
|
logout
|
|
contributor = users(:contributor_user)
|
|
login_as(contributor)
|
|
|
|
get admin_requests_path
|
|
assert_redirected_to root_path
|
|
assert_match(/administrator/i, flash[:alert])
|
|
end
|
|
|
|
test "reviewers should not access admin requests" do
|
|
logout
|
|
reviewer = users(:reviewer_user)
|
|
login_as(reviewer)
|
|
|
|
get admin_requests_path
|
|
assert_redirected_to root_path
|
|
assert_match(/administrator/i, flash[:alert])
|
|
end
|
|
end
|