openskip-skip_embedded 0.0.15
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/ChangeLog +4 -0
- data/README.rdoc +37 -0
- data/Rakefile +87 -0
- data/generators/skip_embedded/skip_embedded_generator.rb +30 -0
- data/generators/skip_embedded/templates/app/views/shared/_flash_message.html.erb +13 -0
- data/generators/skip_embedded/templates/app/views/shared/_skip_full_text_search_form.html.erb +24 -0
- data/generators/skip_embedded/templates/public/javascripts/dropdown_navigation.js +12 -0
- data/generators/skip_embedded/templates/public/javascripts/labeled_text_field.js +21 -0
- data/generators/skip_embedded/templates/public/javascripts/skip_fckeditor_config.js +45 -0
- data/generators/skip_embedded/templates/public/stylesheets/skip_embedded.css +79 -0
- data/lib/skip_embedded/fulltext_search_cache/builder_base.rb +51 -0
- data/lib/skip_embedded/fulltext_search_cache/mediator.rb +67 -0
- data/lib/skip_embedded/fulltext_search_cache/partial_loader.rb +19 -0
- data/lib/skip_embedded/fulltext_search_cache.rb +38 -0
- data/lib/skip_embedded/helpers/ui.rb +46 -0
- data/lib/skip_embedded/helpers.rb +13 -0
- data/lib/skip_embedded/initial_settings.rb +28 -0
- data/lib/skip_embedded/op_fixation.rb +43 -0
- data/lib/skip_embedded/open_id_sso/authentication.rb +21 -0
- data/lib/skip_embedded/open_id_sso/session_management.rb +42 -0
- data/lib/skip_embedded/web_service_util/client.rb +75 -0
- data/lib/skip_embedded/web_service_util/server.rb +14 -0
- data/lib/skip_embedded/web_service_util.rb +26 -0
- data/lib/skip_embedded.rb +4 -0
- data/rails/init.rb +6 -0
- data/spec/skip_embedded/fulltext_search_cache/builder_base_spec.rb +44 -0
- data/spec/skip_embedded/fulltext_search_cache/mediator_spec.rb +49 -0
- data/spec/skip_embedded/fulltext_search_cache/partial_loader_spec.rb +20 -0
- data/spec/skip_embedded/initial_setting_spec.rb +10 -0
- data/spec/skip_embedded/op_fixation_spec.rb +57 -0
- data/spec/skip_embedded/web_service_util_spec.rb +197 -0
- data/spec/spec_helper.rb +16 -0
- metadata +114 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
module SkipEmbedded
|
2
|
+
module OpenIdSso
|
3
|
+
module Authentication
|
4
|
+
def self.included(base)
|
5
|
+
base.alias_method_chain :access_denied, :open_id_sso
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
def access_denied_with_open_id_sso(message = nil)
|
10
|
+
if op = SkipEmbedded::OpFixation.sso_openid_provider_url
|
11
|
+
store_location
|
12
|
+
authenticate_with_open_id(op, :method => "post", :return_to=>session_url, :required => SessionsController.attribute_adapter.keys) do
|
13
|
+
access_denied_without_open_id_sso(message)
|
14
|
+
end
|
15
|
+
else
|
16
|
+
access_denied_without_open_id_sso(message)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
module SkipEmbedded
|
3
|
+
module OpenIdSso
|
4
|
+
module SessionManagement
|
5
|
+
def self.included(controller)
|
6
|
+
controller.before_filter :available_op_limitation, :only => %w[create]
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
def after_logout_path
|
11
|
+
OpFixation.sso_openid_logout_url || login_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def login_successfully(user, personal_data)
|
15
|
+
if OpFixation.sso_enabled?
|
16
|
+
data = attribute_adapter.adapt(personal_data)
|
17
|
+
user.update_attributes!(data.slice(:display_name))
|
18
|
+
flash[:notice] = _("Successfully synchronized your display name with OP's")
|
19
|
+
end
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def signup(identity_url, personal_data = {})
|
24
|
+
session[:user] = attribute_adapter.adapt(personal_data) if OpFixation.sso_enabled?
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def available_op_limitation
|
29
|
+
if params[:openid_url] && !OpFixation.accept?(params[:openid_url])
|
30
|
+
logger.debug("login refused since #{params[:openid_url]} is not member #{OpFixation.servers.inspect}")
|
31
|
+
authenticate_failure
|
32
|
+
elsif OpFixation.sso_enabled? && !params["open_id_complete"].blank? && (params["openid.identity"] != params["openid.claimed_id"])
|
33
|
+
logger.debug("login refused since claimed_id differs from identity.")
|
34
|
+
authenticate_failure
|
35
|
+
else
|
36
|
+
true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'net/http'
|
3
|
+
require "net/https"
|
4
|
+
require 'uri'
|
5
|
+
require 'erb'
|
6
|
+
|
7
|
+
require 'skip_embedded/initial_settings'
|
8
|
+
|
9
|
+
module SkipEmbedded
|
10
|
+
class WebServiceUtil
|
11
|
+
module Client
|
12
|
+
attr_writer :logger
|
13
|
+
def logger
|
14
|
+
@logger ||= if defined?(ActiveRecord::Base)
|
15
|
+
ActiveRecord::Base.logger
|
16
|
+
elsif defined?(Rails)
|
17
|
+
Rails.logger
|
18
|
+
elsif
|
19
|
+
require 'logger'
|
20
|
+
Logger.new
|
21
|
+
end
|
22
|
+
end
|
23
|
+
# 別のWebアプリのWeb-APIをコールするためのユーティリティメソッド
|
24
|
+
# Webアプリ連携の際は、このメソッドを経由して利用すること
|
25
|
+
# 引数
|
26
|
+
# :app_name = 呼び出したいWebアプリケーションのシンボル
|
27
|
+
# :service_name = 呼び出したいWeb-APIの名前
|
28
|
+
# :params = 呼び出す際のパラメータ
|
29
|
+
# :controller_name = サービスのコントローラパス(デフォルトの規約は"services")
|
30
|
+
# services以外を指定も可能
|
31
|
+
def open_service app_name, service_name, params={}, controller_name="services"
|
32
|
+
ActiveSupport::Deprecation.warn("use 'open_service_with_url' with specified endopoint.")
|
33
|
+
|
34
|
+
app_url, app_ca_file = if app = InitialSettings['collaboration_apps'][app_name.to_s]
|
35
|
+
[ app["url"], app["ca_file"] ]
|
36
|
+
else
|
37
|
+
[nil, nil]
|
38
|
+
end
|
39
|
+
url = "#{app_url}/#{controller_name}/#{service_name}"
|
40
|
+
self.open_service_with_url(url, params, app_ca_file)
|
41
|
+
end
|
42
|
+
|
43
|
+
def open_service_with_url url, params = {}, app_ca_file = nil
|
44
|
+
url = "#{url}?" +
|
45
|
+
params.map{|key, val| "#{ERB::Util.u(key.to_s)}=#{ERB::Util.u(val.to_s)}"}.join('&')
|
46
|
+
self.get_json(url, app_ca_file)
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_json(url, ca_file = nil)
|
50
|
+
uri = URI.parse url
|
51
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
52
|
+
if uri.port == 443
|
53
|
+
http.use_ssl = true
|
54
|
+
if ca_file
|
55
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
56
|
+
http.ca_file = ca_file
|
57
|
+
http.verify_depth = 5
|
58
|
+
else
|
59
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
60
|
+
end
|
61
|
+
end
|
62
|
+
response = http.get("#{uri.path}?#{uri.query}", "X-SECRET-KEY" => InitialSettings['skip_collaboration']['secret_key'])
|
63
|
+
if response.code == "200"
|
64
|
+
JSON.parse(response.body)
|
65
|
+
else
|
66
|
+
logger.error "[WebServiceUtil Error] Response code is #{response.code} to access #{url}"
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
rescue Errno::ECONNREFUSED, OpenSSL::SSL::SSLError, SocketError, ArgumentError, JSON::ParserError, URI::InvalidURIError => ex
|
70
|
+
logger.error "[WebServiceUtil Error] #{ex.to_s} to access #{url}"
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module SkipEmbedded
|
2
|
+
# FIXME moduleにする
|
3
|
+
class WebServiceUtil
|
4
|
+
module Server
|
5
|
+
def check_secret_key
|
6
|
+
req_key = request.env["HTTP_X_SECRET_KEY"] && request.env["HTTP_X_SECRET_KEY"]
|
7
|
+
unless req_key == InitialSettings['skip_collaboration']['secret_key']
|
8
|
+
render :text => { :error => "Forbidden" }.to_json, :status => :forbidden
|
9
|
+
return false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# SKIP(Social Knowledge & Innovation Platform)
|
2
|
+
# Copyright (C) 2008 TIS Inc.
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
# アプリケーション連携用のライブラリ
|
17
|
+
# 別のWebアプリを呼び出す際は、WebServiceUtilを利用する
|
18
|
+
# 呼び出されるサービスを定義する際は、ForServicesModuleをincludeする
|
19
|
+
require 'skip_embedded/web_service_util/client'
|
20
|
+
|
21
|
+
module SkipEmbedded
|
22
|
+
class WebServiceUtil
|
23
|
+
extend SkipEmbedded::WebServiceUtil::Client
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
data/rails/init.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# vim:set fileencoding=utf-8 filetype=ruby
|
3
|
+
|
4
|
+
require File.expand_path("../../spec_helper", File.dirname(__FILE__))
|
5
|
+
require 'skip_embedded/fulltext_search_cache/builder_base'
|
6
|
+
|
7
|
+
describe SkipEmbedded::FulltextSearchCache::BuilderBase, :type => :model do
|
8
|
+
before do
|
9
|
+
@url_writer = mock("url_writer")
|
10
|
+
|
11
|
+
SkipEmbedded::FulltextSearchCache::BuilderBase.stub!(:url_writer).and_return(@url_writer)
|
12
|
+
SkipEmbedded::FulltextSearchCache::BuilderBase.entity_name = "target"
|
13
|
+
|
14
|
+
@it = SkipEmbedded::FulltextSearchCache::BuilderBase.new("--- entity ---")
|
15
|
+
@it.stub!(:root_url).and_return("http://asset.example.com/")
|
16
|
+
end
|
17
|
+
|
18
|
+
it{ @it.target.should == "--- entity ---" }
|
19
|
+
|
20
|
+
it{ @it.icon_url.should == "http://asset.example.com/images/icons/target.gif" }
|
21
|
+
|
22
|
+
it "to_metaはovverrideしてつかうこと" do
|
23
|
+
lambda{ @it.to_meta }.should raise_error(NotImplementedError)
|
24
|
+
end
|
25
|
+
it "titleはovverrideしてつかうこと" do
|
26
|
+
lambda{ @it.title }.should raise_error(NotImplementedError)
|
27
|
+
end
|
28
|
+
it "bodyはovverrideしてつかうこと" do
|
29
|
+
lambda{ @it.body }.should raise_error(NotImplementedError)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "write_metaは、mediatorが返すパスにto_meta.to_yamlを書き込むこと" do
|
33
|
+
File.should_receive(:open).with("path", "wb").and_yield(fd = mock("fd"))
|
34
|
+
fd.should_receive(:write).with("--- meta ---".to_yaml)
|
35
|
+
|
36
|
+
mediator = mock("mediator")
|
37
|
+
mediator.should_receive(:meta_path).and_return("path")
|
38
|
+
|
39
|
+
@it.should_receive(:to_meta).and_return("--- meta ---")
|
40
|
+
|
41
|
+
@it.write_meta(mediator)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
require 'skip_embedded/fulltext_search_cache/mediator'
|
3
|
+
|
4
|
+
describe SkipEmbedded::FulltextSearchCache, "new('path/to/cache/root', :since => 15.seconds.ago)", :type => :model do
|
5
|
+
before do
|
6
|
+
@fts_cache = SkipEmbedded::FulltextSearchCache::Mediator.new(:cache_dir => 'path/to/cache/root/app_cache', :url_prefix => "http://example.com", :since => 15.seconds.ago)
|
7
|
+
end
|
8
|
+
|
9
|
+
it{ @fts_cache.cache_dir.should == 'path/to/cache/root/app_cache' }
|
10
|
+
|
11
|
+
describe "出力先パスの算出" do
|
12
|
+
before do
|
13
|
+
@builder = mock("builder")
|
14
|
+
@builder.should_receive(:filename).and_return "file.html"
|
15
|
+
end
|
16
|
+
|
17
|
+
it do
|
18
|
+
@fts_cache.cache_path(@builder).should == "#{Dir.pwd}/path/to/cache/root/app_cache/file.html"
|
19
|
+
end
|
20
|
+
|
21
|
+
it do
|
22
|
+
@fts_cache.meta_path(@builder).should == "#{Dir.pwd}/path/to/cache/root/app_cache_meta/file.html"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#build" do
|
27
|
+
|
28
|
+
before do
|
29
|
+
@model_klass = mock("model_klass")
|
30
|
+
@model_klass.should_receive(:name).and_return "MdelClass"
|
31
|
+
@model_klass.should_receive(:quoted_table_name).and_return "mdoel_classes"
|
32
|
+
@model_klass.should_receive(:scoped).and_return( [model_obj = mock("model_obj")] )
|
33
|
+
model_obj.should_receive(:id).and_return("--id--")
|
34
|
+
|
35
|
+
SkipEmbedded::FulltextSearchCache::PartialLoader.should_receive(:new).with([model_obj], 1000).and_return(loader = mock("loader"))
|
36
|
+
loader.should_receive(:each).and_yield( model_obj )
|
37
|
+
|
38
|
+
@builder_klass = mock("builder_klass")
|
39
|
+
@builder_klass.should_receive(:new).with( model_obj ).and_return( builder = mock("builder") )
|
40
|
+
builder.should_receive(:write_cache).with(@fts_cache)
|
41
|
+
builder.should_receive(:write_meta).with(@fts_cache)
|
42
|
+
end
|
43
|
+
|
44
|
+
it do
|
45
|
+
@fts_cache.build(@model_klass, @builder_klass)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
require 'skip_embedded/fulltext_search_cache/partial_loader'
|
3
|
+
|
4
|
+
describe SkipEmbedded::FulltextSearchCache::PartialLoader, "new(mock_note, 100)", :type => :model do
|
5
|
+
before do
|
6
|
+
@klass = mock("mock_note")
|
7
|
+
@klass.should_receive(:count).and_return 101
|
8
|
+
@klass.should_receive(:find).with(:all, :limit => 100, :offset => 0).and_return((1..99).to_a)
|
9
|
+
@klass.should_receive(:find).with(:all, :limit => 100, :offset => 100).and_return [100, 101]
|
10
|
+
|
11
|
+
@loader = SkipEmbedded::FulltextSearchCache::PartialLoader.new(@klass, 100)
|
12
|
+
end
|
13
|
+
|
14
|
+
it do
|
15
|
+
mock_block = mock("block")
|
16
|
+
mock_block.should_receive(:call).exactly(101).times
|
17
|
+
@loader.each{|n| mock_block.call }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require 'skip_embedded/initial_settings'
|
3
|
+
|
4
|
+
describe SkipEmbedded::InitialSettings do
|
5
|
+
# see spec/initial_setting.yml
|
6
|
+
it{
|
7
|
+
SkipEmbedded::InitialSettings[:skip_collaboration]["skip_url"].should == "http://test.openskip.org"
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require 'skip_embedded/op_fixation'
|
3
|
+
|
4
|
+
describe SkipEmbedded::OpFixation, "http://openid.example.comで擬似SSOをする場合", :type => :model do
|
5
|
+
before() do
|
6
|
+
SkipEmbedded::OpFixation.sso_openid_provider_url = "http://openid.example.com/"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "sso_openid_provider_urlは@server_endpoint_urlであること" do
|
10
|
+
SkipEmbedded::OpFixation.sso_openid_provider_url.should == "http://openid.example.com/"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "sso_openid_logout_urlは@server_endpoint_url + '/logout'であること" do
|
14
|
+
SkipEmbedded::OpFixation.sso_openid_logout_url.should == "http://openid.example.com/logout"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe SkipEmbedded::OpFixation, "[http://openid.example.com]を受け付ける場合", :type => :model do
|
19
|
+
before(:all) do
|
20
|
+
@server_endpoint_url = "http://openid.example.com/server"
|
21
|
+
SkipEmbedded::OpFixation.servers = @server_endpoint_url
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "OpenID.discoverのOP endpoint URLがhttp://openid.example.comの場合" do
|
25
|
+
before do
|
26
|
+
mock_op_service = mock("op_service")
|
27
|
+
mock_op_service.should_receive(:server_url).and_return @server_endpoint_url
|
28
|
+
OpenID.should_receive(:discover).and_return [:ignore, [mock_op_service]]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "http://openid.example.com/alice/での問い合わせは許可すること" do
|
32
|
+
SkipEmbedded::OpFixation.accept?("http://openid.example.com/alice/").should be_true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "OpenID.discoverのOP endpoint URLがhttp://not-registered.example.comの場合" do
|
37
|
+
before do
|
38
|
+
mock_op_service = mock("op_service")
|
39
|
+
mock_op_service.should_receive(:server_url).and_return "http://not-registered.example.com"
|
40
|
+
OpenID.should_receive(:discover).and_return [:ignore, [mock_op_service]]
|
41
|
+
end
|
42
|
+
|
43
|
+
it "http://not-registered.example.com/alice/での問い合わせは許可しないこと" do
|
44
|
+
SkipEmbedded::OpFixation.accept?("http://not-registered.example.com/alice/").should be_false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe SkipEmbedded::OpFixation, "serversを指定しない場合", :type => :model do
|
50
|
+
before(:all) do
|
51
|
+
SkipEmbedded::OpFixation.servers = []
|
52
|
+
end
|
53
|
+
|
54
|
+
it "http://not-registered.example.com/alice/での問い合わせを許可すること" do
|
55
|
+
SkipEmbedded::OpFixation.accept?("http://not-registered.example.com/alice/").should be_true
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
# SKIP(Social Knowledge & Innovation Platform)
|
2
|
+
# Copyright (C) 2008 TIS Inc.
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
17
|
+
require 'skip_embedded/web_service_util'
|
18
|
+
|
19
|
+
module SkipEmbedded
|
20
|
+
describe WebServiceUtil do
|
21
|
+
before do
|
22
|
+
@logger = mock("logger")
|
23
|
+
WebServiceUtil.logger = @logger
|
24
|
+
end
|
25
|
+
|
26
|
+
describe ".open_service" do
|
27
|
+
before do
|
28
|
+
ActiveSupport::Deprecation.should_receive(:warn)
|
29
|
+
SkipEmbedded::InitialSettings.stub!(:[]).with("collaboration_apps").and_return("app" => {"url" => "http://testapp.host"})
|
30
|
+
@base = "http://testapp.host/services/user_info"
|
31
|
+
end
|
32
|
+
it "get_jsonをパラメータからURLを作りだすこと" do
|
33
|
+
WebServiceUtil.should_receive(:open_service_with_url).with(@base, { :id => "user", :key => "key" }, nil)
|
34
|
+
WebServiceUtil.open_service "app", "user_info", { :id => "user", :key => "key" }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "open_service_with_url" do
|
39
|
+
it "paramsがエンコードされてget_jsonに渡されること" do
|
40
|
+
params = { :id => "user", :key => "ほげ%$# ふが" }
|
41
|
+
query_str = "key=%E3%81%BB%E3%81%92%25%24%23%20%E3%81%B5%E3%81%8C&id=user"
|
42
|
+
|
43
|
+
WebServiceUtil.should_receive(:get_json).with("url?#{query_str}", nil)
|
44
|
+
WebServiceUtil.open_service_with_url "url", params
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe ".get_json" do
|
49
|
+
before do
|
50
|
+
@result = { "symbol" => "user", "type" => "entry"}
|
51
|
+
@response = mock('response', :code => "200", :body => @result.to_json)
|
52
|
+
@http = mock('http', :get => @response)
|
53
|
+
end
|
54
|
+
describe "レスポンスが正しく返ってくる場合" do
|
55
|
+
before do
|
56
|
+
Net::HTTP.stub!(:new).and_return(@http)
|
57
|
+
end
|
58
|
+
describe "httpの場合" do
|
59
|
+
it "bodyがパースされて返されること" do
|
60
|
+
WebServiceUtil.get_json("http://test.host/services/user_info?user_code=user").should == @result
|
61
|
+
end
|
62
|
+
end
|
63
|
+
describe "httpsの場合" do
|
64
|
+
before do
|
65
|
+
@http.stub!(:use_ssl=)
|
66
|
+
@http.stub!(:verify_mode=)
|
67
|
+
end
|
68
|
+
it "bodyがパースされて返されること" do
|
69
|
+
WebServiceUtil.get_json("https://test.host/services/user_info?user_code=user").should == @result
|
70
|
+
end
|
71
|
+
it "httpがuse_ssl = trueで呼ばれること" do
|
72
|
+
@http.should_receive(:use_ssl=).with(true)
|
73
|
+
WebServiceUtil.get_json("https://test.host/services/user_info?user_code=user")
|
74
|
+
end
|
75
|
+
it "httpがverify_mode = OpenSSL::SSL::VERIFY_NONE で呼ばれること" do
|
76
|
+
@http.should_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
|
77
|
+
WebServiceUtil.get_json("https://test.host/services/user_info?user_code=user")
|
78
|
+
end
|
79
|
+
describe "httpsでca_fileありの場合" do
|
80
|
+
before do
|
81
|
+
@ca_file = "path/to/config/server.pem"
|
82
|
+
@http.stub!(:ca_file=)
|
83
|
+
@http.stub!(:verify_depth=)
|
84
|
+
end
|
85
|
+
it "bodyがパースされて返されること" do
|
86
|
+
WebServiceUtil.get_json("https://test.host/services/user_info?user_code=user", @ca_file).should == @result
|
87
|
+
end
|
88
|
+
it "httpに ca_file が設定されること" do
|
89
|
+
@http.should_receive(:ca_file=).with(@ca_file)
|
90
|
+
WebServiceUtil.get_json("https://test.host/services/user_info?user_code=user", @ca_file)
|
91
|
+
end
|
92
|
+
it "httpに verify_depth が設定されること" do
|
93
|
+
@http.should_receive(:verify_depth=).with(5)
|
94
|
+
WebServiceUtil.get_json("https://test.host/services/user_info?user_code=user", @ca_file)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
describe "引数がnilの場合" do
|
100
|
+
it "nilが返ること" do
|
101
|
+
@logger.stub!(:error)
|
102
|
+
WebServiceUtil.get_json(nil).should be_nil
|
103
|
+
end
|
104
|
+
it "ログが出力されること" do
|
105
|
+
@logger.should_receive(:error).with(/[WebServiceUtil Error] .*/)
|
106
|
+
WebServiceUtil.get_json(nil).should be_nil
|
107
|
+
end
|
108
|
+
end
|
109
|
+
describe "返ってくるものが正しくparseできない場合" do
|
110
|
+
before do
|
111
|
+
Net::HTTP.stub!(:new).and_return(@http)
|
112
|
+
@response.stub!(:body).and_return("ぱーすにしっぱいする")
|
113
|
+
@url = "http://test.host/services/user_info?user_code=user"
|
114
|
+
end
|
115
|
+
it "nilが返ること" do
|
116
|
+
@logger.stub!(:error)
|
117
|
+
WebServiceUtil.get_json(@url).should be_nil
|
118
|
+
end
|
119
|
+
it "ログが出力されること" do
|
120
|
+
@logger.should_receive(:error).with(/[WebServiceUtil Error] .*/)
|
121
|
+
WebServiceUtil.get_json(@url).should be_nil
|
122
|
+
end
|
123
|
+
end
|
124
|
+
describe "ホストの無いURLが渡された場合" do
|
125
|
+
before do
|
126
|
+
@url = "/services/user_info?user_code=user"
|
127
|
+
end
|
128
|
+
it "nilが返ること" do
|
129
|
+
@logger.stub!(:error)
|
130
|
+
WebServiceUtil.get_json(@url).should be_nil
|
131
|
+
end
|
132
|
+
it "ログが出力されること" do
|
133
|
+
@logger.should_receive(:error).with(/[WebServiceUtil Error] .*/)
|
134
|
+
WebServiceUtil.get_json(@url).should be_nil
|
135
|
+
end
|
136
|
+
end
|
137
|
+
describe "レスポンスが404の場合" do
|
138
|
+
before do
|
139
|
+
@url = "/services/user_info?user_code=user"
|
140
|
+
end
|
141
|
+
before do
|
142
|
+
http = mock('http', :get => mock('response', :code => "404"))
|
143
|
+
Net::HTTP.stub!(:new).and_return(http)
|
144
|
+
end
|
145
|
+
it "nilが返ること" do
|
146
|
+
@logger.stub!(:error)
|
147
|
+
WebServiceUtil.get_json(@url).should be_nil
|
148
|
+
end
|
149
|
+
it "ログが出力されること" do
|
150
|
+
@logger.should_receive(:error).with("[WebServiceUtil Error] Response code is 404 to access #{@url}")
|
151
|
+
WebServiceUtil.get_json(@url).should be_nil
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe "ホストが見つからない場合" do
|
156
|
+
before do
|
157
|
+
@url = "http://test1.host/services/user_info?user_code=user"
|
158
|
+
end
|
159
|
+
it "nilが返ること" do
|
160
|
+
@logger.stub!(:error)
|
161
|
+
WebServiceUtil.get_json(@url).should be_nil
|
162
|
+
end
|
163
|
+
it "ログが出力されること" do
|
164
|
+
@logger.should_receive(:error).with(/[WebServiceUtil Error]/)
|
165
|
+
WebServiceUtil.get_json(@url).should be_nil
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# 証明書でSSL認証を行なう場合、以下のエラーが起こる。環境が無いのでコメントアウト
|
170
|
+
# 自己証明書の場合 => hostname was not match with the server certificate
|
171
|
+
# 証明書が正しくない => SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
|
172
|
+
describe "証明書が正しくない場合場合" do
|
173
|
+
before do
|
174
|
+
mock_http = Net::HTTP.new("www.openskip.org", 443)
|
175
|
+
|
176
|
+
Net::HTTP.should_receive(:new).with("www.openskip.org", 443).and_return(mock_http)
|
177
|
+
mock_http.should_receive(:get).and_raise OpenSSL::SSL::SSLError
|
178
|
+
|
179
|
+
|
180
|
+
@url = "https://www.openskip.org/services/user_info?user_code=user"
|
181
|
+
@ca_file = "path/to/config/server.pem"
|
182
|
+
end
|
183
|
+
|
184
|
+
it "nilが返ること" do
|
185
|
+
SkipEmbedded::WebServiceUtil.logger = Logger.new("/dev/null")
|
186
|
+
SkipEmbedded::WebServiceUtil.get_json(@url, @ca_file).should be_nil
|
187
|
+
end
|
188
|
+
|
189
|
+
it "ログが出力されること" do
|
190
|
+
@logger.should_receive(:error).with("[WebServiceUtil Error] OpenSSL::SSL::SSLError to access #{@url}")
|
191
|
+
|
192
|
+
SkipEmbedded::WebServiceUtil.get_json(@url, @ca_file).should be_nil
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# vim:set fileencoding=utf-8 filetype=ruby
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
|
6
|
+
gem 'rails', '2.1.2'
|
7
|
+
require 'active_support'
|
8
|
+
require 'action_controller'
|
9
|
+
|
10
|
+
$LOAD_PATH.unshift File.expand_path("../../../../", File.dirname(__FILE__))
|
11
|
+
$LOAD_PATH.unshift File.expand_path("../lib", File.dirname(__FILE__))
|
12
|
+
|
13
|
+
RAILS_ENV="test"
|
14
|
+
require 'skip_embedded/initial_settings'
|
15
|
+
SkipEmbedded::InitialSettings.config = File.expand_path("initial_settings.yml", File.dirname(__FILE__))
|
16
|
+
|