foundationapi 0.9.9
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/Rakefile +37 -0
- data/lib/foundation_api.rb +9 -0
- data/lib/foundation_api/errors.rb +34 -0
- data/lib/foundation_api/event.rb +6 -0
- data/lib/foundation_api/event/client.rb +105 -0
- data/lib/foundation_api/event/exceptions.rb +20 -0
- data/lib/foundation_api/json_rpc.rb +6 -0
- data/lib/foundation_api/json_rpc/client.rb +80 -0
- data/lib/foundation_api/json_rpc/exceptions.rb +47 -0
- data/lib/foundation_api/model.rb +7 -0
- data/lib/foundation_api/model/attribute_methods.rb +85 -0
- data/lib/foundation_api/model/cached.rb +13 -0
- data/lib/foundation_api/model/mapping.rb +24 -0
- data/lib/foundation_api/request.rb +29 -0
- data/lib/foundation_api/service.rb +56 -0
- data/lib/foundation_api/shoulda_matcher.rb +15 -0
- data/lib/foundation_api/shoulda_matcher/attribute_alias_matcher.rb +32 -0
- data/lib/foundation_api/shoulda_matcher/persistence_method_matcher.rb +91 -0
- data/lib/foundation_api/table.rb +6 -0
- data/lib/foundation_api/table/persistence.rb +115 -0
- data/lib/foundation_api/table/record.rb +143 -0
- data/lib/foundation_api/test_helper.rb +53 -0
- data/lib/foundation_api/version.rb +27 -0
- data/test/foundation_api_test.rb +31 -0
- data/test/test_helper.rb +31 -0
- data/test/unit/foundation_api/event/client_test.rb +129 -0
- data/test/unit/foundation_api/json_rpc/client_test.rb +143 -0
- data/test/unit/foundation_api/model/attribute_methods_test.rb +96 -0
- data/test/unit/foundation_api/model/cached_test.rb +20 -0
- data/test/unit/foundation_api/model/mapping_test.rb +22 -0
- data/test/unit/foundation_api/request_test.rb +33 -0
- data/test/unit/foundation_api/service_test.rb +54 -0
- data/test/unit/foundation_api/table/persistence_test.rb +182 -0
- data/test/unit/foundation_api/table/record_test.rb +176 -0
- metadata +209 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'foundation_api'))
|
3
|
+
|
4
|
+
# Mock around Net::HTTP so we don't need a real connection.
|
5
|
+
# We just verify whether the correct data is posted and return
|
6
|
+
# know test data
|
7
|
+
|
8
|
+
class Net::HTTP < Net::Protocol
|
9
|
+
def connect
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Net::HTTPResponse
|
14
|
+
def body=(content)
|
15
|
+
@body = content
|
16
|
+
@read = true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Net::HTTP < Net::Protocol
|
21
|
+
|
22
|
+
def self.raw_response_data
|
23
|
+
@raw_response_data
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.raw_response_data=(data)
|
27
|
+
@raw_response_data = data
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.raw_post_body=(body)
|
31
|
+
@raw_post_body = body
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.raw_post_body
|
35
|
+
@raw_post_body
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.raw_post_path=(path)
|
39
|
+
@raw_post_path = path
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.raw_post_path
|
43
|
+
@raw_post_path
|
44
|
+
end
|
45
|
+
|
46
|
+
def post(path, body, headers = {})
|
47
|
+
res = Net::HTTPSuccess.new('1.2', '200', 'OK')
|
48
|
+
self.class.raw_post_path = path
|
49
|
+
self.class.raw_post_body = body
|
50
|
+
res.body = self.class.raw_response_data
|
51
|
+
res
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Copyright (c) 2012 Bingo Entreprenøren AS
|
2
|
+
# Copyright (c) 2012 Teknobingo Scandinavia AS
|
3
|
+
# Copyright (c) 2012 Knut I. Stenmark
|
4
|
+
# Copyright (c) 2012 Patrick Hanevold
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
# a copy of this software and associated documentation files (the
|
8
|
+
# "Software"), to deal in the Software without restriction, including
|
9
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
# the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be
|
15
|
+
# included in all copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
21
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
22
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
23
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
|
25
|
+
module FoundationApi
|
26
|
+
VERSION = "0.9.9"
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Copyright (c) 2012 Bingo Entreprenøren AS
|
2
|
+
# Copyright (c) 2012 Teknobingo Scandinavia AS
|
3
|
+
# Copyright (c) 2012 Knut I. Stenmark
|
4
|
+
# Copyright (c) 2012 Patrick Hanevold
|
5
|
+
#
|
6
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
7
|
+
# a copy of this software and associated documentation files (the
|
8
|
+
# "Software"), to deal in the Software without restriction, including
|
9
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
10
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
11
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
12
|
+
# the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be
|
15
|
+
# included in all copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
18
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
19
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
20
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
21
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
22
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
23
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
24
|
+
|
25
|
+
require 'test_helper'
|
26
|
+
|
27
|
+
class FoundationApiTest < ActiveSupport::TestCase
|
28
|
+
test "truth" do
|
29
|
+
assert_kind_of Module, FoundationApi
|
30
|
+
end
|
31
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'active_support/testing/autorun'
|
3
|
+
require 'active_support/test_case'
|
4
|
+
require 'active_support/benchmarkable'
|
5
|
+
require 'shoulda'
|
6
|
+
SimpleCov.start
|
7
|
+
require 'foundation_api'
|
8
|
+
|
9
|
+
class Nada
|
10
|
+
def do_nothing(*args)
|
11
|
+
end
|
12
|
+
alias :debug :do_nothing
|
13
|
+
alias :notice :do_nothing
|
14
|
+
alias :info :do_nothing
|
15
|
+
alias :error :do_nothing
|
16
|
+
end
|
17
|
+
|
18
|
+
class CacheNada
|
19
|
+
def self.fetch(*args)
|
20
|
+
yield
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Rails
|
25
|
+
def self.logger
|
26
|
+
@logger ||= Nada.new
|
27
|
+
end
|
28
|
+
def self.cache
|
29
|
+
CacheNada
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'foundation_api/test_helper'
|
3
|
+
|
4
|
+
class FoundationApi::Event::ClientTest < ActiveSupport::TestCase
|
5
|
+
setup do
|
6
|
+
class TestClient < FoundationApi::Event::Client
|
7
|
+
self.site = "http://localhost:5555"
|
8
|
+
end
|
9
|
+
FoundationApi::JsonRPC::Client.site = "http://cyber:arts@localhost:4444/api"
|
10
|
+
end
|
11
|
+
|
12
|
+
context 'when authenticatiing it' do
|
13
|
+
should 'request token from api server' do
|
14
|
+
FoundationApi::JsonRPC::Client.expects(:authenticate).returns('auth_token')
|
15
|
+
assert_equal 'auth_token', TestClient.authenticate
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'when requesting it' do
|
20
|
+
setup do
|
21
|
+
TestClient.auth_token = 'token'
|
22
|
+
end
|
23
|
+
should 'post the request correctly' do
|
24
|
+
TestClient.expects(:authenticate).never
|
25
|
+
TestClient.expects(:post_request).with('event', {:apitoken => 'token', :type => '/something/weird', :number => 2}).returns(:anything)
|
26
|
+
assert_equal = TestClient.request('event', {:type => '/something/weird', :number => 2})
|
27
|
+
end
|
28
|
+
should 'authenticate if no token' do
|
29
|
+
TestClient.auth_token = nil
|
30
|
+
TestClient.expects(:authenticate).once
|
31
|
+
TestClient.expects(:post_request).with('event', {:apitoken => nil, :type => '/something/weird', :number => 2}).returns(:anything)
|
32
|
+
assert_equal :anything, TestClient.request('event', {:type => '/something/weird', :number => 2})
|
33
|
+
end
|
34
|
+
should 'reauthenticate if token has expired' do
|
35
|
+
TestClient.expects(:authenticate).once
|
36
|
+
TestClient.stubs(:post_request).
|
37
|
+
raises(FoundationApi::Event::AuthenticationFailed).then.returns(:anything)
|
38
|
+
assert_equal :anything, TestClient.request('event', {:type => '/something/weird', :number => 2})
|
39
|
+
end
|
40
|
+
should 'reauthenticate if token has expired, but only once' do
|
41
|
+
TestClient.expects(:authenticate).once
|
42
|
+
TestClient.stubs(:post_request).raises(FoundationApi::Event::AuthenticationFailed)
|
43
|
+
assert_raises FoundationApi::Event::AuthenticationFailed do
|
44
|
+
assert_equal :anything, TestClient.request('event', {:type => '/something/weird', :number => 2})
|
45
|
+
end
|
46
|
+
end
|
47
|
+
should 'leave other exceptions to be handled by the caller' do
|
48
|
+
TestClient.expects(:authenticate).never
|
49
|
+
TestClient.stubs(:post_request).raises(NoMethodError)
|
50
|
+
assert_raises NoMethodError do
|
51
|
+
assert_equal :anything, TestClient.request('event', {:type => '/something/weird', :number => 2})
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when posting to the server it' do
|
57
|
+
setup do
|
58
|
+
@http = stub('http')
|
59
|
+
TestClient.stubs(:http).returns(@http)
|
60
|
+
end
|
61
|
+
should 'call post correctly' do
|
62
|
+
@conn = stub('connection')
|
63
|
+
@http.expects(:start).yields(@conn)
|
64
|
+
|
65
|
+
@conn.expects(:post).with('/event', '{"type":"/the/type","number":1}', {'Content-Type' => 'application/json', 'Accept' => '*/*'})
|
66
|
+
.returns(stub(:body =>'{"status":"SUCCESS"}'))
|
67
|
+
TestClient.post_request('event', {:type => '/the/type', :number => 1})
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when successful it' do
|
72
|
+
setup do
|
73
|
+
Net::HTTP.stubs(:raw_response_data).returns('{"status": "SUCCESS"}')
|
74
|
+
TestClient.auth_token = 'tns5ddd7cc5271c8c6b5fab8aaf9ec492ed'
|
75
|
+
@result = TestClient.request("geneate_event", :type => '/something/weird', :number => 3 )
|
76
|
+
end
|
77
|
+
|
78
|
+
should 'receive the correct call at the http level' do
|
79
|
+
assert_equal JSON.parse(
|
80
|
+
'{"apitoken":"tns5ddd7cc5271c8c6b5fab8aaf9ec492ed","type":"/something/weird","number":3}'),
|
81
|
+
JSON.parse(Net::HTTP.raw_post_body)
|
82
|
+
end
|
83
|
+
|
84
|
+
should 'correctly parse the response from the server' do
|
85
|
+
assert_equal "SUCCESS", @result
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def expect_exception(status, exception)
|
90
|
+
assert_raises exception do
|
91
|
+
Net::HTTP.stubs(:raw_response_data).returns(%Q/{"status": "#{status}"}/)
|
92
|
+
@result = TestClient.request("geneate_event", :type => '/something/weird', :number => 3 )
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
context 'when failing it' do
|
98
|
+
setup do
|
99
|
+
TestClient.auth_token = 'tns5ddd7cc5271c8c6b5fab8aaf9ec492ed'
|
100
|
+
end
|
101
|
+
should 'generate the appropriate exception' do
|
102
|
+
expect_exception 'INVALID_ARGUMENT', FoundationApi::Event::InvalidArgument
|
103
|
+
expect_exception 'AUTHENTICATION_FAILED', FoundationApi::Event::AuthenticationFailed
|
104
|
+
expect_exception 'MALFORMED_REQUEST', FoundationApi::Event::MalformedRequest
|
105
|
+
expect_exception 'OPERATION_ERROR', FoundationApi::Event::OperationError
|
106
|
+
expect_exception 'TIMEOUT', FoundationApi::Event::Timeout
|
107
|
+
end
|
108
|
+
should 'generate exception if status unknown' do
|
109
|
+
expect_exception 'SWADA', FoundationApi::Event::UnknownResponseError
|
110
|
+
end
|
111
|
+
should 'log exception if status unknown' do
|
112
|
+
Rails.logger.expects(:error).twice
|
113
|
+
expect_exception 'SWADA', FoundationApi::Event::UnknownResponseError
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when logging it' do
|
118
|
+
should 'strip password from message' do
|
119
|
+
s = '{"username":"test5","password":"my22secret","phone":"error prone"}'
|
120
|
+
expected = '{"username":"test5","password":"[FILTERED]","phone":"error prone"}'
|
121
|
+
assert_equal expected, TestClient.send(:password_filter, s)
|
122
|
+
s = '{"username":"test5","password": "my22secret","phone":"error prone"}'
|
123
|
+
assert_equal expected, TestClient.send(:password_filter, s)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'foundation_api/test_helper'
|
3
|
+
|
4
|
+
class FoundationApi::JsonRPC::ClientTest < ActiveSupport::TestCase
|
5
|
+
setup do
|
6
|
+
@client = FoundationApi::JsonRPC::Client
|
7
|
+
@client.site = "http://cyber:arts@localhost:4444/api"
|
8
|
+
end
|
9
|
+
|
10
|
+
should 'respond to post' do
|
11
|
+
assert @client.respond_to?(:post_request)
|
12
|
+
end
|
13
|
+
|
14
|
+
should 'respond to request' do
|
15
|
+
assert @client.respond_to?(:request)
|
16
|
+
end
|
17
|
+
|
18
|
+
should 'respond to authenticate' do
|
19
|
+
assert @client.respond_to?(:authenticate)
|
20
|
+
end
|
21
|
+
|
22
|
+
should 'generate unique id' do
|
23
|
+
t = Time.now
|
24
|
+
Time.stubs(:now).returns(t)
|
25
|
+
assert_equal "#{t.to_f}.1", @client.unique_id(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
should 'create key value pear' do
|
29
|
+
# if you do not understand this joke, there are plenty of books to read
|
30
|
+
assert_equal [['key', 'value'],['pear', 'banana']], @client.key_value_array(:key => 'value', :pear => 'banana')
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when authenticating' do
|
34
|
+
setup do
|
35
|
+
Net::HTTP.stubs(:raw_response_data).returns('{"result": "abc", "id": "jsonrpc", "error": null}')
|
36
|
+
@client.authenticate
|
37
|
+
end
|
38
|
+
|
39
|
+
should 'receive the correct call at the http level' do
|
40
|
+
assert_equal JSON.parse('{"params":[{"username":"cyber","password":"arts"}],"method":"APIAuthenticate","id":"jsonrpc"}'),
|
41
|
+
JSON.parse(Net::HTTP.raw_post_body)
|
42
|
+
end
|
43
|
+
|
44
|
+
should 'set auth_token' do
|
45
|
+
assert_equal 'abc', @client.auth_token
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
context 'when successful it' do
|
51
|
+
setup do
|
52
|
+
Net::HTTP.stubs(:raw_response_data).returns('{"result": 9901014, "id": "jsonrpc", "error": null}')
|
53
|
+
@client.auth_token = 'tns5ddd7cc5271c8c6b5fab8aaf9ec492ed'
|
54
|
+
@result = @client.request("CreatePlayerAccount", :username => 'richard', :attributes => @client.key_value_array({:nickname => "rick", :mobile => "555-555-5555" }))
|
55
|
+
end
|
56
|
+
|
57
|
+
should 'receive the correct call at the http level' do
|
58
|
+
assert_equal JSON.parse(
|
59
|
+
'{"params":[{"authorization":"tns5ddd7cc5271c8c6b5fab8aaf9ec492ed","username":"richard","attributes":[["mobile","555-555-5555"],["nickname","rick"]]}],"method":"CreatePlayerAccount","id":"jsonrpc"}'),
|
60
|
+
JSON.parse(Net::HTTP.raw_post_body)
|
61
|
+
end
|
62
|
+
|
63
|
+
should 'correctly parse the response from the server' do
|
64
|
+
assert_equal 9901014, @result
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context 'when unsuccessful it' do
|
69
|
+
setup do
|
70
|
+
Net::HTTP.stubs(:raw_response_data).returns('{"result": null, "error": {"code": 1, "message": "INVALID_SECURITY_TOKEN"} , "id": "jsonrpc"}' )
|
71
|
+
end
|
72
|
+
|
73
|
+
should 'raise an exception when a call went wrong' do
|
74
|
+
assert_raise FoundationApi::JsonRPC::JsonRPCError do
|
75
|
+
@result = @client.post_request("test_method", {:param1 => "value1", :param2 => "value2" })
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
should 'set exception properly' do
|
80
|
+
begin
|
81
|
+
@result = @client.post_request("test_method", {:param1 => "value1", :param2 => "value2" })
|
82
|
+
rescue => e
|
83
|
+
assert_equal 1, e.code
|
84
|
+
assert_equal "INVALID_SECURITY_TOKEN", e.message
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'when calling authenticated request' do
|
91
|
+
setup do
|
92
|
+
@client.auth_token = nil
|
93
|
+
Net::HTTP.stubs(:raw_response_data).returns(
|
94
|
+
'{"result": "tnsc0d764cb2555b26c8d5e0fbca439c07c", "id": "jsonrpc", "error": null}',
|
95
|
+
'{"result": "some data", "id": "jsonrpc", "error": null}')
|
96
|
+
@result = @client.request('ASimpleMethod', :with => 'a parameter')
|
97
|
+
end
|
98
|
+
|
99
|
+
should 'set auth_token' do
|
100
|
+
assert_equal 'tnsc0d764cb2555b26c8d5e0fbca439c07c', @client.auth_token
|
101
|
+
end
|
102
|
+
|
103
|
+
should 'return data' do
|
104
|
+
assert_equal "some data", @result
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when security token has expired it' do
|
109
|
+
setup do
|
110
|
+
@client.auth_token = 'kmsikss'
|
111
|
+
end
|
112
|
+
should 'try to authenticate again' do
|
113
|
+
Net::HTTP.stubs(:raw_response_data).returns(
|
114
|
+
'{"result": null, "error": {"code": 1, "message": "INVALID_SECURITY_TOKEN"} , "id": "jsonrpc"}',
|
115
|
+
'{"result": "tnsc0d764cb2555b26c8d5e0fbca439c07c", "id": "jsonrpc", "error": null}',
|
116
|
+
'{"result": "some data", "id": "jsonrpc", "error": null}')
|
117
|
+
@result = @client.request('ASimpleMethod', :with => 'a parameter')
|
118
|
+
assert_equal "some data", @result
|
119
|
+
end
|
120
|
+
should 'only try to authenticate once' do
|
121
|
+
Net::HTTP.stubs(:raw_response_data).returns(
|
122
|
+
'{"result": null, "error": {"code": 1, "message": "INVALID_SECURITY_TOKEN"} , "id": "jsonrpc"}',
|
123
|
+
'{"result": null, "error": {"code": 1, "message": "INVALID_SECURITY_TOKEN"} , "id": "jsonrpc"}')
|
124
|
+
begin
|
125
|
+
@result = @client.request("test_method", {:param1 => "value1", :param2 => "value2" })
|
126
|
+
rescue => e
|
127
|
+
assert_equal 1, e.code
|
128
|
+
assert_equal :invalid_security_token, e.response
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
context 'when logging it' do
|
136
|
+
should 'strip password from message' do
|
137
|
+
s = '{"method":"CreatePlayerAccount","id":"jsonrpc","params":[{"username":"test5","attributes":[["clubhouse_token","ZpXEtiIKHoVA6kyieXQ7yw"],["email","test@tecnobingo.no"],["firstName","Test"],["lastName","One"],["password","my22secret"],["phone","90909090"]],"authorization":"tec-t-ca001.osl.basefarm.net:000-813793a81974dab06b9095a820691135"}]}'
|
138
|
+
expected = '{"method":"CreatePlayerAccount","id":"jsonrpc","params":[{"username":"test5","attributes":[["clubhouse_token","ZpXEtiIKHoVA6kyieXQ7yw"],["email","test@tecnobingo.no"],["firstName","Test"],["lastName","One"],["password","[FILTERED]"],["phone","90909090"]],"authorization":"tec-t-ca001.osl.basefarm.net:000-813793a81974dab06b9095a820691135"}]}'
|
139
|
+
assert_equal expected, @client.send(:password_filter, s)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class FoundationApi::Model::AttributeMethodsTest < ActiveSupport::TestCase
|
4
|
+
class Model
|
5
|
+
include FoundationApi::Model::AttributeMethods
|
6
|
+
|
7
|
+
alias_attribute :ip_subnet, :IPSubnet
|
8
|
+
|
9
|
+
attr_accessor :attributes
|
10
|
+
|
11
|
+
def initialize(attrs)
|
12
|
+
@attributes = HashWithIndifferentAccess.new attrs
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'class method' do
|
18
|
+
context 'alias_attribute' do
|
19
|
+
should 'populate attribute_aliases' do
|
20
|
+
assert_equal ({'ip_subnet' => 'IPSubnet'}), Model.attribute_aliases
|
21
|
+
end
|
22
|
+
end
|
23
|
+
context 'map_attribute' do
|
24
|
+
should 'map attribute if known' do
|
25
|
+
assert_equal 'IPSubnet', Model.send(:map_attribute, :ip_subnet)
|
26
|
+
end
|
27
|
+
should 'return definition if unknown' do
|
28
|
+
assert_equal 'gurba', Model.send(:map_attribute, :gurba)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
context 'reverse_map_attribute' do
|
32
|
+
should 'map attribute if known' do
|
33
|
+
assert_equal 'ip_subnet', Model.send(:reverse_map_attribute, :IPSubnet)
|
34
|
+
end
|
35
|
+
should 'return definition if unknown' do
|
36
|
+
assert_equal 'gurba', Model.send(:reverse_map_attribute, :gurba)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
context 'translate_attributes' do
|
40
|
+
should 'return translated hash' do
|
41
|
+
expected = HashWithIndifferentAccess.new 'IPSubnet' => '123.234.56.0/24', 'melon' => :office
|
42
|
+
assert_equal expected, Model.send(:translate_attributes, :ip_subnet => '123.234.56.0/24', :melon => :office)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'instance method' do
|
48
|
+
setup do
|
49
|
+
@model = Model.new(:boolean => true, :string => 'string', 'IPSubnet' => 'subnet')
|
50
|
+
end
|
51
|
+
context 'matching method' do
|
52
|
+
should 'return specified attribute if attribute exists' do
|
53
|
+
assert_equal :IPSubnet, @model.send(:matching_attribute, :IPSubnet)
|
54
|
+
end
|
55
|
+
should 'map attribute unless attribute exists' do
|
56
|
+
assert_equal 'IPSubnet', @model.send(:matching_attribute, :ip_subnet)
|
57
|
+
end
|
58
|
+
should 'return nil if attribute does not exist' do
|
59
|
+
assert_nil @model.send(:matching_attribute, :foo)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
context 'accessing attributes' do
|
63
|
+
should 'give access through [] operator' do
|
64
|
+
assert_equal 'string', @model[:string]
|
65
|
+
assert_equal 'subnet', @model[:ip_subnet]
|
66
|
+
@model[:mood] = 'smiley'
|
67
|
+
assert_equal 'smiley', @model.mood
|
68
|
+
@model[:ip_subnet] = 'ugh'
|
69
|
+
assert_equal 'ugh', @model.ip_subnet
|
70
|
+
@model[:IPSubnet] = 'argh'
|
71
|
+
assert_equal 'argh', @model.ip_subnet
|
72
|
+
end
|
73
|
+
end
|
74
|
+
context 'method missing' do
|
75
|
+
should 'handle boolean methods' do
|
76
|
+
assert @model.boolean?
|
77
|
+
end
|
78
|
+
should 'handle assignments' do
|
79
|
+
assert !(@model.boolean = false)
|
80
|
+
assert !@model.boolean
|
81
|
+
end
|
82
|
+
should 'handle anythin else :p' do
|
83
|
+
assert_equal 'subnet', @model.ip_subnet
|
84
|
+
end
|
85
|
+
should 'allow to use unmapped attribute' do
|
86
|
+
assert_equal 'subnet', @model.IPSubnet
|
87
|
+
end
|
88
|
+
should 'raise exception if bad attribute name' do
|
89
|
+
assert_raises NoMethodError do
|
90
|
+
@model.bad
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|