disiid_user 3.1.0 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|