mohawk 0.1.4 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitmodules +3 -3
- data/Changelog +6 -1
- data/Rakefile +2 -3
- data/cucumber.yml +1 -1
- data/features/combo_box.feature +8 -0
- data/features/menu.feature +8 -0
- data/features/step_definitions/button_steps.rb +1 -1
- data/features/step_definitions/combo_box_steps.rb +13 -1
- data/features/step_definitions/control_steps.rb +1 -1
- data/features/step_definitions/menu_steps.rb +7 -2
- data/features/support/WindowsForms.exe +0 -0
- data/features/support/screens/main_screen.rb +3 -0
- data/features/table.feature +7 -7
- data/features/text.feature +4 -0
- data/lib/mohawk/accessors.rb +3 -0
- data/lib/mohawk/adapters/uia/button.rb +14 -0
- data/lib/mohawk/adapters/uia/checkbox.rb +22 -0
- data/lib/mohawk/adapters/uia/control.rb +83 -0
- data/lib/mohawk/adapters/uia/element_locator.rb +19 -0
- data/lib/mohawk/adapters/uia/menu_item.rb +48 -0
- data/lib/mohawk/adapters/uia/radio.rb +22 -0
- data/lib/mohawk/adapters/uia/select_list.rb +53 -0
- data/lib/mohawk/adapters/uia/spinner.rb +30 -0
- data/lib/mohawk/adapters/uia/tab_control.rb +26 -0
- data/lib/mohawk/adapters/uia/table.rb +62 -0
- data/lib/mohawk/adapters/uia/table_row.rb +73 -0
- data/lib/mohawk/adapters/uia/text_box.rb +47 -0
- data/lib/mohawk/adapters/uia/tree_view.rb +22 -0
- data/lib/mohawk/adapters/uia/value_control.rb +20 -0
- data/lib/mohawk/adapters/uia/window.rb +64 -0
- data/lib/mohawk/adapters/uia_adapter.rb +36 -50
- data/lib/mohawk/version.rb +1 -1
- data/lib/mohawk/waiter.rb +18 -0
- data/lib/mohawk/win_32.rb +12 -0
- data/lib/mohawk.rb +26 -14
- data/mohawk.gemspec +2 -2
- data/spec/lib/mohawk/adapters/uia/control_spec.rb +46 -0
- data/spec/lib/mohawk/adapters/uia/table_row_spec.rb +36 -0
- data/spec/lib/mohawk/waiter_spec.rb +39 -0
- data/spec/lib/mohawk_spec.rb +115 -92
- data/spec/lib/navigation_spec.rb +14 -20
- data/spec/spec_helper.rb +1 -1
- metadata +49 -67
- data/lib/mohawk/accessors/button.rb +0 -20
- data/lib/mohawk/accessors/checkbox.rb +0 -24
- data/lib/mohawk/accessors/combo.rb +0 -37
- data/lib/mohawk/accessors/control.rb +0 -24
- data/lib/mohawk/accessors/label.rb +0 -15
- data/lib/mohawk/accessors/link.rb +0 -9
- data/lib/mohawk/accessors/menu_item.rb +0 -21
- data/lib/mohawk/accessors/radio.rb +0 -19
- data/lib/mohawk/accessors/spinner.rb +0 -27
- data/lib/mohawk/accessors/table.rb +0 -69
- data/lib/mohawk/accessors/table_row.rb +0 -62
- data/lib/mohawk/accessors/tabs.rb +0 -30
- data/lib/mohawk/accessors/text.rb +0 -29
- data/lib/mohawk/accessors/tree_view.rb +0 -32
- data/spec/lib/mohawk/accessors/button_spec.rb +0 -45
- data/spec/lib/mohawk/accessors/checkbox_spec.rb +0 -46
- data/spec/lib/mohawk/accessors/combo_spec.rb +0 -119
- data/spec/lib/mohawk/accessors/control_spec.rb +0 -47
- data/spec/lib/mohawk/accessors/label_spec.rb +0 -29
- data/spec/lib/mohawk/accessors/link_spec.rb +0 -34
- data/spec/lib/mohawk/accessors/menu_spec.rb +0 -32
- data/spec/lib/mohawk/accessors/radio_spec.rb +0 -35
- data/spec/lib/mohawk/accessors/spinner_spec.rb +0 -43
- data/spec/lib/mohawk/accessors/table_row_spec.rb +0 -28
- data/spec/lib/mohawk/accessors/table_spec.rb +0 -262
- data/spec/lib/mohawk/accessors/tabs_spec.rb +0 -58
- data/spec/lib/mohawk/accessors/text_spec.rb +0 -51
- data/spec/lib/mohawk/accessors/tree_view_spec.rb +0 -98
- data/spec/lib/mohawk/adapters/uia_adapter_spec.rb +0 -55
- data/spec/table_stubber.rb +0 -55
@@ -0,0 +1,47 @@
|
|
1
|
+
module Mohawk
|
2
|
+
module Adapters
|
3
|
+
module UIA
|
4
|
+
class TextBox < Control
|
5
|
+
valid_patterns :text, :value
|
6
|
+
|
7
|
+
def enter(*args)
|
8
|
+
send_keys *args
|
9
|
+
end
|
10
|
+
|
11
|
+
def set(value)
|
12
|
+
if is_value?
|
13
|
+
value_pattern.value = value
|
14
|
+
else
|
15
|
+
text_pattern.text = value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def value
|
20
|
+
return value_pattern.value if is_value?
|
21
|
+
text_pattern.text
|
22
|
+
end
|
23
|
+
|
24
|
+
def clear
|
25
|
+
set ''
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def is_value?
|
30
|
+
element.patterns.include? :value
|
31
|
+
end
|
32
|
+
|
33
|
+
def value_pattern
|
34
|
+
element.as :value
|
35
|
+
end
|
36
|
+
|
37
|
+
def is_text?
|
38
|
+
element.patterns.include? :text
|
39
|
+
end
|
40
|
+
|
41
|
+
def text_pattern
|
42
|
+
element.as :text
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Mohawk
|
2
|
+
module Adapters
|
3
|
+
module UIA
|
4
|
+
class TreeView < SelectList
|
5
|
+
def expand(what)
|
6
|
+
find_element(what).as(:expand_collapse).expand
|
7
|
+
end
|
8
|
+
|
9
|
+
def collapse(what)
|
10
|
+
find_element(what).as(:expand_collapse).collapse
|
11
|
+
end
|
12
|
+
|
13
|
+
def value
|
14
|
+
selected_items.map(&:name).first
|
15
|
+
end
|
16
|
+
|
17
|
+
alias_method :items, :options
|
18
|
+
alias_method :select, :set
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Mohawk
|
2
|
+
module Adapters
|
3
|
+
module UIA
|
4
|
+
class ValueControl < Control
|
5
|
+
def set(value)
|
6
|
+
value_pattern.value = value
|
7
|
+
end
|
8
|
+
|
9
|
+
def value
|
10
|
+
value_pattern.value
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
def value_pattern
|
15
|
+
element.as :value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'uia'
|
2
|
+
require 'mohawk/win_32'
|
3
|
+
|
4
|
+
module Mohawk
|
5
|
+
module Adapters
|
6
|
+
module UIA
|
7
|
+
class Window
|
8
|
+
include Mohawk::Waiter
|
9
|
+
attr_reader :element
|
10
|
+
|
11
|
+
def initialize(locator, container)
|
12
|
+
@locator = locator
|
13
|
+
@container = container
|
14
|
+
end
|
15
|
+
|
16
|
+
def element
|
17
|
+
@element ||= Uia.find_element(@locator)
|
18
|
+
if @element && @container
|
19
|
+
@element = @element.find(@container) || @element
|
20
|
+
end
|
21
|
+
@element
|
22
|
+
end
|
23
|
+
|
24
|
+
def send_keys(*keys)
|
25
|
+
activate
|
26
|
+
element.send_keys keys
|
27
|
+
end
|
28
|
+
|
29
|
+
def active?
|
30
|
+
Mohawk::Win32.foreground_window == handle
|
31
|
+
end
|
32
|
+
|
33
|
+
def activate
|
34
|
+
Mohawk::Win32.set_foreground_window handle
|
35
|
+
Mohawk::Win32.activate handle
|
36
|
+
end
|
37
|
+
|
38
|
+
def exist?
|
39
|
+
Mohawk::Win32.is_window handle
|
40
|
+
end
|
41
|
+
|
42
|
+
def handle
|
43
|
+
element.handle
|
44
|
+
end
|
45
|
+
|
46
|
+
def title
|
47
|
+
element.name
|
48
|
+
end
|
49
|
+
|
50
|
+
def text
|
51
|
+
element.descendants.map &:name
|
52
|
+
end
|
53
|
+
|
54
|
+
def present?
|
55
|
+
element != nil
|
56
|
+
end
|
57
|
+
|
58
|
+
def wait_until_present
|
59
|
+
wait_until { element }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -1,91 +1,77 @@
|
|
1
|
+
require 'mohawk/waiter'
|
2
|
+
require_rel 'uia'
|
3
|
+
|
1
4
|
module Mohawk
|
2
5
|
module Adapters
|
3
6
|
class UiaAdapter
|
7
|
+
include UIA
|
8
|
+
|
4
9
|
def initialize(locator, container=nil)
|
5
|
-
@
|
6
|
-
@
|
10
|
+
@children_only = locator.delete :children_only
|
11
|
+
@locator = locator
|
7
12
|
@container = container
|
8
13
|
end
|
9
14
|
|
10
15
|
def window
|
11
|
-
@
|
12
|
-
if @container
|
13
|
-
control = @window.control(@container)
|
14
|
-
RAutomation::WaitHelper.wait_until { control.exist? }
|
15
|
-
@window = RAutomation::Window.new(:hwnd => control.hwnd, :adapter => :ms_uia)
|
16
|
-
end
|
17
|
-
@window
|
18
|
-
end
|
16
|
+
@window ||= Window.new @locator, @container
|
19
17
|
end
|
20
18
|
|
21
|
-
def
|
22
|
-
|
23
|
-
@combos[locator] ||= Mohawk::Accessors::Combo.new(self, merge(locator))
|
19
|
+
def value_control(locator)
|
20
|
+
ValueControl.new self, merge(locator)
|
24
21
|
end
|
25
22
|
|
26
|
-
|
27
|
-
|
28
|
-
@checkbox ||= {}
|
29
|
-
@checkbox[locator] ||= Mohawk::Accessors::CheckBox.new(self, merge(locator))
|
23
|
+
def button(locator)
|
24
|
+
Button.new self, merge(locator)
|
30
25
|
end
|
31
26
|
|
32
|
-
def
|
33
|
-
|
34
|
-
@text_fields[locator] ||= Mohawk::Accessors::Text.new(self, merge(locator))
|
27
|
+
def table(locator)
|
28
|
+
Table.new self, merge(locator)
|
35
29
|
end
|
36
30
|
|
37
|
-
def
|
38
|
-
|
39
|
-
@buttons[locator] ||= Mohawk::Accessors::Button.new(self, merge(locator))
|
31
|
+
def checkbox(locator)
|
32
|
+
CheckBox.new self, merge(locator)
|
40
33
|
end
|
41
34
|
|
42
|
-
def
|
43
|
-
|
44
|
-
@radios[locator] ||= Mohawk::Accessors::Radio.new(self, merge(locator))
|
45
|
-
end
|
46
|
-
|
47
|
-
def label(locator)
|
48
|
-
@labels ||= {}
|
49
|
-
@labels[locator] ||= Mohawk::Accessors::Label.new(self, merge(locator))
|
35
|
+
def combo(locator)
|
36
|
+
SelectList.new self, merge(locator)
|
50
37
|
end
|
51
38
|
|
52
|
-
def
|
53
|
-
|
54
|
-
@links[locator] ||= Mohawk::Accessors::Link.new(self, merge(locator))
|
39
|
+
def tree_view(locator)
|
40
|
+
TreeView.new self, merge(locator)
|
55
41
|
end
|
56
42
|
|
57
|
-
def
|
58
|
-
|
43
|
+
def radio(locator)
|
44
|
+
Radio.new self, merge(locator)
|
59
45
|
end
|
60
46
|
|
61
|
-
def
|
62
|
-
|
63
|
-
@tables[locator] ||= Mohawk::Accessors::Table.new(self, merge(locator))
|
47
|
+
def text(locator)
|
48
|
+
TextBox.new self, merge(locator)
|
64
49
|
end
|
65
50
|
|
66
|
-
def
|
67
|
-
|
68
|
-
@trees[locator] ||= Mohawk::Accessors::TreeView.new(self, merge(locator))
|
51
|
+
def tab_control(locator)
|
52
|
+
TabControl.new self, merge(locator)
|
69
53
|
end
|
70
54
|
|
71
|
-
def
|
72
|
-
|
73
|
-
@controls[locator] ||= Mohawk::Accessors::Control.new(self, merge(locator))
|
55
|
+
def menu_item(locator)
|
56
|
+
MenuItem.new self, merge(locator)
|
74
57
|
end
|
75
58
|
|
76
59
|
def spinner(locator)
|
77
|
-
|
60
|
+
Spinner.new self, merge(locator)
|
78
61
|
end
|
79
62
|
|
80
|
-
def
|
81
|
-
|
63
|
+
def control(locator)
|
64
|
+
Control.new self, merge(locator)
|
82
65
|
end
|
83
66
|
|
67
|
+
alias_method :label, :control
|
68
|
+
alias_method :link, :control
|
69
|
+
|
84
70
|
private
|
85
71
|
def merge(locator)
|
86
|
-
locator = locator.merge
|
72
|
+
locator = locator.merge children_only: true if @children_only
|
87
73
|
locator
|
88
74
|
end
|
89
75
|
end
|
90
76
|
end
|
91
|
-
end
|
77
|
+
end
|
data/lib/mohawk/version.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Mohawk
|
2
|
+
module Waiter
|
3
|
+
extend self
|
4
|
+
|
5
|
+
class WaitTimeout < StandardError;
|
6
|
+
end
|
7
|
+
|
8
|
+
def wait_until(timeout=Mohawk.timeout, &block)
|
9
|
+
start = Time.now
|
10
|
+
until (result = block.call) || (Time.now - start > timeout)
|
11
|
+
sleep 0.25
|
12
|
+
end
|
13
|
+
|
14
|
+
raise WaitTimeout unless result
|
15
|
+
result
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module Mohawk
|
4
|
+
module Win32
|
5
|
+
extend FFI::Library
|
6
|
+
ffi_lib 'user32.dll'
|
7
|
+
attach_function :set_foreground_window, :SetForegroundWindow, [:long], :bool
|
8
|
+
attach_function :foreground_window, :GetForegroundWindow, [], :int
|
9
|
+
attach_function :is_window, :IsWindow, [:int], :bool
|
10
|
+
attach_function :activate, :SetActiveWindow, [:int], :int
|
11
|
+
end
|
12
|
+
end
|
data/lib/mohawk.rb
CHANGED
@@ -1,17 +1,16 @@
|
|
1
|
-
require "rautomation"
|
2
1
|
require 'childprocess'
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
2
|
+
require 'mohawk/version'
|
3
|
+
require 'require_all'
|
4
|
+
require 'mohawk/accessors'
|
5
|
+
require 'mohawk/navigation'
|
6
|
+
require 'mohawk/adapters/uia_adapter'
|
7
|
+
require 'mohawk/core_ext/string'
|
9
8
|
|
10
|
-
require_rel
|
9
|
+
require_rel 'mohawk/accessors'
|
11
10
|
|
12
11
|
module Mohawk
|
13
|
-
include
|
14
|
-
extend
|
12
|
+
include Waiter
|
13
|
+
extend Waiter
|
15
14
|
|
16
15
|
class InvalidApplicationPath < StandardError
|
17
16
|
def initialize(message='You must set the Mohawk.app_path to start an application')
|
@@ -29,8 +28,7 @@ module Mohawk
|
|
29
28
|
raise InvalidApplicationPath.new unless @app_path
|
30
29
|
@app = ChildProcess.build(@app_path).start
|
31
30
|
|
32
|
-
|
33
|
-
wait_until { app_window.present? }
|
31
|
+
wait_until { Uia.find_element pid: @app.pid }
|
34
32
|
end
|
35
33
|
|
36
34
|
def self.stop
|
@@ -47,10 +45,24 @@ module Mohawk
|
|
47
45
|
@app_path = path
|
48
46
|
end
|
49
47
|
|
48
|
+
class << self
|
49
|
+
attr_accessor :timeout
|
50
|
+
attr_accessor :default_adapter
|
51
|
+
end
|
52
|
+
self.timeout = 60
|
53
|
+
|
54
|
+
def self.default_adapter
|
55
|
+
@default_adapter || Mohawk::Adapters::UiaAdapter
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.default_adapter=(cls)
|
59
|
+
@default_adapter = cls
|
60
|
+
end
|
61
|
+
|
50
62
|
def initialize(extra={})
|
51
63
|
locator = [which_window.merge(extra)]
|
52
64
|
locator << parent_container if respond_to?(:parent_container)
|
53
|
-
@adapter = Mohawk
|
65
|
+
@adapter = Mohawk.default_adapter.new(*locator)
|
54
66
|
end
|
55
67
|
|
56
68
|
#
|
@@ -85,7 +97,7 @@ module Mohawk
|
|
85
97
|
# Waits until a control exists
|
86
98
|
#
|
87
99
|
def wait_for_control(locator)
|
88
|
-
control = adapter.
|
100
|
+
control = adapter.control(locator)
|
89
101
|
begin
|
90
102
|
wait_until { control.exist? }
|
91
103
|
rescue
|
data/mohawk.gemspec
CHANGED
@@ -18,14 +18,14 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
gem.require_paths = ["lib"]
|
20
20
|
|
21
|
-
gem.add_dependency '
|
21
|
+
gem.add_dependency 'uia', '>= 0.3.1'
|
22
22
|
gem.add_dependency 'require_all'
|
23
23
|
gem.add_dependency 'page_navigation', '>= 0.7'
|
24
24
|
gem.add_dependency 'childprocess', '~> 0.3.9'
|
25
|
-
gem.add_dependency 'ffi', '1.9.0'
|
26
25
|
|
27
26
|
gem.add_development_dependency 'cucumber'
|
28
27
|
gem.add_development_dependency 'rspec', '>= 2.12.0'
|
28
|
+
gem.add_development_dependency 'rspec-given'
|
29
29
|
gem.add_development_dependency 'rake'
|
30
30
|
gem.add_development_dependency 'childprocess'
|
31
31
|
gem.add_development_dependency 'rb-fsevent', '~> 0.9.1'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mohawk::Adapters::UiaAdapter::Control do
|
4
|
+
let(:adapter) { double(window: window) }
|
5
|
+
let(:window) { double(element: parent) }
|
6
|
+
let(:parent) { double(find: element) }
|
7
|
+
let(:element) { double('uia element') }
|
8
|
+
|
9
|
+
def new_control(locator)
|
10
|
+
Mohawk::Adapters::UiaAdapter::Control.new adapter, locator
|
11
|
+
end
|
12
|
+
|
13
|
+
Given(:control) { new_control(id: 'whatever') }
|
14
|
+
|
15
|
+
context 'working with the element directly' do
|
16
|
+
context 'passes through if it can' do
|
17
|
+
When { expect(element).to receive(:bounding_rectangle).and_return [1, 2, 3, 4] }
|
18
|
+
Then { expect(control.bounding_rectangle).to eq [1, 2, 3, 4] }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'fails otherwise' do
|
22
|
+
When(:bad_method) { control.does_not_have }
|
23
|
+
Then { expect(bad_method).to have_failed NoMethodError }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class HasPattern < Mohawk::Adapters::UiaAdapter::Control
|
28
|
+
valid_patterns :this, :that
|
29
|
+
end
|
30
|
+
|
31
|
+
context '#patterns' do
|
32
|
+
Given { parent.stub(:find) {|l| @locator = l } }
|
33
|
+
Given(:no_filter) { new_control(id: 'hi') }
|
34
|
+
Given(:some_filter) { HasPattern.new adapter, id: 'hi' }
|
35
|
+
Given(:overridden) { HasPattern.new adapter, id: 'hi', pattern: :overridden }
|
36
|
+
|
37
|
+
def pattern(control)
|
38
|
+
control.exist?
|
39
|
+
@locator.delete(:pattern)
|
40
|
+
end
|
41
|
+
|
42
|
+
Then { pattern(no_filter) == nil }
|
43
|
+
Then { pattern(some_filter) == [:this, :that] }
|
44
|
+
Then { pattern(overridden) == :overridden }
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mohawk::Adapters::UIA::TableRow do
|
4
|
+
let(:table) { double 'table', element: table_element }
|
5
|
+
let(:table_element) { double 'table element', row_at: element }
|
6
|
+
let(:element) { double 'row Element' }
|
7
|
+
|
8
|
+
subject { Mohawk::Adapters::UIA::TableRow.new table, 123 }
|
9
|
+
|
10
|
+
def set_expected_cells(h)
|
11
|
+
element.stub(:items).and_return h.values.map {|v| UiaTableCell.new v }
|
12
|
+
table.stub(:headers).and_return h.keys.map(&:to_s)
|
13
|
+
end
|
14
|
+
|
15
|
+
context '#all_match?' do
|
16
|
+
it 'matches string values' do
|
17
|
+
set_expected_cells 'First Column' => 'Yo'
|
18
|
+
|
19
|
+
expect(subject).to be_all_match first_column: 'Yo'
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'matches non-string values' do
|
23
|
+
set_expected_cells 'Date Field' => Date.today.to_s
|
24
|
+
|
25
|
+
expect(subject).to be_all_match date_field: Date.today
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class UiaTableCell
|
30
|
+
attr_reader :name
|
31
|
+
|
32
|
+
def initialize(name)
|
33
|
+
@name = name
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class WaiterStub
|
4
|
+
include Mohawk::Waiter
|
5
|
+
end
|
6
|
+
|
7
|
+
describe Mohawk::Waiter do
|
8
|
+
Given(:waiter) do
|
9
|
+
allow_any_instance_of(WaiterStub).to receive(:sleep) {}
|
10
|
+
WaiterStub.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def fake_time(*times)
|
14
|
+
expect(Time).to receive(:now).exactly(times.count).times.and_return(*times)
|
15
|
+
end
|
16
|
+
|
17
|
+
def do_it
|
18
|
+
@fake_responses.shift
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'default timeout' do
|
22
|
+
When { fake_time 0, 30, 60.1 }
|
23
|
+
Then { expect { waiter.wait_until { false } }.to raise_error Mohawk::WaitTimeout }
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'specific timeout' do
|
27
|
+
When { fake_time 0, 30, 30.1 }
|
28
|
+
Then { expect { waiter.wait_until(30) { false } }.to raise_error Mohawk::WaitTimeout }
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'waits in between' do
|
32
|
+
When do
|
33
|
+
@fake_responses = [false, true]
|
34
|
+
fake_time 0, 1
|
35
|
+
end
|
36
|
+
|
37
|
+
Then { expect { waiter.wait_until { do_it } }.not_to raise_error }
|
38
|
+
end
|
39
|
+
end
|