135 lines
3.2 KiB
Ruby
135 lines
3.2 KiB
Ruby
require 'watir'
|
|
require 'fileutils'
|
|
require 'test/unit'
|
|
|
|
INSTIKI_ROOT = File.expand_path(File.dirname(__FILE__) + "/../..")
|
|
require(File.expand_path(File.dirname(__FILE__) + "/../../config/environment"))
|
|
|
|
INSTIKI_PORT = 2501
|
|
HOME = "http://localhost:#{INSTIKI_PORT}"
|
|
|
|
class E2EInstikiTest < Test::Unit::TestCase
|
|
|
|
def startup
|
|
@@instiki = InstikiController.start
|
|
|
|
sleep 5
|
|
@@ie = Watir::IE.start(HOME)
|
|
|
|
setup_web
|
|
setup_home_page
|
|
|
|
@@ie
|
|
end
|
|
|
|
def self.shutdown
|
|
@@ie.close if defined? @@ie
|
|
@@instiki.stop
|
|
end
|
|
|
|
def ie
|
|
if defined? @@ie
|
|
@@ie
|
|
else
|
|
startup
|
|
end
|
|
end
|
|
|
|
def setup
|
|
ie.goto(HOME)
|
|
ie
|
|
end
|
|
|
|
def test_home_page_contents
|
|
assert_equal HOME + '/wiki/list', ie.link(:text, 'All Pages').href
|
|
assert_equal HOME + '/wiki/recently_revised', ie.link(:text, 'Recently Revised').href
|
|
end
|
|
|
|
private
|
|
|
|
def setup_web
|
|
assert_equal 'Wiki', ie.textField(:name, 'web_name').value
|
|
assert_equal 'wiki', ie.textField(:name, 'web_address').value
|
|
assert_equal '', ie.textField(:name, 'password').value
|
|
assert_equal '', ie.textField(:name, 'password_check').value
|
|
|
|
ie.textField(:name, 'password').set('123')
|
|
ie.textField(:name, 'password_check').set('123')
|
|
ie.button(:value, 'Setup').click
|
|
assert_equal HOME + '/wiki/new/HomePage', ie.url
|
|
end
|
|
|
|
def setup_home_page
|
|
ie.textField(:name, 'content').set('Homepage of a test wiki')
|
|
ie.button(:value, 'Submit').click
|
|
assert_equal HOME + '/wiki/show/HomePage', ie.url
|
|
end
|
|
|
|
def bp
|
|
require 'breakpoint'
|
|
breakpoint
|
|
end
|
|
|
|
end
|
|
|
|
class InstikiController
|
|
|
|
attr_reader :process_id
|
|
|
|
def self.start
|
|
startup_info = [68].pack('lx64')
|
|
process_info = [0, 0, 0, 0].pack('llll')
|
|
|
|
startup_command =
|
|
"ruby #{RAILS_ROOT}/instiki.rb --storage #{prepare_storage} " +
|
|
" --port #{INSTIKI_PORT} --environment development"
|
|
|
|
result = Win32API.new('kernel32.dll', 'CreateProcess', 'pplllllppp', 'L').call(
|
|
nil,
|
|
startup_command,
|
|
0, 0, 1, 0, 0, '.', startup_info, process_info)
|
|
|
|
# TODO print the error code, or better yet a text message
|
|
raise "Failed to start Instiki." if result == 0
|
|
|
|
process_id = process_info.unpack('llll')[2]
|
|
return self.new(process_id)
|
|
end
|
|
|
|
def self.prepare_storage
|
|
storage_path = INSTIKI_ROOT + '/storage/e2e'
|
|
FileUtils.rm_rf(storage_path) if File.exists? storage_path
|
|
FileUtils.mkdir_p(storage_path)
|
|
storage_path
|
|
end
|
|
|
|
def initialize(pid)
|
|
@process_id = pid
|
|
end
|
|
|
|
def stop
|
|
right_to_terminate_process = 1
|
|
handle = Win32API.new('kernel32.dll', 'OpenProcess', 'lil', 'l').call(
|
|
right_to_terminate_process, 0, @process_id)
|
|
Win32API.new('kernel32.dll', 'TerminateProcess', 'll', 'L').call(handle, 0)
|
|
end
|
|
|
|
end
|
|
|
|
begin
|
|
require 'test/unit/ui/console/testrunner'
|
|
Test::Unit::UI::Console::TestRunner.new(E2EInstikiTest.suite).start
|
|
rescue => e
|
|
$stderr.puts 'Unhandled error during test execution'
|
|
$stderr.puts e.message
|
|
$stderr.puts e.backtrace
|
|
ensure
|
|
begin
|
|
E2EInstikiTest::shutdown
|
|
rescue => e
|
|
$stderr.puts 'Error during shutdown'
|
|
$stderr.puts e.message
|
|
$stderr.puts e.backtrace
|
|
end
|
|
end
|