emites-client 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +31 -0
- data/.rspec +2 -0
- data/.travis.yml +11 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +366 -0
- data/Rakefile +9 -0
- data/emites-client.gemspec +37 -0
- data/lib/emites.rb +44 -0
- data/lib/emites/client.rb +30 -0
- data/lib/emites/configuration.rb +12 -0
- data/lib/emites/entities/account.rb +8 -0
- data/lib/emites/entities/base.rb +9 -0
- data/lib/emites/entities/emitter.rb +31 -0
- data/lib/emites/entities/nfse.rb +29 -0
- data/lib/emites/entities/nfse_status.rb +15 -0
- data/lib/emites/entities/nfse_status_transition.rb +14 -0
- data/lib/emites/entities/nfse_values.rb +28 -0
- data/lib/emites/entities/rps.rb +9 -0
- data/lib/emites/entities/taker.rb +20 -0
- data/lib/emites/entities/taker_address.rb +21 -0
- data/lib/emites/entities/taker_contact.rb +9 -0
- data/lib/emites/entities/webhook.rb +9 -0
- data/lib/emites/exception.rb +11 -0
- data/lib/emites/http.rb +34 -0
- data/lib/emites/request.rb +53 -0
- data/lib/emites/resources/base.rb +45 -0
- data/lib/emites/resources/emitter.rb +98 -0
- data/lib/emites/resources/hooks.rb +25 -0
- data/lib/emites/resources/nfse.rb +173 -0
- data/lib/emites/resources/webhook.rb +84 -0
- data/lib/emites/response.rb +38 -0
- data/lib/emites/version.rb +3 -0
- data/spec/emites/client_spec.rb +45 -0
- data/spec/emites/configuration_spec.rb +13 -0
- data/spec/emites/entities/account_spec.rb +14 -0
- data/spec/emites/entities/base_spec.rb +28 -0
- data/spec/emites/entities/emitter_spec.rb +20 -0
- data/spec/emites/entities/nfse_spec.rb +148 -0
- data/spec/emites/entities/nfse_status_spec.rb +16 -0
- data/spec/emites/entities/nfse_status_transition_spec.rb +23 -0
- data/spec/emites/entities/nfse_values_spec.rb +19 -0
- data/spec/emites/entities/rps_spec.rb +15 -0
- data/spec/emites/entities/taker_address_spec.rb +18 -0
- data/spec/emites/entities/taker_contact_spec.rb +13 -0
- data/spec/emites/entities/taker_spec.rb +18 -0
- data/spec/emites/entities/webhook_spec.rb +14 -0
- data/spec/emites/exception_spec.rb +21 -0
- data/spec/emites/http_spec.rb +62 -0
- data/spec/emites/resources/base_spec.rb +96 -0
- data/spec/emites/resources/emitter_spec.rb +119 -0
- data/spec/emites/resources/nfse_spec.rb +214 -0
- data/spec/emites/resources/webhook_spec.rb +62 -0
- data/spec/emites_spec.rb +63 -0
- data/spec/fixtures/certificate.pfx +0 -0
- data/spec/shared_examples/bound_notifiers.rb +8 -0
- data/spec/shared_examples/entity_attributes.rb +9 -0
- data/spec/spec_helper.rb +38 -0
- data/spec/support/matchers/have_attr_accessor.rb +18 -0
- data/spec/vcr_cassettes/client/authenticated/false.yml +48 -0
- data/spec/vcr_cassettes/client/authenticated/true.yml +259 -0
- data/spec/vcr_cassettes/emitters/create/error.yml +57 -0
- data/spec/vcr_cassettes/emitters/create/success.yml +80 -0
- data/spec/vcr_cassettes/emitters/destroy/error.yml +47 -0
- data/spec/vcr_cassettes/emitters/destroy/success.yml +44 -0
- data/spec/vcr_cassettes/emitters/info/error.yml +47 -0
- data/spec/vcr_cassettes/emitters/info/success.yml +77 -0
- data/spec/vcr_cassettes/emitters/list/success.yml +135 -0
- data/spec/vcr_cassettes/emitters/partial_update/success.yml +90 -0
- data/spec/vcr_cassettes/emitters/search/returns_empty.yml +47 -0
- data/spec/vcr_cassettes/emitters/search/success.yml +76 -0
- data/spec/vcr_cassettes/nfse/cancel/success.yml +49 -0
- data/spec/vcr_cassettes/nfse/create/given_taker.yml +109 -0
- data/spec/vcr_cassettes/nfse/create/incomplete.yml +73 -0
- data/spec/vcr_cassettes/nfse/create/success.yml +112 -0
- data/spec/vcr_cassettes/nfse/create/without_taker.yml +73 -0
- data/spec/vcr_cassettes/nfse/destroy/success.yml +46 -0
- data/spec/vcr_cassettes/nfse/history/success.yml +83 -0
- data/spec/vcr_cassettes/nfse/info/success.yml +113 -0
- data/spec/vcr_cassettes/nfse/list/success.yml +1353 -0
- data/spec/vcr_cassettes/nfse/pdf/success.yml +48 -0
- data/spec/vcr_cassettes/nfse/status/success.yml +51 -0
- data/spec/vcr_cassettes/nfse/update/success.yml +113 -0
- data/spec/vcr_cassettes/nfse/xml/success.yml +48 -0
- data/spec/vcr_cassettes/webhooks/create/success.yml +53 -0
- data/spec/vcr_cassettes/webhooks/destroy/success.yml +46 -0
- data/spec/vcr_cassettes/webhooks/list/success.yml +53 -0
- data/spec/vcr_cassettes/webhooks/update/success.yml +52 -0
- metadata +390 -0
@@ -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,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,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
|