kensa 1.1.4 → 1.2.0rc1

Sign up to get free protection for your applications and to get access to all the features.
data/test/sso_test.rb CHANGED
@@ -1,126 +1,72 @@
1
- require 'test/helper'
2
- require 'cgi'
3
-
1
+ $:.unshift(File.expand_path("../..",__FILE__))
2
+ require 'test/lib/dependencies'
4
3
  class SsoTest < Test::Unit::TestCase
5
- include Heroku::Kensa
6
4
 
7
- setup do
8
- @data = Manifest.new.skeleton.merge(:id => 1)
9
- @data['api']['test'] = 'http://localhost:4567/'
10
- @data['api']['sso_salt'] = 'SSO_SALT'
5
+ def setup
6
+ super
7
+ @user_id ||= manifest["user_id"] || 123
8
+ @time = Time.now.to_i
9
+ @params = { :timestamp => @time,
10
+ :token => make_token(@user_id, manifest['api']["sso_salt"], @time.to_s),
11
+ "nav-data" => "some-nav-data"
12
+ }
11
13
  end
12
14
 
13
- teardown { Timecop.return }
14
-
15
- def builds_full_url(env)
16
- url, query = @sso.full_url.split('?')
17
- data = CGI.parse(query)
18
-
19
-
20
- assert_equal "#{@data['api'][env]}heroku/resources/1", url
21
- assert_equal 'b6010f6fbb850887a396c2bc0ab23974003008f6', data['token'].first
22
- assert_equal '1262304000', data['timestamp'].first
23
- assert_equal 'username@example.com', data['user'].first
15
+ def sso_post?
16
+ manifest["api"]["test"].is_a?(Hash) &&
17
+ manifest["api"]["test"]["sso_url"]
24
18
  end
25
19
 
26
- context 'sso' do
27
- setup do
28
- Timecop.freeze Time.utc(2010, 1)
29
- @sso = Sso.new @data
30
- end
31
-
32
- test 'builds path' do
33
- assert_equal '/heroku/resources/1', @sso.path
34
- end
35
-
36
- test 'builds full url' do
37
- builds_full_url('test')
38
- end
39
-
40
- context 'with no "sso" field specified' do
41
- test "defaults to GET" do
42
- assert_equal @sso.full_url, @sso.sso_url
43
- end
20
+ def sso_url
21
+ if sso_post?
22
+ manifest["api"]["test"]["sso_url"].chomp("/")
23
+ else
24
+ "/heroku/resources"
44
25
  end
26
+ end
45
27
 
46
- context 'when sso method is GET' do
47
- setup do
48
- @data['api']['sso'] = 'GET'
49
- @sso = Sso.new(@data).start
50
- end
51
-
52
- test "#sso_url should be the #full_url" do
53
- assert_equal @sso.full_url, @sso.sso_url
54
- end
55
-
56
- test "#message is Opening <full_url>" do
57
- assert_equal "Opening #{@sso.full_url}", @sso.message
58
- end
28
+ def sso_login(params = @params, user_id = @user_id)
29
+ if sso_post?
30
+ post sso_url, params.merge(:id => user_id)
31
+ else
32
+ get "#{sso_url}/#{user_id}", params
59
33
  end
34
+ end
60
35
 
61
- context 'when sso method is POST' do
62
- setup do
63
- Timecop.freeze Time.utc(2010, 1)
64
- @data['api']['sso'] = 'post'
65
- end
66
-
67
- test "it starts the proxy server" do
68
- @sso = Sso.new(@data).start
69
- body = RestClient.get(@sso.sso_url)
70
-
71
- assert body.include? @sso.path
72
- assert body.include? 'b6010f6fbb850887a396c2bc0ab23974003008f6'
73
- assert body.include? '1262304000'
74
- assert body.include? @sso.url
75
- assert body.include? @sso.sample_nav_data
76
- end
77
-
78
- context "with the proxy working" do
79
- setup do
80
- any_instance_of(Sso, :run_proxy => false)
81
- @sso = Sso.new(@data).start
82
- end
83
-
84
- test "#sso_url should point to the proxy" do
85
- assert_equal "http://localhost:#{@sso.proxy_port}/", @sso.sso_url
86
- end
87
-
88
- test "#post_url contains url and path" do
89
- assert_equal "http://localhost:4567/heroku/resources/1/sso", @sso.post_url
90
- end
91
-
92
- test "#message is Posting <data> to <post_url> via proxy on port <proxy_port>" do
93
- assert_equal "POSTing #{@sso.query_data} to http://localhost:4567/heroku/resources/1/sso via proxy on port #{@sso.proxy_port}", @sso.message
94
- end
95
- end
96
- end
36
+ def test_validates_token
37
+ @params[:token] = "foo"
38
+ response = sso_login
39
+ assert_equal 403, response.code, "Signing in via SSO at /heroku/resources/:id must return a 403 if the token is invalid."
97
40
  end
98
41
 
99
- context 'sso without salt' do
100
- setup do
101
- @data['api'].delete 'sso_salt'
102
- @sso = Sso.new @data
103
- end
42
+ def test_validates_timestamp
43
+ @params[:timestamp] = (Time.now-60*3).to_i
44
+ @params[:token] = make_token(123, "SSO_SALT", @params[:timestamp].to_s)
45
+ response = sso_login
46
+ assert_equal 403, response.code, "Signing in via SSO at /heroku/resources/:id must return a 403 if the timestamp is expired."
104
47
 
105
- test 'builds full url' do
106
- expected = 'http://localhost:4567/heroku/resources/1'
48
+ @params[:timestamp] = "foo"
49
+ response = sso_login
50
+ assert_equal 403, response.code, "Signing in via SSO at /heroku/resources/:id must return a 403 if the timestamp is invalid."
51
+ end
107
52
 
108
- assert @sso.full_url.include?(expected)
109
- end
53
+ def test_logs_in
54
+ response = sso_login
55
+ assert response.code.to_s.match(/\A2/), "Signing in via SSO at /heroku/resources/:id must return a 2xx response if sign in was valid."
110
56
  end
111
57
 
112
- context 'sso in a specific environment' do
113
- setup do
114
- Timecop.freeze Time.utc(2010, 1)
115
- env = 'production'
116
- @data[:env] = env
117
- @data['api'][env] = 'http://localhost:7654/'
58
+ def test_creates_the_heroku_nav_data_cookie
59
+ response = sso_login
60
+ puts "Hello"
61
+ puts response.cookies.inspect
118
62
 
119
- @sso = Sso.new @data
120
- end
63
+ assert response.cookies, "SSO sign in should set the heroku-nav-data cookie to the value of the passed nav-data parameter."
64
+ assert_equal @params["nav-data"], response.cookies["heroku-nav-data"], "SSO sign in should set the heroku-nav-data cookie to the value of the passed nav-data parameter."
65
+ end
121
66
 
122
- test 'builds full url' do
123
- builds_full_url('production')
124
- end
67
+ def test_displays_the_heroku_layout
68
+ response = sso_login
69
+ document = Nokogiri::HTML.parse(response.body)
70
+ assert !document.search("div#heroku-header").empty?, "Logged in page should contain the Heroku header."
125
71
  end
126
72
  end
metadata CHANGED
@@ -1,220 +1,162 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: kensa
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 1
8
- - 4
9
- version: 1.1.4
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0rc1
5
+ prerelease: 5
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Blake Mizerany
13
9
  - Pedro Belo
14
10
  - Adam Wiggins
15
11
  - Chris Continanza
12
+ - Glenn Gillen
16
13
  autorequire:
17
14
  bindir: bin
18
15
  cert_chain: []
19
-
20
- date: 2011-08-22 00:00:00 -07:00
21
- default_executable: kensa
22
- dependencies:
23
- - !ruby/object:Gem::Dependency
24
- name: turn
25
- prerelease: false
26
- requirement: &id001 !ruby/object:Gem::Requirement
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- segments:
31
- - 0
32
- version: "0"
16
+ date: 2011-10-14 00:00:00.000000000Z
17
+ dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: json
20
+ requirement: &70119858551140 !ruby/object:Gem::Requirement
21
+ none: false
22
+ requirements:
23
+ - - ! '>='
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
33
26
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: contest
37
27
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- segments:
43
- - 0
44
- version: "0"
28
+ version_requirements: *70119858551140
29
+ - !ruby/object:Gem::Dependency
30
+ name: sinatra
31
+ requirement: &70119858550340 !ruby/object:Gem::Requirement
32
+ none: false
33
+ requirements:
34
+ - - ~>
35
+ - !ruby/object:Gem::Version
36
+ version: 1.2.6
45
37
  type: :development
46
- version_requirements: *id002
47
- - !ruby/object:Gem::Dependency
48
- name: timecop
49
38
  prerelease: false
50
- requirement: &id003 !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- segments:
55
- - 0
56
- - 3
57
- - 5
39
+ version_requirements: *70119858550340
40
+ - !ruby/object:Gem::Dependency
41
+ name: timecop
42
+ requirement: &70119858549300 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
58
47
  version: 0.3.5
59
48
  type: :development
60
- version_requirements: *id003
61
- - !ruby/object:Gem::Dependency
62
- name: sinatra
63
49
  prerelease: false
64
- requirement: &id004 !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- segments:
69
- - 0
70
- - 9
71
- version: "0.9"
50
+ version_requirements: *70119858549300
51
+ - !ruby/object:Gem::Dependency
52
+ name: rr
53
+ requirement: &70119858548460 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ version: 1.0.4
72
59
  type: :development
73
- version_requirements: *id004
74
- - !ruby/object:Gem::Dependency
75
- name: json
76
60
  prerelease: false
77
- requirement: &id005 !ruby/object:Gem::Requirement
78
- requirements:
79
- - - ">="
80
- - !ruby/object:Gem::Version
81
- segments:
82
- - 0
83
- version: "0"
61
+ version_requirements: *70119858548460
62
+ - !ruby/object:Gem::Dependency
63
+ name: artifice
64
+ requirement: &70119858547540 !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '0.6'
84
70
  type: :development
85
- version_requirements: *id005
86
- - !ruby/object:Gem::Dependency
87
- name: contest
88
71
  prerelease: false
89
- requirement: &id006 !ruby/object:Gem::Requirement
90
- requirements:
91
- - - ">="
92
- - !ruby/object:Gem::Version
93
- segments:
94
- - 0
95
- version: "0"
96
- type: :development
97
- version_requirements: *id006
98
- - !ruby/object:Gem::Dependency
72
+ version_requirements: *70119858547540
73
+ - !ruby/object:Gem::Dependency
99
74
  name: haml
100
- prerelease: false
101
- requirement: &id007 !ruby/object:Gem::Requirement
102
- requirements:
103
- - - ">="
104
- - !ruby/object:Gem::Version
105
- segments:
106
- - 0
107
- version: "0"
75
+ requirement: &70119858546680 !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ~>
79
+ - !ruby/object:Gem::Version
80
+ version: 3.1.3
108
81
  type: :development
109
- version_requirements: *id007
110
- - !ruby/object:Gem::Dependency
111
- name: jeweler
112
82
  prerelease: false
113
- requirement: &id008 !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- segments:
118
- - 0
119
- version: "0"
120
- type: :development
121
- version_requirements: *id008
122
- - !ruby/object:Gem::Dependency
123
- name: rr
83
+ version_requirements: *70119858546680
84
+ - !ruby/object:Gem::Dependency
85
+ name: test-unit
86
+ requirement: &70119858545920 !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ~>
90
+ - !ruby/object:Gem::Version
91
+ version: 1.2.3
92
+ type: :runtime
124
93
  prerelease: false
125
- requirement: &id009 !ruby/object:Gem::Requirement
126
- requirements:
127
- - - ">="
128
- - !ruby/object:Gem::Version
129
- segments:
130
- - 0
131
- version: "0"
132
- type: :development
133
- version_requirements: *id009
134
- - !ruby/object:Gem::Dependency
94
+ version_requirements: *70119858545920
95
+ - !ruby/object:Gem::Dependency
135
96
  name: rest-client
136
- prerelease: false
137
- requirement: &id010 !ruby/object:Gem::Requirement
138
- requirements:
139
- - - <
140
- - !ruby/object:Gem::Version
141
- segments:
142
- - 1
143
- - 7
144
- - 0
145
- version: 1.7.0
146
- - - ">="
147
- - !ruby/object:Gem::Version
148
- segments:
149
- - 1
150
- - 4
151
- - 0
152
- version: 1.4.0
97
+ requirement: &70119858545100 !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ~>
101
+ - !ruby/object:Gem::Version
102
+ version: 1.6.7
153
103
  type: :runtime
154
- version_requirements: *id010
155
- - !ruby/object:Gem::Dependency
156
- name: yajl-ruby
157
104
  prerelease: false
158
- requirement: &id011 !ruby/object:Gem::Requirement
159
- requirements:
105
+ version_requirements: *70119858545100
106
+ - !ruby/object:Gem::Dependency
107
+ name: yajl-ruby
108
+ requirement: &70119858544180 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
160
111
  - - ~>
161
- - !ruby/object:Gem::Version
162
- segments:
163
- - 0
164
- - 6
165
- version: "0.6"
112
+ - !ruby/object:Gem::Version
113
+ version: 0.8.3
166
114
  type: :runtime
167
- version_requirements: *id011
168
- - !ruby/object:Gem::Dependency
169
- name: term-ansicolor
170
115
  prerelease: false
171
- requirement: &id012 !ruby/object:Gem::Requirement
172
- requirements:
116
+ version_requirements: *70119858544180
117
+ - !ruby/object:Gem::Dependency
118
+ name: term-ansicolor
119
+ requirement: &70119858543480 !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
173
122
  - - ~>
174
- - !ruby/object:Gem::Version
175
- segments:
176
- - 1
177
- - 0
178
- version: "1.0"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.0.6
179
125
  type: :runtime
180
- version_requirements: *id012
181
- - !ruby/object:Gem::Dependency
182
- name: launchy
183
126
  prerelease: false
184
- requirement: &id013 !ruby/object:Gem::Requirement
185
- requirements:
186
- - - ">="
187
- - !ruby/object:Gem::Version
188
- segments:
189
- - 0
190
- - 3
191
- - 2
192
- version: 0.3.2
127
+ version_requirements: *70119858543480
128
+ - !ruby/object:Gem::Dependency
129
+ name: launchy
130
+ requirement: &70119858542700 !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ~>
134
+ - !ruby/object:Gem::Version
135
+ version: 2.0.5
193
136
  type: :runtime
194
- version_requirements: *id013
195
- - !ruby/object:Gem::Dependency
196
- name: mechanize
197
137
  prerelease: false
198
- requirement: &id014 !ruby/object:Gem::Requirement
199
- requirements:
138
+ version_requirements: *70119858542700
139
+ - !ruby/object:Gem::Dependency
140
+ name: mechanize
141
+ requirement: &70119858541620 !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
200
144
  - - ~>
201
- - !ruby/object:Gem::Version
202
- segments:
203
- - 1
204
- - 0
205
- - 0
145
+ - !ruby/object:Gem::Version
206
146
  version: 1.0.0
207
147
  type: :runtime
208
- version_requirements: *id014
209
- description: Kensa is a command-line tool to help add-on providers integrating their services with Heroku. It manages manifest files, and provides a TDD-like approach for programmers to test and develop their APIs.
210
- email: pedro@heroku.com
211
- executables:
148
+ prerelease: false
149
+ version_requirements: *70119858541620
150
+ description: Kensa is a command-line tool to help add-on providers integrating their
151
+ services with Heroku. It manages manifest files, and provides a TDD-like approach
152
+ for programmers to test and develop their APIs.
153
+ email: glenn@heroku.com
154
+ executables:
212
155
  - kensa
213
156
  extensions: []
214
-
215
- extra_rdoc_files:
216
- - README.md
217
- files:
157
+ extra_rdoc_files: []
158
+ files:
159
+ - .gitignore
218
160
  - Gemfile
219
161
  - Gemfile.lock
220
162
  - README.md
@@ -222,54 +164,63 @@ files:
222
164
  - bin/kensa
223
165
  - kensa.gemspec
224
166
  - lib/heroku/kensa.rb
225
- - lib/heroku/kensa/check.rb
226
167
  - lib/heroku/kensa/client.rb
227
168
  - lib/heroku/kensa/http.rb
228
169
  - lib/heroku/kensa/manifest.rb
229
170
  - lib/heroku/kensa/post_proxy.rb
230
171
  - lib/heroku/kensa/sso.rb
172
+ - lib/heroku/kensa/version.rb
231
173
  - set-env.sh
232
- - test/all_check_test.rb
233
- - test/deprovision_check_test.rb
174
+ - test/deprovision_test.rb
234
175
  - test/helper.rb
235
- - test/manifest_check_test.rb
176
+ - test/lib/dependencies.rb
177
+ - test/lib/formatter.rb
178
+ - test/lib/response.rb
179
+ - test/lib/test_case.rb
180
+ - test/manifest_generation_test.rb
236
181
  - test/manifest_test.rb
237
- - test/plan_change_check_test.rb
238
- - test/provision_check_test.rb
239
- - test/provision_response_check_test.rb
240
- - test/resources/runner.rb
241
- - test/resources/server.rb
242
- - test/sso_check_test.rb
182
+ - test/plan_change_test.rb
183
+ - test/provision_test.rb
184
+ - test/resources/provider_server.rb
185
+ - test/resources/views/index.haml
186
+ - test/sso_launch_test.rb
243
187
  - test/sso_test.rb
244
- has_rdoc: true
245
188
  homepage: http://provider.heroku.com/resources
246
189
  licenses: []
247
-
248
190
  post_install_message:
249
191
  rdoc_options: []
250
-
251
- require_paths:
192
+ require_paths:
252
193
  - lib
253
- required_ruby_version: !ruby/object:Gem::Requirement
254
- requirements:
255
- - - ">="
256
- - !ruby/object:Gem::Version
257
- segments:
258
- - 0
259
- version: "0"
260
- required_rubygems_version: !ruby/object:Gem::Requirement
261
- requirements:
262
- - - ">="
263
- - !ruby/object:Gem::Version
264
- segments:
265
- - 0
266
- version: "0"
194
+ required_ruby_version: !ruby/object:Gem::Requirement
195
+ none: false
196
+ requirements:
197
+ - - ! '>='
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ required_rubygems_version: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>'
204
+ - !ruby/object:Gem::Version
205
+ version: 1.3.1
267
206
  requirements: []
268
-
269
- rubyforge_project:
270
- rubygems_version: 1.3.6
207
+ rubyforge_project: kensa
208
+ rubygems_version: 1.8.10
271
209
  signing_key:
272
210
  specification_version: 3
273
211
  summary: Tool to help Heroku add-on providers integrating their services
274
- test_files: []
275
-
212
+ test_files:
213
+ - test/deprovision_test.rb
214
+ - test/helper.rb
215
+ - test/lib/dependencies.rb
216
+ - test/lib/formatter.rb
217
+ - test/lib/response.rb
218
+ - test/lib/test_case.rb
219
+ - test/manifest_generation_test.rb
220
+ - test/manifest_test.rb
221
+ - test/plan_change_test.rb
222
+ - test/provision_test.rb
223
+ - test/resources/provider_server.rb
224
+ - test/resources/views/index.haml
225
+ - test/sso_launch_test.rb
226
+ - test/sso_test.rb