egree 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|