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.
Files changed (46) hide show
  1. data/.gitignore +4 -0
  2. data/.travis.yml +14 -0
  3. data/Gemfile +4 -0
  4. data/README.md +120 -0
  5. data/Rakefile +23 -0
  6. data/changelog.txt +4 -0
  7. data/heroku-api.gemspec +23 -0
  8. data/lib/heroku-api.rb +1 -0
  9. data/lib/heroku/api.rb +85 -0
  10. data/lib/heroku/api/addons.rb +47 -0
  11. data/lib/heroku/api/apps.rb +62 -0
  12. data/lib/heroku/api/collaborators.rb +33 -0
  13. data/lib/heroku/api/config_vars.rb +33 -0
  14. data/lib/heroku/api/domains.rb +33 -0
  15. data/lib/heroku/api/errors.rb +9 -0
  16. data/lib/heroku/api/keys.rb +42 -0
  17. data/lib/heroku/api/logs.rb +18 -0
  18. data/lib/heroku/api/mock.rb +176 -0
  19. data/lib/heroku/api/mock/addons.rb +153 -0
  20. data/lib/heroku/api/mock/apps.rb +184 -0
  21. data/lib/heroku/api/mock/cache/get_addons.json +1 -0
  22. data/lib/heroku/api/mock/collaborators.rb +55 -0
  23. data/lib/heroku/api/mock/config_vars.rb +46 -0
  24. data/lib/heroku/api/mock/domains.rb +71 -0
  25. data/lib/heroku/api/mock/keys.rb +46 -0
  26. data/lib/heroku/api/mock/logs.rb +20 -0
  27. data/lib/heroku/api/mock/processes.rb +191 -0
  28. data/lib/heroku/api/mock/releases.rb +124 -0
  29. data/lib/heroku/api/mock/stacks.rb +84 -0
  30. data/lib/heroku/api/processes.rb +77 -0
  31. data/lib/heroku/api/releases.rb +33 -0
  32. data/lib/heroku/api/stacks.rb +22 -0
  33. data/lib/heroku/api/vendor/okjson.rb +559 -0
  34. data/lib/heroku/api/version.rb +5 -0
  35. data/test/test_addons.rb +169 -0
  36. data/test/test_apps.rb +119 -0
  37. data/test/test_collaborators.rb +73 -0
  38. data/test/test_config_vars.rb +54 -0
  39. data/test/test_domains.rb +63 -0
  40. data/test/test_helper.rb +35 -0
  41. data/test/test_keys.rb +39 -0
  42. data/test/test_logs.rb +20 -0
  43. data/test/test_processes.rb +245 -0
  44. data/test/test_releases.rb +91 -0
  45. data/test/test_stacks.rb +49 -0
  46. metadata +134 -0
@@ -0,0 +1,5 @@
1
+ module Heroku
2
+ class API
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -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