egree 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.rspec +3 -0
- data/.travis.yml +13 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +72 -0
- data/Rakefile +1 -0
- data/egree.gemspec +31 -0
- data/lib/egree.rb +8 -0
- data/lib/egree/case.rb +64 -0
- data/lib/egree/client.rb +103 -0
- data/lib/egree/document.rb +45 -0
- data/lib/egree/form_field.rb +3 -0
- data/lib/egree/party.rb +21 -0
- data/lib/egree/reference_id.rb +34 -0
- data/lib/egree/serializers/case.rb +22 -0
- data/lib/egree/serializers/document.rb +21 -0
- data/lib/egree/serializers/form_field.rb +16 -0
- data/lib/egree/serializers/party.rb +17 -0
- data/lib/egree/serializers/reference_id.rb +18 -0
- data/lib/egree/version.rb +3 -0
- data/spec/egree/case_spec.rb +74 -0
- data/spec/egree/client/create_case_spec.rb +62 -0
- data/spec/egree/client/get_case_url_spec.rb +84 -0
- data/spec/egree/client_spec.rb +125 -0
- data/spec/egree/document_spec.rb +73 -0
- data/spec/egree/form_field_spec.rb +18 -0
- data/spec/egree/party_spec.rb +35 -0
- data/spec/egree/reference_id_spec.rb +40 -0
- data/spec/egree/serializers/case_spec.rb +30 -0
- data/spec/egree/serializers/document_spec.rb +45 -0
- data/spec/egree/serializers/form_field_spec.rb +29 -0
- data/spec/egree/serializers/party_spec.rb +34 -0
- data/spec/egree/serializers/reference_id_spec.rb +28 -0
- data/spec/egree_spec.rb +17 -0
- data/spec/fixtures/agreement.pdf +0 -0
- data/spec/fixtures/cassettes/Egree_Client/_create_case/invalid_case.yml +58 -0
- data/spec/fixtures/cassettes/Egree_Client/_create_case/valid_case.yml +67 -0
- data/spec/fixtures/cassettes/Egree_Client/_create_case/with_an_invalid_case/includes_the_error_message.yml +66 -0
- data/spec/fixtures/cassettes/Egree_Client/_get_case_url/case_exists.yml +113 -0
- data/spec/fixtures/cassettes/Egree_Client/_get_case_url/case_missing.yml +45 -0
- data/spec/spec_helper.rb +38 -0
- 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,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
|