emites-client 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +31 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +366 -0
  8. data/Rakefile +9 -0
  9. data/emites-client.gemspec +37 -0
  10. data/lib/emites.rb +44 -0
  11. data/lib/emites/client.rb +30 -0
  12. data/lib/emites/configuration.rb +12 -0
  13. data/lib/emites/entities/account.rb +8 -0
  14. data/lib/emites/entities/base.rb +9 -0
  15. data/lib/emites/entities/emitter.rb +31 -0
  16. data/lib/emites/entities/nfse.rb +29 -0
  17. data/lib/emites/entities/nfse_status.rb +15 -0
  18. data/lib/emites/entities/nfse_status_transition.rb +14 -0
  19. data/lib/emites/entities/nfse_values.rb +28 -0
  20. data/lib/emites/entities/rps.rb +9 -0
  21. data/lib/emites/entities/taker.rb +20 -0
  22. data/lib/emites/entities/taker_address.rb +21 -0
  23. data/lib/emites/entities/taker_contact.rb +9 -0
  24. data/lib/emites/entities/webhook.rb +9 -0
  25. data/lib/emites/exception.rb +11 -0
  26. data/lib/emites/http.rb +34 -0
  27. data/lib/emites/request.rb +53 -0
  28. data/lib/emites/resources/base.rb +45 -0
  29. data/lib/emites/resources/emitter.rb +98 -0
  30. data/lib/emites/resources/hooks.rb +25 -0
  31. data/lib/emites/resources/nfse.rb +173 -0
  32. data/lib/emites/resources/webhook.rb +84 -0
  33. data/lib/emites/response.rb +38 -0
  34. data/lib/emites/version.rb +3 -0
  35. data/spec/emites/client_spec.rb +45 -0
  36. data/spec/emites/configuration_spec.rb +13 -0
  37. data/spec/emites/entities/account_spec.rb +14 -0
  38. data/spec/emites/entities/base_spec.rb +28 -0
  39. data/spec/emites/entities/emitter_spec.rb +20 -0
  40. data/spec/emites/entities/nfse_spec.rb +148 -0
  41. data/spec/emites/entities/nfse_status_spec.rb +16 -0
  42. data/spec/emites/entities/nfse_status_transition_spec.rb +23 -0
  43. data/spec/emites/entities/nfse_values_spec.rb +19 -0
  44. data/spec/emites/entities/rps_spec.rb +15 -0
  45. data/spec/emites/entities/taker_address_spec.rb +18 -0
  46. data/spec/emites/entities/taker_contact_spec.rb +13 -0
  47. data/spec/emites/entities/taker_spec.rb +18 -0
  48. data/spec/emites/entities/webhook_spec.rb +14 -0
  49. data/spec/emites/exception_spec.rb +21 -0
  50. data/spec/emites/http_spec.rb +62 -0
  51. data/spec/emites/resources/base_spec.rb +96 -0
  52. data/spec/emites/resources/emitter_spec.rb +119 -0
  53. data/spec/emites/resources/nfse_spec.rb +214 -0
  54. data/spec/emites/resources/webhook_spec.rb +62 -0
  55. data/spec/emites_spec.rb +63 -0
  56. data/spec/fixtures/certificate.pfx +0 -0
  57. data/spec/shared_examples/bound_notifiers.rb +8 -0
  58. data/spec/shared_examples/entity_attributes.rb +9 -0
  59. data/spec/spec_helper.rb +38 -0
  60. data/spec/support/matchers/have_attr_accessor.rb +18 -0
  61. data/spec/vcr_cassettes/client/authenticated/false.yml +48 -0
  62. data/spec/vcr_cassettes/client/authenticated/true.yml +259 -0
  63. data/spec/vcr_cassettes/emitters/create/error.yml +57 -0
  64. data/spec/vcr_cassettes/emitters/create/success.yml +80 -0
  65. data/spec/vcr_cassettes/emitters/destroy/error.yml +47 -0
  66. data/spec/vcr_cassettes/emitters/destroy/success.yml +44 -0
  67. data/spec/vcr_cassettes/emitters/info/error.yml +47 -0
  68. data/spec/vcr_cassettes/emitters/info/success.yml +77 -0
  69. data/spec/vcr_cassettes/emitters/list/success.yml +135 -0
  70. data/spec/vcr_cassettes/emitters/partial_update/success.yml +90 -0
  71. data/spec/vcr_cassettes/emitters/search/returns_empty.yml +47 -0
  72. data/spec/vcr_cassettes/emitters/search/success.yml +76 -0
  73. data/spec/vcr_cassettes/nfse/cancel/success.yml +49 -0
  74. data/spec/vcr_cassettes/nfse/create/given_taker.yml +109 -0
  75. data/spec/vcr_cassettes/nfse/create/incomplete.yml +73 -0
  76. data/spec/vcr_cassettes/nfse/create/success.yml +112 -0
  77. data/spec/vcr_cassettes/nfse/create/without_taker.yml +73 -0
  78. data/spec/vcr_cassettes/nfse/destroy/success.yml +46 -0
  79. data/spec/vcr_cassettes/nfse/history/success.yml +83 -0
  80. data/spec/vcr_cassettes/nfse/info/success.yml +113 -0
  81. data/spec/vcr_cassettes/nfse/list/success.yml +1353 -0
  82. data/spec/vcr_cassettes/nfse/pdf/success.yml +48 -0
  83. data/spec/vcr_cassettes/nfse/status/success.yml +51 -0
  84. data/spec/vcr_cassettes/nfse/update/success.yml +113 -0
  85. data/spec/vcr_cassettes/nfse/xml/success.yml +48 -0
  86. data/spec/vcr_cassettes/webhooks/create/success.yml +53 -0
  87. data/spec/vcr_cassettes/webhooks/destroy/success.yml +46 -0
  88. data/spec/vcr_cassettes/webhooks/list/success.yml +53 -0
  89. data/spec/vcr_cassettes/webhooks/update/success.yml +52 -0
  90. metadata +390 -0
@@ -0,0 +1,3 @@
1
+ module Emites
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,45 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Client do
4
+ let(:token) { "7A75E575CFDEDB91FF7E2CE22089181A" }
5
+ subject { described_class.new(token) }
6
+
7
+ describe "#authenticated?" do
8
+ context "with a valid token" do
9
+ it "returns true" do
10
+ VCR.use_cassette("client/authenticated/true") do
11
+ expect(subject.authenticated?).to be_truthy
12
+ end
13
+ end
14
+ end
15
+
16
+ context "with an invalid token" do
17
+ subject { described_class.new("FAKE-TOKEN") }
18
+
19
+ it "returns false" do
20
+ VCR.use_cassette("client/authenticated/false") do
21
+ expect(subject.authenticated?).to be_falsey
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "#emitters" do
28
+ it "returns an instance of Emites::Resources::Emitter" do
29
+ expect(subject.emitters).to be_a(Emites::Resources::Emitter)
30
+ end
31
+ end
32
+
33
+ describe "#webhooks" do
34
+ it "returns an instance of Emites::Resources::Webhook" do
35
+ expect(subject.webhooks).to be_a(Emites::Resources::Webhook)
36
+ end
37
+ end
38
+
39
+ describe "#nfse" do
40
+ it "returns an instance of Emites::Resources::Nfse" do
41
+ expect(subject.nfse).to be_a(Emites::Resources::Nfse)
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Configuration do
4
+
5
+ it "uses the production Emites URL by default" do
6
+ expect(subject.url).to eq "https://app.emites.com.br/api/v1"
7
+ end
8
+
9
+ it "uses a default user agent" do
10
+ expect(subject.user_agent).to eq "Emites Ruby Client v#{Emites::VERSION}"
11
+ end
12
+
13
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::Account do
4
+ let(:attributes) do
5
+ {
6
+ id: 1,
7
+ name: "Pull4up-NFSE"
8
+ }
9
+ end
10
+
11
+ subject { described_class.new(attributes) }
12
+
13
+ it_behaves_like "entity_attributes", [:id, :name]
14
+ end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::Base do
4
+
5
+ class DummyEntity < Emites::Entities::Base
6
+ attribute :property_1, String
7
+ attribute :property_2, String
8
+ end
9
+
10
+ let(:hash) { {property_1: 1, property_2: 2} }
11
+ subject { DummyEntity.new(hash) }
12
+
13
+ it "builds an object from a hash" do
14
+ expect(subject).to respond_to(:property_1)
15
+ expect(subject).to respond_to(:property_2)
16
+ expect(subject.property_1).to eq("1")
17
+ expect(subject.property_2).to eq("2")
18
+ end
19
+
20
+ describe "#attributes" do
21
+ it "returns a hash from object attributes" do
22
+ expect(subject.to_hash).to eq({
23
+ property_1: "1",
24
+ property_2: "2"
25
+ })
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::Emitter do
4
+ let(:attributes) do
5
+ {
6
+
7
+ }
8
+ end
9
+
10
+ subject { described_class.new(attributes) }
11
+
12
+ it_behaves_like "entity_attributes", [
13
+ :id, :email, :social_reason, :cnpj, :fancy_name,
14
+ :state_inscription, :city_inscription, :state, :city,
15
+ :neighborhood, :street_type, :street, :number, :zip_code,
16
+ :complement, :phone, :certificate, :password, :environment,
17
+ :filename, :latest_serie, :latest_number, :code_tax_regime,
18
+ :national_simple_optant, :cultural_promoter
19
+ ]
20
+ end
@@ -0,0 +1,148 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::Nfse do
4
+ let(:attributes) do
5
+ {
6
+ "_links" => [
7
+ {
8
+ "href" => "https://sandbox.emites.com.br/api/v1/nfse/1",
9
+ "method" => "GET",
10
+ "rel" => "self"
11
+ }, {
12
+ "href" => "https://sandbox.emites.com.br/api/v1/nfse/1",
13
+ "method" => "DELETE",
14
+ "rel" => "destroy"
15
+ }, {
16
+ "href" => "https://sandbox.emites.com.br/api/v1/nfse/1/status",
17
+ "method" => "GET",
18
+ "rel" => "status"
19
+ }, {
20
+ "href" => "https://sandbox.emites.com.br/api/v1/nfse/1/cancel",
21
+ "method" => "POST",
22
+ "rel" => "cancel"
23
+ }, {
24
+ "href" => "https://sandbox.emites.com.br/api/v1/nfse/1/xml",
25
+ "method" => "GET",
26
+ "rel" => "xml"
27
+ }, {
28
+ "href" => "https://sandbox.emites.com.br/api/v1/nfse/1/pdf",
29
+ "method" => "GET",
30
+ "rel" => "pdf"
31
+ }, {
32
+ "href" => "https://sandbox.emites.com.br/api/v1/nfse/1/history",
33
+ "method" => "GET",
34
+ "rel" => "history"
35
+ }, {
36
+ "href" => "https://sandbox.emites.com.br/nfse/show/1",
37
+ "method" => "GET",
38
+ "rel" => "html"
39
+ }
40
+ ],
41
+ "taker" => {
42
+ "address" => {
43
+ "id" => 1,
44
+ "street" => "Feijó Junior",
45
+ "number" => "535",
46
+ "complement" => "Sala 102",
47
+ "neighborhood" => "Sao Pelegrino",
48
+ "city_code" => 4305108,
49
+ "state" => "RS",
50
+ "zip_code" => 95110550,
51
+ "street_type" => "RUA",
52
+ "neighborhood_type" => "COM",
53
+ "city" => "Caxias do Sul",
54
+ "reference_point" => nil,
55
+ "country" => "Brasil",
56
+ "country_code" => "01058",
57
+ "country_abbreviation" => "BR"
58
+ },
59
+ "contact" => {
60
+ "id" => 1,
61
+ "ddd" => 54,
62
+ "phone" => "32272144",
63
+ "email" => nil,
64
+ "ddd_comercial_phone" => nil,
65
+ "comercial_phone" => nil,
66
+ "ddd_fax" => nil,
67
+ "fax_phone" => nil
68
+ },
69
+ "id" => 1,
70
+ "cpf" => 44423739577,
71
+ "cnpj" => nil,
72
+ "city_inscription" => 92708711,
73
+ "social_reason" => "Razão Social do Tomador",
74
+ "fancy_name" => nil,
75
+ "state_inscription" => nil,
76
+ "substitute_state_inscription" => nil,
77
+ "special_situation" => 0,
78
+ "foreign_taker" => false
79
+ },
80
+ "xml" => nil,
81
+ "service_values" => {
82
+ "id" => 1,
83
+ "service_amount" => "99.9",
84
+ "deduction_amount" => "0",
85
+ "retained_iss" => false,
86
+ "calculation_base" => "99.9",
87
+ "iss_percentage" => "5.00",
88
+ "iss_amount" => "4.99",
89
+ "pis_amount" => "0",
90
+ "cofins_amount" => "0",
91
+ "inss_amount" => "0",
92
+ "ir_amount" => "0",
93
+ "csll_amount" => "0",
94
+ "discount_conditioning_amount" => "0",
95
+ "service_item_code" => "0105",
96
+ "cnae_code" => nil,
97
+ "description" => "Servicos de informatica",
98
+ "city_code" => 3304557,
99
+ "nfse_liquid_amount" => "109.9",
100
+ "city_tax_code" => "010501",
101
+ "other_retentions_amount" => "0.00",
102
+ "retained_iss_amount" => "0.00",
103
+ "unconditioned_discount_amount" => "0.00"
104
+ },
105
+ "substitute_rps" => nil,
106
+ "errors" => [],
107
+ "id" => 1,
108
+ "emitter_id" => 1,
109
+ "status" => "processing",
110
+ "description" => "Aguardando processamento pela Sefaz",
111
+ "nfse_key" => nil,
112
+ "nfse_number" => nil,
113
+ "nfse_xml" => nil,
114
+ "number" => 370851823,
115
+ "serie" => "a",
116
+ "rps_type" => 1,
117
+ "emission_date" => "2014-03-18T08:34:56Z",
118
+ "operation_nature" => 1,
119
+ "rps_situation" => 1,
120
+ "other_informations" => nil,
121
+ "competence" => nil,
122
+ "special_regime" => nil,
123
+ "is_complete" => true
124
+ }
125
+ end
126
+
127
+ subject { described_class.new(attributes) }
128
+
129
+ it_behaves_like "entity_attributes", [
130
+ :id, :emitter_id, :taker, :rps_situation, :serie,
131
+ :number, :rps_type, :emission_date,
132
+ :operation_nature, :other_informations,
133
+ :competence, :special_regime, :status,
134
+ :description, :send_nfse_taker, :service_values,
135
+ :_links
136
+ ]
137
+
138
+ describe "#url" do
139
+ it "returns an action endpoint" do
140
+ expect(subject.url("self")).to eq("https://sandbox.emites.com.br/api/v1/nfse/1")
141
+ end
142
+
143
+ it "returns an empty string if action is invalid" do
144
+ expect(subject.url("fake-action")).to eq("")
145
+ end
146
+ end
147
+
148
+ end
@@ -0,0 +1,16 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::NfseStatus do
4
+ let(:attributes) do
5
+ {
6
+
7
+ }
8
+ end
9
+
10
+ subject { described_class.new(attributes) }
11
+
12
+ it_behaves_like "entity_attributes", [
13
+ :id, :status, :description, :nfse_key, :nfse_number,
14
+ :number, :mirror, :xml, :errors
15
+ ]
16
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::NfseStatusTransition do
4
+ let(:attributes) do
5
+ {
6
+ id: 1,
7
+ token_description: "MY_T0KEN",
8
+ from_status: "created",
9
+ to_status: "scheduled",
10
+ date: "DateTime",
11
+ emitter: Emites::Entities::Emitter.new(id: 1, name: "MyFinance"),
12
+ rps: Emites::Entities::Rps.new(id: 6, number: 1950875687),
13
+ account: Emites::Entities::Account.new(id: 1, name: "MyFinance Account")
14
+ }
15
+ end
16
+
17
+ subject { described_class.new(attributes) }
18
+
19
+ it_behaves_like "entity_attributes", [
20
+ :id, :token_description, :from_status,
21
+ :to_status, :date, :emitter, :rps, :account
22
+ ]
23
+ end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::NfseValues do
4
+ let(:attributes) do
5
+ {
6
+
7
+ }
8
+ end
9
+
10
+ subject { described_class.new(attributes) }
11
+
12
+ it_behaves_like "entity_attributes", [
13
+ :id, :service_amount, :calculation_base, :deduction_amount, :retained_iss,
14
+ :iss_percentage, :iss_amount, :pis_amount, :cofins_amount, :inss_amount,
15
+ :ir_amount, :csll_amount, :discount_conditioning_amount, :service_item_code,
16
+ :city_tax_code, :cnae_code, :description, :city_code, :nfse_liquid_amount,
17
+ :other_retentions_amount, :retained_iss_amount, :unconditioned_discount_amount
18
+ ]
19
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::Rps do
4
+ let(:attributes) do
5
+ {
6
+ number: 1,
7
+ serie: "a",
8
+ rps_type: 1,
9
+ }
10
+ end
11
+
12
+ subject { described_class.new(attributes) }
13
+
14
+ it_behaves_like "entity_attributes", [:number, :serie, :rps_type]
15
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::TakerAddress do
4
+ let(:attributes) do
5
+ {
6
+
7
+ }
8
+ end
9
+
10
+ subject { described_class.new(attributes) }
11
+
12
+ it_behaves_like "entity_attributes", [
13
+ :id, :street, :number, :complement, :neighborhood,
14
+ :city_code, :state, :zip_code, :street_type,
15
+ :neighborhood_type, :city, :reference_point,
16
+ :country, :country_code, :country_abbreviation
17
+ ]
18
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::TakerContact do
4
+ let(:attributes) do
5
+ {
6
+
7
+ }
8
+ end
9
+
10
+ subject { described_class.new(attributes) }
11
+
12
+ it_behaves_like "entity_attributes", [:id, :phone, :email]
13
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::Taker do
4
+ let(:attributes) do
5
+ {
6
+
7
+ }
8
+ end
9
+
10
+ subject { described_class.new(attributes) }
11
+
12
+ it_behaves_like "entity_attributes", [
13
+ :id, :cpf, :cnpj, :city_inscription, :social_reason,
14
+ :fancy_name, :state_inscription, :substitute_state_inscription,
15
+ :special_situation, :foreign_taker, :allow_incomplete,
16
+ :is_complete, :address, :contact
17
+ ]
18
+ end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Entities::Webhook do
4
+ let(:attributes) do
5
+ {
6
+ name: "RSpec Subject",
7
+ url: "http://requestb.in/1mayrfq1"
8
+ }
9
+ end
10
+
11
+ subject { described_class.new(attributes) }
12
+
13
+ it_behaves_like "entity_attributes", [:id, :name, :url]
14
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ describe Emites::Exception do
4
+
5
+ class DummyError < Emites::Exception; end
6
+
7
+ subject do
8
+ DummyError.new(
9
+ body: "FAKE BODY",
10
+ message: "FAKE MESSAGE",
11
+ code: 42
12
+ )
13
+ end
14
+
15
+ it "responds to the correct accessors" do
16
+ expect(subject.body).to eq("FAKE BODY")
17
+ expect(subject.message).to eq("FAKE MESSAGE")
18
+ expect(subject.code).to eq(42)
19
+ expect(subject.to_s).to eq("FAKE MESSAGE")
20
+ end
21
+ end