testingbot 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +5 -0
- data/Gemfile +3 -1
- data/LICENSE +1 -1
- data/README.rdoc +89 -42
- data/Rakefile +15 -0
- data/examples/android.rb +14 -0
- data/examples/capybara.rb +10 -20
- data/examples/capybara_multiple_browsers.rb +38 -0
- data/examples/cucumber/README.rdoc +15 -0
- data/examples/cucumber/Rakefile +20 -0
- data/examples/cucumber/features/support/env.rb +5 -30
- data/examples/cucumber/features/youtube.feature +1 -0
- data/examples/test_rspec.rb +8 -30
- data/examples/test_rspec1.rb +1 -1
- data/examples/test_unit.rb +6 -13
- data/lib/testingbot.rb +3 -222
- data/lib/testingbot/api.rb +112 -0
- data/lib/testingbot/capybara.rb +49 -0
- data/lib/testingbot/config.rb +54 -2
- data/lib/testingbot/cucumber.rb +31 -26
- data/lib/testingbot/hooks.rb +255 -0
- data/lib/testingbot/selenium.rb +122 -0
- data/lib/testingbot/tunnel.rb +96 -8
- data/lib/testingbot/version.rb +2 -2
- data/spec/integration/api_spec.rb +88 -0
- data/spec/integration/selenium1_spec.rb +53 -0
- data/spec/integration/selenium2_spec.rb +60 -0
- data/spec/integration/tunnel_spec.rb +84 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/unit/api_spec.rb +17 -0
- data/spec/unit/config_spec.rb +73 -0
- data/spec/unit/tunnel_spec.rb +41 -0
- data/testingbot.gemspec +6 -1
- data/vendor/Testingbot-Tunnel.jar +0 -0
- metadata +86 -6
- data/examples/cucumber/README +0 -3
data/lib/testingbot/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module Testingbot
|
2
|
-
VERSION = "0.0
|
3
|
-
end
|
2
|
+
VERSION = "0.1.0"
|
3
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require "uri"
|
2
|
+
require "net/http"
|
3
|
+
require 'rspec'
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
5
|
+
|
6
|
+
describe "Testingbot Api" do
|
7
|
+
|
8
|
+
context "the API should return valid user information" do
|
9
|
+
it "should return info for the current user" do
|
10
|
+
@api = TestingBot::Api.new()
|
11
|
+
@api.get_user_info.should_not be_empty
|
12
|
+
@api.get_user_info["first_name"].should_not be_empty
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should raise an error when wrong credentials are provided" do
|
16
|
+
@api = TestingBot::Api.new({ :client_key => "bogus", :client_secret => "false" })
|
17
|
+
lambda { @api.get_user_info }.should raise_error(RuntimeError, /^401 Unauthorized/)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "updating my user info via the API should work" do
|
22
|
+
it "should allow me to update my own user info" do
|
23
|
+
@api = TestingBot::Api.new()
|
24
|
+
new_name = rand(36**9).to_s(36)
|
25
|
+
@api.update_user_info({ "first_name" => new_name }).should == true
|
26
|
+
@api.get_user_info["first_name"].should == new_name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "retrieve my own tests" do
|
31
|
+
it "should retrieve a list of my own tests" do
|
32
|
+
@api = TestingBot::Api.new()
|
33
|
+
@api.get_tests.include?("data").should == true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should provide info for a specific test" do
|
37
|
+
@api = TestingBot::Api.new()
|
38
|
+
data = @api.get_tests["data"]
|
39
|
+
if data.length > 0
|
40
|
+
test_id = data.first["id"]
|
41
|
+
|
42
|
+
single_test = @api.get_single_test(test_id)
|
43
|
+
single_test["id"].should == test_id
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should fail when trying to access a test that is not mine" do
|
48
|
+
@api = TestingBot::Api.new()
|
49
|
+
lambda { @api.get_single_test(123423423423423) }.should raise_error(RuntimeError, /^404 Not Found./)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "update a test" do
|
54
|
+
it "should update a test of mine" do
|
55
|
+
@api = TestingBot::Api.new()
|
56
|
+
data = @api.get_tests["data"]
|
57
|
+
if data.length > 0
|
58
|
+
test_id = data.first["id"]
|
59
|
+
new_name = rand(36**9).to_s(36)
|
60
|
+
@api.update_test(test_id, { :name => new_name }).should == true
|
61
|
+
single_test = @api.get_single_test(test_id)
|
62
|
+
single_test["name"].should == new_name
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should not update a test that is not mine" do
|
67
|
+
@api = TestingBot::Api.new()
|
68
|
+
lambda { @api.update_test(123423423423423, { :name => "testingbot" }) }.should raise_error(RuntimeError, /^404 Not Found./)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "delete a test" do
|
73
|
+
it "should delete a test of mine" do
|
74
|
+
@api = TestingBot::Api.new()
|
75
|
+
data = @api.get_tests["data"]
|
76
|
+
if data.length > 0
|
77
|
+
test_id = data.first["id"]
|
78
|
+
@api.delete_test(test_id).should == true
|
79
|
+
lambda { @api.get_single_test(test_id) }.should raise_error(RuntimeError, /^404 Not Found./)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should not delete a test that is not mine" do
|
84
|
+
@api = TestingBot::Api.new()
|
85
|
+
lambda { @api.delete_test(123423423423423) }.should raise_error(RuntimeError, /^404 Not Found./)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "uri"
|
2
|
+
require "net/http"
|
3
|
+
require 'rspec'
|
4
|
+
|
5
|
+
@@success = true
|
6
|
+
@@check_api = true
|
7
|
+
|
8
|
+
# disabled until RSpec2 has append_after support
|
9
|
+
# ::RSpec.configuration.after :each do
|
10
|
+
# if @@check_api
|
11
|
+
# api = TestingBot::Api.new
|
12
|
+
# single_test = api.get_single_test(@selenium_driver.session_id)
|
13
|
+
# single_test["success"].should eql(@@success)
|
14
|
+
# single_test["extra"].should eql("just a test")
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
|
18
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
19
|
+
|
20
|
+
describe "Selenium RC test" do
|
21
|
+
|
22
|
+
before(:all) do
|
23
|
+
@selenium_driver = Selenium::Client::Driver.new \
|
24
|
+
:browser => "firefox",
|
25
|
+
:url => "http://testingbot.com",
|
26
|
+
:timeout_in_second => 60,
|
27
|
+
:platform => "WINDOWS",
|
28
|
+
:version => "10"
|
29
|
+
end
|
30
|
+
before(:each) do
|
31
|
+
@selenium_driver.start_new_browser_session({ :extra => "just a test" })
|
32
|
+
end
|
33
|
+
|
34
|
+
after(:each) do
|
35
|
+
@selenium_driver.close_current_browser_session
|
36
|
+
end
|
37
|
+
|
38
|
+
context "Connect and run successfully to the TestingBot Grid with Selenium 1 (RC)" do
|
39
|
+
it "should be able to run an RC test successfully" do
|
40
|
+
@check_api = false
|
41
|
+
@selenium_driver.open "/"
|
42
|
+
@selenium_driver.text?("TestingBot").should be_true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "Check that we report the test status back successfully" do
|
47
|
+
it "should send a success status to TestingBot upon success of the test" do
|
48
|
+
@check_api = true
|
49
|
+
@selenium_driver.open "/"
|
50
|
+
@selenium_driver.text?("TestingBot").should be_true
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require "uri"
|
2
|
+
require "net/http"
|
3
|
+
require 'rspec'
|
4
|
+
|
5
|
+
@@success = true
|
6
|
+
@@check_api = true
|
7
|
+
|
8
|
+
# disabled until RSpec2 has append_after support
|
9
|
+
# ::RSpec.configuration.after :each do
|
10
|
+
# if @@check_api
|
11
|
+
# api = TestingBot::Api.new
|
12
|
+
# single_test = api.get_single_test(@selenium_driver.session_id)
|
13
|
+
# single_test["success"].should eql(@@success)
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
|
17
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
18
|
+
|
19
|
+
|
20
|
+
TestingBot::config do |config|
|
21
|
+
config[:desired_capabilities] = { :browserName => "firefox", :version => 9, :platform => "WINDOWS" }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "Selenium WebDriver test" do
|
25
|
+
|
26
|
+
before(:all) do
|
27
|
+
@selenium_driver = TestingBot::SeleniumWebdriver.new
|
28
|
+
end
|
29
|
+
|
30
|
+
after(:each) do
|
31
|
+
@selenium_driver.stop
|
32
|
+
end
|
33
|
+
|
34
|
+
context "Connect and run successfully to the TestingBot Grid with Selenium 2" do
|
35
|
+
it "should be able to run an RC test successfully" do
|
36
|
+
@check_api = false
|
37
|
+
@selenium_driver.navigate.to "http://testingbot.com"
|
38
|
+
@selenium_driver.title.should match /^Selenium Testing/
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "Selenium WebDriver test API" do
|
44
|
+
|
45
|
+
before(:all) do
|
46
|
+
@selenium_driver = TestingBot::SeleniumWebdriver.new
|
47
|
+
end
|
48
|
+
|
49
|
+
after(:each) do
|
50
|
+
@selenium_driver.stop
|
51
|
+
end
|
52
|
+
|
53
|
+
context "Check that we report the test status back successfully" do
|
54
|
+
it "should send a success status to TestingBot upon success of the test" do
|
55
|
+
@check_api = true
|
56
|
+
@selenium_driver.navigate.to "http://testingbot.com"
|
57
|
+
@selenium_driver.title.should match /^Selenium Testing/
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
3
|
+
|
4
|
+
describe "Testingbot Tunnel" do
|
5
|
+
after :each do
|
6
|
+
@tunnel.stop if @tunnel.is_connected?
|
7
|
+
TestingBot.reset_config!
|
8
|
+
end
|
9
|
+
|
10
|
+
context "the tunnel should start and block until it's ready" do
|
11
|
+
it "should successfully start a tunnel connection" do
|
12
|
+
@tunnel = TestingBot::Tunnel.new()
|
13
|
+
@tunnel.start
|
14
|
+
@tunnel.is_connected?.should == true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should raise an exception when trying to stop a tunnel that has not been started yet" do
|
18
|
+
@tunnel = TestingBot::Tunnel.new()
|
19
|
+
lambda { @tunnel.stop }.should raise_error(RuntimeError, /not been started/)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "the tunnel needs to handle proper credentials" do
|
24
|
+
it "should fail to start a tunnel connection when invalid credentials are supplied" do
|
25
|
+
@tunnel = TestingBot::Tunnel.new({ :client_key => "fake", :client_secret => "bogus" })
|
26
|
+
@tunnel.start
|
27
|
+
@tunnel.is_connected?.should == false
|
28
|
+
@tunnel.errors.should_not be_empty
|
29
|
+
@tunnel.kill
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should try to fetch client_key and client_secret from the ~/.testingbot file when no credentials supplied" do
|
33
|
+
if File.exists?(File.expand_path("~/.testingbot"))
|
34
|
+
@tunnel = TestingBot::Tunnel.new()
|
35
|
+
@tunnel.start
|
36
|
+
@tunnel.is_connected?.should == true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "the tunnel needs to accept extra options" do
|
42
|
+
it "should accept extra options" do
|
43
|
+
if File.exists?(File.expand_path("~/testingbot_ready.txt"))
|
44
|
+
File.delete(File.expand_path("~/testingbot_ready.txt"))
|
45
|
+
end
|
46
|
+
|
47
|
+
File.exists?(File.expand_path("~/testingbot_ready.txt")).should == false
|
48
|
+
|
49
|
+
@tunnel = TestingBot::Tunnel.new({ :options => ['-f ~/testingbot_ready.txt'] })
|
50
|
+
@tunnel.start
|
51
|
+
@tunnel.is_connected?.should == true
|
52
|
+
|
53
|
+
File.exists?(File.expand_path("~/testingbot_ready.txt")).should == true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "there should only be one instance of a tunnel running" do
|
58
|
+
it "should check before starting that another tunnel is not yet running" do
|
59
|
+
@tunnel = TestingBot::Tunnel.new
|
60
|
+
@tunnel.start
|
61
|
+
@tunnel.is_connected?.should == true
|
62
|
+
|
63
|
+
clone = TestingBot::Tunnel.new
|
64
|
+
clone.start
|
65
|
+
clone.is_connected?.should == false
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should not be possible to stop a tunnel that is not running" do
|
69
|
+
@tunnel = TestingBot::Tunnel.new
|
70
|
+
lambda { @tunnel.stop }.should raise_error(RuntimeError, /^Can't stop tunnel/)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "When running a tunnel config values should be changed" do
|
75
|
+
it "should change the host and port in the config so that we connect to our tunnel instead of to the grid directly" do
|
76
|
+
@tunnel = TestingBot::Tunnel.new
|
77
|
+
@tunnel.start
|
78
|
+
@tunnel.is_connected?.should == true
|
79
|
+
@tunnel.instance_variable_get("@config")[:require_tunnel].should == true
|
80
|
+
@tunnel.instance_variable_get("@config")[:host].should eql("127.0.0.1")
|
81
|
+
@tunnel.instance_variable_get("@config")[:port].should eql(4445)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,4 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/testingbot/config.rb')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/testingbot/tunnel.rb')
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/testingbot/api.rb')
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/testingbot.rb')
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rspec"
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../lib/testingbot/config.rb')
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../lib/testingbot/api.rb')
|
4
|
+
|
5
|
+
describe TestingBot::Api do
|
6
|
+
describe "load config" do
|
7
|
+
it "should load the configuration in the constructor" do
|
8
|
+
api = TestingBot::Api.new
|
9
|
+
api.instance_variable_get("@config").should_not be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should use the credentials passed in from the constructor, overwriting possible credentials from the config" do
|
13
|
+
api = TestingBot::Api.new({ :client_key => "fake" })
|
14
|
+
api.instance_variable_get("@config")[:client_key].should eql("fake")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "rspec"
|
2
|
+
require 'selenium/webdriver'
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../lib/testingbot/config.rb')
|
4
|
+
|
5
|
+
describe TestingBot::Config do
|
6
|
+
describe '#[]' do
|
7
|
+
it "should return nil for options that don't exist" do
|
8
|
+
c = TestingBot::Config.new
|
9
|
+
c[:doesnotexist].should be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return a config value when being set from the constructor" do
|
13
|
+
c = TestingBot::Config.new({ :client_secret => "secret!!" })
|
14
|
+
c[:client_secret].should == "secret!!"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#[]=' do
|
19
|
+
it "should successfully set a config value" do
|
20
|
+
c = TestingBot::Config.new
|
21
|
+
value = rand * 1000
|
22
|
+
c[:client_key] = value
|
23
|
+
c[:client_key].should == value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "read config file" do
|
28
|
+
it "should read values from the .testingbot config file" do
|
29
|
+
if File.exists?(File.expand_path("~/.testingbot"))
|
30
|
+
c = TestingBot::Config.new
|
31
|
+
client_key, client_secret = File.open(File.expand_path("~/.testingbot")) { |f| f.readline }.chomp.split(":")
|
32
|
+
c[:client_key].should == client_key
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should use the options I pass in the constructor, even if I have a config file" do
|
37
|
+
if File.exists?(File.expand_path("~/.testingbot"))
|
38
|
+
c = TestingBot::Config.new({ :client_key => "pickme" })
|
39
|
+
client_key, client_secret = File.open(File.expand_path("~/.testingbot")) { |f| f.readline }.chomp.split(":")
|
40
|
+
c[:client_key].should == "pickme"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "config values" do
|
46
|
+
it "should specify a default desired capability if the user did not specify any" do
|
47
|
+
c = TestingBot::Config.new
|
48
|
+
c.desired_capabilities.should_not be_empty
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should be possible to use a Selenium::WebDriver::Remote::Capabilities object for the desired capabilities" do
|
52
|
+
c = TestingBot::Config.new
|
53
|
+
c[:desired_capabilities] = Selenium::WebDriver::Remote::Capabilities.firefox
|
54
|
+
c.desired_capabilities[:browserName].should eql("firefox")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "usage" do
|
59
|
+
it "should use the TestingBot.get_config as a singleton" do
|
60
|
+
c = TestingBot.get_config
|
61
|
+
c.should eql(TestingBot.get_config)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should be possible to reset the configuration" do
|
65
|
+
c = TestingBot.get_config
|
66
|
+
c.add_options({ :randomKey => "lol" })
|
67
|
+
|
68
|
+
TestingBot.reset_config!
|
69
|
+
c = TestingBot.get_config
|
70
|
+
c[:randomKey].should be_nil
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require "rspec"
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../lib/testingbot/config.rb')
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../lib/testingbot/tunnel.rb')
|
4
|
+
|
5
|
+
describe TestingBot::Tunnel do
|
6
|
+
describe "load config" do
|
7
|
+
it "should load the configuration in the constructor" do
|
8
|
+
tunnel = TestingBot::Tunnel.new
|
9
|
+
tunnel.instance_variable_get("@config").should_not be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should should not overwrite the config with arguments supplied in the constructor" do
|
13
|
+
tunnel = TestingBot::Tunnel.new({ :client_key => "fake" })
|
14
|
+
tunnel.instance_variable_get("@config")[:client_key].should_not eql("fake")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should allow for extra options to be specified, which will be passed to the jar's argument list" do
|
18
|
+
tunnel = TestingBot::Tunnel.new({ :options => ["-f readyfile.txt", "-F *.com"] })
|
19
|
+
tunnel.extra_options.should eql("-f readyfile.txt -F *.com")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "before starting the tunnel" do
|
24
|
+
it "should have 0 errors" do
|
25
|
+
tunnel = TestingBot::Tunnel.new
|
26
|
+
tunnel.errors.should be_empty
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should not be connected" do
|
30
|
+
tunnel = TestingBot::Tunnel.new
|
31
|
+
tunnel.is_connected?.should == false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "before stopping the tunnel" do
|
36
|
+
it "should check if the tunnel has been started yet" do
|
37
|
+
tunnel = TestingBot::Tunnel.new
|
38
|
+
lambda { tunnel.stop }.should raise_error(RuntimeError, /^Can't stop tunnel/)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/testingbot.gemspec
CHANGED
@@ -5,7 +5,7 @@ require "testingbot/version"
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "testingbot"
|
7
7
|
s.version = Testingbot::VERSION
|
8
|
-
s.authors = ["Jochen"]
|
8
|
+
s.authors = ["Jochen Delabie"]
|
9
9
|
s.email = ["info@testingbot.com"]
|
10
10
|
s.homepage = "http://www.testingbot.com"
|
11
11
|
s.summary = "Ruby Gem to be used with testingbot.com"
|
@@ -17,4 +17,9 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
|
+
s.add_dependency "json"
|
21
|
+
s.add_dependency "net-http-persistent"
|
22
|
+
s.add_dependency "selenium-webdriver"
|
23
|
+
s.add_development_dependency "rspec", [">= 2.9.0"]
|
24
|
+
s.add_development_dependency "rake"
|
20
25
|
end
|