kensa 1.1.4 → 1.2.0rc1
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 +5 -0
- data/Gemfile +4 -7
- data/Gemfile.lock +59 -23
- data/README.md +1 -1
- data/Rakefile +6 -33
- data/kensa.gemspec +26 -98
- data/lib/heroku/kensa/client.rb +25 -5
- data/lib/heroku/kensa/manifest.rb +9 -3
- data/lib/heroku/kensa/sso.rb +24 -14
- data/lib/heroku/kensa/version.rb +6 -0
- data/lib/heroku/kensa.rb +10 -6
- data/test/deprovision_test.rb +30 -0
- data/test/helper.rb +11 -44
- data/test/lib/dependencies.rb +8 -0
- data/test/lib/formatter.rb +85 -0
- data/test/lib/response.rb +6 -0
- data/test/lib/test_case.rb +56 -0
- data/test/manifest_generation_test.rb +32 -0
- data/test/manifest_test.rb +36 -21
- data/test/plan_change_test.rb +30 -0
- data/test/provision_test.rb +84 -0
- data/test/resources/provider_server.rb +82 -0
- data/test/resources/views/index.haml +6 -0
- data/test/sso_launch_test.rb +130 -0
- data/test/sso_test.rb +52 -106
- metadata +161 -210
- data/lib/heroku/kensa/check.rb +0 -485
- data/test/all_check_test.rb +0 -25
- data/test/deprovision_check_test.rb +0 -36
- data/test/manifest_check_test.rb +0 -79
- data/test/plan_change_check_test.rb +0 -27
- data/test/provision_check_test.rb +0 -43
- data/test/provision_response_check_test.rb +0 -72
- data/test/resources/runner.rb +0 -1
- data/test/resources/server.rb +0 -207
- data/test/sso_check_test.rb +0 -59
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/unit/ui/console/testrunner'
|
3
|
+
|
4
|
+
def format_kensa_test_name(name)
|
5
|
+
name.sub(/\Atest_/,"").match(/\A([^\(]*)/)[1].gsub("_", " ")
|
6
|
+
end
|
7
|
+
|
8
|
+
module Test
|
9
|
+
module Unit
|
10
|
+
class TestCase
|
11
|
+
alias_method :add_error_with_connection_exception, :add_error
|
12
|
+
alias_method :add_failure_with_connection_exception, :add_failure
|
13
|
+
|
14
|
+
private
|
15
|
+
def add_error(exception)
|
16
|
+
if exception.class == Errno::ECONNREFUSED
|
17
|
+
@test_passed = false
|
18
|
+
message = "Unable to connect to your API."
|
19
|
+
@_result.add_failure(Failure.new(name, filter_backtrace(caller()), message))
|
20
|
+
else
|
21
|
+
add_error_with_connection_exception(exception)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Failure
|
27
|
+
def long_display
|
28
|
+
name = format_kensa_test_name(@test_name)
|
29
|
+
"#{name} - FAILED: #@message"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Error
|
34
|
+
def long_display
|
35
|
+
backtrace = filter_backtrace(@exception.backtrace).join("\n ")
|
36
|
+
name = format_kensa_test_name(@test_name)
|
37
|
+
"#{@exception.class.name} in #{name}:\n#{message}\n #{backtrace}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
module UI
|
42
|
+
module Console
|
43
|
+
class TestRunner
|
44
|
+
|
45
|
+
alias_method :test_started_old, :test_started
|
46
|
+
|
47
|
+
def add_fault(fault)
|
48
|
+
@faults << fault
|
49
|
+
@already_outputted = true
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_started(name)
|
53
|
+
if name =~ /\((.*)::([^\)]*)/
|
54
|
+
ctx, should = [$1, $2]
|
55
|
+
end
|
56
|
+
unless ctx.nil? or should.nil?
|
57
|
+
if ctx != @ctx
|
58
|
+
nl
|
59
|
+
output("#{ctx}:")
|
60
|
+
end
|
61
|
+
@ctx = ctx
|
62
|
+
@current_test_text = " ==> #{should}"
|
63
|
+
else
|
64
|
+
test_started_old(name)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_finished(name)
|
69
|
+
@current_test_text = name.sub(/\Atest_/,"").match(/\A([^\(]*)/)[1].gsub("_", " ")
|
70
|
+
if fault = @faults.find {|f| f.test_name == name}
|
71
|
+
fault_type = fault.is_a?(Test::Unit::Failure) ? "FAILED" : "ERROR!"
|
72
|
+
# NOTE -- Concatenation because "\e[0m]" does funky stuff.
|
73
|
+
output("[\e[0;31m#{fault_type}\e[0m" + "] #{@current_test_text}.")
|
74
|
+
else
|
75
|
+
output("[ \e[0;32mOK\e[0m ] #{@current_test_text}.")
|
76
|
+
end
|
77
|
+
@already_outputted = false
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class Test::Unit::TestCase
|
2
|
+
def make_token(id, salt, timestamp)
|
3
|
+
Digest::SHA1.hexdigest([id, salt, timestamp].join(':'))
|
4
|
+
end
|
5
|
+
|
6
|
+
def provider_request(meth, path, params = {}, auth_credentials = nil)
|
7
|
+
if auth_credentials.nil?
|
8
|
+
auth_credentials = [manifest["id"], manifest["api"]["password"]]
|
9
|
+
end
|
10
|
+
if path =~ /http/
|
11
|
+
uri = URI.parse(path)
|
12
|
+
else
|
13
|
+
uri = URI.parse(base_url)
|
14
|
+
uri.path = path
|
15
|
+
end
|
16
|
+
if auth_credentials
|
17
|
+
uri.userinfo = auth_credentials
|
18
|
+
end
|
19
|
+
opts = meth == :get ? { :params => params } : params
|
20
|
+
response = RestClient.send(meth, "#{uri.to_s}", opts)
|
21
|
+
Response.new(response.code, response.body, response.cookies)
|
22
|
+
rescue RestClient::Forbidden
|
23
|
+
Response.new(403)
|
24
|
+
rescue RestClient::Unauthorized
|
25
|
+
Response.new(401)
|
26
|
+
end
|
27
|
+
|
28
|
+
def get(path, params = {})
|
29
|
+
provider_request(:get, path, params, auth = false)
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete(path, auth_credentials = nil)
|
33
|
+
provider_request(:delete, path, params = nil, auth_credentials)
|
34
|
+
end
|
35
|
+
|
36
|
+
def post(path, params = {}, auth_credentials = nil)
|
37
|
+
provider_request(:post, path, params, auth_credentials)
|
38
|
+
end
|
39
|
+
|
40
|
+
def put(path, params = {}, auth_credentials = nil)
|
41
|
+
provider_request(:put, path, params, auth_credentials)
|
42
|
+
end
|
43
|
+
|
44
|
+
def manifest
|
45
|
+
return @manifest if @manifest
|
46
|
+
@manifest ||= $manifest || Heroku::Kensa::Manifest.new.skeleton
|
47
|
+
end
|
48
|
+
|
49
|
+
def base_url
|
50
|
+
if manifest["api"]["test"].is_a?(Hash)
|
51
|
+
manifest["api"]["test"]["base_url"].chomp("/")
|
52
|
+
else
|
53
|
+
manifest["api"]["test"].chomp("/")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
$:.unshift(File.expand_path("../..",__FILE__))
|
2
|
+
require 'test/helper'
|
3
|
+
class ManifestGenerationTest < Test::Unit::TestCase
|
4
|
+
include Heroku::Kensa
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
@manifest = Manifest.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_generates_a_new_sso_salt_every_time
|
12
|
+
assert @manifest.skeleton['api']['sso_salt'] != Manifest.new.skeleton['api']['sso_salt']
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_generates_a_new_password_every_time
|
16
|
+
assert @manifest.skeleton['api']['password'] != Manifest.new.skeleton['api']['password']
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class ManifestGenerationWithoutSSOTest < Test::Unit::TestCase
|
21
|
+
include Heroku::Kensa
|
22
|
+
|
23
|
+
def setup
|
24
|
+
super
|
25
|
+
options = { :sso => false }
|
26
|
+
@manifest = Manifest.new 'test.txt', options
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_exclude_sso_salt
|
30
|
+
assert_nil @manifest.skeleton['api']['sso_salt']
|
31
|
+
end
|
32
|
+
end
|
data/test/manifest_test.rb
CHANGED
@@ -1,36 +1,51 @@
|
|
1
|
+
$:.unshift(File.expand_path("../..",__FILE__))
|
1
2
|
require 'test/helper'
|
2
|
-
|
3
3
|
class ManifestTest < Test::Unit::TestCase
|
4
|
-
include Heroku::Kensa
|
5
4
|
|
6
|
-
|
7
|
-
|
5
|
+
def test_has_an_id
|
6
|
+
assert manifest["id"], "Manifest needs to specify the ID of the add-on."
|
7
|
+
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
def test_has_a_hash_of_api_settings
|
10
|
+
assert manifest["api"], "Manifest needs to contain a Hash of API settings."
|
11
|
+
assert manifest["api"].is_a?(Hash), "Manifest needs to contain a Hash of API settings."
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
def test_api_has_a_password
|
15
|
+
assert manifest["api"]["password"], "Manifest must define a password within the API settings."
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
def test_api_contains_test
|
19
|
+
assert manifest["api"]["test"], "Manifest must define a test environment with the API settings."
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_api_contains_production
|
23
|
+
assert manifest["api"]["production"], "Manifest must define a production environment with the API settings."
|
24
|
+
end
|
20
25
|
|
21
|
-
|
22
|
-
|
26
|
+
def test_api_contains_production_of_https
|
27
|
+
if manifest["api"]["production"].is_a?(Hash)
|
28
|
+
url = manifest["api"]["production"]["base_url"]
|
29
|
+
else
|
30
|
+
url = manifest["api"]["production"]
|
23
31
|
end
|
32
|
+
assert url.match(%r{\Ahttps://}), "Production environment must communicate over HTTPS."
|
24
33
|
end
|
25
34
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@manifest = Manifest.new 'test.txt', options
|
35
|
+
def test_all_config_vars_are_in_upper_case
|
36
|
+
manifest["api"]["config_vars"].each do |var|
|
37
|
+
assert_equal var.upcase, var, "All config vars must be uppercase, #{var} is not."
|
30
38
|
end
|
39
|
+
end
|
31
40
|
|
32
|
-
|
33
|
-
|
41
|
+
def test_assert_config_var_prefixes_match_addon_id
|
42
|
+
id = manifest["id"].upcase.gsub("-", "_")
|
43
|
+
manifest["api"]["config_vars"].each do |var|
|
44
|
+
assert var.match(%r{\A#{id}_}), "All config vars must be prefixed with the add-on ID (#{id}), #{var} is not."
|
34
45
|
end
|
35
46
|
end
|
47
|
+
|
48
|
+
def test_username_is_deprecated
|
49
|
+
assert !manifest["api"]["username"], "Username has been deprecated."
|
50
|
+
end
|
36
51
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
$:.unshift(File.expand_path("../..",__FILE__))
|
2
|
+
require 'test/lib/dependencies'
|
3
|
+
class PlanChangeTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@params = { :plan => "new_plan" }
|
8
|
+
end
|
9
|
+
|
10
|
+
def plan_change(auth = nil, params = @params)
|
11
|
+
response = put "/heroku/resources/123", params, auth
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_working_plan_change_call
|
15
|
+
response = plan_change
|
16
|
+
assert_equal 200, response.code, "Expected a 200 response code on successful plan change."
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_detects_missing_auth
|
20
|
+
response = plan_change(auth = false)
|
21
|
+
assert_equal 401, response.code, "Provisioning request should require authentication."
|
22
|
+
|
23
|
+
response = plan_change(auth = [manifest["id"]+"a", manifest["api"]["password"]])
|
24
|
+
assert_equal 401, response.code, "Provisioning request appears to allow any username, should require '#{manifest["id"]}'."
|
25
|
+
|
26
|
+
response = plan_change(auth = [manifest["id"], manifest["api"]["password"]+"a"])
|
27
|
+
assert_equal 401, response.code, "Provisioning request appears to allow any password, should require '#{manifest["api"]["password"]}'."
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
$:.unshift(File.expand_path("../..",__FILE__))
|
2
|
+
require 'test/lib/dependencies'
|
3
|
+
class ProvisionTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@params = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def provision(auth = nil, params = @params)
|
11
|
+
post "/heroku/resources", params, auth
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_working_provision_call
|
15
|
+
response = provision
|
16
|
+
assert_equal 201, response.code, "Expects a 201 - Created response/status code when successfully provisioned."
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_allows_the_definition_of_a_custom_provisioning_endpoint
|
20
|
+
#Artifice.activate_with(KensaServer.new)
|
21
|
+
#@data['api']['test'] = {
|
22
|
+
# "base_url" => "https://example.org/providers/provision",
|
23
|
+
# "sso_url" => "https://example.org/sso"
|
24
|
+
#}
|
25
|
+
#assert_valid
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_expects_a_valid_json_response
|
29
|
+
response = provision
|
30
|
+
assert response.json_body, "Expects a valid JSON object as response body."
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_detects_missing_id
|
34
|
+
response = provision
|
35
|
+
assert response.json_body["id"], "Expects JSON response to contain the Provider's unique ID for this app."
|
36
|
+
assert response.json_body["id"].to_s.strip != "", "Expects JSON response to contain the Provider's unique ID for this app."
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_provides_app_config
|
40
|
+
response = provision
|
41
|
+
assert response.json_body["config"].is_a?(Hash), "Expects JSON response to contain a hash of config variables."
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_all_config_values_are_strings
|
45
|
+
response = provision
|
46
|
+
response.json_body["config"].each do |k,v|
|
47
|
+
assert k.is_a?(String), "Expect all config names to be strings ('#{k}' is not)."
|
48
|
+
assert v.is_a?(String), "Expect all config values to be strings ('#{v}' is not)."
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_all_config_vars_are_defined_in_the_manifest
|
53
|
+
response = provision
|
54
|
+
response.json_body["config"].each do |k,v|
|
55
|
+
assert manifest["api"]["config_vars"].include?(k), "Only config vars defined in the manfiest can be set ('#{k}' is not)."
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_all_config_url_values_are_valid
|
60
|
+
response = provision
|
61
|
+
response.json_body["config"].each do |k,v|
|
62
|
+
next unless k =~ /_URL\z/
|
63
|
+
begin
|
64
|
+
uri = URI.parse(v)
|
65
|
+
assert uri.host, "#{v} is not a valid URI - missing host"
|
66
|
+
assert uri.scheme, "#{v} is not a valid URI - missing scheme"
|
67
|
+
rescue URI::InvalidURIError
|
68
|
+
assert false, "#{v} is not a valud URI"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_detects_missing_auth
|
74
|
+
response = provision(auth = false)
|
75
|
+
assert_equal 401, response.code, "Provisioning request should require authentication."
|
76
|
+
|
77
|
+
response = provision(auth = [manifest["id"]+"a", manifest["api"]["password"]])
|
78
|
+
assert_equal 401, response.code, "Provisioning request appears to allow any username, should require '#{manifest["id"]}'."
|
79
|
+
|
80
|
+
response = provision(auth = [manifest["id"], manifest["api"]["password"]+"a"])
|
81
|
+
assert_equal 401, response.code, "Provisioning request appears to allow any password, should require '#{manifest["api"]["password"]}'."
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class ProviderServer < Sinatra::Base
|
5
|
+
set :views, File.dirname(__FILE__) + "/views"
|
6
|
+
|
7
|
+
def initialize(manifest = nil)
|
8
|
+
@manifest = manifest
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
helpers do
|
13
|
+
def unauthorized!(status=403)
|
14
|
+
halt status, "Not authorized\n"
|
15
|
+
end
|
16
|
+
|
17
|
+
def check_timestamp!
|
18
|
+
unauthorized! if params[:timestamp].to_i < (Time.now-60*2).to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
def check_token!
|
22
|
+
salt = @manifest && @manifest["sso_salt"]
|
23
|
+
token = Digest::SHA1.hexdigest([params[:id], salt, params[:timestamp]].join(':'))
|
24
|
+
unauthorized! if params[:token] != token
|
25
|
+
end
|
26
|
+
|
27
|
+
def authenticate!
|
28
|
+
unless auth_heroku?
|
29
|
+
response['WWW-Authenticate'] = %(Basic realm="Kensa Test Server")
|
30
|
+
unauthorized!(401)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def auth_heroku?
|
35
|
+
auth = Rack::Auth::Basic::Request.new(request.env)
|
36
|
+
return false unless auth.provided? && auth.basic? && auth.credentials
|
37
|
+
if @manifest
|
38
|
+
auth.credentials == [@manifest["id"], @manifest["api"]["password"]]
|
39
|
+
else
|
40
|
+
auth.credentials == ['myaddon', 'secret']
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
delete '/heroku/resources/:id' do
|
46
|
+
authenticate!
|
47
|
+
status 200
|
48
|
+
end
|
49
|
+
|
50
|
+
put '/heroku/resources/:id' do
|
51
|
+
authenticate!
|
52
|
+
status 200
|
53
|
+
end
|
54
|
+
|
55
|
+
post '/heroku/resources' do
|
56
|
+
authenticate!
|
57
|
+
status 201
|
58
|
+
{ "id" => 52343.to_s,
|
59
|
+
"config" => {
|
60
|
+
"MYADDON_USER" => "1",
|
61
|
+
"MYADDON_URL" => "http://host.example.org/"
|
62
|
+
}
|
63
|
+
}.to_json
|
64
|
+
end
|
65
|
+
|
66
|
+
get '/heroku/resources/:id' do
|
67
|
+
check_timestamp!
|
68
|
+
check_token!
|
69
|
+
response.set_cookie('heroku-nav-data', params['nav-data'])
|
70
|
+
session[:heroku] = true
|
71
|
+
haml :index
|
72
|
+
end
|
73
|
+
|
74
|
+
post '/sso/login' do
|
75
|
+
check_timestamp!
|
76
|
+
check_token!
|
77
|
+
response.set_cookie('heroku-nav-data', params['nav-data'])
|
78
|
+
session[:heroku] = true
|
79
|
+
haml :index
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
$:.unshift(File.expand_path("../..",__FILE__))
|
2
|
+
require 'test/helper'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
module SsoSetupActions
|
6
|
+
include Heroku::Kensa
|
7
|
+
|
8
|
+
def sso_setup
|
9
|
+
Timecop.freeze Time.utc(2010, 1)
|
10
|
+
@data = Manifest.new.skeleton.merge(:id => 1)
|
11
|
+
@data['api']['test'] = 'http://localhost:4567/'
|
12
|
+
@data['api']['sso_salt'] = 'SSO_SALT'
|
13
|
+
@sso = Sso.new @data
|
14
|
+
end
|
15
|
+
|
16
|
+
def asserts_builds_full_url(env)
|
17
|
+
url, query = @sso.full_url.split('?')
|
18
|
+
data = CGI.parse(query)
|
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
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class SsoLaunchTest < Test::Unit::TestCase
|
28
|
+
include SsoSetupActions
|
29
|
+
|
30
|
+
def setup
|
31
|
+
super
|
32
|
+
sso_setup
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_builds_path
|
36
|
+
assert_equal '/heroku/resources/1', @sso.path
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_builds_full_url
|
40
|
+
asserts_builds_full_url('test')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class SsoGetLaunchTest < Test::Unit::TestCase
|
45
|
+
include SsoSetupActions
|
46
|
+
|
47
|
+
def setup
|
48
|
+
super
|
49
|
+
sso_setup
|
50
|
+
@data["api"]["test"] = "http://example.org/"
|
51
|
+
@sso = Sso.new(@data).start
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_sso_url_should_be_the_full_url
|
55
|
+
assert_equal @sso.full_url, @sso.sso_url
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_message_is_opening_full_url
|
59
|
+
assert_equal "Opening #{@sso.full_url}", @sso.message
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class SsoPostLaunchTest < Test::Unit::TestCase
|
64
|
+
include SsoSetupActions
|
65
|
+
|
66
|
+
def setup
|
67
|
+
super
|
68
|
+
sso_setup
|
69
|
+
@data['api']['test'] = {
|
70
|
+
"base_url" => "http://localhost:4567",
|
71
|
+
"sso_url" => "http://localhost:4567/users/login/sso"
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_it_starts_the_proxy_server
|
76
|
+
Artifice.deactivate
|
77
|
+
@sso = Sso.new(@data).start
|
78
|
+
body = RestClient.get(@sso.sso_url)
|
79
|
+
|
80
|
+
assert body.include? 'b6010f6fbb850887a396c2bc0ab23974003008f6'
|
81
|
+
assert body.include? '1262304000'
|
82
|
+
assert body.include? @sso.url
|
83
|
+
assert body.include? @sso.sample_nav_data
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class SsoPostProxyLaunchTest < Test::Unit::TestCase
|
88
|
+
include SsoSetupActions
|
89
|
+
|
90
|
+
def setup
|
91
|
+
super
|
92
|
+
sso_setup
|
93
|
+
@data['api']['test'] = {
|
94
|
+
"base_url" => "http://localhost:4567",
|
95
|
+
"sso_url" => "http://localhost:4567/users/login/sso"
|
96
|
+
}
|
97
|
+
any_instance_of(Sso, :run_proxy => false)
|
98
|
+
@sso = Sso.new(@data).start
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_sso_url_should_point_to_the_proxy
|
102
|
+
assert_equal "http://localhost:#{@sso.proxy_port}/", @sso.sso_url
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_post_url_contains_url_and_path
|
106
|
+
assert_equal "http://localhost:4567/users/login/sso", @sso.post_url
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_message_is_posting_data_to_post_url_via_proxy_on_port_proxy_port
|
110
|
+
assert_equal "POSTing #{@sso.query_data} to #{@sso.post_url} via proxy on port #{@sso.proxy_port}", @sso.message
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
class SsoEnvironmentLaunchTest < Test::Unit::TestCase
|
115
|
+
include SsoSetupActions
|
116
|
+
|
117
|
+
def setup
|
118
|
+
super
|
119
|
+
sso_setup
|
120
|
+
env = 'production'
|
121
|
+
@data[:env] = env
|
122
|
+
@data['api'][env] = 'http://localhost:7654/'
|
123
|
+
|
124
|
+
@sso = Sso.new @data
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_builds_full_url
|
128
|
+
asserts_builds_full_url('production')
|
129
|
+
end
|
130
|
+
end
|