disiid_user 3.1.0 → 3.1.1
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/disiid_user.gemspec +1 -0
- data/lib/disiid_user/version.rb +1 -1
- data/lib/disiid_user.rb +33 -4
- data/spec/disiid_user_spec.rb +81 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/stub_user.rb +9 -2
- metadata +19 -8
data/disiid_user.gemspec
CHANGED
data/lib/disiid_user/version.rb
CHANGED
data/lib/disiid_user.rb
CHANGED
|
@@ -32,12 +32,41 @@ module DisiidUser
|
|
|
32
32
|
# Class Methods
|
|
33
33
|
#
|
|
34
34
|
module ClassMethods
|
|
35
|
-
#
|
|
36
|
-
#
|
|
35
|
+
# Returns a list of users as ActiveResource objects that match given query params, e.g.
|
|
36
|
+
# User.search(:q => "dude") # => [{name: 'dude', ...}, {...}]
|
|
37
|
+
# User.search(:position => 'whatever) # => []
|
|
37
38
|
def search(args = {})
|
|
38
39
|
args.merge! :auth_token => DisiidUser::RemoteUser.auth_token
|
|
39
40
|
DisiidUser::RemoteUser.find :all, :params => args
|
|
40
41
|
end
|
|
42
|
+
|
|
43
|
+
# Creates a new user object with the identity attribute assigned
|
|
44
|
+
# and returns a not presisted record.
|
|
45
|
+
# You'll need to call .save or .save! on the returned result
|
|
46
|
+
# if you want to persist it in a local database.
|
|
47
|
+
#
|
|
48
|
+
# Note: your local :users table should :identity_url string attribute for this to work.
|
|
49
|
+
def build_from_identity(url)
|
|
50
|
+
user = new
|
|
51
|
+
user.identity_url = url
|
|
52
|
+
user
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Looks for a local user record with a given UUID by matching its local attribute :identity_url.
|
|
56
|
+
# Creates a new user if it doesn't exist locally but is present remotely using #build_from_identity method.
|
|
57
|
+
# This method will throw ActiveRecord::RecordNotFound exception if persistance process didn't go well.
|
|
58
|
+
def find_local_or_remote_by_uuid!(id)
|
|
59
|
+
user = first(conditions: ['identity_url LIKE ?', "%#{id}"])
|
|
60
|
+
if !user && DisiidUser::RemoteUser.exists?(id, params: {auth_token: DisiidUser::RemoteUser.auth_token})
|
|
61
|
+
user_url = "#{DisiidUser::RemoteUser.site}/#{DisiidUser::RemoteUser.collection_name}/#{id}"
|
|
62
|
+
user = build_from_identity(user_url)
|
|
63
|
+
user.save!
|
|
64
|
+
end
|
|
65
|
+
user
|
|
66
|
+
rescue
|
|
67
|
+
raise ::ActiveRecord::RecordNotFound
|
|
68
|
+
end
|
|
69
|
+
|
|
41
70
|
end
|
|
42
71
|
|
|
43
72
|
def self.version_string
|
|
@@ -118,8 +147,7 @@ module DisiidUser
|
|
|
118
147
|
# Last part of identity_url, after path 'user' (element_name of RemoteUser params)
|
|
119
148
|
def uuid
|
|
120
149
|
@uuid ||= begin
|
|
121
|
-
|
|
122
|
-
/.*\/#{collection_name}\/([a-z0-9\-]+)$/.match(identity_url.to_s)[1]
|
|
150
|
+
/.*\/#{DisiidUser::RemoteUser.collection_name}\/([a-z0-9\-]+)$/.match(identity_url.to_s)[1]
|
|
123
151
|
rescue; nil; end
|
|
124
152
|
end
|
|
125
153
|
|
|
@@ -145,6 +173,7 @@ module DisiidUser
|
|
|
145
173
|
# defaults to 1 hour
|
|
146
174
|
cattr_accessor :cache_expiry
|
|
147
175
|
self.cache_expiry = 3600
|
|
176
|
+
|
|
148
177
|
|
|
149
178
|
protected
|
|
150
179
|
|
data/spec/disiid_user_spec.rb
CHANGED
|
@@ -36,6 +36,87 @@ describe DisiidUser do
|
|
|
36
36
|
@user.uuid.should be_nil
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
it "should build a new user with correct identity url" do
|
|
40
|
+
u = User.build_from_identity 'http://openid.provider.local/users/6a002a40-bc63-4095-9bb0-f31bf386bf55'
|
|
41
|
+
|
|
42
|
+
u.should be_instance_of(User)
|
|
43
|
+
u.should be_new_record
|
|
44
|
+
u.identity_url.should == 'http://openid.provider.local/users/6a002a40-bc63-4095-9bb0-f31bf386bf55'
|
|
45
|
+
u.uuid.should == '6a002a40-bc63-4095-9bb0-f31bf386bf55'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe "#find_local_or_remote_by_uuid!" do
|
|
49
|
+
let(:user) { User }
|
|
50
|
+
subject { user }
|
|
51
|
+
|
|
52
|
+
it { should respond_to :find_local_or_remote_by_uuid! }
|
|
53
|
+
it "should look for a local user" do
|
|
54
|
+
user.should_receive(:first).with(hash_including(conditions: ['identity_url LIKE ?', '%some-uuid'])).and_return(true)
|
|
55
|
+
user.find_local_or_remote_by_uuid!('some-uuid')
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "when local user doesn't exist" do
|
|
59
|
+
let(:new_user) { mock('new user', :save! => true) }
|
|
60
|
+
before {
|
|
61
|
+
user.stub(:first).and_return(nil)
|
|
62
|
+
user.stub(:build_from_identity).and_return(new_user)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
it "should try and see if remote user exists" do
|
|
66
|
+
DisiidUser::RemoteUser.should_receive(:exists?).with('some-uuid', params: hash_including(
|
|
67
|
+
auth_token: DisiidUser::RemoteUser.auth_token
|
|
68
|
+
))
|
|
69
|
+
user.find_local_or_remote_by_uuid!('some-uuid')
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "but the remote does" do
|
|
73
|
+
before { DisiidUser::RemoteUser.stub(:exists?).and_return(true) }
|
|
74
|
+
it "should build a new user" do
|
|
75
|
+
user.should_receive(:build_from_identity).with('http://localhost:3001/users/a-uuid')
|
|
76
|
+
user.find_local_or_remote_by_uuid!('a-uuid')
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should store user with .save!" do
|
|
80
|
+
new_user.should_receive(:save!)
|
|
81
|
+
user.find_local_or_remote_by_uuid!('a-uuid')
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should return newly created user" do
|
|
85
|
+
user.find_local_or_remote_by_uuid!('a-uuid').should == new_user
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it "should raise 'record not found' if .save! fails" do
|
|
89
|
+
new_user.stub(:save!).and_raise('some exception')
|
|
90
|
+
expect { user.find_local_or_remote_by_uuid!('some-uuid') }.to raise_error(ActiveRecord::RecordNotFound)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
context "and niether does remote" do
|
|
95
|
+
before { DisiidUser::RemoteUser.stub(:exists?).and_return(false) }
|
|
96
|
+
subject { user.find_local_or_remote_by_uuid!('some-uuid') }
|
|
97
|
+
it { should be_nil }
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
context "and an exception's been raised" do
|
|
101
|
+
before { DisiidUser::RemoteUser.stub(:exists?).and_raise('some error') }
|
|
102
|
+
it "should throw 'record not found'" do
|
|
103
|
+
expect { user.find_local_or_remote_by_uuid!('some-uuid') }.to raise_error(ActiveRecord::RecordNotFound)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
context "when local user exists" do
|
|
109
|
+
let(:existing_user) { mock('existing user') }
|
|
110
|
+
before { user.stub(:first).and_return(existing_user) }
|
|
111
|
+
|
|
112
|
+
it "should not fetch from remote" do
|
|
113
|
+
DisiidUser::RemoteUser.should_not_receive(:exists?)
|
|
114
|
+
user.should_not_receive(:build_from_identity)
|
|
115
|
+
user.find_local_or_remote_by_uuid!('some-uuid').should == existing_user
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
39
120
|
context "with local roles" do
|
|
40
121
|
|
|
41
122
|
it 'should correctly parse :role attribute' do
|
data/spec/spec_helper.rb
CHANGED
data/spec/stub_user.rb
CHANGED
|
@@ -11,11 +11,18 @@ end
|
|
|
11
11
|
# - role (Integer)
|
|
12
12
|
# - identity_url (String)
|
|
13
13
|
class User
|
|
14
|
+
attr_accessor :new_record, :role, :identity_url
|
|
15
|
+
alias_method :new_record?, :new_record
|
|
16
|
+
|
|
17
|
+
def initialize(*args)
|
|
18
|
+
super(*args)
|
|
19
|
+
@new_record = true
|
|
20
|
+
end
|
|
21
|
+
|
|
14
22
|
# stub methods and attributes
|
|
15
23
|
def self.scope(*args); end
|
|
16
|
-
attr_accessor :role, :identity_url
|
|
17
24
|
|
|
18
|
-
include DisiidUser
|
|
25
|
+
include DisiidUser
|
|
19
26
|
end
|
|
20
27
|
|
|
21
28
|
class FakeResponse
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: disiid_user
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.1.
|
|
4
|
+
version: 3.1.1
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -10,11 +10,11 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2011-12-
|
|
13
|
+
date: 2011-12-21 00:00:00.000000000Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: rspec
|
|
17
|
-
requirement: &
|
|
17
|
+
requirement: &70154939590940 !ruby/object:Gem::Requirement
|
|
18
18
|
none: false
|
|
19
19
|
requirements:
|
|
20
20
|
- - ! '>='
|
|
@@ -22,10 +22,10 @@ dependencies:
|
|
|
22
22
|
version: '0'
|
|
23
23
|
type: :development
|
|
24
24
|
prerelease: false
|
|
25
|
-
version_requirements: *
|
|
25
|
+
version_requirements: *70154939590940
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: bundler
|
|
28
|
-
requirement: &
|
|
28
|
+
requirement: &70154939648160 !ruby/object:Gem::Requirement
|
|
29
29
|
none: false
|
|
30
30
|
requirements:
|
|
31
31
|
- - ! '>='
|
|
@@ -33,10 +33,10 @@ dependencies:
|
|
|
33
33
|
version: '0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
|
-
version_requirements: *
|
|
36
|
+
version_requirements: *70154939648160
|
|
37
37
|
- !ruby/object:Gem::Dependency
|
|
38
38
|
name: activeresource
|
|
39
|
-
requirement: &
|
|
39
|
+
requirement: &70154939656120 !ruby/object:Gem::Requirement
|
|
40
40
|
none: false
|
|
41
41
|
requirements:
|
|
42
42
|
- - ~>
|
|
@@ -44,7 +44,18 @@ dependencies:
|
|
|
44
44
|
version: '3'
|
|
45
45
|
type: :runtime
|
|
46
46
|
prerelease: false
|
|
47
|
-
version_requirements: *
|
|
47
|
+
version_requirements: *70154939656120
|
|
48
|
+
- !ruby/object:Gem::Dependency
|
|
49
|
+
name: activerecord
|
|
50
|
+
requirement: &70154939665280 !ruby/object:Gem::Requirement
|
|
51
|
+
none: false
|
|
52
|
+
requirements:
|
|
53
|
+
- - ~>
|
|
54
|
+
- !ruby/object:Gem::Version
|
|
55
|
+
version: '3'
|
|
56
|
+
type: :runtime
|
|
57
|
+
prerelease: false
|
|
58
|
+
version_requirements: *70154939665280
|
|
48
59
|
description: DISI - UniTN internal development
|
|
49
60
|
email:
|
|
50
61
|
- tech@disi.unitn.it
|