2025-09-21 16:42:07 +00:00
|
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
|
|
|
|
require_relative '../application_system_test_case'
|
|
|
|
|
|
|
|
|
|
|
|
class ListAutofillSystemTest < ApplicationSystemTestCase
|
|
|
|
|
|
def setup
|
|
|
|
|
|
super
|
|
|
|
|
|
log_user('jsmith', 'jsmith')
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_autofill_textile_unordered_list
|
|
|
|
|
|
with_settings :text_formatting => 'textile' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('* First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"* First item\n" \
|
|
|
|
|
|
"* ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_autofill_textile_ordered_list
|
|
|
|
|
|
with_settings :text_formatting => 'textile' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('# First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"# First item\n" \
|
|
|
|
|
|
"# ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_remove_list_marker_for_empty_item
|
|
|
|
|
|
with_settings :text_formatting => 'textile' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('* First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
find('#issue_description').send_keys(:enter) # Press Enter on empty line removes the marker
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"* First item\n",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_autofill_markdown_unordered_list
|
|
|
|
|
|
with_settings :text_formatting => 'common_mark' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('- First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"- First item\n" \
|
|
|
|
|
|
"- ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
fill_in 'Description', with: ''
|
|
|
|
|
|
find('#issue_description').send_keys('* First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"* First item\n" \
|
|
|
|
|
|
"* ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
fill_in 'Description', with: ''
|
|
|
|
|
|
find('#issue_description').send_keys('+ First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"+ First item\n" \
|
|
|
|
|
|
"+ ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_autofill_with_markdown_ordered_list
|
|
|
|
|
|
with_settings :text_formatting => 'common_mark' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('1. First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"1. First item\n" \
|
|
|
|
|
|
"2. ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_autofill_with_markdown_ordered_list_using_parenthesis
|
|
|
|
|
|
with_settings :text_formatting => 'common_mark' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('1) First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"1) First item\n" \
|
|
|
|
|
|
"2) ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2025-10-21 04:54:34 +00:00
|
|
|
|
def test_autofill_with_markdown_unchecked_task_list
|
|
|
|
|
|
with_settings :text_formatting => 'common_mark' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('- [ ] First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"- [ ] First item\n" \
|
|
|
|
|
|
"- [ ] ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
fill_in 'Description', with: ''
|
|
|
|
|
|
find('#issue_description').send_keys('1. [ ] First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"1. [ ] First item\n" \
|
|
|
|
|
|
"2. [ ] ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_autofill_with_markdown_checked_task_list
|
|
|
|
|
|
with_settings :text_formatting => 'common_mark' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('- [x] First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"- [x] First item\n" \
|
|
|
|
|
|
"- [ ] ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
fill_in 'Description', with: ''
|
|
|
|
|
|
find('#issue_description').send_keys('1. [x] First item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"1. [x] First item\n" \
|
|
|
|
|
|
"2. [ ] ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2025-09-21 16:42:07 +00:00
|
|
|
|
def test_textile_nested_list_autofill
|
|
|
|
|
|
with_settings :text_formatting => 'textile' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('* Parent item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
find('#issue_description').send_keys(:backspace, :backspace) # Remove auto-filled marker
|
|
|
|
|
|
find('#issue_description').send_keys('** Child item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
find('#issue_description').send_keys(:backspace, :backspace, :backspace) # Remove auto-filled marker
|
|
|
|
|
|
find('#issue_description').send_keys("*** Grandchild item")
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"* Parent item\n" \
|
|
|
|
|
|
"** Child item\n" \
|
|
|
|
|
|
"*** Grandchild item\n" \
|
|
|
|
|
|
"*** ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_common_mark_nested_list_autofill
|
|
|
|
|
|
with_settings :text_formatting => 'common_mark' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('- Parent item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
find('#issue_description').send_keys(:backspace, :backspace) # Remove auto-filled marker
|
|
|
|
|
|
find('#issue_description').send_keys(' - Child item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"- Parent item\n" \
|
|
|
|
|
|
" - Child item\n" \
|
|
|
|
|
|
" - ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
find('#issue_description').send_keys(:backspace, :backspace, :backspace, :backspace) # Remove auto-filled marker
|
|
|
|
|
|
find('#issue_description').send_keys(' - Grandchild item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"- Parent item\n" \
|
|
|
|
|
|
" - Child item\n" \
|
|
|
|
|
|
" - Grandchild item\n" \
|
|
|
|
|
|
" - ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_common_mark_mixed_list_types
|
|
|
|
|
|
with_settings :text_formatting => 'common_mark' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').send_keys('1. First numbered item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
find('#issue_description').send_keys(:backspace, :backspace, :backspace) # Remove auto-filled numbered list marker
|
|
|
|
|
|
find('#issue_description').send_keys(' - Nested bullet item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"1. First numbered item\n" \
|
|
|
|
|
|
" - Nested bullet item\n" \
|
|
|
|
|
|
" - ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
find('#issue_description').send_keys(:backspace, :backspace, :backspace, :backspace, :backspace) # Remove auto-filled numbered list marker
|
|
|
|
|
|
find('#issue_description').send_keys('2. Second numbered item')
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
|
"1. First numbered item\n" \
|
|
|
|
|
|
" - Nested bullet item\n" \
|
|
|
|
|
|
"2. Second numbered item\n" \
|
|
|
|
|
|
"3. ",
|
|
|
|
|
|
find('#issue_description').value
|
|
|
|
|
|
)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_remove_list_marker_with_single_halfwidth_space_variants
|
|
|
|
|
|
with_settings :text_formatting => 'common_mark' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').click
|
|
|
|
|
|
|
|
|
|
|
|
# Half-width space only → should remove marker
|
|
|
|
|
|
find('#issue_description').send_keys('1. First item', :enter)
|
|
|
|
|
|
assert_equal("1. First item\n2. ", find('#issue_description').value)
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
assert_equal("1. First item\n", find('#issue_description').value)
|
|
|
|
|
|
|
|
|
|
|
|
fill_in 'Description', with: ''
|
|
|
|
|
|
# Full-width space only → should NOT remove marker
|
|
|
|
|
|
find('#issue_description').send_keys('1. First item', :enter)
|
|
|
|
|
|
find('#issue_description').send_keys(:backspace, :backspace, :backspace)
|
|
|
|
|
|
find('#issue_description').send_keys("2. ", :enter)
|
|
|
|
|
|
assert_equal("1. First item\n2. \n", find('#issue_description').value)
|
|
|
|
|
|
|
|
|
|
|
|
fill_in 'Description', with: ''
|
|
|
|
|
|
# Two or more spaces → should NOT remove marker
|
|
|
|
|
|
find('#issue_description').send_keys('1. First item', :enter)
|
|
|
|
|
|
find('#issue_description').send_keys(:backspace, :backspace, :backspace)
|
|
|
|
|
|
find('#issue_description').send_keys("2. ", :enter)
|
|
|
|
|
|
assert_equal("1. First item\n2. \n3. ", find('#issue_description').value)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_no_autofill_when_content_is_missing_or_invalid_marker
|
|
|
|
|
|
with_settings :text_formatting => 'common_mark' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').click
|
|
|
|
|
|
|
|
|
|
|
|
# Marker only with no content → should not trigger insert
|
|
|
|
|
|
find('#issue_description').send_keys('1.', :enter)
|
|
|
|
|
|
assert_equal("1.\n", find('#issue_description').value)
|
|
|
|
|
|
|
|
|
|
|
|
fill_in 'Description', with: ''
|
|
|
|
|
|
# Invalid marker pattern (e.g. double dot) → should not trigger insert
|
|
|
|
|
|
find('#issue_description').send_keys('1.. Invalid marker', :enter)
|
|
|
|
|
|
assert_equal("1.. Invalid marker\n", find('#issue_description').value)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_autofill_ignored_with_none_text_formatting
|
|
|
|
|
|
with_settings :text_formatting => '' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').click
|
|
|
|
|
|
|
|
|
|
|
|
# Unsupported format → no autofill should occur
|
|
|
|
|
|
find('#issue_description').send_keys('* First item', :enter)
|
|
|
|
|
|
assert_equal("* First item\n", find('#issue_description').value)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
def test_marker_not_inserted_on_empty_line
|
|
|
|
|
|
with_settings :text_formatting => 'textile' do
|
|
|
|
|
|
visit '/projects/ecookbook/issues/new'
|
|
|
|
|
|
|
|
|
|
|
|
within('form#issue-form') do
|
|
|
|
|
|
find('#issue_description').click
|
|
|
|
|
|
|
|
|
|
|
|
# Pressing enter on an empty line → should not trigger insert
|
|
|
|
|
|
find('#issue_description').send_keys(:enter)
|
|
|
|
|
|
assert_equal("\n", find('#issue_description').value)
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|