lackie 0.1.4 → 0.1.5

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.
@@ -3,13 +3,14 @@ Feature: Remote Control
3
3
  As a client
4
4
  I want to surrender applications as javascript lackies
5
5
 
6
- Scenario Outline: Remote Execution
6
+ Background:
7
7
  Given I have surrendered my web page as a lackie
8
+
9
+ Scenario Outline: Remote Execution
8
10
  When I tell the lackie to execute "<command>"
9
11
  Then I should see a result with the value "<result>"
10
12
 
11
13
  Examples:
12
-
13
14
  | command | result |
14
15
  | 1 + 1 | 2 |
15
16
  | 2 + 2 | 4 |
@@ -17,18 +18,25 @@ Feature: Remote Control
17
18
  | document.title | Lackie Example App |
18
19
 
19
20
  Scenario: Remote Execution Error
20
- Given I have surrendered my web page as a lackie
21
21
  When I tell the lackie to execute "(function() { throw 'whoopsie'; })()"
22
22
  Then I should see an error with the message "whoopsie"
23
23
 
24
24
  Scenario: Remote Log
25
- Given I have surrendered my web page as a lackie
26
25
  When I tell the lackie to log "yipee"
27
26
  Then I should see a result with the value "yipee"
28
27
 
29
28
  Scenario: Send Command Without Expecting A Result
30
- Given I have surrendered my web page as a lackie
31
29
  When I tell the lackie to send the command "window.foo = '123'"
32
30
  Then I should see a result with the value "OK"
33
31
  When I tell the lackie to execute "window.foo = 99"
34
- Then I should see a result with the value "99"
32
+ Then I should see a result with the value "99"
33
+
34
+ Scenario: Await Result
35
+ When I tell the lackie to execute "setTimeout(function() { window.foo = 666 }, 500)"
36
+ And I await the result of "window.foo" to equal "666"
37
+ Then I should not see an error
38
+
39
+ Scenario: Await Result Timeout
40
+ When I tell the lackie to execute "window.bar = 123"
41
+ When I await the result of "window.bar" to equal "456"
42
+ Then I should see an error with a message including "123"
@@ -18,10 +18,29 @@ When /^I tell the lackie to send the command "([^"]*)"$/ do |script|
18
18
  @response = remote_control.send_command(script)
19
19
  end
20
20
 
21
+ When /^I await the result of "([^"]*)" to equal "([^"]*)"$/ do |script, value|
22
+ begin
23
+ @response = remote_control.await(script, :timeout_seconds => 1) do |current_value|
24
+ current_value.to_s == value
25
+ end
26
+ rescue Lackie::AwaitError => e
27
+ @error = e
28
+ end
29
+ end
30
+
21
31
  Then /^I should see a result with the value "([^\"]*)"$/ do |value|
22
32
  @response.to_s.should == value
23
33
  end
24
34
 
25
35
  Then /^I should see an error with the message "([^\"]*)"$/ do |message|
26
36
  @error.message.should == message
27
- end
37
+ end
38
+
39
+ Then /^I should not see an error$/ do
40
+ raise @error unless @error.nil?
41
+ end
42
+
43
+ Then /^I should see an error with a message including "([^"]*)"$/ do |string|
44
+ @error.should_not be_nil
45
+ @error.message.should =~ Regexp.new(string)
46
+ end
data/lib/lackie.rb CHANGED
@@ -2,7 +2,7 @@ lib = File.dirname(__FILE__)
2
2
  $:.unshift(lib) unless $:.include?(lib) || $:.include?(File.expand_path(lib))
3
3
 
4
4
  module Lackie
5
- VERSION = '0.1.4'
5
+ VERSION = '0.1.5'
6
6
  end
7
7
 
8
8
  require 'lackie/remote_control'
@@ -26,6 +26,22 @@ module Lackie
26
26
  end
27
27
  end
28
28
 
29
+ def await(expression, options={})
30
+ result = nil
31
+ begin
32
+ @poller.await("result matching expression: #{expression}", options) do
33
+ begin
34
+ result = exec(expression)
35
+ rescue TimeoutError => e
36
+ end
37
+ yield result
38
+ end
39
+ rescue TimeoutError => e
40
+ raise AwaitError.new(expression, result)
41
+ end
42
+ result
43
+ end
44
+
29
45
  private
30
46
 
31
47
  def poll_for_result(command, options={})
@@ -56,8 +72,7 @@ module Lackie
56
72
 
57
73
  class ConnectionError < RuntimeError
58
74
  def initialize(url, inner)
59
- @url = url
60
- @inner = inner
75
+ @url, @inner = url, inner
61
76
  end
62
77
 
63
78
  def message
@@ -68,4 +83,16 @@ module Lackie
68
83
 
69
84
  class RemoteExecutionError < RuntimeError
70
85
  end
86
+
87
+ class AwaitError < RuntimeError
88
+ def initialize(expression, result)
89
+ @expression, @result = expression, result
90
+ end
91
+
92
+ def message
93
+ "Timed out awaiting the result of expression:\n" +
94
+ "#{@expression}\n" +
95
+ "The last result was:\n#{@result}"
96
+ end
97
+ end
71
98
  end
@@ -64,7 +64,7 @@ module Lackie
64
64
  lambda { @rc.log("oops") }.should raise_error("oops")
65
65
  end
66
66
 
67
- it "reports a useful error when sending a command fails" do
67
+ it "raises when sending a command fails" do
68
68
  RestClient.should_receive(:post).with("http://host:555/lackie/eval", 'foo').and_raise "oops"
69
69
  begin
70
70
  @rc.exec("foo")
@@ -73,5 +73,35 @@ module Lackie
73
73
  e.message.should =~ /have you started a lackie server?/
74
74
  end
75
75
  end
76
+
77
+ describe "#await" do
78
+ it "does not raise if the value eventually matches the block" do
79
+ responses = ["bar", "foo"].map do |result|
80
+ mock("stub_result_response", :body => { :value => result }.to_json)
81
+ end
82
+ RestClient.stub!(:get).with("http://host:555/lackie/result?cachebust").and_return {
83
+ responses.shift
84
+ }
85
+ lambda {
86
+ @rc.await("script") { |value| value == "foo" }
87
+ }.should_not raise_error
88
+ end
89
+
90
+ it "raises if the value never matches the block" do
91
+ RestClient.stub!(:get).with("http://host:555/lackie/result?cachebust").and_return {
92
+ mock("stub_result_response", :body => '{"value":"oopsie"}')
93
+ }
94
+ begin
95
+ @rc.await("script") { |value| value == "bar" }
96
+ rescue Lackie::AwaitError => e
97
+ e.message.should =~ /oopsie/
98
+ end
99
+ end
100
+
101
+ it "accepts an optional total number of seconds to wait" do
102
+ @poller.should_receive(:await).with("result matching expression: script", :timeout_seconds => 333)
103
+ @rc.await("script", :timeout_seconds => 333) { |value| value == "bar" }
104
+ end
105
+ end
76
106
  end
77
107
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lackie
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 4
10
- version: 0.1.4
9
+ - 5
10
+ version: 0.1.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Josh Chisholm
@@ -197,7 +197,7 @@ rubyforge_project:
197
197
  rubygems_version: 1.3.7
198
198
  signing_key:
199
199
  specification_version: 3
200
- summary: lackie-0.1.4
200
+ summary: lackie-0.1.5
201
201
  test_files:
202
202
  - features/remote_control.feature
203
203
  - features/step_definitions/lackie_steps.rb