1
0

Test pass: test_update_add_and_simultaneously_remove_persisted_duplicate

Replace option[selected] with option:checked
Fix target validation when threshold destroyed
Extract #fill_threshold in tests
This commit is contained in:
cryptogopher 2021-04-26 15:29:04 +02:00
parent 788dbc67c1
commit a210ccc661
2 changed files with 51 additions and 21 deletions

View File

@ -9,9 +9,9 @@ class Target < ActiveRecord::Base
validates :thresholds, presence: true
accepts_nested_attributes_for :thresholds, allow_destroy: true,
reject_if: proc { |attrs| attrs['quantity_id'].blank? && attrs['value'].blank? }
reject_if: proc { |attrs| attrs['quantity_id'].blank? && attrs['id'].blank? }
validate do
quantities = thresholds.map(&:quantity)
quantities = thresholds.reject(&:marked_for_destruction?).map(&:quantity)
ancestors = quantities.max_by(&:lft).self_and_ancestors
errors.add(:thresholds, :count_mismatch) unless quantities.length == ancestors.length
errors.add(:thresholds, :quantity_mismatch) unless quantities == ancestors

View File

@ -7,7 +7,7 @@ class TargetsTest < BodyTrackingSystemTestCase
log_user 'jsmith', 'jsmith'
end
# TODO: add binding_and_nonbinding method to run same test for 2 target types
# TODO: add binding_and_nonbinding method to run same test for 2 goal/target types
# TODO: set values taken randomly from fixtures, not hardcoded
def test_index_binding_goal
@ -154,12 +154,7 @@ class TargetsTest < BodyTrackingSystemTestCase
within 'form#new-target-form' do
within 'p.target' do
select quantity.name
thresholds.each do |t_quantity, t_value, t_unit|
within select(t_quantity.name).ancestor('select') do
find(:xpath, 'following-sibling::input[not(@type="hidden")][1]').set(t_value)
find(:xpath, 'following-sibling::select[1]').select(t_unit.shortname)
end
end
fill_thresholds thresholds
end
click_on t(:button_create)
end
@ -275,12 +270,12 @@ class TargetsTest < BodyTrackingSystemTestCase
assert_selector 'p.target', count: targets.length
targets.each do |target|
within find('option[selected]', exact_text: target.quantity.name)
within find('option:checked', exact_text: target.quantity.name)
.ancestor('p.target') do
assert_selector 'input, select', count: 1 + 3*target.thresholds.length
target.thresholds.each do |threshold|
within find('option[selected]', exact_text: threshold.quantity.name)
within find('option:checked', exact_text: threshold.quantity.name)
.ancestor('select') do
assert has_selector?(:xpath,
'following-sibling::input[not(@type="hidden")][1]',
@ -332,15 +327,10 @@ class TargetsTest < BodyTrackingSystemTestCase
within 'form#edit-target-form' do
fill_in t(:field_effective_from), with: date
within find('option[selected]', exact_text: target.quantity.name)
within find('option:checked', exact_text: target.quantity.name)
.ancestor('p.target') do
select quantity.name
thresholds.each do |t_quantity, t_value, t_unit|
within select(t_quantity.name).ancestor('select') do
find(:xpath, 'following-sibling::input[not(@type="hidden")][1]').set(t_value)
find(:xpath, 'following-sibling::select[1]').select(t_unit.shortname)
end
end
fill_thresholds thresholds
end
click_on t(:button_save)
@ -374,8 +364,8 @@ class TargetsTest < BodyTrackingSystemTestCase
assert_no_difference 'Target.count' do
within 'form#edit-target-form' do
select1 = find('option[selected]', exact_text: quantity1).ancestor('select')
select2 = find('option[selected]', exact_text: quantity2).ancestor('select')
select1 = find('option:checked', exact_text: quantity1).ancestor('select')
select2 = find('option:checked', exact_text: quantity2).ancestor('select')
select1.select quantity2
select2.select quantity1
@ -392,6 +382,46 @@ class TargetsTest < BodyTrackingSystemTestCase
end
def test_update_add_and_simultaneously_remove_persisted_duplicate
# TODO
target = @project.targets.sample
thresholds = @project.quantities.target.sample.self_and_ancestors.map do |q|
[q, rand(-2000.0..2000.0).to_d(4), @project.units.sample]
end
visit goal_targets_path(target.goal)
find('td', text: target.effective_from).ancestor('tr').click_link t(:button_edit)
assert_no_difference 'Target.count' do
within 'form#edit-target-form' do
click_link t('targets.form.button_new_target')
find('option:checked', exact_text: target.quantity.name).ancestor('p.target')
.click_link t('targets.form.button_delete_target')
within :xpath, '//p[@class="target"][last()]' do
select target.quantity.name
fill_thresholds thresholds
end
click_on t(:button_save)
assert_no_selector 'div#errorExplanation'
end
end
new_target = Target.last
assert new_target.quantity, target.quantity
assert_raises(ActiveRecord::RecordNotFound) { target.reload }
end
def fill_thresholds(thresholds)
thresholds.each do |threshold|
t_quantity, t_value, t_unit = threshold
within select(t_quantity.name).ancestor('select') do
find(:xpath, 'following-sibling::input[not(@type="hidden")][1]').set(t_value)
find(:xpath, 'following-sibling::select[1]').select(t_unit.shortname)
if threshold == thresholds.last && !t_quantity.leaf?
find(:xpath, 'following-sibling::select[2]').select('.')
end
end
end
end
end