Files
Runar Ingebrigtsen 7c7bdf7e65
CI / scan_ruby (push) Successful in 18s
CI / scan_js (push) Successful in 14s
CI / lint (push) Successful in 20s
CI / test (push) Successful in 33s
lint this, check todo
2026-01-30 01:47:41 +01:00

224 lines
6.4 KiB
Ruby

require "test_helper"
class RequestsControllerTest < ActionDispatch::IntegrationTest
test "should show new request form for anonymous users" do
get new_request_path
assert_response :success
assert_select "h1", "Request a New Entry"
assert_select "form"
assert_select "input[name='entry[name]']"
assert_select "input[name='entry[email]']"
assert_select "select[name='entry[category]']"
end
test "should show new request form for logged-in users without name/email fields" do
login_as(users(:contributor_user))
get new_request_path
assert_response :success
assert_select "h1", "Request a New Entry"
assert_select "form"
assert_select "input[name='entry[name]']", count: 0
assert_select "input[name='entry[email]']", count: 0
assert_select ".bg-blue-50", text: /Submitting as/
end
test "should create entry request with valid data" do
assert_difference([ "User.count", "Entry.count" ], 1) do
post requests_path, params: {
entry: {
name: "New Requester",
email: "newrequester@example.com",
category: "word",
fi: "uusi sana",
en: "new word",
notes: "Please add this word"
}
}
end
entry = Entry.last
user = User.last
assert_equal "requested", entry.status
assert_equal user, entry.requested_by
assert_equal "New Requester", user.name
assert_equal "newrequester@example.com", user.email
assert_equal "contributor", user.role
assert_nil user.invitation_token
assert_redirected_to root_path
assert_match(/thank you for your request/i, flash[:notice])
end
test "should require at least one translation" do
assert_no_difference([ "User.count", "Entry.count" ]) do
post requests_path, params: {
entry: {
name: "New Requester",
email: "newrequester@example.com",
category: "word",
notes: "No translations provided"
}
}
end
assert_response :unprocessable_entity
assert_select ".bg-red-50", text: /At least one language translation is required/
end
test "should redirect to login if email already exists" do
existing_user = users(:contributor_user)
assert_no_difference([ "User.count", "Entry.count" ]) do
post requests_path, params: {
entry: {
name: "Test User",
email: existing_user.email,
category: "word",
fi: "sana",
en: "word"
}
}
end
assert_redirected_to login_path
assert_equal "An account with this email already exists. Please log in.", flash[:alert]
end
test "should show pending count for email with existing requests" do
requester = users(:requester_user)
get new_request_path, params: { email: requester.email }
assert_response :success
# User has one requested entry from fixtures
assert_select ".bg-blue-50", text: /1 pending request/
end
test "should create entry with only one translation" do
assert_difference([ "User.count", "Entry.count" ], 1) do
post requests_path, params: {
entry: {
name: "Single Translation",
email: "single@example.com",
category: "word",
fi: "vain suomeksi"
}
}
end
entry = Entry.last
assert_equal "vain suomeksi", entry.fi
assert_nil entry.en
assert_nil entry.sv
assert_redirected_to root_path
end
test "should create entry with multiple translations" do
assert_difference([ "User.count", "Entry.count" ], 1) do
post requests_path, params: {
entry: {
name: "Multi Lingual",
email: "multilingual@example.com",
category: "phrase",
fi: "hyvää päivää",
en: "good day",
sv: "god dag",
no: "god dag",
ru: "добрый день",
de: "guten Tag"
}
}
end
entry = Entry.last
assert_equal "hyvää päivää", entry.fi
assert_equal "good day", entry.en
assert_equal "god dag", entry.sv
assert_equal "god dag", entry.no
assert_equal "добрый день", entry.ru
assert_equal "guten Tag", entry.de
assert_redirected_to root_path
end
test "logged-in user can submit request without providing name/email" do
user = users(:contributor_user)
login_as(user)
assert_no_difference("User.count") do
assert_difference("Entry.count", 1) do
post requests_path, params: {
entry: {
category: "word",
fi: "kirjautunut käyttäjä",
en: "logged in user"
}
}
end
end
entry = Entry.last
assert_equal user, entry.requested_by
assert_equal "requested", entry.status
assert_redirected_to root_path
assert_match(/thank you for your request/i, flash[:notice])
end
test "should not modify existing user when they submit request" do
user = users(:contributor_user)
original_name = user.name
original_updated_at = user.updated_at
login_as(user)
post requests_path, params: {
entry: {
category: "word",
fi: "testi"
}
}
user.reload
assert_equal original_name, user.name
assert_equal original_updated_at.to_i, user.updated_at.to_i
end
test "should reuse existing pending user without modifying them" do
# Create a user without accepted invitation
existing_user = User.create!(
name: "Pending User",
email: "pending_test@example.com",
password: SecureRandom.alphanumeric(32),
role: :contributor
)
original_name = existing_user.name
original_updated_at = existing_user.updated_at
# Create first entry
Entry.create!(
category: :word,
fi: "first",
status: :requested,
requested_by: existing_user
)
# Submit second request with same email but different name
assert_no_difference("User.count") do
assert_difference("Entry.count", 1) do
post requests_path, params: {
entry: {
name: "Different Name", # This should be ignored
email: existing_user.email,
category: "word",
fi: "second"
}
}
end
end
existing_user.reload
assert_equal original_name, existing_user.name # Name should not change
assert_equal original_updated_at.to_i, existing_user.updated_at.to_i # Should not be updated
assert_equal 2, existing_user.requested_entries.count
end
end