correios-frete-alternative 1.10.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.
- checksums.yaml +7 -0
- data/.gitignore +28 -0
- data/.rspec +2 -0
- data/.travis.yml +18 -0
- data/CHANGELOG.rdoc +107 -0
- data/Gemfile +2 -0
- data/README.rdoc +364 -0
- data/Rakefile +25 -0
- data/bin/console +12 -0
- data/correios-frete-alternative.gemspec +31 -0
- data/lib/correios-frete-alternative.rb +9 -0
- data/lib/correios/frete.rb +19 -0
- data/lib/correios/frete/calculador.rb +69 -0
- data/lib/correios/frete/pacote.rb +69 -0
- data/lib/correios/frete/pacote_item.rb +27 -0
- data/lib/correios/frete/parser.rb +20 -0
- data/lib/correios/frete/servico.rb +97 -0
- data/lib/correios/frete/version.rb +6 -0
- data/lib/correios/frete/web_service.rb +87 -0
- data/misc/correios_frete_manual_v1.7.pdf +0 -0
- data/misc/correios_frete_manual_v1.9.pdf +0 -0
- data/spec/correios/frete/calculador_spec.rb +174 -0
- data/spec/correios/frete/pacote_item_spec.rb +45 -0
- data/spec/correios/frete/pacote_spec.rb +188 -0
- data/spec/correios/frete/parser_spec.rb +44 -0
- data/spec/correios/frete/servico_spec.rb +185 -0
- data/spec/correios/frete/web_service_spec.rb +18 -0
- data/spec/correios/frete_spec.rb +79 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/support/mock_request.rb +17 -0
- data/spec/support/responses/success-response-many-services.xml +27 -0
- data/spec/support/responses/success-response-one-service.xml +15 -0
- metadata +187 -0
Binary file
|
Binary file
|
@@ -0,0 +1,174 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
describe Correios::Frete::Calculador do
|
3
|
+
describe ".new" do
|
4
|
+
context "creates with default value of" do
|
5
|
+
before(:each) { @frete = Correios::Frete::Calculador.new }
|
6
|
+
|
7
|
+
{ :peso => 0.0,
|
8
|
+
:comprimento => 0.0,
|
9
|
+
:largura => 0.0,
|
10
|
+
:altura => 0.0,
|
11
|
+
:diametro => 0.0,
|
12
|
+
:formato => :caixa_pacote,
|
13
|
+
:mao_propria => false,
|
14
|
+
:aviso_recebimento => false,
|
15
|
+
:valor_declarado => 0.0
|
16
|
+
}.each do |attr, value|
|
17
|
+
it attr do
|
18
|
+
expect(@frete.send(attr)).to eq(value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
{ :cep_origem => "01000-000",
|
24
|
+
:cep_destino => "021222-222",
|
25
|
+
:peso => 0.321,
|
26
|
+
:comprimento => 30,
|
27
|
+
:largura => 15,
|
28
|
+
:altura => 2,
|
29
|
+
:diametro => 5,
|
30
|
+
:formato => :rolo_prisma,
|
31
|
+
:mao_propria => true,
|
32
|
+
:aviso_recebimento => true,
|
33
|
+
:valor_declarado => 1.99,
|
34
|
+
:codigo_empresa => "1234567890",
|
35
|
+
:senha => "senha",
|
36
|
+
:encomenda => Correios::Frete::Pacote.new
|
37
|
+
}.each do |attr, value|
|
38
|
+
context "when #{attr} is supplied" do
|
39
|
+
it "sets #{attr}" do
|
40
|
+
frete = Correios::Frete::Calculador.new(attr => value)
|
41
|
+
expect(frete.send(attr)).to eq(value)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when #{attr} is supplied in a block" do
|
46
|
+
it "sets #{attr}" do
|
47
|
+
frete = Correios::Frete::Calculador.new { |f| f.send("#{attr}=", value) }
|
48
|
+
expect(frete.send(attr)).to eq(value)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#encomenda" do
|
55
|
+
context "when encomenda is supplied" do
|
56
|
+
before :each do
|
57
|
+
@encomenda = Correios::Frete::Pacote.new
|
58
|
+
@encomenda.adicionar_item(:peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2)
|
59
|
+
@encomenda.adicionar_item(:peso => 0.7, :comprimento => 70, :largura => 25, :altura => 3)
|
60
|
+
@frete = Correios::Frete::Calculador.new :peso => 10.5,
|
61
|
+
:comprimento => 105,
|
62
|
+
:largura => 50,
|
63
|
+
:altura => 10,
|
64
|
+
:formato => :rolo_prisma,
|
65
|
+
:encomenda => @encomenda
|
66
|
+
end
|
67
|
+
|
68
|
+
[:peso, :comprimento, :largura, :altura, :formato].each do |attr|
|
69
|
+
it "#{attr} returns encomenda #{attr}" do
|
70
|
+
expect(@frete.send(attr)).to eq(@encomenda.send(attr))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context "when encomenda is not supplied" do
|
76
|
+
before :each do
|
77
|
+
@frete = Correios::Frete::Calculador.new :peso => 10.5,
|
78
|
+
:comprimento => 105,
|
79
|
+
:largura => 50,
|
80
|
+
:altura => 10,
|
81
|
+
:formato => :rolo_prisma
|
82
|
+
end
|
83
|
+
|
84
|
+
{ :peso => 10.5,
|
85
|
+
:comprimento => 105,
|
86
|
+
:largura => 50,
|
87
|
+
:altura => 10,
|
88
|
+
:formato => :rolo_prisma
|
89
|
+
}.each do |attr, value|
|
90
|
+
it "#{attr} returns supplied #{attr}" do
|
91
|
+
expect(@frete.send(attr)).to eq(value)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#calcular" do
|
98
|
+
around do |example|
|
99
|
+
Correios::Frete.configure { |config| config.log_enabled = false }
|
100
|
+
example.run
|
101
|
+
Correios::Frete.configure { |config| config.log_enabled = true }
|
102
|
+
end
|
103
|
+
|
104
|
+
before(:each) { @frete = Correios::Frete::Calculador.new }
|
105
|
+
|
106
|
+
context "to many services" do
|
107
|
+
before(:each) { mock_request_for(:success_response_many_services) }
|
108
|
+
|
109
|
+
it "creates a WebService with correct params" do
|
110
|
+
web_service = Correios::Frete::WebService.new @frete, [:pac, :sedex]
|
111
|
+
expect(Correios::Frete::WebService).to receive(:new).with(@frete, [:pac, :sedex]).and_return(web_service)
|
112
|
+
@frete.calcular(:pac, :sedex)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "returns all services" do
|
116
|
+
services = @frete.calcular(:pac, :sedex)
|
117
|
+
expect(services.keys.size).to eq(2)
|
118
|
+
expect(services[:pac].tipo).to eq(:pac)
|
119
|
+
expect(services[:sedex].tipo).to eq(:sedex)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context "to one service" do
|
124
|
+
before(:each) { mock_request_for(:success_response_one_service) }
|
125
|
+
|
126
|
+
it "creates a WebService with correct params" do
|
127
|
+
web_service = Correios::Frete::WebService.new @frete, [:sedex]
|
128
|
+
expect(Correios::Frete::WebService).to receive(:new).with(@frete, [:sedex]).and_return(web_service)
|
129
|
+
@frete.calcular(:sedex)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "returns only one service" do
|
133
|
+
expect(@frete.calcular(:sedex).tipo).to eq(:sedex)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
["calcular", "calculate"].each do |method_name|
|
139
|
+
Correios::Frete::Servico::AVAILABLE_SERVICES.each do |key, service|
|
140
|
+
describe "##{method_name}_#{service[:type]}" do
|
141
|
+
before :each do
|
142
|
+
@frete = Correios::Frete::Calculador.new
|
143
|
+
@servico = Correios::Frete::Servico.new
|
144
|
+
|
145
|
+
web_service = double(Correios::Frete::WebService, :request! => "XML")
|
146
|
+
allow(Correios::Frete::WebService).to receive(:new).and_return(web_service)
|
147
|
+
|
148
|
+
parser = double(Correios::Frete::Parser, :servicos => { service[:type] => @servico })
|
149
|
+
allow(Correios::Frete::Parser).to receive(:new).and_return(parser)
|
150
|
+
end
|
151
|
+
|
152
|
+
it "calculates #{service[:name]}" do
|
153
|
+
expect(@frete.send("#{method_name}_#{service[:type]}")).to eq(@servico)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "returns true in respond_to?" do
|
157
|
+
expect(@frete.respond_to?("#{method_name}_#{service[:type]}")).to be_truthy
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe "##{method_name}_servico_que_nao_existe" do
|
163
|
+
before(:each) { @frete = Correios::Frete::Calculador.new }
|
164
|
+
|
165
|
+
it "raises NoMethodError" do
|
166
|
+
expect { @frete.send("#{method_name}_servico_que_nao_existe") }.to raise_error(NoMethodError)
|
167
|
+
end
|
168
|
+
|
169
|
+
it "returns false in respond_to?" do
|
170
|
+
expect(@frete.respond_to?("#{method_name}_servico_que_nao_existe")).to be_falsey
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
describe Correios::Frete::PacoteItem do
|
3
|
+
describe ".new" do
|
4
|
+
context "creates with default value of" do
|
5
|
+
before(:each) { @item = Correios::Frete::PacoteItem.new }
|
6
|
+
|
7
|
+
{ :peso => 0.0,
|
8
|
+
:comprimento => 0.0,
|
9
|
+
:largura => 0.0,
|
10
|
+
:altura => 0.0
|
11
|
+
}.each do |attr, value|
|
12
|
+
it attr do
|
13
|
+
expect(@item.send(attr)).to eq(value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
{ :peso => 0.3,
|
19
|
+
:comprimento => 30,
|
20
|
+
:largura => 15,
|
21
|
+
:altura => 2,
|
22
|
+
}.each do |attr, value|
|
23
|
+
context "when #{attr} is supplied" do
|
24
|
+
it "sets #{attr}" do
|
25
|
+
item = Correios::Frete::PacoteItem.new(attr => value)
|
26
|
+
expect(item.send(attr)).to eq(value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when #{attr} is supplied in a block" do
|
31
|
+
it "sets #{attr}" do
|
32
|
+
item = Correios::Frete::PacoteItem.new { |f| f.send("#{attr}=", value) }
|
33
|
+
expect(item.send(attr)).to eq(value)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#volume" do
|
40
|
+
it "calculates item volume" do
|
41
|
+
item = Correios::Frete::PacoteItem.new(:comprimento => 16, :largura => 11, :altura => 2)
|
42
|
+
expect(item.volume).to eq(16 * 11 * 2)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,188 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
describe Correios::Frete::Pacote do
|
3
|
+
before(:each) { @pacote = Correios::Frete::Pacote.new }
|
4
|
+
|
5
|
+
describe ".new" do
|
6
|
+
context "creates with default value of" do
|
7
|
+
{ :peso => 0.0,
|
8
|
+
:comprimento => 0.0,
|
9
|
+
:altura => 0.0,
|
10
|
+
:largura => 0.0
|
11
|
+
}.each do |attr, value|
|
12
|
+
it attr do
|
13
|
+
expect(@pacote.send(attr)).to eq(value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "itens" do
|
18
|
+
expect(@pacote.itens).to be_empty
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when items are supplied" do
|
23
|
+
context "as PacoteItem" do
|
24
|
+
it "adds in items" do
|
25
|
+
itens = [Correios::Frete::PacoteItem.new, Correios::Frete::PacoteItem.new]
|
26
|
+
pacote = Correios::Frete::Pacote.new(itens)
|
27
|
+
|
28
|
+
pacote.itens.each_with_index do |item, i|
|
29
|
+
expect(item).to eq(itens[i])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "as Hash" do
|
35
|
+
it "adds new items" do
|
36
|
+
itens = [
|
37
|
+
{ :peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2 },
|
38
|
+
{ :peso => 0.7, :comprimento => 70, :largura => 25, :altura => 3 }
|
39
|
+
]
|
40
|
+
pacote = Correios::Frete::Pacote.new(itens)
|
41
|
+
|
42
|
+
pacote.itens.each_with_index do |item, i|
|
43
|
+
expect(item.peso).to eq(itens[i][:peso])
|
44
|
+
expect(item.comprimento).to eq(itens[i][:comprimento])
|
45
|
+
expect(item.largura).to eq(itens[i][:largura])
|
46
|
+
expect(item.altura).to eq(itens[i][:altura])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#formato" do
|
54
|
+
it "is caixa/pacote" do
|
55
|
+
expect(@pacote.formato).to eq(:caixa_pacote)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#adicionar_item" do
|
60
|
+
context "when adds a package item" do
|
61
|
+
it "adds in items" do
|
62
|
+
item = Correios::Frete::PacoteItem.new
|
63
|
+
@pacote.adicionar_item(item)
|
64
|
+
expect(@pacote.itens.first).to eq(item)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "when adds package item params" do
|
69
|
+
it "adds new item" do
|
70
|
+
params = { :peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2 }
|
71
|
+
@pacote.adicionar_item(params)
|
72
|
+
|
73
|
+
expect(@pacote.itens.first.peso).to eq(params[:peso])
|
74
|
+
expect(@pacote.itens.first.comprimento).to eq(params[:comprimento])
|
75
|
+
expect(@pacote.itens.first.largura).to eq(params[:largura])
|
76
|
+
expect(@pacote.itens.first.altura).to eq(params[:altura])
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when adds nil item" do
|
81
|
+
it "does not add" do
|
82
|
+
@pacote.adicionar_item(nil)
|
83
|
+
expect(@pacote.itens).to be_empty
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "calculations" do
|
89
|
+
context "when adds one package item" do
|
90
|
+
before :each do
|
91
|
+
@item = Correios::Frete::PacoteItem.new(:peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2)
|
92
|
+
@pacote.adicionar_item(@item)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "calculates package weight" do
|
96
|
+
expect(@pacote.peso).to eq(@item.peso)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "calculates package volume" do
|
100
|
+
expect(@pacote.volume).to eq(@item.volume)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "calculates package length" do
|
104
|
+
expect(@pacote.comprimento).to eq(@item.comprimento)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "calculates package width" do
|
108
|
+
expect(@pacote.largura).to eq(@item.largura)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "calculates package height" do
|
112
|
+
expect(@pacote.altura).to eq(@item.altura)
|
113
|
+
end
|
114
|
+
|
115
|
+
context "with dimensions less than each minimum" do
|
116
|
+
before :each do
|
117
|
+
item = Correios::Frete::PacoteItem.new(:peso => 0.3, :comprimento => 15, :largura => 10, :altura => 1)
|
118
|
+
@pacote = Correios::Frete::Pacote.new
|
119
|
+
@pacote.adicionar_item(item)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "sets minimum length value" do
|
123
|
+
expect(@pacote.comprimento).to eq(16)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "sets minimum width value" do
|
127
|
+
expect(@pacote.largura).to eq(11)
|
128
|
+
end
|
129
|
+
|
130
|
+
it "sets minimum height value" do
|
131
|
+
expect(@pacote.altura).to eq(2)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
context "when adds more than one package item" do
|
137
|
+
before :each do
|
138
|
+
@item1 = Correios::Frete::PacoteItem.new(:peso => 0.3, :comprimento => 30, :largura => 15, :altura => 2)
|
139
|
+
@item2 = Correios::Frete::PacoteItem.new(:peso => 0.7, :comprimento => 70, :largura => 25, :altura => 3)
|
140
|
+
@expected_dimension = (@item1.volume + @item2.volume).to_f**(1.0/3)
|
141
|
+
|
142
|
+
@pacote.adicionar_item(@item1)
|
143
|
+
@pacote.adicionar_item(@item2)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "calculates package weight" do
|
147
|
+
expect(@pacote.peso).to eq(@item1.peso + @item2.peso)
|
148
|
+
end
|
149
|
+
|
150
|
+
it "calculates package volume" do
|
151
|
+
expect(@pacote.volume).to eq(@item1.volume + @item2.volume)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "calculates package length" do
|
155
|
+
expect(@pacote.comprimento).to eq(@expected_dimension)
|
156
|
+
end
|
157
|
+
|
158
|
+
it "calculates package width" do
|
159
|
+
expect(@pacote.largura).to eq(@expected_dimension)
|
160
|
+
end
|
161
|
+
|
162
|
+
it "calculates package height" do
|
163
|
+
expect(@pacote.altura).to eq(@expected_dimension)
|
164
|
+
end
|
165
|
+
|
166
|
+
context "with dimensions less than each minimum" do
|
167
|
+
before :each do
|
168
|
+
item = Correios::Frete::PacoteItem.new(:peso => 0.3, :comprimento => 3, :largura => 1, :altura => 1)
|
169
|
+
@pacote = Correios::Frete::Pacote.new
|
170
|
+
@pacote.adicionar_item(item)
|
171
|
+
@pacote.adicionar_item(item)
|
172
|
+
end
|
173
|
+
|
174
|
+
it "sets minimum length value" do
|
175
|
+
expect(@pacote.comprimento).to eq(16)
|
176
|
+
end
|
177
|
+
|
178
|
+
it "sets minimum width value" do
|
179
|
+
expect(@pacote.largura).to eq(11)
|
180
|
+
end
|
181
|
+
|
182
|
+
it "sets minimum height value" do
|
183
|
+
expect(@pacote.altura).to eq(2)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
describe Correios::Frete::Parser do
|
3
|
+
describe "#servicos" do
|
4
|
+
let(:xml) { body_for :success_response_many_services }
|
5
|
+
let(:parser) { Correios::Frete::Parser.new }
|
6
|
+
|
7
|
+
it "encodes from ISO-8859-1 to UTF-8" do
|
8
|
+
expect(xml).to receive(:encode).with("UTF-8", "ISO-8859-1").and_return(xml)
|
9
|
+
parser.servicos(xml)
|
10
|
+
end
|
11
|
+
|
12
|
+
{ :pac => { :tipo => :pac,
|
13
|
+
:codigo => "04510",
|
14
|
+
:valor => 15.70,
|
15
|
+
:prazo_entrega => 3,
|
16
|
+
:valor_mao_propria => 3.75,
|
17
|
+
:valor_aviso_recebimento => 1.99,
|
18
|
+
:valor_valor_declarado => 1.50,
|
19
|
+
:entrega_domiciliar => true,
|
20
|
+
:entrega_sabado => false,
|
21
|
+
:erro => "-3",
|
22
|
+
:msg_erro => "Somente para teste" },
|
23
|
+
:sedex => { :tipo => :sedex,
|
24
|
+
:codigo => "04014",
|
25
|
+
:valor => 17.8,
|
26
|
+
:prazo_entrega => 1,
|
27
|
+
:valor_mao_propria => 3.70,
|
28
|
+
:valor_aviso_recebimento => 0.0,
|
29
|
+
:valor_valor_declarado => 1.5,
|
30
|
+
:entrega_domiciliar => true,
|
31
|
+
:entrega_sabado => true,
|
32
|
+
:erro => "0",
|
33
|
+
:msg_erro => nil }
|
34
|
+
}.each do |service, attributes|
|
35
|
+
it "returns #{service} data" do
|
36
|
+
servicos = parser.servicos(xml)
|
37
|
+
|
38
|
+
attributes.each do |attr, value|
|
39
|
+
expect(servicos[service].send(attr)).to eq(value)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|