Skip to content

Commit 5892f24

Browse files
committed
refactor(enmeshed): leave the validation of the userdata to the User model
Part of XI-6523
1 parent b9454a8 commit 5892f24

File tree

3 files changed

+88
-78
lines changed

3 files changed

+88
-78
lines changed

lib/enmeshed/relationship.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ def pending_for(nbp_uid)
7474
private
7575

7676
def parse_userdata # rubocop:disable Metrics/AbcSize
77+
return if response_items.blank?
78+
7779
user_provided_attributes = response_items.select do |item|
7880
item[:@type] == 'ReadAttributeAcceptResponseItem'
7981
end
@@ -91,13 +93,13 @@ def parse_userdata # rubocop:disable Metrics/AbcSize
9193
email: enmeshed_user_attributes['EMailAddress'],
9294
first_name: enmeshed_user_attributes['GivenName'],
9395
last_name: enmeshed_user_attributes['Surname'],
94-
status_group: parse_status_group(enmeshed_user_attributes['AffiliationRole'].downcase),
96+
status_group: parse_status_group(enmeshed_user_attributes['AffiliationRole']&.downcase),
9597
}
96-
rescue NoMethodError
97-
raise ConnectorError.new("Could not parse userdata in the response items: #{response_items}")
9898
end
9999

100100
def parse_status_group(affiliation_role)
101+
return if affiliation_role.blank?
102+
101103
if STATUS_GROUP_SYNONYMS['learner'].any? {|synonym| synonym.downcase.include? affiliation_role }
102104
:learner
103105
elsif STATUS_GROUP_SYNONYMS['educator'].any? {|synonym| synonym.downcase.include? affiliation_role }

spec/lib/enmeshed/relationship_spec.rb

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,48 +89,75 @@
8989
describe '#userdata' do
9090
subject(:userdata) { described_class.new(json:, template:, response_items:).userdata }
9191

92-
it 'returns the requested data' do
93-
expect(userdata).to eq({email: '[email protected]', first_name: 'John', last_name: 'Oliver',
94-
status_group: :educator})
92+
shared_examples 'parsed userdata' do
93+
it 'passes' do
94+
expect { userdata }.not_to raise_error
95+
end
96+
97+
it 'returns the requested data' do
98+
expect(userdata).to eq parsed_userdata
99+
end
100+
end
101+
102+
it_behaves_like 'parsed userdata' do
103+
let(:parsed_userdata) do
104+
{email: '[email protected]', first_name: 'John', last_name: 'Oliver', status_group: :educator}
105+
end
95106
end
96107

97108
context 'with a synonym of "learner" as status group' do
98109
before do
99110
response_items.last[:attribute][:value][:value] = 'Schüler'
100111
end
101112

102-
it 'returns the requested data' do
103-
expect(userdata).to eq({email: '[email protected]', first_name: 'John', last_name: 'Oliver',
104-
status_group: :learner})
113+
it_behaves_like 'parsed userdata' do
114+
let(:parsed_userdata) do
115+
{email: '[email protected]', first_name: 'John', last_name: 'Oliver', status_group: :learner}
116+
end
105117
end
106118
end
107119

108-
context 'with a blank attribute' do
120+
context 'with gibberish as status group' do
121+
before do
122+
response_items.last[:attribute][:value][:value] = 'gibberish'
123+
end
124+
125+
it_behaves_like 'parsed userdata' do
126+
let(:parsed_userdata) do
127+
{email: '[email protected]', first_name: 'John', last_name: 'Oliver', status_group: nil}
128+
end
129+
end
130+
end
131+
132+
context 'with a blank status group' do
109133
before do
110134
response_items.last[:attribute][:value][:value] = ' '
111135
end
112136

113-
# The validations of the User model will take care
114-
it 'passes' do
115-
expect { userdata }.not_to raise_error
137+
it_behaves_like 'parsed userdata' do
138+
let(:parsed_userdata) do
139+
{email: '[email protected]', first_name: 'John', last_name: 'Oliver', status_group: nil}
140+
end
116141
end
117142
end
118143

119144
context 'with a missing attribute' do
120145
before do
121-
response_items.pop
146+
response_items.slice!(3)
122147
end
123148

124-
it 'raises an error' do
125-
expect { userdata }.to raise_error(Enmeshed::ConnectorError, 'AffiliationRole must not be empty')
149+
it_behaves_like 'parsed userdata' do
150+
let(:parsed_userdata) do
151+
{email: nil, first_name: 'John', last_name: 'Oliver', status_group: :educator}
152+
end
126153
end
127154
end
128155

129156
context 'without any provided attributes' do
130157
let(:response_items) { nil }
131158

132-
it 'raises an error' do
133-
expect { userdata }.to raise_error(Enmeshed::ConnectorError, 'Could not parse userdata in the response items: ')
159+
it_behaves_like 'parsed userdata' do
160+
let(:parsed_userdata) { nil }
134161
end
135162
end
136163
end

spec/requests/users/nbp_wallet/finalize_spec.rb

Lines changed: 41 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,17 @@
77

88
let(:uid) { 'example-uid' }
99
let(:session_params) { {saml_uid: uid, omniauth_provider: 'nbp'} }
10+
let(:relationship) { instance_double(Enmeshed::Relationship) }
1011

1112
before do
1213
set_session(session_params)
1314
end
1415

1516
context 'without any errors' do
16-
let(:relationship) do
17-
instance_double(Enmeshed::Relationship,
18-
accept!: true,
19-
userdata: {
20-
21-
first_name: 'john',
22-
last_name: 'oliver',
23-
status_group: 'learner',
24-
})
25-
end
26-
2717
before do
2818
allow(Enmeshed::Relationship).to receive(:pending_for).with(uid).and_return(relationship)
29-
allow(relationship).to receive(:peer).and_return('id1EvvJ68x6wdHBwYrFTR31XtALHko9fnbyp')
19+
allow(relationship).to receive_messages(peer: 'id1EvvJ68x6wdHBwYrFTR31XtALHko9fnbyp', accept!: true,
20+
userdata: {email: '[email protected]', first_name: 'john', last_name: 'oliver', status_group: :learner})
3021
end
3122

3223
it 'creates a user' do
@@ -112,79 +103,69 @@
112103
end
113104

114105
context 'when an attribute is missing' do
115-
# `Enmeshed::ConnectorError` is unknown until 'lib/enmeshed/connector.rb' is loaded, because it's defined there
116-
require 'enmeshed/connector'
117-
118-
let(:relationship) do
119-
instance_double(Enmeshed::Relationship, accept!: false, reject!: true)
120-
end
121-
122106
before do
123107
allow(Enmeshed::Relationship).to receive(:pending_for).with(uid).and_return(relationship)
124-
allow(relationship).to receive(:userdata).and_raise(Enmeshed::ConnectorError, 'EMailAddress must not be empty')
108+
allow(relationship).to receive_messages(
109+
userdata: {first_name: 'john', last_name: 'oliver', status_group: :learner},
110+
peer: 'id1EvvJ68x6wdHBwYrFTR31XtALHko9fnbyp',
111+
reject!: true
112+
)
125113
end
126114

127-
it_behaves_like 'a handled erroneous request', I18n.t('common.errors.generic')
128-
it_behaves_like 'a documented erroneous request', Enmeshed::ConnectorError
115+
it_behaves_like 'a handled erroneous request', "Could not create User: Email can't be blank"
129116
end
130117

131118
context 'with an invalid status group' do
132-
let(:relationship) do
133-
instance_double(Enmeshed::Relationship,
134-
reject!: true,
135-
userdata: {
136-
137-
first_name: 'john',
138-
last_name: 'oliver',
139-
status_group: nil,
140-
})
141-
end
142-
143119
before do
144120
allow(Enmeshed::Relationship).to receive(:pending_for).with(uid).and_return(relationship)
121+
allow(relationship).to receive_messages(reject!: true, peer: 'id1EvvJ68x6wdHBwYrFTR31XtALHko9fnbyp', userdata: {
122+
123+
first_name: 'john',
124+
last_name: 'oliver',
125+
status_group: nil,
126+
})
145127
end
146128

147-
it_behaves_like 'a handled erroneous request', 'Could not create User: Unknown role. Please select either ' \
148-
'"Teacher" or "Student" as your role.'
129+
it_behaves_like 'a handled erroneous request', 'Could not create User: Status Group is unknown. ' \
130+
'Please select either "Teacher" or "Student" as your role.'
149131
end
150132

151-
context 'when the User cannot be saved' do
152-
let(:relationship) do
153-
instance_double(Enmeshed::Relationship,
154-
reject!: true,
155-
userdata: {
156-
157-
first_name: 'john',
158-
last_name: 'oliver',
159-
status_group: 'learner',
160-
})
133+
context 'with a blank name' do
134+
before do
135+
allow(Enmeshed::Relationship).to receive(:pending_for).with(uid).and_return(relationship)
136+
allow(relationship).to receive_messages(
137+
userdata: {email: '[email protected]', first_name: ' ', last_name: 'oliver', status_group: :learner},
138+
peer: 'id1EvvJ68x6wdHBwYrFTR31XtALHko9fnbyp',
139+
reject!: true
140+
)
161141
end
162142

143+
it_behaves_like 'a handled erroneous request', "Could not create User: First Name can't be blank"
144+
end
145+
146+
context 'when email address already has been taken' do
163147
before do
164-
create(:user, email: relationship.userdata[:email])
148+
create(:user, email: '[email protected]')
165149
allow(Enmeshed::Relationship).to receive(:pending_for).with(uid).and_return(relationship)
166-
allow(relationship).to receive(:peer).and_return('id1EvvJ68x6wdHBwYrFTR31XtALHko9fnbyp')
150+
allow(relationship).to receive_messages(
151+
userdata: {email: '[email protected]', first_name: 'john', last_name: 'oliver', status_group: :learner},
152+
peer: 'id1EvvJ68x6wdHBwYrFTR31XtALHko9fnbyp',
153+
reject!: true
154+
)
167155
end
168156

169157
it_behaves_like 'a handled erroneous request', 'Could not create User: Email has already been taken'
170158
end
171159

172160
context 'when the RelationshipChange cannot be accepted' do
173-
let(:relationship) do
174-
instance_double(Enmeshed::Relationship,
175-
accept!: false,
176-
reject!: true,
177-
userdata: {
178-
179-
first_name: 'john',
180-
last_name: 'oliver',
181-
status_group: 'learner',
182-
})
183-
end
184-
185161
before do
186162
allow(Enmeshed::Relationship).to receive(:pending_for).with(uid).and_return(relationship)
187-
allow(relationship).to receive(:peer).and_return('id1EvvJ68x6wdHBwYrFTR31XtALHko9fnbyp')
163+
allow(relationship).to receive_messages(
164+
userdata: {email: '[email protected]', first_name: 'john', last_name: 'oliver', status_group: :learner},
165+
peer: 'id1EvvJ68x6wdHBwYrFTR31XtALHko9fnbyp',
166+
accept!: false,
167+
reject!: true
168+
)
188169
end
189170

190171
it_behaves_like 'a handled erroneous request', I18n.t('common.errors.generic')

0 commit comments

Comments
 (0)