96.99% test coverage
This commit is contained in:
@@ -0,0 +1,299 @@
|
||||
require "application_system_test_case"
|
||||
|
||||
class AdminWorkflowTest < ApplicationSystemTestCase
|
||||
setup do
|
||||
@admin = users(:admin_user)
|
||||
@admin.update!(invitation_accepted_at: Time.current)
|
||||
end
|
||||
|
||||
test "admin can access dashboard" do
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_root_path
|
||||
|
||||
assert_text "Dashboard"
|
||||
assert_text "Total Users"
|
||||
assert_text "Total Entries"
|
||||
end
|
||||
|
||||
test "admin sees admin button in header" do
|
||||
login_as(@admin)
|
||||
visit root_path
|
||||
|
||||
within "header" do
|
||||
assert_link "Admin"
|
||||
end
|
||||
end
|
||||
|
||||
test "admin can send invitation" do
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_invitations_path
|
||||
click_link "Send New Invitation"
|
||||
|
||||
assert_current_path new_admin_invitation_path
|
||||
|
||||
fill_in "Name", with: "New User"
|
||||
fill_in "Email", with: "newuser@example.com"
|
||||
select "Contributor", from: "Role"
|
||||
|
||||
click_button "Send Invitation"
|
||||
|
||||
assert_current_path admin_invitations_path
|
||||
assert_text "Invitation sent"
|
||||
assert_text "newuser@example.com"
|
||||
end
|
||||
|
||||
test "admin can view users list" do
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_users_path
|
||||
|
||||
assert_text "Users"
|
||||
assert_selector "table"
|
||||
assert_text @admin.email
|
||||
end
|
||||
|
||||
test "admin can edit user role" do
|
||||
user = users(:contributor_user)
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_users_path
|
||||
within "#user_#{user.id}" do
|
||||
click_link "Edit"
|
||||
end
|
||||
|
||||
assert_current_path edit_admin_user_path(user)
|
||||
|
||||
select "Reviewer", from: "Role"
|
||||
click_button "Update User"
|
||||
|
||||
assert_current_path admin_users_path
|
||||
assert_text "User updated"
|
||||
|
||||
user.reload
|
||||
assert_equal "reviewer", user.role
|
||||
end
|
||||
|
||||
test "admin can delete user" do
|
||||
user = users(:contributor_user)
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_users_path
|
||||
|
||||
within "#user_#{user.id}" do
|
||||
click_button "Delete"
|
||||
end
|
||||
|
||||
assert_current_path admin_users_path
|
||||
assert_text "User deleted"
|
||||
assert_no_text user.email
|
||||
end
|
||||
|
||||
test "admin can view entry requests" do
|
||||
requested_entry = Entry.create!(
|
||||
fi: "Requested Entry",
|
||||
category: :word,
|
||||
status: :requested,
|
||||
requested_by: users(:contributor_user)
|
||||
)
|
||||
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_requests_path
|
||||
|
||||
assert_text "Requested Entry"
|
||||
assert_link "View"
|
||||
assert_link "Edit"
|
||||
assert_button "Approve"
|
||||
end
|
||||
|
||||
test "admin can approve entry request" do
|
||||
requester = users(:contributor_user)
|
||||
requested_entry = Entry.create!(
|
||||
fi: "Requested Entry",
|
||||
category: :word,
|
||||
status: :requested,
|
||||
requested_by: requester
|
||||
)
|
||||
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_requests_path
|
||||
|
||||
within "#entry_#{requested_entry.id}" do
|
||||
click_button "Approve"
|
||||
end
|
||||
|
||||
assert_current_path admin_requests_path
|
||||
assert_text "approved"
|
||||
|
||||
requested_entry.reload
|
||||
assert_equal "approved", requested_entry.status
|
||||
end
|
||||
|
||||
test "admin can edit entry request before approval" do
|
||||
requested_entry = Entry.create!(
|
||||
fi: "Requested Entry",
|
||||
category: :word,
|
||||
status: :requested,
|
||||
requested_by: users(:contributor_user)
|
||||
)
|
||||
|
||||
login_as(@admin)
|
||||
|
||||
visit edit_admin_request_path(requested_entry)
|
||||
|
||||
fill_in "Finnish", with: "Edited Finnish"
|
||||
fill_in "English", with: "Added English"
|
||||
click_button "Save Changes"
|
||||
|
||||
assert_current_path admin_requests_path
|
||||
requested_entry.reload
|
||||
assert_equal "Edited Finnish", requested_entry.fi
|
||||
assert_equal "Added English", requested_entry.en
|
||||
end
|
||||
|
||||
test "admin can reject entry request" do
|
||||
requested_entry = Entry.create!(
|
||||
fi: "Requested Entry",
|
||||
category: :word,
|
||||
status: :requested,
|
||||
requested_by: users(:contributor_user)
|
||||
)
|
||||
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_requests_path
|
||||
|
||||
within "#entry_#{requested_entry.id}" do
|
||||
click_button "Reject"
|
||||
end
|
||||
|
||||
assert_current_path admin_requests_path
|
||||
assert_text "rejected"
|
||||
assert_nil Entry.find_by(id: requested_entry.id)
|
||||
end
|
||||
|
||||
test "admin can resend invitation" do
|
||||
pending_user = users(:pending_invitation)
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_invitations_path
|
||||
|
||||
within "#invitation_#{pending_user.id}" do
|
||||
click_button "Resend"
|
||||
end
|
||||
|
||||
assert_current_path admin_invitations_path
|
||||
assert_text "Invitation resent"
|
||||
end
|
||||
|
||||
test "admin can cancel invitation" do
|
||||
pending_user = users(:pending_invitation)
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_invitations_path
|
||||
|
||||
within "#invitation_#{pending_user.id}" do
|
||||
click_button "Cancel"
|
||||
end
|
||||
|
||||
assert_current_path admin_invitations_path
|
||||
assert_text "deleted"
|
||||
assert_nil User.find_by(id: pending_user.id)
|
||||
end
|
||||
|
||||
test "admin sees request count badge" do
|
||||
Entry.create!(
|
||||
fi: "Requested Entry 1",
|
||||
category: :word,
|
||||
status: :requested,
|
||||
requested_by: users(:contributor_user)
|
||||
)
|
||||
Entry.create!(
|
||||
fi: "Requested Entry 2",
|
||||
category: :word,
|
||||
status: :requested,
|
||||
requested_by: users(:contributor_user)
|
||||
)
|
||||
|
||||
login_as(@admin)
|
||||
visit admin_root_path
|
||||
|
||||
within "header" do
|
||||
assert_text "2"
|
||||
end
|
||||
end
|
||||
|
||||
test "admin navigation is responsive" do
|
||||
login_as(@admin)
|
||||
visit admin_root_path
|
||||
|
||||
# Test mobile menu if visible
|
||||
if page.has_selector?("#admin-mobile-menu-button", visible: true)
|
||||
click_button id: "admin-mobile-menu-button"
|
||||
assert_selector "#admin-mobile-menu", visible: true
|
||||
assert_link "Dashboard"
|
||||
assert_link "Users"
|
||||
assert_link "Invitations"
|
||||
end
|
||||
end
|
||||
|
||||
test "admin cannot delete themselves" do
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_users_path
|
||||
|
||||
within "#user_#{@admin.id}" do
|
||||
click_button "Delete"
|
||||
end
|
||||
|
||||
assert_text "cannot delete yourself"
|
||||
assert User.exists?(@admin.id)
|
||||
end
|
||||
|
||||
test "admin can view dashboard statistics" do
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_dashboard_path
|
||||
|
||||
assert_text "Total Users"
|
||||
assert_text "Total Entries"
|
||||
assert_text "Pending Invitations"
|
||||
assert_text "Entry Requests"
|
||||
end
|
||||
|
||||
test "admin can navigate between admin sections" do
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_root_path
|
||||
|
||||
click_link "Users"
|
||||
assert_current_path admin_users_path
|
||||
|
||||
click_link "Invitations"
|
||||
assert_current_path admin_invitations_path
|
||||
|
||||
click_link "Requests"
|
||||
assert_current_path admin_requests_path
|
||||
|
||||
click_link "Dashboard"
|
||||
assert_current_path admin_dashboard_path
|
||||
end
|
||||
|
||||
test "admin can return to main site from admin" do
|
||||
login_as(@admin)
|
||||
|
||||
visit admin_root_path
|
||||
|
||||
# On mobile, click hamburger menu first
|
||||
if page.has_selector?("#admin-mobile-menu-button", visible: true)
|
||||
click_button id: "admin-mobile-menu-button"
|
||||
end
|
||||
|
||||
click_link "Back to Site"
|
||||
|
||||
assert_current_path root_path
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user