keybase-core 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +19 -0
- data/.ruby-version +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +49 -0
- data/LICENSE +23 -0
- data/README.md +137 -0
- data/Rakefile +20 -0
- data/keybase.gemspec +25 -0
- data/lib/keybase.rb +49 -0
- data/lib/keybase/crypto.rb +20 -0
- data/lib/keybase/error.rb +37 -0
- data/lib/keybase/models/dump.rb +33 -0
- data/lib/keybase/models/user.rb +168 -0
- data/lib/keybase/request/base.rb +32 -0
- data/lib/keybase/request/dump/all.rb +10 -0
- data/lib/keybase/request/dump/latest.rb +10 -0
- data/lib/keybase/request/key/add.rb +13 -0
- data/lib/keybase/request/key/revoke.rb +14 -0
- data/lib/keybase/request/root/get_salt_and_login_session.rb +12 -0
- data/lib/keybase/request/root/login.rb +14 -0
- data/lib/keybase/request/sig/post_auth.rb +13 -0
- data/lib/keybase/request/user/lookup.rb +10 -0
- data/lib/keybase/response.rb +14 -0
- data/lib/keybase/token_store.rb +32 -0
- data/test/all.rb +6 -0
- data/test/fixtures/example_dump.json +9 -0
- data/test/fixtures/example_user.json +50 -0
- data/test/integration/dumps_test.rb +23 -0
- data/test/integration/keys_test.rb +26 -0
- data/test/integration/login_users_test.rb +18 -0
- data/test/integration/lookup_users_test.rb +42 -0
- data/test/integration_test_helper.rb +6 -0
- data/test/test_helper.rb +17 -0
- data/test/unit/lib/keybase/crypto_test.rb +45 -0
- data/test/unit/lib/keybase/error_test.rb +32 -0
- data/test/unit/lib/keybase/models/dump_test.rb +31 -0
- data/test/unit/lib/keybase/models/user_test.rb +136 -0
- data/test/unit/lib/keybase/requests/base_test.rb +60 -0
- data/test/unit/lib/keybase/requests/dump/all_test.rb +17 -0
- data/test/unit/lib/keybase/requests/dump/latest_test.rb +17 -0
- data/test/unit/lib/keybase/requests/key/add_test.rb +19 -0
- data/test/unit/lib/keybase/requests/key/revoke_test.rb +19 -0
- data/test/unit/lib/keybase/requests/root/get_salt_test.rb +23 -0
- data/test/unit/lib/keybase/requests/root/login_test.rb +19 -0
- data/test/unit/lib/keybase/requests/sig/post_auth_test.rb +19 -0
- data/test/unit/lib/keybase/requests/user/lookup_test.rb +17 -0
- data/test/unit/lib/keybase/response_test.rb +23 -0
- data/test/unit/lib/keybase/token_store_test.rb +25 -0
- data/test/unit/lib/keybase_test.rb +25 -0
- data/test/vcr_cassettes/dumps.yml +49418 -0
- data/test/vcr_cassettes/keys.yml +349 -0
- data/test/vcr_cassettes/user_login.yml +176 -0
- data/test/vcr_cassettes/user_lookup_foo.yml +89 -0
- data/test/vcr_cassettes/user_lookup_invalid.yml +52 -0
- data/test/vcr_cassettes/user_lookup_missing.yml +52 -0
- data/test/vcr_cassettes/user_lookup_not_found.yml +55 -0
- metadata +200 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require_relative '../integration_test_helper'
|
3
|
+
|
4
|
+
module Keybase
|
5
|
+
class KeysIntegrationTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
VCR.use_cassette('keys') do
|
9
|
+
@me = User.login('seanhandley', 'secret')
|
10
|
+
@public_key = @me.public_keys.primary.bundle
|
11
|
+
@private_key = @me.private_keys.primary.bundle
|
12
|
+
@old_public_kid = @me.public_keys.primary.kid
|
13
|
+
@old_private_kid = @me.private_keys.primary.kid
|
14
|
+
|
15
|
+
@me.revoke_key(@me.public_keys.primary.kid)
|
16
|
+
@public_kid = @me.add_public_key(@public_key)
|
17
|
+
@private_kid = @me.add_private_key(@private_key)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_kids_match
|
22
|
+
assert_equal @old_public_kid, @old_private_kid
|
23
|
+
assert_equal @public_kid, @private_kid
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require_relative '../integration_test_helper'
|
3
|
+
|
4
|
+
module Keybase
|
5
|
+
class LoginUsersIntegrationTest < Minitest::Test
|
6
|
+
|
7
|
+
def test_login
|
8
|
+
VCR.use_cassette('user_login') do
|
9
|
+
user = User.login('seanhandley', 'secret')
|
10
|
+
assert_equal "secret", user.private_keys.primary.bundle
|
11
|
+
assert_equal "dude@testing.com", user.emails.primary.email
|
12
|
+
assert_equal 'lgHZIDA0MmNjYWYwMTMxZmZlZDNiZGE1MDAyM2M3ZGEzNzA4zlMxfzfOAAFRgMDEIPBYxx9HWUnY8GVK2rYzx29hOQW5DXDNkONntT1FjGxI', TokenStore.csrf
|
13
|
+
assert_equal 'guest=lgHZIGJkM2E1MGNmMjBjNmQ0MzQwMmFhMDI4Mjc4YzJiZjA4zlMxfzjOAAFRgMDEINQblgb3pKa15JV58bI2VqKfWGvPFe3qcLUuq153%2Be7C; Max-Age=604.8; Domain=.keybase.io; Path=/; Expires=Tue, 25 Mar 2014 13:16:04 GMT; HttpOnly; Secure, session=lgHZIGU3MjBmNWE0Y2NlOWM2MGY5NDUzOGQzMDk1OWU3MTAwzlMxfzjOAeEzgNkgODViZmU1ZGI4MzM3NzM4NDk2MDRmZGIzOWZkM2UxMDLEII%2B6%2FmdEgDo74uwb%2BQDMrDt6m06NFhs0eQjX9popcagO; Max-Age=31536000; Domain=.keybase.io; Path=/; Expires=Wed, 25 Mar 2015 13:06:00 GMT; HttpOnly; Secure', TokenStore.cookie
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
require_relative '../integration_test_helper'
|
3
|
+
|
4
|
+
module Keybase
|
5
|
+
class LookupUsersIntegrationTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
VCR.use_cassette('user_lookup_foo') do
|
9
|
+
@user = Keybase.lookup("foo")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_user_object_has_expected_fields
|
14
|
+
assert @user.respond_to? :id
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_user_not_found
|
18
|
+
VCR.use_cassette('user_lookup_not_found') do
|
19
|
+
assert_raises(Keybase::UserNotFoundError, 'user not found foofoofooofo') do
|
20
|
+
@user = User.lookup('foofoofooofo')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_username_missing
|
26
|
+
VCR.use_cassette('user_lookup_missing') do
|
27
|
+
assert_raises(Keybase::InputError, 'missing or invalid input. username: missing name') do
|
28
|
+
@user = User.lookup('')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_username_invalid
|
34
|
+
VCR.use_cassette('user_lookup_invalid') do
|
35
|
+
assert_raises(Keybase::InputError, 'missing or invalid input. username: invalid name') do
|
36
|
+
@user = User.lookup('d8dw9sfu83u39229i9fewdsi0-fdsii-i')
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
if require 'simplecov'
|
2
|
+
SimpleCov.start do
|
3
|
+
add_filter '/test/'
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
require_relative '../lib/keybase'
|
8
|
+
EXAMPLE_USER_JSON = IO.read(File.expand_path('../fixtures/example_user.json', __FILE__))
|
9
|
+
EXAMPLE_USER = JSON.parse(EXAMPLE_USER_JSON)
|
10
|
+
EXAMPLE_DUMP_JSON = IO.read(File.expand_path('../fixtures/example_dump.json', __FILE__))
|
11
|
+
EXAMPLE_DUMP = JSON.parse(EXAMPLE_DUMP_JSON)
|
12
|
+
|
13
|
+
TEST_ENV = true
|
14
|
+
|
15
|
+
require 'rubygems'
|
16
|
+
gem "minitest"
|
17
|
+
require 'minitest/autorun'
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Keybase
|
2
|
+
require_relative '../../../test_helper'
|
3
|
+
|
4
|
+
class CryptoTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@passphrase = "passphrase"
|
7
|
+
@salt = "salt"
|
8
|
+
@key = "key"
|
9
|
+
@data = "data"
|
10
|
+
@random = SecureRandom.random_bytes(224).bytes
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_scrypt_passes_to_engine_and_truncates_result
|
14
|
+
args = lambda { |*args|
|
15
|
+
assert_equal @passphrase, args[0]
|
16
|
+
assert_equal [@salt].pack("H*"), args[1]
|
17
|
+
@random
|
18
|
+
}
|
19
|
+
SCrypt::Engine.stub(:scrypt, args) do
|
20
|
+
response = Crypto.scrypt(@passphrase, @salt)
|
21
|
+
assert_equal 32, response.size
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_hmac_sha512_passes_to_openssl
|
26
|
+
args = lambda { |_, key, data|
|
27
|
+
assert_equal @key, key
|
28
|
+
assert_equal Base64.decode64(@data), data
|
29
|
+
nil
|
30
|
+
}
|
31
|
+
OpenSSL::HMAC.stub(:hexdigest, args) do
|
32
|
+
Crypto.hmac_sha512(@key, @data)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_defines_scrypt_vars
|
37
|
+
assert defined?(Crypto::SCRYPT_VARS)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.hmac_sha512(key, data)
|
41
|
+
OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA512.new, key, data)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Keybase
|
2
|
+
require_relative '../../../test_helper'
|
3
|
+
|
4
|
+
class ErrorTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@status = {'code' => 100, 'fields' => {'username' => 'dsay7984yfhuragh4u3q9fR^&%^%'}, 'desc' => 'Invalid username'}
|
7
|
+
@unknown = {'code' => 1337, 'fields' => {'foo' => 'bar'}, 'desc' => 'baz'}
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_behaviour_with_known_error_code
|
11
|
+
assert_raises InputError do
|
12
|
+
begin
|
13
|
+
Error.raise_unless_successful(@status)
|
14
|
+
catch StandardError => e
|
15
|
+
assert_equal 'Invalid username. username: dsay7984yfhuragh4u3q9fR^&%^%', e.msg
|
16
|
+
raise
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_behaviour_with_unknown_error_code
|
22
|
+
assert_raises Keybase::Error do
|
23
|
+
begin
|
24
|
+
Error.raise_unless_successful(@unknown)
|
25
|
+
catch StandardError => e
|
26
|
+
assert_equal 'Error 1337: baz. foo: bar', e.msg
|
27
|
+
raise
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Keybase
|
2
|
+
|
3
|
+
require_relative '../../../../test_helper'
|
4
|
+
|
5
|
+
class DumpTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@dump = Dump.new(EXAMPLE_DUMP)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_unix_time_parsed_to_date
|
11
|
+
assert_equal "2014-02-24T18:46:31+00:00",
|
12
|
+
@dump.created_at.to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_dump_all
|
16
|
+
Request::Dump.stub :all, [{'dump_id' => 1, 'ctime' => 1393267591},
|
17
|
+
{'dump_id' => 2, 'ctime' => 1393267591}] do
|
18
|
+
dumps = Dump.all
|
19
|
+
assert_equal 1, dumps[0].id
|
20
|
+
assert_equal 2, dumps[1].id
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_dump_latest
|
25
|
+
Request::Dump.stub :latest, {'dump_id' => 1, 'ctime' => 1393267591} do
|
26
|
+
assert_equal 1, Dump.latest.id
|
27
|
+
assert_equal '2014-02-24T18:46:31+00:00', Dump.latest.created_at.to_s
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
module Keybase
|
2
|
+
|
3
|
+
require_relative '../../../../test_helper'
|
4
|
+
|
5
|
+
class UserTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@user = User.new(EXAMPLE_USER)
|
8
|
+
@username = 'foo'
|
9
|
+
@salt = 'salt'
|
10
|
+
@login_session = 'login_session'
|
11
|
+
@passphrase = 'passphrase'
|
12
|
+
@pwh = "secret"
|
13
|
+
@kid = 123
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_unix_times_parsed_to_dates_for_basics
|
17
|
+
assert_equal "2013-10-30T19:24:21+00:00",
|
18
|
+
@user.basics.created_at.to_s
|
19
|
+
assert_equal "2013-10-30T19:41:01+00:00",
|
20
|
+
@user.basics.updated_at.to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_unix_times_parsed_to_dates_for_profile
|
24
|
+
assert_equal "2013-10-31T19:22:19+00:00",
|
25
|
+
@user.profile.updated_at.to_s
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_unix_times_parsed_to_dates_for_public_keys
|
29
|
+
assert_equal "2013-11-05T21:00:12+00:00",
|
30
|
+
@user.public_keys.primary.created_at.to_s
|
31
|
+
assert_equal "2013-11-05T21:00:12+00:00",
|
32
|
+
@user.public_keys.primary.updated_at.to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_unix_times_parsed_to_dates_for_private_keys
|
36
|
+
assert_equal "2013-11-05T21:00:12+00:00",
|
37
|
+
@user.private_keys.primary.created_at.to_s
|
38
|
+
assert_equal "2013-11-05T21:00:12+00:00",
|
39
|
+
@user.private_keys.primary.updated_at.to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_emails_set_correctly
|
43
|
+
assert_equal EXAMPLE_USER['emails']['primary']['email'], @user.emails.primary.email
|
44
|
+
assert_equal true, @user.emails.primary.is_verified?
|
45
|
+
assert_equal EXAMPLE_USER['emails']['secondary']['email'], @user.emails.secondary.email
|
46
|
+
assert_equal false, @user.emails.secondary.is_verified?
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_user_lookup_loads_from_returned_hash
|
50
|
+
Request::User.stub :lookup, EXAMPLE_USER do
|
51
|
+
user = User.lookup('foo')
|
52
|
+
assert_equal EXAMPLE_USER['id'], user.id
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_object_loads_when_data_missing
|
57
|
+
@empty = User.new({})
|
58
|
+
assert_nil @empty.basics
|
59
|
+
assert_nil @empty.profile
|
60
|
+
assert_nil @empty.emails
|
61
|
+
assert_nil @empty.public_keys
|
62
|
+
assert_nil @empty.private_keys
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_login_calls_correct_methods
|
66
|
+
get_salt_args = lambda {|email_or_username|
|
67
|
+
assert_equal @username, email_or_username
|
68
|
+
[@salt, @login_session]
|
69
|
+
}
|
70
|
+
login_args = lambda {|email_or_username, hmac_pwh, login_session|
|
71
|
+
{'me' => EXAMPLE_USER}
|
72
|
+
}
|
73
|
+
scrypt_args = lambda {|passphrase, salt|
|
74
|
+
assert_equal @passphrase, passphrase
|
75
|
+
assert_equal @salt, salt
|
76
|
+
@pwh
|
77
|
+
}
|
78
|
+
hmac_sha512_args = lambda{|key, data|
|
79
|
+
assert_equal @login_session, data
|
80
|
+
assert_equal @pwh, key
|
81
|
+
}
|
82
|
+
Request::Root.stub(:get_salt_and_login_session, get_salt_args) do
|
83
|
+
Request::Root.stub(:login, login_args) do
|
84
|
+
Crypto.stub(:scrypt, scrypt_args) do
|
85
|
+
Crypto.stub(:hmac_sha512, hmac_sha512_args) do
|
86
|
+
me = User.login(@username, @passphrase)
|
87
|
+
assert_equal me.id, EXAMPLE_USER['id']
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_post_auth_calls_correct_methods
|
95
|
+
args = lambda {|username, sig|
|
96
|
+
assert_equal @user.basics.username, username
|
97
|
+
assert_equal 'foo', sig
|
98
|
+
'auth_token'
|
99
|
+
}
|
100
|
+
Request::Sig.stub(:post_auth, args) do
|
101
|
+
assert_equal 'auth_token', @user.post_auth('foo')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_add_public_key_calls_correct_methods
|
106
|
+
args = lambda {|params|
|
107
|
+
assert_equal 'foo', params[:public_key]
|
108
|
+
@kid
|
109
|
+
}
|
110
|
+
Request::Key.stub(:add, args) do
|
111
|
+
assert_equal @kid, @user.add_public_key('foo')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_add_private_key_calls_correct_methods
|
116
|
+
args = lambda {|params|
|
117
|
+
assert_equal 'foo', params[:private_key]
|
118
|
+
@kid
|
119
|
+
}
|
120
|
+
Request::Key.stub(:add, args) do
|
121
|
+
assert_equal @kid, @user.add_private_key('foo')
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_revoke_key_calls_correct_methods
|
126
|
+
args = lambda {|kid|
|
127
|
+
assert_equal @kid, kid
|
128
|
+
true
|
129
|
+
}
|
130
|
+
Request::Key.stub(:revoke, args) do
|
131
|
+
assert @user.revoke_key(@kid)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Keybase
|
2
|
+
require_relative '../../../../test_helper'
|
3
|
+
|
4
|
+
module Request
|
5
|
+
class RequestBaseTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@server_response = Object.new
|
8
|
+
@conn = Faraday.new
|
9
|
+
@response = OpenStruct.new(body: true)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_get_returns_keybase_response
|
13
|
+
Base.stub :conn, @conn do
|
14
|
+
@conn.stub :get, nil do
|
15
|
+
Keybase::Response.stub :new, @response do
|
16
|
+
assert Base.get('foo', {})
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_get_passes_params
|
23
|
+
@mock = MiniTest::Mock.new
|
24
|
+
@mock.expect(:get, @response, ['foo', { 'bar' => 'baz'}])
|
25
|
+
Base.stub :conn, @mock do
|
26
|
+
Keybase::Response.stub :new, @response do
|
27
|
+
Base.get('foo', 'bar' => 'baz')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
@mock.verify
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_post_returns_keybase_response
|
34
|
+
Base.stub :conn, @conn do
|
35
|
+
@conn.stub :post, nil do
|
36
|
+
Keybase::Response.stub :new, @response do
|
37
|
+
assert Base.post('foo', {})
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_post_passes_params
|
44
|
+
@mock = MiniTest::Mock.new
|
45
|
+
@mock.expect(:post, @response, ['foo', { 'bar' => 'baz'}])
|
46
|
+
Base.stub :conn, @mock do
|
47
|
+
Keybase::Response.stub :new, @response do
|
48
|
+
Base.post('foo', 'bar' => 'baz')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
@mock.verify
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_base_url_defined
|
55
|
+
assert defined?(API_BASE_URL)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../../../../../test_helper'
|
2
|
+
|
3
|
+
module Keybase
|
4
|
+
module Request
|
5
|
+
class DumpAllTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@response = { 'dumps' => [EXAMPLE_DUMP, EXAMPLE_DUMP] }
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_all_returns_dumps
|
11
|
+
Base.stub :get, @response do
|
12
|
+
assert_equal 2, Request::Dump.all.count
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../../../../../test_helper'
|
2
|
+
|
3
|
+
module Keybase
|
4
|
+
module Request
|
5
|
+
class DumpLatestTest < Minitest::Test
|
6
|
+
def setup
|
7
|
+
@response = { 'dump' => EXAMPLE_DUMP }
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_latest_returns_dump
|
11
|
+
Base.stub :get, @response do
|
12
|
+
assert_equal "472eba4586993583b395b00e", Request::Dump.latest['dump_id']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|