smarteru 0.0.1 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Rakefile +1 -2
- data/lib/smarteru.rb +4 -2
- data/lib/smarteru/client.rb +32 -19
- data/lib/smarteru/error.rb +12 -0
- data/lib/smarteru/resources/base.rb +10 -0
- data/lib/smarteru/resources/users.rb +110 -0
- data/lib/smarteru/response.rb +12 -12
- data/lib/smarteru/version.rb +1 -1
- data/test/smarteru_test.rb +128 -40
- data/test/support/responses/getGroup.xml +0 -3
- data/test/test_helper.rb +42 -0
- data/test/vcr/create_user.yml +57 -0
- data/test/vcr/enroll_user.yml +57 -0
- data/test/vcr/enrolled_false.yml +59 -0
- data/test/vcr/enrolled_true.yml +59 -0
- data/test/vcr/get_group.yml +60 -0
- data/test/vcr/get_nonexistant_user.yml +57 -0
- data/test/vcr/get_user.yml +66 -0
- data/test/vcr/invalid_api_keys.yml +57 -0
- data/test/vcr/learner_report.yml +63 -0
- data/test/vcr/signin_user.yml +60 -0
- data/test/vcr/update_employee_id.yml +57 -0
- data/test/vcr/update_user.yml +57 -0
- metadata +103 -34
- data/test/helper.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5b9a09b604285fcf6277b75b5844190f09994387214d03d2969e8db7dbe701ec
|
4
|
+
data.tar.gz: f1a43226645c1bd28eece5216bf7a45a43747016f9ca43c7a56081bd87f95f93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a49703f950673e5c851aaddd7f4beb5a3aca23aa8597c4b78e7dcd3a9334be10b4166d0e2d4233263ccaabfd286e9df26a04d098c6865f76564d5dcbb7efbabf
|
7
|
+
data.tar.gz: 0406a8dcec0eaf5ddb0897483ed2e102b3ccb58286e490aeca046847473fda293d281995b79646c213d8d549d1f48f8c040d0f4bca4d07e4abe432a2d63a7782
|
data/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require 'rubygems'
|
4
3
|
require 'bundler'
|
4
|
+
|
5
5
|
begin
|
6
6
|
Bundler.setup(:default, :development)
|
7
7
|
rescue Bundler::BundlerError => e
|
@@ -9,7 +9,6 @@ rescue Bundler::BundlerError => e
|
|
9
9
|
$stderr.puts "Run `bundle install` to install missing gems"
|
10
10
|
exit e.status_code
|
11
11
|
end
|
12
|
-
require 'rake'
|
13
12
|
|
14
13
|
require 'rake/testtask'
|
15
14
|
Rake::TestTask.new(:test) do |test|
|
data/lib/smarteru.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'rest-client'
|
2
|
-
require '
|
3
|
-
require 'xmlhasher'
|
2
|
+
require 'nori'
|
4
3
|
|
4
|
+
require 'smarteru/error'
|
5
5
|
require 'smarteru/client'
|
6
6
|
require 'smarteru/response'
|
7
|
+
require 'smarteru/resources/base'
|
8
|
+
require 'smarteru/resources/users'
|
7
9
|
|
8
10
|
module Smarteru
|
9
11
|
API_HOST = 'api.smarteru.com'
|
data/lib/smarteru/client.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
module Smarteru
|
2
2
|
class Client
|
3
|
-
|
4
|
-
|
5
|
-
:api_url
|
3
|
+
attr_accessor :account_api_key, :user_api_key
|
4
|
+
attr_reader :use_ssl, :verify_ssl, :ssl_ca_file, :api_url, :fail_on_error
|
6
5
|
|
7
6
|
# Create an instance of an API client
|
8
7
|
#
|
@@ -10,13 +9,14 @@ module Smarteru
|
|
10
9
|
# * +options+ - Access credentials and options hash, required keys are: account_api_key, user_api_key
|
11
10
|
# ==== Example
|
12
11
|
# client = Smarteru::Client.new({account_api_key: 'abc', user_api_key: 'abc'})
|
13
|
-
def initialize
|
14
|
-
@account_api_key = options[:account_api_key]
|
15
|
-
@user_api_key = options[:user_api_key]
|
12
|
+
def initialize(options = {})
|
13
|
+
@account_api_key = options[:account_api_key] || ENV['SMARTERU_ACCOUNT_API_KEY']
|
14
|
+
@user_api_key = options[:user_api_key] || ENV['SMARTERU_USER_API_KEY']
|
16
15
|
@use_ssl = options[:use_ssl] || true
|
17
16
|
@verify_ssl = options[:verify_ssl]
|
18
17
|
@ssl_ca_file = options[:ssl_ca_file]
|
19
|
-
@api_url =
|
18
|
+
@api_url = (@use_ssl ? 'https' : 'http') + "://#{API_HOST}/#{API_VERSION}/"
|
19
|
+
@fail_on_error = options[:fail_on_error] != false
|
20
20
|
end
|
21
21
|
|
22
22
|
# Make an API request
|
@@ -32,14 +32,24 @@ module Smarteru
|
|
32
32
|
# })
|
33
33
|
def request(operation, data)
|
34
34
|
opts = {
|
35
|
-
method:
|
36
|
-
url:
|
37
|
-
payload:
|
35
|
+
method: :post,
|
36
|
+
url: api_url,
|
37
|
+
payload: { 'Package' => body(operation, data) },
|
38
38
|
content_type: :xml,
|
39
|
-
verify_ssl:
|
40
|
-
ssl_ca_file:
|
41
|
-
|
42
|
-
|
39
|
+
verify_ssl: verify_ssl,
|
40
|
+
ssl_ca_file: ssl_ca_file }
|
41
|
+
|
42
|
+
response = RestClient::Request.execute(opts)
|
43
|
+
response = Response.new(response)
|
44
|
+
|
45
|
+
if !response.success? && fail_on_error
|
46
|
+
fail Error.new(response)
|
47
|
+
end
|
48
|
+
response
|
49
|
+
end
|
50
|
+
|
51
|
+
def users
|
52
|
+
@users ||= Resources::Users.new(self)
|
43
53
|
end
|
44
54
|
|
45
55
|
private
|
@@ -67,20 +77,23 @@ module Smarteru
|
|
67
77
|
# * +parameters+ - Parameters hash
|
68
78
|
def body_parameters(parameters)
|
69
79
|
parameters_xml = ''
|
70
|
-
parameters.each_pair do |k,v|
|
80
|
+
parameters.each_pair do |k, v|
|
71
81
|
key = parameter_key(k)
|
72
82
|
|
73
|
-
case v
|
83
|
+
val = case v
|
74
84
|
when Hash
|
75
|
-
|
85
|
+
body_parameters(v)
|
76
86
|
when Array
|
77
|
-
|
87
|
+
v.map { |i| body_parameters(i) }.join('')
|
88
|
+
when nil
|
89
|
+
''
|
78
90
|
else
|
79
|
-
|
91
|
+
"<![CDATA[#{v}]]>"
|
80
92
|
end
|
81
93
|
|
82
94
|
parameters_xml << "<#{key}>#{val}</#{key}>"
|
83
95
|
end
|
96
|
+
|
84
97
|
parameters_xml
|
85
98
|
end
|
86
99
|
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Smarteru
|
2
|
+
module Resources
|
3
|
+
class Users < Base
|
4
|
+
def get(id_or_email)
|
5
|
+
params = { user: normalize_id_param(id_or_email) }
|
6
|
+
|
7
|
+
response = client.request('getUser', params)
|
8
|
+
response.success? ? response.result[:user] : response
|
9
|
+
rescue Error => e
|
10
|
+
return nil if e.code == 'GU:03'
|
11
|
+
fail e
|
12
|
+
end
|
13
|
+
|
14
|
+
def create(info = {})
|
15
|
+
validate!(info, :email, :employee_i_d, :given_name, :surname, :group)
|
16
|
+
|
17
|
+
params = create_params(info)
|
18
|
+
|
19
|
+
client.request('createUser', params)
|
20
|
+
end
|
21
|
+
|
22
|
+
def update(id_or_email, info = {})
|
23
|
+
params = { user:
|
24
|
+
{ identifier: normalize_id_param(id_or_email),
|
25
|
+
info: info,
|
26
|
+
profile: nil,
|
27
|
+
groups: nil } }
|
28
|
+
|
29
|
+
client.request('updateUser', params)
|
30
|
+
end
|
31
|
+
|
32
|
+
def update_employee_id(id_or_email, new_employee_id)
|
33
|
+
update(id_or_email, employee_i_d: new_employee_id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def signin(id_or_email)
|
37
|
+
params = { security: normalize_id_param(id_or_email) }
|
38
|
+
|
39
|
+
client.request('requestExternalAuthorization', params)
|
40
|
+
end
|
41
|
+
|
42
|
+
def enroll(id_or_email, group, module_id)
|
43
|
+
params = {
|
44
|
+
learning_module_enrollment: {
|
45
|
+
enrollment: {
|
46
|
+
user: normalize_id_param(id_or_email),
|
47
|
+
group_name: group,
|
48
|
+
learning_module_i_d: module_id } } }
|
49
|
+
|
50
|
+
client.request('enrollLearningModules', params)
|
51
|
+
end
|
52
|
+
|
53
|
+
def learner_report(id_or_email, group)
|
54
|
+
params = {
|
55
|
+
report: {
|
56
|
+
filters: {
|
57
|
+
groups: {
|
58
|
+
group_names: {
|
59
|
+
group_name: group } },
|
60
|
+
learning_modules: nil,
|
61
|
+
users: {
|
62
|
+
user_identifier: normalize_id_param(id_or_email, :email_address) } },
|
63
|
+
columns: [
|
64
|
+
{ column_name: 'ENROLLED_DATE' },
|
65
|
+
{ column_name: 'COMPLETED_DATE' },
|
66
|
+
{ column_name: 'DUE_DATE' },
|
67
|
+
{ column_name: 'LAST_ACCESSED_DATE' },
|
68
|
+
{ column_name: 'STARTED_DATE' } ],
|
69
|
+
custom_fields: nil } }
|
70
|
+
|
71
|
+
response = client.request('getLearnerReport', params)
|
72
|
+
[ response.result[:learner_report][:learner] ].flatten.compact
|
73
|
+
end
|
74
|
+
|
75
|
+
def enrolled?(id_or_email, group, course_name)
|
76
|
+
enrollments = learner_report(id_or_email, group)
|
77
|
+
enrollments.any? { |e| e[:course_name] == course_name }
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
DEFAULT_CREATE_INFO = {
|
83
|
+
learner_notifications: 1,
|
84
|
+
supervisor_notifications: 0,
|
85
|
+
send_email_to: 'Self' }
|
86
|
+
|
87
|
+
def create_params(info)
|
88
|
+
group = info.delete(:group)
|
89
|
+
|
90
|
+
{ user: {
|
91
|
+
info: info.merge(DEFAULT_CREATE_INFO),
|
92
|
+
profile: { home_group: group },
|
93
|
+
groups: {
|
94
|
+
group: {
|
95
|
+
group_name: group,
|
96
|
+
group_permissions: nil } } } }
|
97
|
+
end
|
98
|
+
|
99
|
+
def normalize_id_param(value, email_field_name = :email)
|
100
|
+
value =~ /@/ ? { email_field_name => value } : { employee_i_d: value }
|
101
|
+
end
|
102
|
+
|
103
|
+
def validate!(params, *args)
|
104
|
+
args.each do |arg|
|
105
|
+
fail(":#{arg} required to create user") unless params.include?(arg)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
data/lib/smarteru/response.rb
CHANGED
@@ -1,39 +1,39 @@
|
|
1
1
|
module Smarteru
|
2
2
|
class Response
|
3
|
-
attr_reader :data, :hash, :
|
3
|
+
attr_reader :data, :hash, :opts
|
4
4
|
|
5
5
|
# Initializes an API response
|
6
6
|
#
|
7
7
|
# ==== Attributes
|
8
8
|
# * +resp+ - RestClient response from the API
|
9
|
-
def initialize(res)
|
9
|
+
def initialize(res, opts = {})
|
10
10
|
@data = res
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
string_keys: false
|
11
|
+
opts[:parser] ||= Nori.new(
|
12
|
+
parser: :rexml,
|
13
|
+
convert_tags_to: lambda { |tag| tag.snakecase.to_sym }
|
15
14
|
)
|
15
|
+
@opts = opts
|
16
16
|
end
|
17
17
|
|
18
18
|
# Hash representation of response data
|
19
|
-
def
|
20
|
-
|
21
|
-
@hash = parser.parse(data.to_s.gsub(/\<!\[CDATA\[(.+)\]\]\>/) {$1})
|
19
|
+
def hash
|
20
|
+
@hash ||= opts[:parser].parse(data.to_s.gsub(/\<!\[CDATA\[([^\]]+)\]\]\>/) {$1})
|
22
21
|
end
|
23
22
|
|
24
23
|
# Return true/false based on the API response status
|
25
24
|
def success?
|
26
|
-
|
25
|
+
hash[:smarter_u][:result] == 'Success'
|
27
26
|
rescue
|
28
27
|
false
|
29
28
|
end
|
30
29
|
|
31
30
|
def result
|
32
|
-
|
31
|
+
hash[:smarter_u][:info]
|
33
32
|
end
|
34
33
|
|
35
34
|
def error
|
36
|
-
|
35
|
+
errors = hash[:smarter_u][:errors]
|
36
|
+
errors.is_a?(Hash) ? errors : nil
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
data/lib/smarteru/version.rb
CHANGED
data/test/smarteru_test.rb
CHANGED
@@ -1,45 +1,133 @@
|
|
1
|
-
require '
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
3
|
class TestSmarteru < Test::Unit::TestCase
|
4
|
-
|
5
4
|
def setup
|
6
|
-
@client = Smarteru::Client.new(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
5
|
+
@client = Smarteru::Client.new(
|
6
|
+
account_api_key: 'C3FE6BE08120A82DB9C4555A5C0E46AF',
|
7
|
+
user_api_key: '*623jec3nad4!aic5rlg*$mrg8n4$itd^vy62xut')
|
8
|
+
# replace values w/ actual keys to run/test vcr cassettes
|
9
|
+
# @client = Smarteru::Client.new(
|
10
|
+
# account_api_key: 'foo',
|
11
|
+
# user_api_key: 'bar')
|
12
|
+
end
|
13
|
+
|
14
|
+
GROUP_PARAMS = { group: { name: 'PowurU' } }
|
15
|
+
def test_invalid_api_keys
|
16
|
+
@client.account_api_key = 'foo'
|
17
|
+
@client.user_api_key = 'bar'
|
18
|
+
|
19
|
+
VCR.use_cassette('invalid_api_keys') do
|
20
|
+
assert_raise_kind_of(Smarteru::Error) do
|
21
|
+
@client.request('getGroup', GROUP_PARAMS)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_get_group
|
27
|
+
with_request('get_group', 'getGroup', GROUP_PARAMS) do |response|
|
28
|
+
assert_true response.success?
|
29
|
+
assert_not_nil response.result[:group]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_get_user
|
34
|
+
email = 'vduplessie@gmail.com'
|
35
|
+
|
36
|
+
VCR.use_cassette('get_user') do
|
37
|
+
response = @client.users.get(email)
|
38
|
+
assert_not_nil response[:email] == email
|
39
|
+
assert_not_nil response[:status] == 'Active'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_get_nonexistant_user
|
44
|
+
VCR.use_cassette('get_nonexistant_user') do
|
45
|
+
response = @client.users.get('noop@eyecuelab.com')
|
46
|
+
assert_nil response
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_update_user
|
51
|
+
VCR.use_cassette('update_user') do
|
52
|
+
employee_id = 'powur.com:4242'
|
53
|
+
response = @client.users.update('vduplessie@gmail.com', employee_i_d: employee_id)
|
54
|
+
assert_true response.success?
|
55
|
+
assert_true response.result.keys.include?(:employee_id)
|
56
|
+
assert_equal response.result[:employee_id], employee_id
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_update_employee_id
|
61
|
+
VCR.use_cassette('update_employee_id') do
|
62
|
+
employee_id = 'powur.com:4242'
|
63
|
+
response = @client.users.update_employee_id('vduplessie@gmail.com', employee_id)
|
64
|
+
assert_true response.success?
|
65
|
+
assert_true response.result.keys.include?(:employee_id)
|
66
|
+
assert_equal response.result[:employee_id], employee_id
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_create_user
|
71
|
+
employee_id = 'test.eyecuelab.com:42'
|
72
|
+
params = {
|
73
|
+
email: 'foo@eyecuelab.com',
|
74
|
+
employee_i_d: employee_id,
|
75
|
+
given_name: 'Test',
|
76
|
+
surname: 'User',
|
77
|
+
password: 'password',
|
78
|
+
group: 'PowurU' }
|
79
|
+
|
80
|
+
VCR.use_cassette('create_user') do
|
81
|
+
response = @client.users.create(params)
|
82
|
+
assert_true response.success?
|
83
|
+
assert_true response.result.keys.include?(:employee_id)
|
84
|
+
assert_equal response.result[:employee_id], employee_id
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_signin_user
|
89
|
+
VCR.use_cassette('signin_user') do
|
90
|
+
response = @client.users.signin('5258029611')
|
91
|
+
assert_true response.success?
|
92
|
+
assert_true response.result.keys.include?(:redirect_path)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_enroll_user
|
97
|
+
VCR.use_cassette('enroll_user') do
|
98
|
+
response = @client.users.enroll('5258029611', 'PowurU', '8319')
|
99
|
+
assert_true response.success?
|
100
|
+
assert_true response.result.keys.include?(:enrollments)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_learner_report
|
105
|
+
VCR.use_cassette('learner_report') do
|
106
|
+
response = @client.users.learner_report('5258029611', 'PowurU')
|
107
|
+
assert_kind_of Array, response
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_enrolled_true
|
112
|
+
VCR.use_cassette('enrolled_true') do
|
113
|
+
response = @client.users.enrolled?('foo@eyecuelab.com', 'PowurU', 'Fast Impact Training (FIT)')
|
114
|
+
assert_true response
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_enrolled_false
|
119
|
+
VCR.use_cassette('enrolled_false') do
|
120
|
+
response = @client.users.enrolled?('foo@eyecuelab.com', 'PowurU', 'Cert Pro')
|
121
|
+
assert_false response
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def with_request(cassette, method, params)
|
128
|
+
VCR.use_cassette(cassette) do
|
129
|
+
response = @client.request(method, params)
|
130
|
+
yield(response) if block_given?
|
131
|
+
end
|
44
132
|
end
|
45
133
|
end
|