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.
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