onfido 0.12.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +4 -3
  3. data/.travis.yml +8 -7
  4. data/CHANGELOG.md +23 -0
  5. data/LICENSE +2 -1
  6. data/README.md +70 -70
  7. data/lib/onfido.rb +1 -1
  8. data/lib/onfido/api.rb +4 -4
  9. data/lib/onfido/configuration.rb +12 -16
  10. data/lib/onfido/resource.rb +3 -6
  11. data/lib/onfido/resources/address.rb +1 -1
  12. data/lib/onfido/resources/applicant.rb +9 -5
  13. data/lib/onfido/resources/check.rb +10 -14
  14. data/lib/onfido/resources/document.rb +11 -11
  15. data/lib/onfido/resources/extraction.rb +9 -0
  16. data/lib/onfido/resources/live_photo.rb +9 -14
  17. data/lib/onfido/resources/live_video.rb +5 -8
  18. data/lib/onfido/resources/report.rb +8 -9
  19. data/lib/onfido/resources/sdk_token.rb +3 -5
  20. data/lib/onfido/resources/webhook.rb +11 -9
  21. data/lib/onfido/version.rb +1 -1
  22. data/onfido.gemspec +8 -9
  23. data/spec/integrations/address_spec.rb +1 -0
  24. data/spec/integrations/applicant_spec.rb +38 -32
  25. data/spec/integrations/check_spec.rb +13 -23
  26. data/spec/integrations/document_spec.rb +16 -17
  27. data/spec/integrations/exceptions_spec.rb +12 -13
  28. data/spec/integrations/extraction_spec.rb +19 -0
  29. data/spec/integrations/live_photo_spec.rb +12 -13
  30. data/spec/integrations/live_video_spec.rb +7 -10
  31. data/spec/integrations/report_spec.rb +11 -13
  32. data/spec/integrations/sdk_token_spec.rb +5 -5
  33. data/spec/integrations/webhook_spec.rb +35 -20
  34. data/spec/onfido/resource_spec.rb +10 -14
  35. data/spec/onfido_spec.rb +13 -13
  36. data/spec/support/fake_onfido_api.rb +60 -77
  37. data/spec/support/fixtures/applicant.json +21 -42
  38. data/spec/support/fixtures/check.json +4 -4
  39. data/spec/support/fixtures/checks.json +4 -4
  40. data/spec/support/fixtures/document.json +2 -2
  41. data/spec/support/fixtures/documents.json +8 -8
  42. data/spec/support/fixtures/extraction.json +23 -0
  43. data/spec/support/fixtures/live_photo.json +3 -3
  44. data/spec/support/fixtures/live_photos.json +6 -6
  45. data/spec/support/fixtures/live_video.json +3 -3
  46. data/spec/support/fixtures/live_videos.json +4 -4
  47. data/spec/support/fixtures/not_scheduled_for_deletion_error.json +7 -0
  48. data/spec/support/fixtures/report.json +4 -4
  49. data/spec/support/fixtures/reports.json +8 -8
  50. data/spec/support/fixtures/webhook.json +6 -5
  51. data/spec/support/fixtures/webhooks.json +17 -12
  52. metadata +22 -42
  53. data/lib/onfido/resources/report_type_group.rb +0 -11
  54. data/spec/integrations/report_type_group_spec.rb +0 -19
  55. data/spec/support/fixtures/check_with_expanded_reports.json +0 -30
  56. data/spec/support/fixtures/checks_with_expanded_reports.json +0 -34
  57. data/spec/support/fixtures/report_type_group.json +0 -25
  58. data/spec/support/fixtures/report_type_groups.json +0 -30
@@ -7,15 +7,11 @@ module Onfido
7
7
  @api_key = api_key || Onfido.api_key
8
8
  end
9
9
 
10
- def url_for(path)
11
- Onfido.endpoint + path
12
- end
13
-
14
10
  VALID_HTTP_METHODS.each do |method|
15
11
  define_method method do |*args|
16
12
  make_request(
17
13
  method: method.to_sym,
18
- url: args.first.fetch(:url),
14
+ url: Onfido.endpoint + args.first.fetch(:path),
19
15
  payload: build_query(args.first.fetch(:payload, {}))
20
16
  )
21
17
  end
@@ -69,7 +65,8 @@ module Onfido
69
65
  def headers
70
66
  {
71
67
  'Authorization' => "Token token=#{@api_key}",
72
- 'Accept' => "application/json"
68
+ 'Accept' => "application/json",
69
+ 'User-Agent' => "onfido-ruby/#{Onfido::VERSION}"
73
70
  }
74
71
  end
75
72
 
@@ -2,7 +2,7 @@ module Onfido
2
2
  class Address < Resource
3
3
  def all(postcode)
4
4
  get(
5
- url: url_for('addresses/pick'),
5
+ path: 'addresses/pick',
6
6
  payload: { postcode: postcode.delete(' ') }
7
7
  )
8
8
  end
@@ -1,23 +1,27 @@
1
1
  module Onfido
2
2
  class Applicant < Resource
3
3
  def create(payload)
4
- post(url: url_for('applicants'), payload: payload)
4
+ post(path: 'applicants', payload: payload)
5
5
  end
6
6
 
7
7
  def update(applicant_id, payload)
8
- put(url: url_for("applicants/#{applicant_id}"), payload: payload)
8
+ put(path: "applicants/#{applicant_id}", payload: payload)
9
9
  end
10
10
 
11
11
  def destroy(applicant_id)
12
- delete(url: url_for("applicants/#{applicant_id}"))
12
+ delete(path: "applicants/#{applicant_id}")
13
13
  end
14
14
 
15
15
  def find(applicant_id)
16
- get(url: url_for("applicants/#{applicant_id}"))
16
+ get(path: "applicants/#{applicant_id}")
17
17
  end
18
18
 
19
19
  def all(page: 1, per_page: 20)
20
- get(url: url_for("applicants?page=#{page}&per_page=#{per_page}"))
20
+ get(path: "applicants?page=#{page}&per_page=#{per_page}")
21
+ end
22
+
23
+ def restore(applicant_id)
24
+ post(path: "applicants/#{applicant_id}/restore")
21
25
  end
22
26
  end
23
27
  end
@@ -1,26 +1,22 @@
1
1
  module Onfido
2
2
  class Check < Resource
3
- def create(applicant_id, payload)
4
- post(
5
- url: url_for("applicants/#{applicant_id}/checks"),
6
- payload: payload
7
- )
3
+ def create(applicant_id:, report_names:, **payload)
4
+ payload[:applicant_id] = applicant_id
5
+ payload[:report_names] = report_names
6
+
7
+ post(path: 'checks', payload: payload)
8
8
  end
9
9
 
10
- def find(applicant_id, check_id, expand: nil)
11
- querystring = "&expand=#{expand}" if expand
12
- get(url: url_for("applicants/#{applicant_id}/checks/#{check_id}?" \
13
- "#{querystring}"))
10
+ def find(check_id)
11
+ get(path: "checks/#{check_id}")
14
12
  end
15
13
 
16
- def all(applicant_id, page: 1, per_page: 20, expand: nil)
17
- querystring = "page=#{page}&per_page=#{per_page}"
18
- querystring += "&expand=#{expand}" if expand
19
- get(url: url_for("applicants/#{applicant_id}/checks?#{querystring}"))
14
+ def all(applicant_id)
15
+ get(path: "checks?applicant_id=#{applicant_id}")
20
16
  end
21
17
 
22
18
  def resume(check_id)
23
- post(url: url_for("checks/#{check_id}/resume"))
19
+ post(path: "checks/#{check_id}/resume")
24
20
  end
25
21
  end
26
22
  end
@@ -2,25 +2,25 @@ module Onfido
2
2
  class Document < Resource
3
3
  # with open-uri the file can be a link or an actual file
4
4
 
5
- def create(applicant_id, payload)
6
- validate_file!(payload.fetch(:file))
5
+ def create(applicant_id:, file:, type:, **payload)
6
+ validate_file!(file)
7
+ payload[:applicant_id] = applicant_id
8
+ payload[:file] = file
9
+ payload[:type] = type
7
10
 
8
- post(
9
- url: url_for("applicants/#{applicant_id}/documents"),
10
- payload: payload
11
- )
11
+ post(path: 'documents', payload: payload)
12
12
  end
13
13
 
14
- def find(applicant_id, document_id)
15
- get(url: url_for("applicants/#{applicant_id}/documents/#{document_id}"))
14
+ def find(document_id)
15
+ get(path: "documents/#{document_id}")
16
16
  end
17
17
 
18
- def download(applicant_id, document_id)
19
- get(url: url_for("applicants/#{applicant_id}/documents/#{document_id}/download"))
18
+ def download(document_id)
19
+ get(path: "documents/#{document_id}/download")
20
20
  end
21
21
 
22
22
  def all(applicant_id)
23
- get(url: url_for("applicants/#{applicant_id}/documents"))
23
+ get(path: "documents?applicant_id=#{applicant_id}")
24
24
  end
25
25
  end
26
26
  end
@@ -0,0 +1,9 @@
1
+ module Onfido
2
+ class Extraction < Resource
3
+ def create(document_id:)
4
+ payload = { document_id: document_id }
5
+
6
+ post(path: 'extractions', payload: payload)
7
+ end
8
+ end
9
+ end
@@ -2,29 +2,24 @@ module Onfido
2
2
  class LivePhoto < Resource
3
3
  # with open-uri the file can be a link or an actual file
4
4
 
5
- def create(applicant_id, payload)
6
- validate_file!(payload.fetch(:file))
5
+ def create(applicant_id:, file:, **payload)
6
+ validate_file!(file)
7
7
  payload[:applicant_id] = applicant_id
8
+ payload[:file] = file
8
9
 
9
- post(
10
- url: url_for("/live_photos"),
11
- payload: payload
12
- )
10
+ post(path: 'live_photos', payload: payload)
13
11
  end
14
12
 
15
- def find(applicant_id, live_photo_id)
16
- query_string = "applicant_id=#{applicant_id}"
17
- get(url: url_for("live_photos/#{live_photo_id}?#{query_string}"))
13
+ def find(live_photo_id)
14
+ get(path: "live_photos/#{live_photo_id}")
18
15
  end
19
16
 
20
- def download(applicant_id, live_photo_id)
21
- query_string = "applicant_id=#{applicant_id}"
22
- get(url: url_for("live_photos/#{live_photo_id}/download?#{query_string}"))
17
+ def download(live_photo_id)
18
+ get(path: "live_photos/#{live_photo_id}/download")
23
19
  end
24
20
 
25
21
  def all(applicant_id)
26
- query_string = "applicant_id=#{applicant_id}"
27
- get(url: url_for("live_photos?#{query_string}"))
22
+ get(path: "live_photos?applicant_id=#{applicant_id}")
28
23
  end
29
24
  end
30
25
  end
@@ -1,18 +1,15 @@
1
1
  module Onfido
2
2
  class LiveVideo < Resource
3
- def find(applicant_id, live_video_id)
4
- query_string = "applicant_id=#{applicant_id}"
5
- get(url: url_for("live_videos/#{live_video_id}?#{query_string}"))
3
+ def find(live_video_id)
4
+ get(path: "live_videos/#{live_video_id}")
6
5
  end
7
6
 
8
- def download(applicant_id, live_video_id)
9
- query_string = "applicant_id=#{applicant_id}"
10
- get(url: url_for("live_videos/#{live_video_id}/download?#{query_string}"))
7
+ def download(live_video_id)
8
+ get(path: "live_videos/#{live_video_id}/download")
11
9
  end
12
10
 
13
11
  def all(applicant_id)
14
- query_string = "applicant_id=#{applicant_id}"
15
- get(url: url_for("live_videos?#{query_string}"))
12
+ get(path: "live_videos?applicant_id=#{applicant_id}")
16
13
  end
17
14
  end
18
15
  end
@@ -1,20 +1,19 @@
1
1
  module Onfido
2
2
  class Report < Resource
3
- def find(check_id, report_id)
4
- get(url: url_for("checks/#{check_id}/reports/#{report_id}"))
3
+ def find(report_id)
4
+ get(path: "reports/#{report_id}")
5
5
  end
6
6
 
7
- def all(check_id, page: 1, per_page: 20)
8
- querystring = "page=#{page}&per_page=#{per_page}"
9
- get(url: url_for("checks/#{check_id}/reports?#{querystring}"))
7
+ def all(check_id)
8
+ get(path: "reports?check_id=#{check_id}")
10
9
  end
11
10
 
12
- def resume(check_id, report_id)
13
- post(url: url_for("checks/#{check_id}/reports/#{report_id}/resume"))
11
+ def resume(report_id)
12
+ post(path: "reports/#{report_id}/resume")
14
13
  end
15
14
 
16
- def cancel(check_id, report_id)
17
- post(url: url_for("checks/#{check_id}/reports/#{report_id}/cancel"))
15
+ def cancel(report_id)
16
+ post(path: "reports/#{report_id}/cancel")
18
17
  end
19
18
  end
20
19
  end
@@ -1,10 +1,8 @@
1
1
  module Onfido
2
2
  class SdkToken < Resource
3
- def create(payload)
4
- post(
5
- url: url_for("sdk_token"),
6
- payload: payload
7
- )
3
+ def create(applicant_id:, **payload)
4
+ payload[:applicant_id] = applicant_id
5
+ post(path: 'sdk_token', payload: payload)
8
6
  end
9
7
  end
10
8
  end
@@ -1,18 +1,20 @@
1
1
  module Onfido
2
2
  class Webhook < Resource
3
- def create(payload)
4
- post(
5
- url: url_for('webhooks'),
6
- payload: payload
7
- )
3
+ def create(url:, **payload)
4
+ payload[:url] = url
5
+ post(path: 'webhooks', payload: payload)
8
6
  end
9
7
 
10
8
  def find(webhooks_id)
11
- get(url: url_for("webhooks/#{webhooks_id}"))
9
+ get(path: "webhooks/#{webhooks_id}")
12
10
  end
13
11
 
14
- def all(page: 1, per_page: 20)
15
- get(url: url_for("webhooks?page=#{page}&per_page=#{per_page}"))
12
+ def all
13
+ get(path: 'webhooks')
14
+ end
15
+
16
+ def destroy(webhook_id)
17
+ delete(path: "webhooks/#{webhook_id}")
16
18
  end
17
19
 
18
20
  # As well as being a normal resource, Onfido::Webhook also supports
@@ -29,7 +31,7 @@ module Onfido
29
31
  end
30
32
 
31
33
  def self.generate_signature(request_body, token)
32
- OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), token, request_body)
34
+ OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), token, request_body)
33
35
  end
34
36
  private_class_method :generate_signature
35
37
  end
@@ -1,3 +1,3 @@
1
1
  module Onfido
2
- VERSION = '0.12.0'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -1,20 +1,20 @@
1
1
  # coding: utf-8
2
2
 
3
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'onfido/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'onfido'
9
9
  spec.version = Onfido::VERSION
10
- spec.authors = ['Pericles Theodorou', 'Grey Baker']
11
- spec.email = ['periclestheo@gmail.com', 'grey@gocardless.com']
10
+ spec.authors = ['Onfido']
11
+ spec.email = ['engineering@onfido.com']
12
12
  spec.summary = 'A wrapper for Onfido API'
13
- spec.description = "A thin wrapper for Onfido's API. This gem supports "\
14
- "both v1 and v2 of the Onfido API. Refer to Onfido's "\
13
+ spec.description = "A thin wrapper for Onfido's API. This gem only supports "\
14
+ "v3 of the Onfido API. Refer to Onfido's "\
15
15
  "API documentation for details of the expected "\
16
- "requests and responses for both."
17
- spec.homepage = 'http://github.com/hvssle/onfido'
16
+ "requests and responses."
17
+ spec.homepage = 'http://github.com/onfido/onfido-ruby'
18
18
  spec.license = 'MIT'
19
19
 
20
20
  spec.files = `git ls-files -z`.split("\x0")
@@ -23,11 +23,10 @@ Gem::Specification.new do |spec|
23
23
  spec.require_paths = ['lib']
24
24
  spec.required_ruby_version = ">= 2.2.0"
25
25
 
26
- spec.add_development_dependency 'bundler', '~> 1.7'
27
26
  spec.add_development_dependency 'rake', '~> 12.0'
28
27
  spec.add_development_dependency 'rspec', '~> 3.1'
29
28
  spec.add_development_dependency 'rspec-its', '~> 1.2'
30
- spec.add_development_dependency 'rubocop', '~> 0.52.0'
29
+ spec.add_development_dependency 'rubocop', '~> 0.57.0'
31
30
  spec.add_development_dependency 'sinatra', '~> 1.4'
32
31
  spec.add_development_dependency 'webmock', '~> 3.0'
33
32
 
@@ -4,6 +4,7 @@ describe Onfido::Address do
4
4
  describe '#all' do
5
5
  it 'returns the addresses matching the postcode' do
6
6
  response = api.address.all('SW1 4NG')
7
+
7
8
  expect(response['addresses'].count).to eq(2)
8
9
  end
9
10
  end
@@ -1,38 +1,24 @@
1
1
  describe Onfido::Applicant do
2
2
  subject(:applicant) { described_class.new }
3
+ let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
3
4
  let(:params) do
4
5
  {
5
6
  'title' => 'Mr',
6
7
  'first_name' => 'Chandler',
7
8
  'last_name' => 'Bing',
8
- 'gender' => 'male',
9
9
  'middle_name' => 'Muriel',
10
10
  'dob' => '1968-04-08',
11
- 'telephone' => '555555555',
12
- 'mobile' => '77777777',
13
11
  'email' => 'chandler_bing_6@friends.com',
14
- 'addresses' => [
15
- {
16
- 'flat_number' => '4',
17
- 'building_number' => '100',
18
- 'building_name' => 'Awesome Building',
19
- 'street' => 'Main Street',
20
- 'sub_street' => 'A sub street',
21
- 'town' => 'London',
22
- 'postcode' => 'SW4 6EH',
23
- 'country' => 'GBR'
24
- },
25
- {
26
- 'flat_number' => '1',
27
- 'building_number' => '10',
28
- 'building_name' => 'Great Building',
29
- 'street' => 'Old Street',
30
- 'sub_street' => 'Sub Street',
31
- 'town' => 'London',
32
- 'postcode' => 'SW1 4NG',
33
- 'country' => 'GBR'
34
- }
35
- ]
12
+ 'address' => {
13
+ 'flat_number' => '4',
14
+ 'building_number' => '100',
15
+ 'building_name' => 'Awesome Building',
16
+ 'street' => 'Main Street',
17
+ 'sub_street' => 'A sub street',
18
+ 'town' => 'London',
19
+ 'postcode' => 'SW4 6EH',
20
+ 'country' => 'GBR'
21
+ }
36
22
  }
37
23
  end
38
24
 
@@ -43,7 +29,7 @@ describe Onfido::Applicant do
43
29
 
44
30
  it 'serializes the payload correctly' do
45
31
  WebMock.after_request do |request_signature, _response|
46
- if request_signature.uri.path == 'v2/applicants'
32
+ if request_signature.uri.path == 'v3/applicants'
47
33
  expect(Rack::Utils.parse_nested_query(request_signature.body)).
48
34
  to eq(params)
49
35
  end
@@ -57,26 +43,22 @@ describe Onfido::Applicant do
57
43
  end
58
44
 
59
45
  describe '#update' do
60
- let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
61
-
62
46
  it 'updates an applicant' do
63
47
  response = applicant.update(applicant_id, params)
48
+
64
49
  expect(response['id']).to eq(applicant_id)
65
50
  end
66
51
  end
67
52
 
68
53
  describe '#find' do
69
- let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
70
-
71
54
  it 'returns the applicant' do
72
55
  response = applicant.find(applicant_id)
56
+
73
57
  expect(response['id']).to eq(applicant_id)
74
58
  end
75
59
  end
76
60
 
77
61
  describe '#destroy' do
78
- let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
79
-
80
62
  it 'returns success code' do
81
63
  expect { applicant.destroy(applicant_id) }.not_to raise_error
82
64
  end
@@ -86,6 +68,7 @@ describe Onfido::Applicant do
86
68
  context 'with the default page and per page params' do
87
69
  it 'returns all the applicants' do
88
70
  response = applicant.all
71
+
89
72
  expect(response['applicants'].size).to eq(2)
90
73
  end
91
74
  end
@@ -93,8 +76,31 @@ describe Onfido::Applicant do
93
76
  context 'with specific range of results for a page' do
94
77
  it 'returns the specified applicants' do
95
78
  response = applicant.all(page: 1, per_page: 1)
79
+
96
80
  expect(response['applicants'].size).to eq(1)
97
81
  end
98
82
  end
99
83
  end
84
+
85
+ describe '#restore' do
86
+ context 'an applicant scheduled for deletion' do
87
+ it 'returns nil' do
88
+ expect(applicant.restore(applicant_id)).to be_nil
89
+ end
90
+ end
91
+
92
+ context 'an applicant not scheduled for deletion' do
93
+ it 'returns an error' do
94
+ applicant_id = 'a2fb9c62-ab10-4898-a8ec-342c4b552ad5'
95
+
96
+ expect { applicant.restore(applicant_id) }.to raise_error { |error|
97
+ expect(error).to be_a(Onfido::RequestError)
98
+ expect(error.message).to eq('There was a validation error on this request')
99
+ expect(error.fields).to eq(
100
+ "Applicant a2fb9c62-ab10-4898-a8ec-342c4b552ad5 is not scheduled for deletion"
101
+ )
102
+ }
103
+ end
104
+ end
105
+ end
100
106
  end