heroku-api 0.1.0
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/.gitignore +4 -0
- data/.travis.yml +14 -0
- data/Gemfile +4 -0
- data/README.md +120 -0
- data/Rakefile +23 -0
- data/changelog.txt +4 -0
- data/heroku-api.gemspec +23 -0
- data/lib/heroku-api.rb +1 -0
- data/lib/heroku/api.rb +85 -0
- data/lib/heroku/api/addons.rb +47 -0
- data/lib/heroku/api/apps.rb +62 -0
- data/lib/heroku/api/collaborators.rb +33 -0
- data/lib/heroku/api/config_vars.rb +33 -0
- data/lib/heroku/api/domains.rb +33 -0
- data/lib/heroku/api/errors.rb +9 -0
- data/lib/heroku/api/keys.rb +42 -0
- data/lib/heroku/api/logs.rb +18 -0
- data/lib/heroku/api/mock.rb +176 -0
- data/lib/heroku/api/mock/addons.rb +153 -0
- data/lib/heroku/api/mock/apps.rb +184 -0
- data/lib/heroku/api/mock/cache/get_addons.json +1 -0
- data/lib/heroku/api/mock/collaborators.rb +55 -0
- data/lib/heroku/api/mock/config_vars.rb +46 -0
- data/lib/heroku/api/mock/domains.rb +71 -0
- data/lib/heroku/api/mock/keys.rb +46 -0
- data/lib/heroku/api/mock/logs.rb +20 -0
- data/lib/heroku/api/mock/processes.rb +191 -0
- data/lib/heroku/api/mock/releases.rb +124 -0
- data/lib/heroku/api/mock/stacks.rb +84 -0
- data/lib/heroku/api/processes.rb +77 -0
- data/lib/heroku/api/releases.rb +33 -0
- data/lib/heroku/api/stacks.rb +22 -0
- data/lib/heroku/api/vendor/okjson.rb +559 -0
- data/lib/heroku/api/version.rb +5 -0
- data/test/test_addons.rb +169 -0
- data/test/test_apps.rb +119 -0
- data/test/test_collaborators.rb +73 -0
- data/test/test_config_vars.rb +54 -0
- data/test/test_domains.rb +63 -0
- data/test/test_helper.rb +35 -0
- data/test/test_keys.rb +39 -0
- data/test/test_logs.rb +20 -0
- data/test/test_processes.rb +245 -0
- data/test/test_releases.rb +91 -0
- data/test/test_stacks.rb +49 -0
- metadata +134 -0
data/test/test_addons.rb
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/test_helper"
|
2
|
+
|
3
|
+
class TestAddons < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_delete_addon_addon_not_found
|
6
|
+
with_app do |app_data|
|
7
|
+
assert_raises(Heroku::API::Errors::Error) do
|
8
|
+
heroku.delete_addon(app_data['name'], random_name)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_delete_addon_addon_not_installed
|
14
|
+
with_app do |app_data|
|
15
|
+
assert_raises(Heroku::API::Errors::Error) do
|
16
|
+
heroku.delete_addon(app_data['name'], 'custom_domains:basic')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_delete_addon_app_not_found
|
22
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
23
|
+
heroku.delete_addon(random_name, 'logging:basic')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_delete_addon
|
28
|
+
with_app do |app_data|
|
29
|
+
heroku.post_addon(app_data['name'], 'custom_domains:basic')
|
30
|
+
response = heroku.delete_addon(app_data['name'], 'custom_domains:basic')
|
31
|
+
|
32
|
+
assert_equal(200, response.status)
|
33
|
+
assert_equal({
|
34
|
+
'message' => nil,
|
35
|
+
'price' => 'free',
|
36
|
+
'status' => 'Uninstalled'
|
37
|
+
}, response.body)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_get_addons
|
42
|
+
skip unless MOCK
|
43
|
+
response = heroku.get_addons
|
44
|
+
data = File.read("#{File.dirname(__FILE__)}/../lib/heroku/api/mock/cache/get_addons.json")
|
45
|
+
|
46
|
+
assert_equal(200, response.status)
|
47
|
+
assert_equal(Heroku::API::OkJson.decode(data), response.body)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_get_addons_with_app
|
51
|
+
with_app do |app_data|
|
52
|
+
response = heroku.get_addons(app_data['name'])
|
53
|
+
|
54
|
+
assert_equal(200, response.status)
|
55
|
+
assert_equal([{
|
56
|
+
'beta' => false,
|
57
|
+
'configured' => true,
|
58
|
+
'description' => 'Logging Basic',
|
59
|
+
'name' => 'logging:basic',
|
60
|
+
'url' => 'https://addons.heroku.com/addons/logging:basic',
|
61
|
+
'state' => 'public'
|
62
|
+
},
|
63
|
+
{
|
64
|
+
'beta' => false,
|
65
|
+
'configured' => true,
|
66
|
+
'description' => 'Shared Database 5MB',
|
67
|
+
'name' => 'shared-database:5mb',
|
68
|
+
'state' => 'public',
|
69
|
+
'url' => nil
|
70
|
+
}], response.body)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_get_addons_with_app_app_not_found
|
75
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
76
|
+
heroku.get_addons(random_name)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_post_addon
|
81
|
+
with_app do |app_data|
|
82
|
+
response = heroku.post_addon(app_data['name'], 'custom_domains:basic')
|
83
|
+
|
84
|
+
assert_equal(200, response.status)
|
85
|
+
assert_equal({
|
86
|
+
'message' => nil,
|
87
|
+
'price' => 'free',
|
88
|
+
'status' => 'Installed'
|
89
|
+
}, response.body)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_post_addon_addon_already_installed
|
94
|
+
with_app do |app_data|
|
95
|
+
assert_raises(Heroku::API::Errors::Error) do
|
96
|
+
heroku.post_addon(app_data['name'], 'logging:basic')
|
97
|
+
heroku.post_addon(app_data['name'], 'logging:basic')
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_post_addon_addon_type_already_installed
|
103
|
+
with_app do |app_data|
|
104
|
+
assert_raises(Heroku::API::Errors::Error) do
|
105
|
+
heroku.post_addon(app_data['name'], 'logging:basic')
|
106
|
+
heroku.post_addon(app_data['name'], 'logging:expanded')
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_post_addon_addon_not_found
|
112
|
+
with_app do |app_data|
|
113
|
+
assert_raises(Heroku::API::Errors::Error) do
|
114
|
+
heroku.post_addon(app_data['name'], random_name)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_post_addon_app_not_found
|
120
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
121
|
+
heroku.post_addon(random_name, 'shared-database:5mb')
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_put_addon
|
126
|
+
with_app do |app_data|
|
127
|
+
response = heroku.put_addon(app_data['name'], 'logging:expanded')
|
128
|
+
|
129
|
+
assert_equal(200, response.status)
|
130
|
+
assert_equal({
|
131
|
+
'message' => nil,
|
132
|
+
'price' => 'free',
|
133
|
+
'status' => 'Updated'
|
134
|
+
}, response.body)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_put_addon_addon_already_installed
|
139
|
+
with_app do |app_data|
|
140
|
+
assert_raises(Heroku::API::Errors::Error) do
|
141
|
+
heroku.post_addon(app_data['name'], 'logging:basic')
|
142
|
+
heroku.put_addon(app_data['name'], 'logging:basic')
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_put_addon_addon_not_found
|
148
|
+
with_app do |app_data|
|
149
|
+
assert_raises(Heroku::API::Errors::Error) do
|
150
|
+
heroku.put_addon(app_data['name'], random_name)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_put_addon_addon_type_not_installed
|
156
|
+
with_app do |app_data|
|
157
|
+
assert_raises(Heroku::API::Errors::Error) do
|
158
|
+
heroku.put_addon(app_data['name'], 'releases:basic')
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_put_addon_app_not_found
|
164
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
165
|
+
heroku.put_addon(random_name, 'logging:basic')
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
data/test/test_apps.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/test_helper"
|
2
|
+
|
3
|
+
class TestApps < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_delete_app
|
6
|
+
with_app do |app_data|
|
7
|
+
response = heroku.delete_app(app_data['name'])
|
8
|
+
assert_equal({}, response.body)
|
9
|
+
assert_equal(200, response.status)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_delete_app_not_found
|
14
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
15
|
+
heroku.delete_app(random_name)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_get_apps
|
20
|
+
with_app do |app_data|
|
21
|
+
response = heroku.get_apps
|
22
|
+
assert_equal(200, response.status)
|
23
|
+
assert(response.body.detect {|app| app['name'] == app_data['name']})
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_get_app
|
28
|
+
with_app do |app_data|
|
29
|
+
response = heroku.get_app(app_data['name'])
|
30
|
+
assert_equal(200, response.status)
|
31
|
+
assert_equal(app_data['name'], response.body['name'])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_get_app_not_found
|
36
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
37
|
+
heroku.get_app(random_name)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_post_app
|
42
|
+
response = heroku.post_app
|
43
|
+
|
44
|
+
assert_equal(202, response.status)
|
45
|
+
|
46
|
+
heroku.delete_app(response.body['name'])
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_post_app_with_name
|
50
|
+
name = random_name
|
51
|
+
response = heroku.post_app('name' => name)
|
52
|
+
|
53
|
+
assert_equal(202, response.status)
|
54
|
+
assert_equal(name, response.body['name'])
|
55
|
+
|
56
|
+
heroku.delete_app(name)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_post_app_with_duplicate_name
|
60
|
+
name = random_name
|
61
|
+
response = heroku.post_app('name' => name)
|
62
|
+
|
63
|
+
assert_raises(Heroku::API::Errors::Error) do
|
64
|
+
heroku.post_app('name' => name)
|
65
|
+
end
|
66
|
+
|
67
|
+
heroku.delete_app(name)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_post_app_with_stack
|
71
|
+
response = heroku.post_app('stack' => 'cedar')
|
72
|
+
|
73
|
+
assert_equal(202, response.status)
|
74
|
+
assert_equal('cedar', response.body['stack'])
|
75
|
+
|
76
|
+
heroku.delete_app(response.body['name'])
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_put_app_not_found
|
80
|
+
name = random_name
|
81
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
82
|
+
heroku.put_app(name, 'name' => random_name)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_put_app_with_name
|
87
|
+
with_app do |app_data|
|
88
|
+
new_name = random_name
|
89
|
+
response = heroku.put_app(app_data['name'], 'name' => new_name)
|
90
|
+
|
91
|
+
assert_equal(200, response.status)
|
92
|
+
assert_equal({'name' => new_name}, response.body)
|
93
|
+
|
94
|
+
heroku.delete_app(new_name)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_put_app_with_transfer_owner_non_collaborator
|
99
|
+
with_app do |app_data|
|
100
|
+
assert_raises(Heroku::API::Errors::Error) do
|
101
|
+
heroku.put_app(app_data['name'], 'transfer_owner' => random_email_address)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_put_app_with_transfer_owner
|
107
|
+
with_app do |app_data|
|
108
|
+
email_address = 'wesley+heroku.rb@heroku.com'
|
109
|
+
heroku.post_collaborator(app_data['name'], email_address)
|
110
|
+
response = heroku.put_app(app_data['name'], 'transfer_owner' => email_address)
|
111
|
+
|
112
|
+
assert_equal(200, response.status)
|
113
|
+
assert_equal({'name' => app_data['name']}, response.body)
|
114
|
+
|
115
|
+
heroku.delete_collaborator(app_data['name'], email_address)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/test_helper"
|
2
|
+
|
3
|
+
class TestCollaborators < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_delete_collaborator
|
6
|
+
with_app do |app_data|
|
7
|
+
email_address = 'wesley+heroku.rb@heroku.com'
|
8
|
+
heroku.post_collaborator(app_data['name'], email_address)
|
9
|
+
|
10
|
+
response = heroku.delete_collaborator(app_data['name'], email_address)
|
11
|
+
|
12
|
+
assert_equal(200, response.status)
|
13
|
+
assert_equal(
|
14
|
+
"#{email_address} has been removed as collaborator on #{app_data['name']}",
|
15
|
+
response.body
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_delete_collaborator_app_not_found
|
21
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
22
|
+
heroku.delete_collaborator(random_name, random_email_address)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_delete_collaborator_user_not_found
|
27
|
+
with_app do |app_data|
|
28
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
29
|
+
heroku.delete_collaborator(app_data['name'], random_email_address)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_get_collaborators
|
35
|
+
with_app do |app_data|
|
36
|
+
response = heroku.get_collaborators(app_data['name'])
|
37
|
+
|
38
|
+
assert_equal(200, response.status)
|
39
|
+
assert_equal(
|
40
|
+
[{'access' => 'edit', 'email' => app_data['owner_email']}],
|
41
|
+
response.body
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_get_collaborators_app_not_found
|
47
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
48
|
+
heroku.get_collaborators(random_name)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_post_collaborator
|
53
|
+
with_app do |app_data|
|
54
|
+
email_address = 'wesley+heroku.rb@heroku.com'
|
55
|
+
response = heroku.post_collaborator(app_data['name'], email_address)
|
56
|
+
|
57
|
+
assert_equal(200, response.status)
|
58
|
+
assert_equal(
|
59
|
+
"#{email_address} added as a collaborator on #{app_data['name']}.",
|
60
|
+
response.body
|
61
|
+
)
|
62
|
+
|
63
|
+
heroku.delete_collaborator(app_data['name'], email_address)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_post_collaborator_app_not_found
|
68
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
69
|
+
heroku.post_collaborator(random_name, random_email_address)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/test_helper"
|
2
|
+
|
3
|
+
class TestConfigVars < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_delete_app_config_var
|
6
|
+
with_app('stack' => 'cedar') do |app_data|
|
7
|
+
heroku.put_config_vars(app_data['name'], {'KEY' => 'value'})
|
8
|
+
|
9
|
+
response = heroku.delete_config_var(app_data['name'], 'KEY')
|
10
|
+
|
11
|
+
assert_equal(200, response.status)
|
12
|
+
assert_equal({}, response.body)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_delete_app_config_var_app_not_found
|
17
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
18
|
+
heroku.delete_config_var(random_name, 'key')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_get_app_config_vars
|
23
|
+
with_app('stack' => 'cedar') do |app_data|
|
24
|
+
response = heroku.get_config_vars(app_data['name'])
|
25
|
+
|
26
|
+
assert_equal(200, response.status)
|
27
|
+
assert_equal({}, response.body)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_get_app_config_vars_app_not_found
|
32
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
33
|
+
heroku.get_config_vars(random_name)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_put_app_config_vars
|
38
|
+
with_app('stack' => 'cedar') do |app_data|
|
39
|
+
response = heroku.put_config_vars(app_data['name'], {'KEY' => 'value'})
|
40
|
+
|
41
|
+
assert_equal(200, response.status)
|
42
|
+
assert_equal({'KEY' => 'value'}, response.body)
|
43
|
+
|
44
|
+
heroku.delete_config_var(app_data['name'], 'KEY')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_put_app_config_vars_app_not_found
|
49
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
50
|
+
heroku.put_config_vars(random_name, {'KEY' => 'value'})
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/test_helper"
|
2
|
+
|
3
|
+
class TestDomains < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_delete_domain_app_not_found
|
6
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
7
|
+
heroku.delete_domain(random_name, 'example.com')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_delete_domain
|
12
|
+
with_app do |app_data|
|
13
|
+
heroku.post_addon(app_data['name'], 'custom_domains:basic')
|
14
|
+
heroku.post_domain(app_data['name'], 'example.com')
|
15
|
+
response = heroku.delete_domain(app_data['name'], 'example.com')
|
16
|
+
|
17
|
+
assert_equal(200, response.status)
|
18
|
+
assert_equal({}, response.body)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_get_domains
|
23
|
+
with_app do |app_data|
|
24
|
+
response = heroku.get_domains(app_data['name'])
|
25
|
+
|
26
|
+
assert_equal(200, response.status)
|
27
|
+
assert_equal([], response.body)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_get_domains_app_not_found
|
32
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
33
|
+
heroku.get_domains(random_name)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_post_domain
|
38
|
+
with_app do |app_data|
|
39
|
+
heroku.post_addon(app_data['name'], 'custom_domains:basic')
|
40
|
+
response = heroku.post_domain(app_data['name'], 'example.com')
|
41
|
+
|
42
|
+
assert_equal(201, response.status)
|
43
|
+
assert_equal({'domain' => 'example.com'}, response.body)
|
44
|
+
|
45
|
+
heroku.delete_domain(app_data['name'], 'example.com')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_post_domain_addon_not_installed
|
50
|
+
with_app do |app_data|
|
51
|
+
assert_raises(Heroku::API::Errors::Error) do
|
52
|
+
heroku.post_domain(app_data['name'], 'example.com')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_post_domain_app_not_found
|
58
|
+
assert_raises(Heroku::API::Errors::NotFound) do
|
59
|
+
heroku.post_domain(random_name, 'example.com')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|