howitzer 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe051b3bfe068d7fe68f999882f1aac432ee24dd558438e3e0b6f195c7123885
4
- data.tar.gz: '09dca8df71b0ed83c4f0cf6f49679330628d92934f4e2e36bd861ddeb3ff2427'
3
+ metadata.gz: 1044884bf6fe39dc63128f59f930a0d75ae80297a946d34d2464f47a30fe17fe
4
+ data.tar.gz: b5501960e801914414fc6569996a9cc219e601ea78dfea1dac28c7db9d582ac7
5
5
  SHA512:
6
- metadata.gz: 5265ec269dba8e334e2c1223ac788c2a65b331f2374d9007ae78a3c0b5fc1aa79a9ce65ccfff713efeec3a7e6531cf42fc413eeb722c908f916b7fd5efc8f34d
7
- data.tar.gz: 72948920c6c1cd9b437e766dc89bc205b12837c86e98a225ff05d853d17f16a4b833cbcc9febeeafd4b5ed3f60be915c0a67e779dd5d9967175c6b9e62cfc9f5
6
+ metadata.gz: 450f74b4dec7185673b2faa9138c8afb4b9568be8680f38718728105ad5893a5e1abfb1d908e759a021fcd3af13093e67775537b3a109219b065b00c30a7f293
7
+ data.tar.gz: 0bc01379c520937ec1bd004fffcc44b9c558ff9c1c5eea1a292067d65f5d1661f9f5aaf806c5b0183d34e46c2591fc3bd9b71a0cc8288fc7e12b56d9946478d0
data/CHANGELOG.md CHANGED
@@ -4,6 +4,19 @@
4
4
 
5
5
  ### Bug-fixes
6
6
 
7
+ ## [2.5.0](https://github.com/strongqa/howitzer/compare/v2.4.0...v2.5.0) (2022-08-16)
8
+
9
+
10
+ ### Features
11
+
12
+ * 1secMail integration ([#316](https://github.com/strongqa/howitzer/issues/316)) ([6850758](https://github.com/strongqa/howitzer/commit/6850758370bd293d241f95c2a3cc0163c6fb3062))
13
+ * testmail.app integration ([#314](https://github.com/strongqa/howitzer/issues/314)) ([7f62bae](https://github.com/strongqa/howitzer/commit/7f62bae2e7e91200e02ed98acded9070726f3fc1))
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * mailtrap integration update ([#313](https://github.com/strongqa/howitzer/issues/313)) ([49e7390](https://github.com/strongqa/howitzer/commit/49e73909f7033d2986b0f5713bbbcbea7231ade0))
19
+
7
20
  ## [2.4.0](https://github.com/strongqa/howitzer/compare/v2.3.0...v2.4.0) (2022-07-22)
8
21
 
9
22
 
@@ -120,3 +120,10 @@
120
120
  # -Gmail-
121
121
  gmail_login: gmail_address
122
122
  gmail_password: gmail_password
123
+
124
+ # -testmail.app-
125
+ testmail_api_key: testmail_api_key
126
+ testmail_namespace: testmail_namespace
127
+
128
+ # 1secMail
129
+ onesecmail_domain: 1secmail.com
@@ -24,19 +24,19 @@ module Howitzer
24
24
  # @return [String] plain text body of the email message
25
25
 
26
26
  def plain_text_body
27
- message['text_body']
27
+ Howitzer::MailtrapApi::Client.new.get_txt_body(message)
28
28
  end
29
29
 
30
30
  # @return [String] html body of the email message
31
31
 
32
32
  def html_body
33
- message['html_body']
33
+ Howitzer::MailtrapApi::Client.new.get_html_body(message)
34
34
  end
35
35
 
36
36
  # @return [String] stripped text
37
37
 
38
38
  def text
39
- message['text_body']
39
+ Howitzer::MailtrapApi::Client.new.get_raw_body(message)
40
40
  end
41
41
 
42
42
  # @return [String] an email address specified in `From` field
@@ -0,0 +1,80 @@
1
+ require 'howitzer/exceptions'
2
+ require 'howitzer/mail_adapters/abstract'
3
+ require 'howitzer/onesecmail_api/client'
4
+
5
+ module Howitzer
6
+ module MailAdapters
7
+ # This class represents 1secMail mail adapter
8
+ class Onesecmail < Abstract
9
+ # Finds an email in storage
10
+ # @param recipient [String] an email
11
+ # @param subject [String]
12
+ # @param wait [Integer] how much time is required to wait an email
13
+ # @raise [EmailNotFoundError] if blank message
14
+
15
+ def self.find(recipient, subject, wait:)
16
+ message = {}
17
+ retryable(find_retry_params(wait)) { message = retrieve_message(recipient, subject) }
18
+ return new(message) if message.present?
19
+
20
+ raise Howitzer::EmailNotFoundError,
21
+ "Message with subject '#{subject}' for recipient '#{recipient}' was not found."
22
+ end
23
+
24
+ # @return [String] plain text body of the email message
25
+
26
+ def plain_text_body
27
+ message['body']
28
+ end
29
+
30
+ # @return [String] html body of the email message
31
+
32
+ def html_body
33
+ message['htmlBody']
34
+ end
35
+
36
+ # @return [String] stripped text
37
+
38
+ def text
39
+ message['textBody']
40
+ end
41
+
42
+ # @return [String] an email address specified in `From` field
43
+
44
+ def mail_from
45
+ message['from']
46
+ end
47
+
48
+ # @return [String] when email was received
49
+
50
+ def received_time
51
+ Time.parse(message['date']).to_s
52
+ end
53
+
54
+ # @return [String] a real sender email address
55
+
56
+ def sender_email
57
+ message['from']
58
+ end
59
+
60
+ def self.find_retry_params(wait)
61
+ {
62
+ timeout: wait,
63
+ sleep: Howitzer.mail_sleep_time,
64
+ silent: true,
65
+ logger: Howitzer::Log,
66
+ on: Howitzer::EmailNotFoundError
67
+ }
68
+ end
69
+ private_class_method :find_retry_params
70
+
71
+ def self.retrieve_message(recipient, subject)
72
+ message = Howitzer::OnesecmailApi::Client.new.find_message(recipient, subject)
73
+ raise Howitzer::EmailNotFoundError, 'Message not received yet, retry...' unless message
74
+
75
+ message
76
+ end
77
+ private_class_method :retrieve_message
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,102 @@
1
+ require 'howitzer/exceptions'
2
+ require 'howitzer/mail_adapters/abstract'
3
+ require 'howitzer/testmail_api/client'
4
+
5
+ module Howitzer
6
+ module MailAdapters
7
+ # This class represents testmail.app mail adapter
8
+ class Testmail < Abstract
9
+ # Finds an email in storage
10
+ # @param recipient [String] an email
11
+ # @param subject [String]
12
+ # @param wait [Integer] how much time is required to wait an email
13
+ # @raise [EmailNotFoundError] if blank message
14
+
15
+ def self.find(recipient, subject, wait:)
16
+ message = {}
17
+ retryable(find_retry_params(wait)) { message = retrieve_message(recipient, subject) }
18
+ return new(message) if message.present?
19
+
20
+ raise Howitzer::EmailNotFoundError,
21
+ "Message with subject '#{subject}' for recipient '#{recipient}' was not found."
22
+ end
23
+
24
+ # @return [String] plain text body of the email message
25
+
26
+ def plain_text_body
27
+ message['text']
28
+ end
29
+
30
+ # @return [String] html body of the email message
31
+
32
+ def html_body
33
+ message['html']
34
+ end
35
+
36
+ # @return [String] stripped text
37
+
38
+ def text
39
+ message['text']
40
+ end
41
+
42
+ # @return [String] an email address specified in `From` field
43
+
44
+ def mail_from
45
+ message['from']
46
+ end
47
+
48
+ # @return [String] recipient emails separated with `, `
49
+
50
+ def recipients
51
+ message['to'].split ', '
52
+ end
53
+
54
+ # @return [String] when email was received
55
+
56
+ def received_time
57
+ Time.parse(message['timestamp']).to_s
58
+ end
59
+
60
+ # @return [String] a real sender email address
61
+
62
+ def sender_email
63
+ message['from']
64
+ end
65
+
66
+ # @return [Array] attachments
67
+
68
+ def mime_part
69
+ message['attachments']
70
+ end
71
+
72
+ # @raise [NoAttachmentsError] if no attachments present
73
+ # @return [Array] attachments
74
+
75
+ def mime_part!
76
+ files = mime_part
77
+ return files if files.present?
78
+
79
+ raise Howitzer::NoAttachmentsError, 'No attachments were found.'
80
+ end
81
+
82
+ def self.find_retry_params(wait)
83
+ {
84
+ timeout: wait,
85
+ sleep: Howitzer.mail_sleep_time,
86
+ silent: true,
87
+ logger: Howitzer::Log,
88
+ on: Howitzer::EmailNotFoundError
89
+ }
90
+ end
91
+ private_class_method :find_retry_params
92
+
93
+ def self.retrieve_message(recipient, subject)
94
+ message = Howitzer::TestmailApi::Client.new.find_message(recipient, subject)
95
+ raise Howitzer::EmailNotFoundError, 'Message not received yet, retry...' unless message
96
+
97
+ message
98
+ end
99
+ private_class_method :retrieve_message
100
+ end
101
+ end
102
+ end
@@ -32,6 +32,24 @@ module Howitzer
32
32
  JSON.parse(RestClient.get("#{BASE_URL}/messages/#{message['id']}/attachments", 'Api-Token' => @api_token))
33
33
  end
34
34
 
35
+ def get_html_body(message)
36
+ RestClient.get("#{BASE_URL}/messages/#{message['id']}/body.html", 'Api-Token' => @api_token).body
37
+ rescue => e
38
+ raise Howitzer::CommunicationError, e.message
39
+ end
40
+
41
+ def get_txt_body(message)
42
+ RestClient.get("#{BASE_URL}/messages/#{message['id']}/body.txt", 'Api-Token' => @api_token).body
43
+ rescue => e
44
+ raise Howitzer::CommunicationError, e.message
45
+ end
46
+
47
+ def get_raw_body(message)
48
+ RestClient.get("#{BASE_URL}/messages/#{message['id']}/body.raw", 'Api-Token' => @api_token).body
49
+ rescue => e
50
+ raise Howitzer::CommunicationError, e.message
51
+ end
52
+
35
53
  private
36
54
 
37
55
  def messages(recipient)
@@ -0,0 +1,44 @@
1
+ require 'json'
2
+ require 'rest-client'
3
+
4
+ module Howitzer
5
+ module OnesecmailApi
6
+ # A Onesecmail::Client object is used to communicate with the 1secMail API.
7
+ class Client
8
+ BASE_URL = 'https://www.1secmail.com/api/v1/'.freeze # :nodoc:
9
+
10
+ # Finds message according to given parameters
11
+ #
12
+ # @param recipient [String] this is recipient mail address for message filtering
13
+ # @param subject [String] this is subject of the message to filter particular message
14
+ # @return [Hash] json message parsed to ruby hash
15
+
16
+ def find_message(recipient, subject)
17
+ messages = filter_by_subject(recipient[/[^@]+/], subject)
18
+ latest_message(messages)
19
+ end
20
+
21
+ private
22
+
23
+ def messages(recipient_name)
24
+ JSON.parse(RestClient.get("#{BASE_URL}?action=getMessages&login=#{recipient_name}" \
25
+ "&domain=#{Howitzer.onesecmail_domain}"))
26
+ end
27
+
28
+ def latest_message(messages)
29
+ messages[0]
30
+ end
31
+
32
+ def filter_by_subject(recipient_name, subject)
33
+ result_messages = []
34
+ messages(recipient_name).each do |msg|
35
+ if msg['subject'] == subject
36
+ result_messages << JSON.parse(RestClient.get("#{BASE_URL}?action=readMessage&login=#{recipient_name}" \
37
+ "&domain=#{Howitzer.onesecmail_domain}&id=#{msg['id']}"))
38
+ end
39
+ end
40
+ result_messages
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,7 @@
1
+ module Howitzer
2
+ # This module holds simple implementation of 1secMail api client
3
+ module OnesecmailApi
4
+ end
5
+ end
6
+
7
+ require 'howitzer/onesecmail_api/client'
@@ -0,0 +1,44 @@
1
+ require 'json'
2
+ require 'rest-client'
3
+
4
+ module Howitzer
5
+ module TestmailApi
6
+ # A Testmail::Client object is used to communicate with the testmail.app API.
7
+ class Client
8
+ BASE_URL = "https://api.testmail.app/api/json?apikey=#{Howitzer.testmail_api_key}" \
9
+ "&namespace=#{Howitzer.testmail_namespace}".freeze # :nodoc:
10
+
11
+ def initialize
12
+ @api_token = Howitzer.testmail_api_key
13
+ end
14
+
15
+ # Finds message according to given parameters
16
+ #
17
+ # @param recipient [String] this is recipient mail address for message filtering
18
+ # @param subject [String] this is subject of the message to filter particular message
19
+ # @return [Hash] json message parsed to ruby hash
20
+
21
+ def find_message(recipient, subject)
22
+ recipient = recipient.gsub(/.*\.([^@]+)@.*/, '\1')
23
+ messages = filter_by_subject(messages(recipient), subject)
24
+ latest_message(messages)
25
+ end
26
+
27
+ private
28
+
29
+ def messages(recipient)
30
+ JSON.parse(RestClient.get("#{BASE_URL}&tag=#{recipient}"))
31
+ end
32
+
33
+ def latest_message(messages)
34
+ messages[0]
35
+ end
36
+
37
+ def filter_by_subject(messages, subject)
38
+ result_messages = []
39
+ messages['emails'].each { |msg| result_messages << msg if msg['subject'] == subject }
40
+ result_messages
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,7 @@
1
+ module Howitzer
2
+ # This module holds simple implementation of testmail.app api client
3
+ module TestmailApi
4
+ end
5
+ end
6
+
7
+ require 'howitzer/testmail_api/client'
@@ -1,4 +1,4 @@
1
1
  # This module holds howitzer version
2
2
  module Howitzer
3
- VERSION = '2.4.0'.freeze # :nodoc:
3
+ VERSION = '2.5.0'.freeze # :nodoc:
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: howitzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Parashchenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-22 00:00:00.000000000 Z
11
+ date: 2022-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -302,6 +302,8 @@ files:
302
302
  - lib/howitzer/mail_adapters/gmail.rb
303
303
  - lib/howitzer/mail_adapters/mailgun.rb
304
304
  - lib/howitzer/mail_adapters/mailtrap.rb
305
+ - lib/howitzer/mail_adapters/onesecmail.rb
306
+ - lib/howitzer/mail_adapters/testmail.rb
305
307
  - lib/howitzer/mailgun_api.rb
306
308
  - lib/howitzer/mailgun_api/client.rb
307
309
  - lib/howitzer/mailgun_api/connector.rb
@@ -314,7 +316,11 @@ files:
314
316
  - lib/howitzer/meta/entry.rb
315
317
  - lib/howitzer/meta/iframe.rb
316
318
  - lib/howitzer/meta/section.rb
319
+ - lib/howitzer/onesecmail_api.rb
320
+ - lib/howitzer/onesecmail_api/client.rb
317
321
  - lib/howitzer/tasks/framework.rake
322
+ - lib/howitzer/testmail_api.rb
323
+ - lib/howitzer/testmail_api/client.rb
318
324
  - lib/howitzer/utils.rb
319
325
  - lib/howitzer/utils/string_extensions.rb
320
326
  - lib/howitzer/version.rb
@@ -336,7 +342,7 @@ licenses:
336
342
  metadata:
337
343
  bug_tracker_uri: https://github.com/strongqa/howitzer/issues
338
344
  changelog_uri: https://github.com/strongqa/howitzer/blob/master/CHANGELOG.md
339
- documentation_uri: https://www.rubydoc.info/gems/howitzer/2.4.0
345
+ documentation_uri: https://www.rubydoc.info/gems/howitzer/2.5.0
340
346
  source_code_uri: https://github.com/strongqa/howitzer
341
347
  rubygems_mfa_required: 'false'
342
348
  post_install_message: