egree 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +20 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +5 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +72 -0
  8. data/Rakefile +1 -0
  9. data/egree.gemspec +31 -0
  10. data/lib/egree.rb +8 -0
  11. data/lib/egree/case.rb +64 -0
  12. data/lib/egree/client.rb +103 -0
  13. data/lib/egree/document.rb +45 -0
  14. data/lib/egree/form_field.rb +3 -0
  15. data/lib/egree/party.rb +21 -0
  16. data/lib/egree/reference_id.rb +34 -0
  17. data/lib/egree/serializers/case.rb +22 -0
  18. data/lib/egree/serializers/document.rb +21 -0
  19. data/lib/egree/serializers/form_field.rb +16 -0
  20. data/lib/egree/serializers/party.rb +17 -0
  21. data/lib/egree/serializers/reference_id.rb +18 -0
  22. data/lib/egree/version.rb +3 -0
  23. data/spec/egree/case_spec.rb +74 -0
  24. data/spec/egree/client/create_case_spec.rb +62 -0
  25. data/spec/egree/client/get_case_url_spec.rb +84 -0
  26. data/spec/egree/client_spec.rb +125 -0
  27. data/spec/egree/document_spec.rb +73 -0
  28. data/spec/egree/form_field_spec.rb +18 -0
  29. data/spec/egree/party_spec.rb +35 -0
  30. data/spec/egree/reference_id_spec.rb +40 -0
  31. data/spec/egree/serializers/case_spec.rb +30 -0
  32. data/spec/egree/serializers/document_spec.rb +45 -0
  33. data/spec/egree/serializers/form_field_spec.rb +29 -0
  34. data/spec/egree/serializers/party_spec.rb +34 -0
  35. data/spec/egree/serializers/reference_id_spec.rb +28 -0
  36. data/spec/egree_spec.rb +17 -0
  37. data/spec/fixtures/agreement.pdf +0 -0
  38. data/spec/fixtures/cassettes/Egree_Client/_create_case/invalid_case.yml +58 -0
  39. data/spec/fixtures/cassettes/Egree_Client/_create_case/valid_case.yml +67 -0
  40. data/spec/fixtures/cassettes/Egree_Client/_create_case/with_an_invalid_case/includes_the_error_message.yml +66 -0
  41. data/spec/fixtures/cassettes/Egree_Client/_get_case_url/case_exists.yml +113 -0
  42. data/spec/fixtures/cassettes/Egree_Client/_get_case_url/case_missing.yml +45 -0
  43. data/spec/spec_helper.rb +38 -0
  44. metadata +219 -0
@@ -0,0 +1,22 @@
1
+ require "json"
2
+ require "egree/serializers/party"
3
+ require "egree/serializers/document"
4
+
5
+ module Egree
6
+ module Serializers
7
+ module Case
8
+ def self.serialize signature_case
9
+ JSON.pretty_generate to_api_hash(signature_case)
10
+ end
11
+
12
+ def self.to_api_hash signature_case
13
+ {
14
+ "Name" => signature_case.name,
15
+ "Documents" => signature_case.documents.map { |document| Document.to_api_hash(document) },
16
+ "Parties" => signature_case.parties.map { |party| Party.to_api_hash(party) },
17
+ "AllowedSignatureTypes" => signature_case.signature_types
18
+ }.merge(signature_case.reference_id.to_api_hash)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ require "egree/serializers/form_field"
2
+
3
+ module Egree
4
+ module Serializers
5
+ module Document
6
+ def self.serialize document
7
+ JSON.pretty_generate to_api_hash(document)
8
+ end
9
+
10
+ def self.to_api_hash document
11
+ {
12
+ "Filename" => document.filename,
13
+ "Data" => document.data,
14
+ "ContentType" => document.content_type,
15
+ "Size" => document.size,
16
+ "FormFields" => document.form_fields.map { |form_field| FormField.to_api_hash(form_field) }
17
+ }
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module Egree
2
+ module Serializers
3
+ module FormField
4
+ def self.serialize form_field
5
+ JSON.pretty_generate to_api_hash(form_field)
6
+ end
7
+
8
+ def self.to_api_hash form_field
9
+ {
10
+ "Name" => form_field.name,
11
+ "Value" => form_field.value
12
+ }
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module Egree
2
+ module Serializers
3
+ module Party
4
+ def self.serialize party
5
+ JSON.pretty_generate to_api_hash(party)
6
+ end
7
+
8
+ def self.to_api_hash party
9
+ {
10
+ "Name" => party.name,
11
+ "EmailAddress" => party.email,
12
+ "SocialSecurityNumber" => party.social_security_number
13
+ }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ require "json"
2
+
3
+ module Egree
4
+ module Serializers
5
+ module ReferenceId
6
+ def self.serialize reference_id
7
+ JSON.pretty_generate to_api_hash(reference_id)
8
+ end
9
+
10
+ def self.to_api_hash reference_id
11
+ {
12
+ "CaseReferenceId" => reference_id.to_s
13
+ }
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,3 @@
1
+ module Egree
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,74 @@
1
+ require "spec_helper"
2
+ require "egree/case"
3
+
4
+ module Egree
5
+ RSpec.describe Case do
6
+ let :signature_case do
7
+ Case.new "Agreement", Case.signature_types
8
+ end
9
+
10
+ it "requires a name" do
11
+ expect(signature_case.name).to eq "Agreement"
12
+ end
13
+
14
+ specify ".generate_reference_id" do
15
+ expect(Egree::ReferenceId).to receive(:generate).and_return "very-random"
16
+
17
+ expect(Case.generate_reference_id).to eq "very-random"
18
+ end
19
+
20
+ describe "#reference_id" do
21
+ it "creates a unique reference_id" do
22
+ expect(Case).to receive(:generate_reference_id).and_return "very-random"
23
+
24
+ expect(signature_case.reference_id).to eq "very-random"
25
+ end
26
+
27
+ it "does not change the reference_id after created" do
28
+ last_id = signature_case.reference_id
29
+
30
+ expect(signature_case.reference_id).to eq last_id
31
+ end
32
+
33
+ it "does not share reference_id between instances" do
34
+ expect(signature_case.reference_id).to_not eq Case.new("Agreement", Case.signature_types).reference_id
35
+ end
36
+ end
37
+
38
+ describe "signature types" do
39
+ it "requires at least one valid signature type" do
40
+ signature_case = Case.new "Agreement", Case.signature_types.first
41
+
42
+ expect(signature_case.signature_types).to eq [ Case.signature_types.first ]
43
+ end
44
+
45
+ it "throws an error if it is an unknown signature type" do
46
+ expect{ Case.new("Agreement", "unknown type") }.to raise_error(ArgumentError)
47
+ end
48
+ end
49
+
50
+ it "adds a party" do
51
+ signature_case = Case.new "Agreement", Case.signature_types
52
+
53
+ party = double "Party"
54
+ signature_case.add_party party
55
+
56
+ expect(signature_case.parties).to eq [party]
57
+ end
58
+
59
+ it "adds a document" do
60
+ signature_case = Case.new "Agreement", Case.signature_types
61
+
62
+ document = double "Document"
63
+ signature_case.add_document document
64
+
65
+ expect(signature_case.documents).to eq [document]
66
+ end
67
+
68
+ describe "#to_json" do
69
+ it "uses Serializers::Case" do
70
+ expect(signature_case.to_json).to eq Serializers::Case.serialize(signature_case)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,62 @@
1
+ require "luhn"
2
+ require "spec_helper"
3
+
4
+ require "egree/client"
5
+ require "egree/case"
6
+ require "egree/document"
7
+ require "egree/party"
8
+
9
+ module Egree
10
+ describe Egree::Client do
11
+ describe "#create_case" do
12
+ let :client do
13
+ Egree::Client.new ENV["EGREE_USERNAME"], ENV["EGREE_PASSWORD"], :test
14
+ end
15
+
16
+ it "sends the create case comamnd with a json representation of the case" do
17
+ allow(client).to receive :post
18
+
19
+ signature_case = double "Case", to_json: "case-json"
20
+
21
+ client.create_case signature_case
22
+
23
+ expect(client).to have_received(:post).with "/apiv1/createcasecommand", "case-json"
24
+ end
25
+
26
+ describe "with a valid case", vcr: { cassette_name: "Egree_Client/_create_case/valid_case" } do
27
+ it "returns a successful result object" do
28
+ signature_case = Egree::Case.new "Agreement", ["touch"]
29
+ signature_case.add_party Egree::Party.new_with_attributes({
30
+ name: "First Last",
31
+ email: "name@example.com",
32
+ social_security_number: Luhn::CivicNumber.generate
33
+ })
34
+ signature_case.add_document Egree::Document.new(File.join(Dir.pwd, "spec/fixtures/agreement.pdf"))
35
+
36
+ result = client.create_case signature_case
37
+
38
+ expect(result.success?).to be true
39
+ end
40
+ end
41
+
42
+ describe "with an invalid case" do
43
+ it "returns a error result object", vcr: { cassette_name: "Egree_Client/_create_case/invalid_case" } do
44
+ signature_case = Egree::Case.new "Agreement", ["touch"]
45
+
46
+ result = client.create_case signature_case
47
+
48
+ expect(result.success?).to be false
49
+ end
50
+
51
+ it "includes the error message", vcr: true do
52
+ signature_case = Egree::Case.new "Agreement", ["touch"]
53
+ signature_case.add_document Egree::Document.new(File.join(Dir.pwd, "spec/fixtures/agreement.pdf"))
54
+
55
+ result = client.create_case signature_case
56
+
57
+ expect(result.errors[0]).to eq "E041 At least one signer is required."
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,84 @@
1
+ require "luhn"
2
+ require "spec_helper"
3
+
4
+ require "egree/client"
5
+ require "egree/case"
6
+ require "egree/document"
7
+ require "egree/party"
8
+
9
+ module Egree
10
+ describe Egree::Client do
11
+ let :client do
12
+ Egree::Client.new ENV["EGREE_USERNAME"], ENV["EGREE_PASSWORD"], :test
13
+ end
14
+
15
+ describe "#get_case_url" do
16
+ it "sends the getviewcaseurl query with the case reference id" do
17
+ allow(client).to receive :post
18
+
19
+ signature_case = double "Case", to_json: "reference-id-json"
20
+
21
+ client.get_case_url signature_case
22
+
23
+ expect(client).to have_received(:post).with "/apiv1/getviewcaseurlquery", "reference-id-json"
24
+ end
25
+
26
+ describe "when the case exists", vcr: { cassette_name: "Egree_Client/_get_case_url/case_exists" } do
27
+ let :reference_id do
28
+ Egree::Case.generate_reference_id
29
+ end
30
+
31
+ before do
32
+ create_case reference_id
33
+ end
34
+
35
+ describe "result" do
36
+ it "is successfull" do
37
+ result = client.get_case_url reference_id
38
+
39
+ expect(result.success?).to be true
40
+ end
41
+
42
+ it "has the url as the response" do
43
+ result = client.get_case_url reference_id
44
+
45
+ expect(result.response).to match "https://test.underskrift.se"
46
+ end
47
+ end
48
+ end
49
+
50
+ describe "when there is no matching case" do
51
+ describe "result", vcr: { cassette_name: "Egree_Client/_get_case_url/case_missing" } do
52
+ it "is not successfull" do
53
+ result = client.get_case_url "missing-case"
54
+
55
+ expect(result.success?).to be false
56
+ end
57
+
58
+ it "has the error" do
59
+ result = client.get_case_url "missing-case"
60
+
61
+ expect(result.errors[0]).to eq "E030 User is not creator of case."
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ private
68
+
69
+ def create_case reference_id = nil
70
+ signature_case = Egree::Case.new "Agreement", ["touch"]
71
+ signature_case.add_party Egree::Party.new_with_attributes({
72
+ name: "First Last",
73
+ email: "name@example.com",
74
+ social_security_number: Luhn::CivicNumber.generate
75
+ })
76
+ signature_case.add_document Egree::Document.new(File.join(Dir.pwd, "spec/fixtures/agreement.pdf"))
77
+
78
+ signature_case.reference_id = reference_id if reference_id
79
+
80
+ client.create_case signature_case
81
+ end
82
+ end
83
+ end
84
+
@@ -0,0 +1,125 @@
1
+ require "spec_helper"
2
+ require "egree/client"
3
+
4
+ RSpec.describe Egree::Client do
5
+ let :client do
6
+ Egree::Client.new "admin", "secret"
7
+ end
8
+
9
+ it "instantiates with username and password" do
10
+ expect(client.username).to eq "admin"
11
+ expect(client.password).to eq "secret"
12
+ end
13
+
14
+ describe "host" do
15
+ it "defaults to the production environment" do
16
+ expect(client.host).to eq "app.egree.com"
17
+ end
18
+
19
+ it "can be set to the test environment" do
20
+ test_host = "test.underskrift.se"
21
+
22
+ expect(Egree::Client.new("admin", "secret", :test).host).to eq test_host
23
+
24
+ client = Egree::Client.new "admin", "secret"
25
+ client.environment = :test
26
+
27
+ expect(client.host).to eq test_host
28
+ end
29
+ end
30
+
31
+ describe "#post" do
32
+ it "it sends the json as the request body" do
33
+ stub_request(:post, "https://admin:secret@app.egree.com/some/path").with({
34
+ body: '{ "key": "value" }'
35
+ })
36
+
37
+ client.post "/some/path", '{ "key": "value" }'
38
+ end
39
+
40
+ describe "headers" do
41
+ it "sets application/json with utf8 charset" do
42
+ stub_request(:post, "https://admin:secret@app.egree.com/some/path").with({
43
+ headers: { "content-type" => "application/json; charset=utf-8" }
44
+ })
45
+
46
+ client.post "/some/path", '{ "key": "value" }'
47
+ end
48
+ end
49
+
50
+ describe "with a successful response" do
51
+ before do
52
+ stub_request(:post, "https://admin:secret@app.egree.com/some/path").to_return({
53
+ status: 200,
54
+ body: '{ "result": "Success" }'
55
+ })
56
+ end
57
+
58
+ describe "result" do
59
+ it "is successfull" do
60
+ result = client.post "/some/path"
61
+
62
+ expect(result.success?).to be true
63
+ end
64
+
65
+ it "parses the response json" do
66
+ result = client.post "/some/path"
67
+
68
+ expect(result.response).to eq("result" => "Success")
69
+ end
70
+
71
+ it "handles simple string bodies" do
72
+ stub_request(:post, "https://admin:secret@app.egree.com/some/path").to_return({
73
+ status: 200,
74
+ body: "a string response"
75
+ })
76
+
77
+ result = client.post "/some/path"
78
+
79
+ expect(result.response).to eq "a string response"
80
+ end
81
+ end
82
+ end
83
+
84
+ describe "with a error response" do
85
+ before do
86
+ stub_request(:post, "https://admin:secret@app.egree.com/some/path").to_return({
87
+ status: 500,
88
+ body: "<html><p>Error message</p><p>Another error</p></html>"
89
+ })
90
+ end
91
+
92
+ it "returns a error result" do
93
+ result = client.post "/some/path"
94
+
95
+ expect(result.success?).to be false
96
+ end
97
+
98
+ it "parses the error messages from the html body" do
99
+ result = client.post "/some/path"
100
+
101
+ expect(result.errors).to eq [ "Error message", "Another error" ]
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "#connection" do
107
+ it "looks lika a faraday connection" do
108
+ expect(client.connection).to be_kind_of Faraday::Connection
109
+ end
110
+
111
+ it "runs over https" do
112
+ expect(client.connection.scheme).to eq "https"
113
+ end
114
+
115
+ it "points to the host" do
116
+ expect(client.connection.host).to eq client.host
117
+ end
118
+
119
+ describe "authentication" do
120
+ it "uses basic auth" do
121
+ expect(client.headers["Authorization"]).to eq "Basic YWRtaW46c2VjcmV0"
122
+ end
123
+ end
124
+ end
125
+ end