carterdte_smtp_filter 0.0.3
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 +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +42 -0
- data/Rakefile +9 -0
- data/bin/carterdte_smtp_filter +66 -0
- data/carterdte_smtp_filter.gemspec +33 -0
- data/lib/carterdte_smtp_filter.rb +27 -0
- data/lib/carterdte_smtp_filter/api_client.rb +46 -0
- data/lib/carterdte_smtp_filter/config.rb +19 -0
- data/lib/carterdte_smtp_filter/dte.rb +90 -0
- data/lib/carterdte_smtp_filter/message.rb +65 -0
- data/lib/carterdte_smtp_filter/smtp_server.rb +33 -0
- data/lib/carterdte_smtp_filter/version.rb +3 -0
- data/o-ri/bundle +23 -0
- data/o-ri/bundler +23 -0
- data/test/fake_api.rb +69 -0
- data/test/fixtures/acuse.xml +108 -0
- data/test/fixtures/config.yml +13 -0
- data/test/fixtures/email_with_attachment_no_dte.eml +33 -0
- data/test/fixtures/envio_dte_33.xml +238 -0
- data/test/fixtures/guia_despacho.xml +222 -0
- data/test/fixtures/invalid_dte.xml +4 -0
- data/test/fixtures/mail.tmp +11 -0
- data/test/fixtures/mail_with_dte.eml +269 -0
- data/test/fixtures/mail_with_multiple_attachments.eml +283 -0
- data/test/fixtures/recepcion_dte_33.xml +200 -0
- data/test/fixtures/resultado_revision_sii.xml +17 -0
- data/test/test_api_client.rb +43 -0
- data/test/test_config.rb +20 -0
- data/test/test_dte.rb +79 -0
- data/test/test_helper.rb +277 -0
- data/test/test_message.rb +67 -0
- data/test/test_smtp_server.rb +42 -0
- metadata +252 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
2
|
+
<RESULTADO_ENVIO>
|
3
|
+
<IDENTIFICACION>
|
4
|
+
<RUTEMISOR>81137900-K</RUTEMISOR>
|
5
|
+
<RUTENVIA>11862736-9</RUTENVIA>
|
6
|
+
<TRACKID>1031250770</TRACKID>
|
7
|
+
<TMSTRECEPCION>09/05/2015 12:18:50</TMSTRECEPCION>
|
8
|
+
<ESTADO>EPR - Envio Procesado</ESTADO>
|
9
|
+
</IDENTIFICACION>
|
10
|
+
<ESTADISTICA>
|
11
|
+
<SUBTOTAL>
|
12
|
+
<TIPODOC>33</TIPODOC>
|
13
|
+
<INFORMADO>1</INFORMADO>
|
14
|
+
<ACEPTA>1</ACEPTA>
|
15
|
+
</SUBTOTAL>
|
16
|
+
</ESTADISTICA>
|
17
|
+
</RESULTADO_ENVIO>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestApiClient < Minitest::Test
|
4
|
+
|
5
|
+
|
6
|
+
def setup
|
7
|
+
CarterdteSmtpFilter::Config.parse("./test/fixtures/config.yml")
|
8
|
+
@api_host = CarterdteSmtpFilter::Config::api_host
|
9
|
+
@api_url = "http://#{@api_host}"
|
10
|
+
stub_request(:any, /#{@api_host}/).to_rack(FakeApi)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_push_should_return_false_if_message_is_not_json
|
14
|
+
response = CarterdteSmtpFilter::ApiClient.push "hola"
|
15
|
+
assert(!response, "Failure message.")
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_check_fake_api_response
|
19
|
+
user = CarterdteSmtpFilter::Config::api_user.gsub(/@/,"%40")
|
20
|
+
response = RestClient.get "http://#{user}:#{CarterdteSmtpFilter::Config::api_password}@#{@api_host}/api/v1/"
|
21
|
+
assert_equal("{api_version: 1}", response)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_post_should_workout_unauthorized
|
25
|
+
response = CarterdteSmtpFilter::ApiClient.post({url: "#{@api_url}/api/v1/denied" })
|
26
|
+
assert(!response, "Failure message.")
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_post_should_workout_application_error
|
30
|
+
response = CarterdteSmtpFilter::ApiClient.post({url: "#{@api_url}/api/v1/app_error" })
|
31
|
+
assert(!response, "Failure message.")
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_post_should_return_json
|
35
|
+
hash = {dte_type: 33, msg_type: "envio"}
|
36
|
+
json = JSON.generate hash
|
37
|
+
response = CarterdteSmtpFilter::ApiClient.post({payload: json})
|
38
|
+
new_hash = JSON.parse response
|
39
|
+
assert_equal("123456", new_hash["id"])
|
40
|
+
assert_equal(hash[:dte_type], new_hash["dte_type"])
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
data/test/test_config.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestConfig < Minitest::Test
|
4
|
+
|
5
|
+
def test_should_raise_not_file_if_file_not_exists
|
6
|
+
assert_raises(Errno::ENOENT) { CarterdteSmtpFilter::Config.parse("/tmp/file") }
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_should_return_config_values
|
10
|
+
CarterdteSmtpFilter::Config.parse("./test/fixtures/config.yml")
|
11
|
+
assert_equal("127.0.0.1", CarterdteSmtpFilter::Config::bind_address)
|
12
|
+
assert_equal("127.0.0.1", CarterdteSmtpFilter::Config::return_host)
|
13
|
+
assert_equal("30025", CarterdteSmtpFilter::Config::return_port)
|
14
|
+
assert_equal("pbruna@example.com", CarterdteSmtpFilter::Config::api_user)
|
15
|
+
assert_equal("123456", CarterdteSmtpFilter::Config::api_password)
|
16
|
+
assert_equal("api.dte.zboxapp.com", CarterdteSmtpFilter::Config::api_host)
|
17
|
+
assert_equal("./test/tmp/carterdte_smtp_filter.log", CarterdteSmtpFilter::Config::log_file)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/test/test_dte.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestDte < Minitest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@resultado = File.open("./test/fixtures/acuse.xml", "rb")
|
7
|
+
@envio = File.open("./test/fixtures/envio_dte_33.xml", "rb")
|
8
|
+
@dte_resultado = CarterdteSmtpFilter::Dte.new @resultado
|
9
|
+
@dte_envio = CarterdteSmtpFilter::Dte.new @envio
|
10
|
+
end
|
11
|
+
|
12
|
+
def teardown
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_should_only_parse_valid_dtes
|
17
|
+
file = File.open("./test/fixtures/invalid_dte.xml", "rb")
|
18
|
+
dte = CarterdteSmtpFilter::Dte.new file
|
19
|
+
assert(!dte.valid?, "Should be false")
|
20
|
+
assert(@dte_resultado.valid?, "Failure message.")
|
21
|
+
assert(@dte_envio.valid?, "Failure message.")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_root_should_return_the_root_element
|
25
|
+
assert_equal("Resultado", @dte_resultado.root_name)
|
26
|
+
assert_equal("SetDTE", @dte_envio.root_name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_return_msg_type
|
30
|
+
assert_equal("respuesta", @dte_resultado.msg_type)
|
31
|
+
assert_equal("envio", @dte_envio.msg_type)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_return_setdte_id
|
35
|
+
assert_equal("SETDTE94528000X33X7597817X94141763", @dte_resultado.setdte_id)
|
36
|
+
assert_equal("SETDTE96529310X33X3152118X94141243", @dte_envio.setdte_id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_rut_emisor
|
40
|
+
assert_equal("94528000-K", @dte_resultado.rut_emisor)
|
41
|
+
assert_equal("96529310-8", @dte_envio.rut_emisor)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_rut_receptor
|
45
|
+
assert_equal("81537600-5", @dte_resultado.rut_receptor)
|
46
|
+
assert_equal("81201000-K", @dte_envio.rut_receptor)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_dte_type
|
50
|
+
assert_equal("33", @dte_resultado.dte_type)
|
51
|
+
assert_equal("33", @dte_envio.dte_type)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_dte_fecha_emision
|
55
|
+
date_envio = Time.parse("2015-05-09T11:10:10").to_date
|
56
|
+
date_resultado = Time.parse("2015-05-09T12:30:11").to_date
|
57
|
+
assert_equal(date_resultado, @dte_resultado.fecha_emision)
|
58
|
+
assert_equal(date_envio, @dte_envio.fecha_emision)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_dte_fecha_recepcion
|
62
|
+
date_resultado = Time.parse("2015-05-09T12:30:11").to_date
|
63
|
+
assert_equal(date_resultado, @dte_resultado.fecha_recepcion)
|
64
|
+
assert_equal(nil, @dte_envio.fecha_recepcion)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_return_empty_json_if_no_valid
|
68
|
+
file = File.open("./test/fixtures/invalid_dte.xml", "rb")
|
69
|
+
dte = CarterdteSmtpFilter::Dte.new file
|
70
|
+
json = JSON.parse dte.to_json
|
71
|
+
assert_equal({}, json)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_return_json_object
|
75
|
+
json = JSON.parse @dte_resultado.to_json
|
76
|
+
assert_equal("81537600-5", json["rut_receptor"])
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,277 @@
|
|
1
|
+
require "carterdte_smtp_filter"
|
2
|
+
require 'pp'
|
3
|
+
require 'time'
|
4
|
+
require 'date'
|
5
|
+
|
6
|
+
require 'minitest/autorun'
|
7
|
+
require 'minitest/reporters' # requires the gem
|
8
|
+
require 'webmock/minitest'
|
9
|
+
|
10
|
+
require 'fake_api'
|
11
|
+
|
12
|
+
Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # spec-like progress
|
13
|
+
|
14
|
+
# Only log Celluloid errors
|
15
|
+
#Celluloid.logger.level = Logger::ERROR
|
16
|
+
|
17
|
+
|
18
|
+
#CarterDteSmtp::Config.parse("./test/fixtures/config.yml")
|
19
|
+
|
20
|
+
def check_imap()
|
21
|
+
require "mail"
|
22
|
+
Mail.defaults do
|
23
|
+
retriever_method :imap, address: "localhost", port: 143, user_name: "carterdte", password: "123456"
|
24
|
+
end
|
25
|
+
|
26
|
+
emails = Mail.find keys: ['NOT', 'SEEN']
|
27
|
+
emails.first
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
class Enviacorreo
|
32
|
+
attr_accessor :to, :from, :body, :subject, :attachment_path, :server, :port
|
33
|
+
|
34
|
+
def initialize(to: "carterdte@example.com", from: "dte@itlinux.cl", body: "Cuerpo correo", subject: "DTE", attachment_path: false, server: "localhost", port: 2025)
|
35
|
+
@to = to
|
36
|
+
@from = from
|
37
|
+
@body = body
|
38
|
+
@subject = subject
|
39
|
+
@attachment_path = attachment_path
|
40
|
+
@server = server
|
41
|
+
@port = port
|
42
|
+
end
|
43
|
+
|
44
|
+
def send
|
45
|
+
message.deliver!
|
46
|
+
end
|
47
|
+
|
48
|
+
def message
|
49
|
+
smtp_conn = smtp_options
|
50
|
+
Mail.defaults do
|
51
|
+
delivery_method :smtp_connection, { :connection => smtp_conn.start }
|
52
|
+
end
|
53
|
+
mail = Mail.new(
|
54
|
+
from: @from,
|
55
|
+
to: @to,
|
56
|
+
subject: @subject,
|
57
|
+
body: @body
|
58
|
+
)
|
59
|
+
mail.add_file @attachment_path if @attachment_path
|
60
|
+
mail
|
61
|
+
end
|
62
|
+
|
63
|
+
def smtp_options
|
64
|
+
smtp = Net::SMTP.new(@server, @port)
|
65
|
+
smtp.read_timeout = 2
|
66
|
+
smtp.open_timeout = 2
|
67
|
+
smtp
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
class ReturnSmtp < MidiSmtpServer::Smtpd
|
73
|
+
|
74
|
+
attr_accessor :mail
|
75
|
+
|
76
|
+
def start
|
77
|
+
@logger = Logger.new('/dev/null')
|
78
|
+
@port = CarterdteSmtpFilter::Config::return_port
|
79
|
+
@host = CarterdteSmtpFilter::Config::return_host
|
80
|
+
super
|
81
|
+
end
|
82
|
+
|
83
|
+
def on_message_data_event(ctx)
|
84
|
+
File.open("./test/tmp/returnmail", "w") {|file| file.write ctx[:message][:data]}
|
85
|
+
end
|
86
|
+
|
87
|
+
def process_line(line)
|
88
|
+
# check wether in data or command mode
|
89
|
+
if Thread.current[:cmd_sequence] != :CMD_DATA
|
90
|
+
|
91
|
+
# Handle specific messages from the client
|
92
|
+
case line
|
93
|
+
|
94
|
+
when (/^(HELO|EHLO)(\s+.*)?$/i)
|
95
|
+
# HELO/EHLO
|
96
|
+
# 250 Requested mail action okay, completed
|
97
|
+
# 421 <domain> Service not available, closing transmission channel
|
98
|
+
# 500 Syntax error, command unrecognised
|
99
|
+
# 501 Syntax error in parameters or arguments
|
100
|
+
# 504 Command parameter not implemented
|
101
|
+
# 521 <domain> does not accept mail [rfc1846]
|
102
|
+
# ---------
|
103
|
+
# check valid command sequence
|
104
|
+
raise Smtpd503Exception if Thread.current[:cmd_sequence] != :CMD_HELO
|
105
|
+
# handle command
|
106
|
+
@cmd_data = line.gsub(/^(HELO|EHLO)\ /i, '').strip
|
107
|
+
# call event to handle data
|
108
|
+
on_helo_event(Thread.current[:ctx], @cmd_data)
|
109
|
+
# if no error raised, append to message hash
|
110
|
+
Thread.current[:ctx][:server][:helo] = @cmd_data
|
111
|
+
# set sequence state as RSET
|
112
|
+
Thread.current[:cmd_sequence] = :CMD_RSET
|
113
|
+
# reply ok
|
114
|
+
return "250 OK"
|
115
|
+
|
116
|
+
when (/^NOOP\s*$/i)
|
117
|
+
# NOOP
|
118
|
+
# 250 Requested mail action okay, completed
|
119
|
+
# 421 <domain> Service not available, closing transmission channel
|
120
|
+
# 500 Syntax error, command unrecognised
|
121
|
+
return "250 OK"
|
122
|
+
|
123
|
+
when (/^RSET\s*$/i)
|
124
|
+
# RSET
|
125
|
+
# 250 Requested mail action okay, completed
|
126
|
+
# 421 <domain> Service not available, closing transmission channel
|
127
|
+
# 500 Syntax error, command unrecognised
|
128
|
+
# 501 Syntax error in parameters or arguments
|
129
|
+
# ---------
|
130
|
+
# check valid command sequence
|
131
|
+
raise Smtpd503Exception if Thread.current[:cmd_sequence] == :CMD_HELO
|
132
|
+
# handle command
|
133
|
+
reset_ctx
|
134
|
+
return "250 OK"
|
135
|
+
|
136
|
+
when (/^QUIT\s*$/i)
|
137
|
+
# QUIT
|
138
|
+
# 221 <domain> Service closing transmission channel
|
139
|
+
# 500 Syntax error, command unrecognised
|
140
|
+
Thread.current[:cmd_sequence] = :CMD_QUIT
|
141
|
+
return ""
|
142
|
+
|
143
|
+
when (/^MAIL FROM\:/i)
|
144
|
+
# MAIL
|
145
|
+
# 250 Requested mail action okay, completed
|
146
|
+
# 421 <domain> Service not available, closing transmission channel
|
147
|
+
# 451 Requested action aborted: local error in processing
|
148
|
+
# 452 Requested action not taken: insufficient system storage
|
149
|
+
# 500 Syntax error, command unrecognised
|
150
|
+
# 501 Syntax error in parameters or arguments
|
151
|
+
# 552 Requested mail action aborted: exceeded storage allocation
|
152
|
+
# ---------
|
153
|
+
# check valid command sequence
|
154
|
+
raise Smtpd503Exception if Thread.current[:cmd_sequence] != :CMD_RSET
|
155
|
+
# handle command
|
156
|
+
@cmd_data = line.gsub(/^MAIL FROM\:/i, '').strip
|
157
|
+
# call event to handle data
|
158
|
+
if return_value = on_mail_from_event(Thread.current[:ctx], @cmd_data)
|
159
|
+
# overwrite data with returned value
|
160
|
+
@cmd_data = return_value
|
161
|
+
end
|
162
|
+
# if no error raised, append to message hash
|
163
|
+
Thread.current[:ctx][:envelope][:from] = @cmd_data
|
164
|
+
# set sequence state
|
165
|
+
Thread.current[:cmd_sequence] = :CMD_MAIL
|
166
|
+
# reply ok
|
167
|
+
return "250 OK"
|
168
|
+
|
169
|
+
when (/^RCPT TO\:/i)
|
170
|
+
# RCPT
|
171
|
+
# 250 Requested mail action okay, completed
|
172
|
+
# 251 User not local; will forward to <forward-path>
|
173
|
+
# 421 <domain> Service not available, closing transmission channel
|
174
|
+
# 450 Requested mail action not taken: mailbox unavailable
|
175
|
+
# 451 Requested action aborted: local error in processing
|
176
|
+
# 452 Requested action not taken: insufficient system storage
|
177
|
+
# 500 Syntax error, command unrecognised
|
178
|
+
# 501 Syntax error in parameters or arguments
|
179
|
+
# 503 Bad sequence of commands
|
180
|
+
# 521 <domain> does not accept mail [rfc1846]
|
181
|
+
# 550 Requested action not taken: mailbox unavailable
|
182
|
+
# 551 User not local; please try <forward-path>
|
183
|
+
# 552 Requested mail action aborted: exceeded storage allocation
|
184
|
+
# 553 Requested action not taken: mailbox name not allowed
|
185
|
+
# ---------
|
186
|
+
# check valid command sequence
|
187
|
+
raise Smtpd503Exception if ![ :CMD_MAIL, :CMD_RCPT ].include?(Thread.current[:cmd_sequence])
|
188
|
+
# handle command
|
189
|
+
@cmd_data = line.gsub(/^RCPT TO\:/i, '').strip
|
190
|
+
# call event to handle data
|
191
|
+
if return_value = on_rcpt_to_event(Thread.current[:ctx], @cmd_data)
|
192
|
+
# overwrite data with returned value
|
193
|
+
@cmd_data = return_value
|
194
|
+
end
|
195
|
+
# if no error raised, append to message hash
|
196
|
+
Thread.current[:ctx][:envelope][:to] << @cmd_data
|
197
|
+
# set sequence state
|
198
|
+
Thread.current[:cmd_sequence] = :CMD_RCPT
|
199
|
+
# reply ok
|
200
|
+
return "250 OK"
|
201
|
+
|
202
|
+
when (/^DATA\s*$/i)
|
203
|
+
# DATA
|
204
|
+
# 354 Start mail input; end with <CRLF>.<CRLF>
|
205
|
+
# 250 Requested mail action okay, completed
|
206
|
+
# 421 <domain> Service not available, closing transmission channel received data
|
207
|
+
# 451 Requested action aborted: local error in processing
|
208
|
+
# 452 Requested action not taken: insufficient system storage
|
209
|
+
# 500 Syntax error, command unrecognised
|
210
|
+
# 501 Syntax error in parameters or arguments
|
211
|
+
# 503 Bad sequence of commands
|
212
|
+
# 552 Requested mail action aborted: exceeded storage allocation
|
213
|
+
# 554 Transaction failed
|
214
|
+
# ---------
|
215
|
+
# check valid command sequence
|
216
|
+
raise Smtpd503Exception if Thread.current[:cmd_sequence] != :CMD_RCPT
|
217
|
+
# handle command
|
218
|
+
# set sequence state
|
219
|
+
Thread.current[:cmd_sequence] = :CMD_DATA
|
220
|
+
# reply ok / proceed with message data
|
221
|
+
return "354 Enter message, ending with \".\" on a line by itself"
|
222
|
+
|
223
|
+
else
|
224
|
+
# If we somehow get to this point then
|
225
|
+
# we have encountered an error
|
226
|
+
raise Smtpd500Exception
|
227
|
+
|
228
|
+
end
|
229
|
+
|
230
|
+
else
|
231
|
+
# If we are in data mode and the entire message consists
|
232
|
+
# solely of a period on a line by itself then we
|
233
|
+
# are being told to exit data mode
|
234
|
+
if (line.chomp =~ /^\.$/)
|
235
|
+
# append last chars to message data
|
236
|
+
Thread.current[:ctx][:message][:data] += line
|
237
|
+
# remove ending line .
|
238
|
+
Thread.current[:ctx][:message][:data].gsub!(/\r\n\Z/, '').gsub!(/\.\Z/, '')
|
239
|
+
# save delivered time
|
240
|
+
Thread.current[:ctx][:message][:delivered] = Time.now.utc
|
241
|
+
# save bytesize of message data
|
242
|
+
Thread.current[:ctx][:message][:bytesize] = Thread.current[:ctx][:message][:data].bytesize
|
243
|
+
# call event
|
244
|
+
begin
|
245
|
+
on_message_data_event(Thread.current[:ctx])
|
246
|
+
array = (0..9).to_a + ("A".."F").to_a
|
247
|
+
return "250 2.0.0 Ok: queued as #{array.sample(11).join("")}"
|
248
|
+
|
249
|
+
# test for SmtpdException
|
250
|
+
rescue SmtpdException
|
251
|
+
# just re-raise exception set by app
|
252
|
+
raise
|
253
|
+
|
254
|
+
# test all other Exceptions
|
255
|
+
rescue Exception => e
|
256
|
+
# send correct aborted message to smtp dialog
|
257
|
+
raise Smtpd451Exception.new("#{e}")
|
258
|
+
|
259
|
+
ensure
|
260
|
+
# always start with empty values after finishing incoming message
|
261
|
+
# and rset command sequence
|
262
|
+
reset_ctx
|
263
|
+
end
|
264
|
+
|
265
|
+
else
|
266
|
+
# If we are in date mode then we need to add
|
267
|
+
# the new data to the message
|
268
|
+
Thread.current[:ctx][:message][:data] += line
|
269
|
+
return ""
|
270
|
+
# command sequence state will stay on :CMD_DATA
|
271
|
+
|
272
|
+
end
|
273
|
+
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestMessage < Minitest::Test
|
4
|
+
|
5
|
+
def setup
|
6
|
+
CarterdteSmtpFilter::Config.parse("./test/fixtures/config.yml")
|
7
|
+
@server = CarterdteSmtpFilter::SmtpServer.new()
|
8
|
+
@server.start
|
9
|
+
@return_stmp = ReturnSmtp.new()
|
10
|
+
@return_stmp.start
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
@server.shutdown
|
15
|
+
sleep 2 unless @server.connections == 0
|
16
|
+
@server.stop
|
17
|
+
@return_stmp.shutdown
|
18
|
+
@return_stmp.stop
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_message_should_save_server_response_when_returning_email
|
22
|
+
raw_mail = File.open("./test/fixtures/mail.tmp", "rb").read
|
23
|
+
message = CarterdteSmtpFilter::Message.new raw_mail
|
24
|
+
response = message.return_email
|
25
|
+
assert(Net::SMTP::Response == message.response.class, "Response should be a SMTP Response")
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_message_should_save_server_queueid_response_if_any
|
29
|
+
raw_mail = File.open("./test/fixtures/mail_with_dte.eml", "rb").read
|
30
|
+
message = CarterdteSmtpFilter::Message.new raw_mail
|
31
|
+
message.process
|
32
|
+
assert_equal(message.response.string.split(/\s+/).last, message.qid)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_message_to_json_should_return_json_object_with_message_metada
|
36
|
+
message = CarterdteSmtpFilter::Message.new File.open("./test/fixtures/mail_with_dte.eml", "rb").read
|
37
|
+
assert(JSON.parse(message.to_json), "No JSON")
|
38
|
+
json = JSON.parse(message.to_json)
|
39
|
+
assert_equal(message.email.to, json["to"])
|
40
|
+
assert_equal(message.email.from, json["from"])
|
41
|
+
assert_equal(message.email.date.to_s, json["date"])
|
42
|
+
assert_equal("96529310-8", json["dte"]["rut_emisor"])
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_extract_dte_should_return_false_if_no_attachments
|
46
|
+
message = CarterdteSmtpFilter::Message.new File.open("./test/fixtures/mail.tmp", "rb").read
|
47
|
+
assert(!message.extract_dte, "Failure message.")
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_extract_dte_should_return_false_if_no_dte_attachments
|
51
|
+
message = CarterdteSmtpFilter::Message.new File.open("./test/fixtures/email_with_attachment_no_dte.eml", "rb").read
|
52
|
+
assert(!message.extract_dte, "Failure message.")
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_extract_dte_should_return_mail_part_with_xml_file
|
56
|
+
message = CarterdteSmtpFilter::Message.new File.open("./test/fixtures/mail_with_multiple_attachments.eml", "rb").read
|
57
|
+
assert(message.dte, "Failure message.")
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def test_message_dte_should_be_a_dte_object
|
62
|
+
message = CarterdteSmtpFilter::Message.new File.open("./test/fixtures/mail_with_dte.eml", "rb").read
|
63
|
+
assert_equal(CarterdteSmtpFilter::Dte, message.dte.class)
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
end
|