emites-client 0.0.2

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