correios-frete-alternative 1.10.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|