178 lines
4.3 KiB
Ruby
178 lines
4.3 KiB
Ruby
require "test_helper"
|
|
require "roo"
|
|
require "tempfile"
|
|
|
|
class EntriesControllerTest < ActionDispatch::IntegrationTest
|
|
setup do
|
|
@entry = entries(:one)
|
|
@user = users(:admin_user)
|
|
end
|
|
|
|
# INDEX tests
|
|
test "should get index" do
|
|
get entries_url
|
|
assert_response :success
|
|
end
|
|
|
|
test "should filter by language" do
|
|
get entries_url, params: { language: "fi" }
|
|
assert_response :success
|
|
assert_select "input[type=hidden][name='language'][value='fi']"
|
|
end
|
|
|
|
test "should filter by category" do
|
|
get entries_url, params: { category: "word" }
|
|
assert_response :success
|
|
assert_select "input[type=hidden][name='category'][value='word']"
|
|
end
|
|
|
|
test "should search with query" do
|
|
get entries_url, params: { q: "test" }
|
|
assert_response :success
|
|
assert_select "input[name='q'][value='test']"
|
|
end
|
|
|
|
test "should filter by starts_with" do
|
|
get entries_url, params: { starts_with: "a" }
|
|
assert_response :success
|
|
assert_select "input[type=hidden][name='starts_with'][value='a']"
|
|
end
|
|
|
|
test "should paginate results" do
|
|
get entries_url, params: { page: 2 }
|
|
assert_response :success
|
|
assert_select "a", text: "Previous"
|
|
assert_select "a", text: "Next"
|
|
end
|
|
|
|
test "should handle invalid language code" do
|
|
get entries_url, params: { language: "invalid" }
|
|
assert_response :success
|
|
assert_select "input[name='language']", count: 0
|
|
end
|
|
|
|
test "should respond to turbo_stream" do
|
|
get entries_url, as: :turbo_stream
|
|
assert_response :success
|
|
end
|
|
|
|
test "should only show active entries in index" do
|
|
# Create a requested entry that should not appear
|
|
requested_entry = Entry.create!(
|
|
fi: "Requested",
|
|
category: :word,
|
|
status: :requested,
|
|
requested_by: @user
|
|
)
|
|
|
|
get entries_url
|
|
assert_response :success
|
|
assert_select "td", text: requested_entry.fi, count: 0
|
|
end
|
|
|
|
# SHOW tests
|
|
test "should show entry" do
|
|
get entry_url(@entry)
|
|
assert_response :success
|
|
end
|
|
|
|
test "should show entry with comments" do
|
|
get entry_url(@entry)
|
|
assert_response :success
|
|
assert_select "p", text: @entry.fi
|
|
end
|
|
|
|
# EDIT tests
|
|
test "should get edit" do
|
|
get edit_entry_url(@entry)
|
|
assert_response :success
|
|
end
|
|
|
|
# UPDATE tests
|
|
test "should update entry" do
|
|
patch entry_url(@entry), params: {
|
|
entry: {
|
|
fi: "Updated Finnish",
|
|
en: "Updated English",
|
|
category: "word"
|
|
}
|
|
}
|
|
assert_redirected_to entry_url(@entry)
|
|
@entry.reload
|
|
assert_equal "Updated Finnish", @entry.fi
|
|
end
|
|
|
|
test "should not update entry with invalid data" do
|
|
patch entry_url(@entry), params: {
|
|
entry: {
|
|
fi: "",
|
|
en: "",
|
|
sv: "",
|
|
no: "",
|
|
ru: "",
|
|
de: ""
|
|
}
|
|
}
|
|
assert_response :unprocessable_entity
|
|
end
|
|
|
|
test "should update entry category" do
|
|
patch entry_url(@entry), params: {
|
|
entry: { category: "phrase" }
|
|
}
|
|
assert_redirected_to entry_url(@entry)
|
|
@entry.reload
|
|
assert_equal "phrase", @entry.category
|
|
end
|
|
|
|
# DOWNLOAD tests
|
|
test "should download xlsx" do
|
|
get download_entries_url(format: :xlsx)
|
|
assert_response :success
|
|
assert_equal "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
response.media_type
|
|
end
|
|
|
|
test "should include active entries in xlsx" do
|
|
unique_entry = Entry.create!(
|
|
fi: "UniqueActiveEntry123",
|
|
category: :word,
|
|
status: :active
|
|
)
|
|
|
|
get download_entries_url(format: :xlsx)
|
|
assert_response :success
|
|
|
|
Tempfile.create([ "entries", ".xlsx" ]) do |file|
|
|
file.binmode
|
|
file.write(response.body)
|
|
file.flush
|
|
|
|
sheet = Roo::Excelx.new(file.path).sheet(0)
|
|
cell_values = sheet.to_a.flatten.compact
|
|
assert_includes cell_values, unique_entry.fi
|
|
end
|
|
end
|
|
|
|
# Statistics tests
|
|
test "should calculate entry statistics" do
|
|
get entries_url
|
|
assert_response :success
|
|
assert_select "div", text: /entries/i
|
|
assert_select "div", text: /% complete/i
|
|
end
|
|
|
|
test "should calculate language completion" do
|
|
get entries_url
|
|
assert_response :success
|
|
assert_select "div", text: /% complete/i
|
|
end
|
|
|
|
# Language ordering tests
|
|
test "should prioritize selected language in display" do
|
|
get entries_url, params: { language: "fi" }
|
|
assert_response :success
|
|
assert_select "th span", text: "FI", count: 1
|
|
end
|
|
end
|