Fixed issue #1025 - “Update Database" plus restart does not work correctly.

This commit is contained in:
Martin Edenhofer 2017-04-30 15:14:17 +02:00
parent 060051b710
commit 1fbd368f02
3 changed files with 239 additions and 0 deletions

View file

@ -227,6 +227,11 @@ possible types
# if data_option has changed, store it for next migration # if data_option has changed, store it for next migration
if !force if !force
[:name, :display, :data_type, :position, :active].each { |key|
next if record[key] == data[key]
data[:to_config] = true
break
}
if record[:data_option] != data[:data_option] if record[:data_option] != data[:data_option]
# do we need a database migration? # do we need a database migration?
@ -587,7 +592,9 @@ to send no browser reload event, pass false
end end
# restart processes # restart processes
attribute.to_create = false
attribute.to_migrate = false attribute.to_migrate = false
attribute.to_delete = false
attribute.save! attribute.save!
reset_database_info(model) reset_database_info(model)
execute_db_count += 1 execute_db_count += 1

View file

@ -2,6 +2,7 @@
require 'browser_test_helper' require 'browser_test_helper'
class AdminObjectManagerTest < TestCase class AdminObjectManagerTest < TestCase
def test_basic_a def test_basic_a
@browser = browser_instance @browser = browser_instance
@ -388,4 +389,113 @@ class AdminObjectManagerTest < TestCase
) )
end end
def test_basic_c
@browser = browser_instance
login(
username: 'master@example.com',
password: 'test',
url: browser_url,
)
tasks_close_all()
# valid name
object_manager_attribute_create(
data: {
name: 'browser_update_test1',
display: 'Browser Update Test 1',
data_type: 'Text',
},
)
watch_for(
css: '.content.active',
value: 'Database Update required',
)
click(css: '.content.active .tab-pane.active div.js-execute')
watch_for(
css: '.modal',
value: 'restart',
)
watch_for_disappear(
css: '.modal',
timeout: 120,
)
sleep 5
watch_for(
css: '.content.active',
)
match_not(
css: '.content.active',
value: 'Database Update required',
)
# valid name
object_manager_attribute_update(
data: {
name: 'browser_update_test1',
display: 'Browser Update Test 2',
data_type: 'Text',
},
)
watch_for(
css: '.content.active',
value: 'Database Update required',
)
click(css: '.content.active .tab-pane.active div.js-execute')
watch_for(
css: '.modal',
value: 'configuration of Zammad has changed',
)
click(css: '.modal .js-submit')
watch_for_disappear(
css: '.modal',
timeout: 120,
)
sleep 5
watch_for(
css: '.content.active',
)
match_not(
css: '.content.active',
value: 'Database Update required',
)
object_manager_attribute_delete(
data: {
name: 'browser_update_test1',
},
)
watch_for(
css: '.content.active',
value: 'Database Update required',
)
watch_for(
css: '.content.active table',
value: 'browser_update_test1',
)
click(css: '.content.active .tab-pane.active div.js-execute')
watch_for(
css: '.modal',
value: 'restart',
)
watch_for_disappear(
css: '.modal',
timeout: 120,
)
sleep 5
watch_for(
css: '.content.active',
)
match_not(
css: '.content.active',
value: 'Database Update required',
)
match_not(
css: '.content.active table',
value: 'browser_update_test1',
)
end
end end

View file

@ -3376,6 +3376,128 @@ wait untill text in selector disabppears
raise 'object manager attribute creation failed' raise 'object manager attribute creation failed'
end end
=begin
object_manager_attribute_update(
browser: browser2,
data: {
name: 'field_name' + random,
display: 'Display Name of Field',
data_type: 'Select',
data_option: {
options: {
'aa' => 'AA',
'bb' => 'BB',
},
default: 'abc',
},
},
error: 'already exists'
)
=end
def object_manager_attribute_update(params = {})
switch_window_focus(params)
log('object_manager_attribute_update', params)
instance = params[:browser] || @browser
data = params[:data]
click(
browser: instance,
css: 'a[href="#manage"]',
mute_log: true,
)
click(
browser: instance,
css: '.content.active a[href="#system/object_manager"]',
mute_log: true,
)
sleep 4
instance.execute_script("$(\".content.active td:contains('#{data[:name]}')\").first().click()")
modal_ready(browser: instance)
element = instance.find_elements(css: '.modal input[name=display]')[0]
element.clear
element.send_keys(data[:display])
select(
browser: instance,
css: '.modal select[name="data_type"]',
value: data[:data_type],
mute_log: true,
)
if data[:data_option]
if data[:data_option][:options]
if data[:data_type] == 'Boolean'
element = instance.find_elements(css: '.modal .js-valueTrue').first
element.clear
element.send_keys(data[:data_option][:options][:true])
element = instance.find_elements(css: '.modal .js-valueFalse').first
element.clear
element.send_keys(data[:data_option][:options][:false])
else
data[:data_option][:options].each { |key, value|
element = instance.find_elements(css: '.modal .js-Table .js-key').last
element.clear
element.send_keys(key)
element = instance.find_elements(css: '.modal .js-Table .js-value').last
element.clear
element.send_keys(value)
element = instance.find_elements(css: '.modal .js-Table .js-add')[0]
element.click
}
end
end
[:default, :min, :max, :diff].each { |key|
next if !data[:data_option].key?(key)
element = instance.find_elements(css: ".modal [name=\"data_option::#{key}\"]").first
element.clear
element.send_keys(data[:data_option][key])
}
[:future, :past].each { |key|
next if !data[:data_option].key?(key)
select(
browser: instance,
css: ".modal select[name=\"data_option::#{key}\"]",
value: data[:data_option][key],
mute_log: true,
)
}
end
instance.find_elements(css: '.modal button.js-submit')[0].click
if params[:error]
sleep 4
watch_for(
css: '.modal',
value: params[:error],
)
click(
browser: instance,
css: '.modal .js-close',
)
modal_disappear(browser: instance)
return
end
11.times {
element = instance.find_elements(css: 'body')[0]
text = element.text
if text =~ /#{Regexp.quote(data[:name])}/
assert(true, 'object manager attribute updated')
sleep 1
return true
end
sleep 1
}
screenshot(browser: instance, comment: 'object_manager_attribute_update_failed')
raise 'object manager attribute update failed'
end
=begin =begin
object_manager_attribute_delete( object_manager_attribute_delete(