mailosaur 6.0.3 → 7.0.2

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: 527f1eadb528e82ab2e1a56047b7494e1fcaf43d7d12c57c33511df5274c35f1
4
- data.tar.gz: 8216fc4682a238eeb6f29a6f0b71426b6c684c5973d50c364be0019566403599
3
+ metadata.gz: 798ce47acf047126597a038b0bdb2297f4a4806145674ee116cefcb1e31dd556
4
+ data.tar.gz: 5595c1400c4e16d1f0f1f75e44f027809b95d89817890d54695240e053f63a13
5
5
  SHA512:
6
- metadata.gz: 0da89f9b5d8c3b176e1188904a054e241b379269e20151157f0d3a4dc8080a7bc6a9f14387314b4adc2f7e794b82662444e3bc13bff0971ae8de1f11b033c928
7
- data.tar.gz: f4d7c3e0c3a10ab0f6c33ec8d0d15f24354aef15b297395afbaa010d443d2f7484d90ec4ae01760e02d444306dcb57baf74e5139aa281b589474c803bf9f6e7c
6
+ metadata.gz: 1a193b027b089135e3855ae44abe60c777e3addca743ae48620577aa79b08877d31aa01497381055e64178ce0c848f23530041d6ff70d573fd6054556fdec7c0
7
+ data.tar.gz: 71e18e02a530719f12cc506ed6bafda93c0127e8c37f5ac26345659506427453c11e540dc53feafc99b4dd21cbb607a6c07b08ed8229bfa5ec46de5e91f1f011
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Mailosaur Ruby Client Library
2
2
 
3
- [Mailosaur](https://mailosaur.com) allows you to automate tests involving email. Allowing you to perform end-to-end automated and functional email testing.
3
+ [Mailosaur](https://mailosaur.com) lets you automate email and SMS tests, like account verification and password resets, and integrate these into your CI/CD pipeline.
4
4
 
5
- [![Build Status](https://travis-ci.org/mailosaur/mailosaur-ruby.svg?branch=master)](https://travis-ci.org/mailosaur/mailosaur-ruby)
5
+ [![](https://github.com/mailosaur/mailosaur-ruby/workflows/CI/badge.svg)](https://github.com/mailosaur/mailosaur-ruby/actions)
6
6
 
7
7
  ## Installation
8
8
 
@@ -10,29 +10,52 @@
10
10
  gem install mailosaur
11
11
  ```
12
12
 
13
- ## Documentation and usage examples
13
+ ## Documentation
14
14
 
15
- [Mailosaur's documentation](https://mailosaur.com/docs) includes all the information and usage examples you'll need.
15
+ Please see the [Ruby client reference](https://mailosaur.com/docs/email-testing/ruby/client-reference/) for the most up-to-date documentation.
16
16
 
17
- ## Running tests
17
+ ## Usage
18
18
 
19
- Once you've cloned this repository locally, you can simply run:
19
+ example.rb
20
20
 
21
+ ```ruby
22
+ require "mailosaur"
23
+ mailosaur = Mailosaur::MailosaurClient.new("YOUR_API_KEY")
24
+
25
+ result = mailosaur.servers.list()
26
+
27
+ print("You have a server called: " + result.items[0].name)
21
28
  ```
29
+
30
+ ## Development
31
+
32
+ You must have the following prerequisites installed:
33
+
34
+ * [Bundler](https://bundler.io/)
35
+
36
+ Install all development dependencies:
37
+
38
+ ```sh
22
39
  bundle install
40
+ ```
41
+
42
+ The test suite requires the following environment variables to be set:
23
43
 
44
+ ```sh
45
+ export MAILOSAUR_BASE_URL=https://mailosaur.com/
24
46
  export MAILOSAUR_API_KEY=your_api_key
25
47
  export MAILOSAUR_SERVER=server_id
48
+ ```
49
+
50
+ Run all tests:
26
51
 
52
+ ```sh
27
53
  bundle exec rake test
28
54
  ```
29
55
 
30
- ## Linting code
56
+ Lint code (via Rubocop):
31
57
 
32
- Simply run Rubocop:
33
-
34
- ```
35
- bundle install
58
+ ```sh
36
59
  bundle exec rubocop
37
60
  ```
38
61
 
@@ -4,8 +4,9 @@ module Mailosaur
4
4
  # Creates and initializes a new instance of the Analysis class.
5
5
  # @param conn client connection.
6
6
  #
7
- def initialize(conn)
7
+ def initialize(conn, handle_http_error)
8
8
  @conn = conn
9
+ @handle_http_error = handle_http_error
9
10
  end
10
11
 
11
12
  # @return [Connection] the client connection.
@@ -22,13 +23,7 @@ module Mailosaur
22
23
  #
23
24
  def spam(email)
24
25
  response = conn.get 'api/analysis/spam/' + email
25
-
26
- unless response.status == 200
27
- error_model = JSON.load(response.body)
28
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
29
- raise mailosaur_error
30
- end
31
-
26
+ @handle_http_error.call(response) unless response.status == 200
32
27
  model = JSON.load(response.body)
33
28
  Mailosaur::Models::SpamAnalysisResult.new(model)
34
29
  end
@@ -4,8 +4,9 @@ module Mailosaur
4
4
  # Creates and initializes a new instance of the Files class.
5
5
  # @param client connection.
6
6
  #
7
- def initialize(conn)
7
+ def initialize(conn, handle_http_error)
8
8
  @conn = conn
9
+ @handle_http_error = handle_http_error
9
10
  end
10
11
 
11
12
  # @return [Connection] the client connection.
@@ -23,13 +24,7 @@ module Mailosaur
23
24
  #
24
25
  def get_attachment(id)
25
26
  response = conn.get 'api/files/attachments/' + id
26
-
27
- unless response.status == 200
28
- error_model = JSON.load(response.body)
29
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
30
- raise mailosaur_error
31
- end
32
-
27
+ @handle_http_error.call(response) unless response.status == 200
33
28
  response.body
34
29
  end
35
30
 
@@ -45,13 +40,7 @@ module Mailosaur
45
40
  #
46
41
  def get_email(id)
47
42
  response = conn.get 'api/files/email/' + id
48
-
49
- unless response.status == 200
50
- error_model = JSON.load(response.body)
51
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
52
- raise mailosaur_error
53
- end
54
-
43
+ @handle_http_error.call(response) unless response.status == 200
55
44
  response.body
56
45
  end
57
46
  end
@@ -1,23 +1,15 @@
1
- require 'json'
2
-
3
1
  module Mailosaur
4
2
  class MailosaurError < StandardError
5
- attr_reader :type
6
- attr_reader :messages
7
- attr_reader :model
3
+ attr_reader :error_type
4
+ attr_reader :http_status_code
5
+ attr_reader :http_response_body
8
6
 
9
- def initialize(message, error_model)
7
+ def initialize(message = '', error_type = '', http_status_code = nil, http_response_body = nil)
10
8
  super(message)
11
9
 
12
- @type = nil
13
- @messages = nil
14
- @model = nil
15
-
16
- unless error_model.nil?
17
- @type = error_model['type']
18
- @messages = error_model['messages']
19
- @model = error_model['model']
20
- end
10
+ @error_type = error_type
11
+ @http_status_code = http_status_code
12
+ @http_response_body = http_response_body
21
13
  end
22
14
  end
23
15
  end
@@ -1,11 +1,14 @@
1
+ require 'uri'
2
+
1
3
  module Mailosaur
2
4
  class Messages
3
5
  #
4
6
  # Creates and initializes a new instance of the Messages class.
5
7
  # @param client connection.
6
8
  #
7
- def initialize(conn)
9
+ def initialize(conn, handle_http_error)
8
10
  @conn = conn
11
+ @handle_http_error = handle_http_error
9
12
  end
10
13
 
11
14
  # @return [Connection] the client connection.
@@ -29,9 +32,9 @@ module Mailosaur
29
32
  #
30
33
  def get(server, criteria, timeout: 10_000, received_after: DateTime.now - (1.0 / 24))
31
34
  # Defaults timeout to 10s, receivedAfter to 1h
32
- raise Mailosaur::MailosaurError.new('Use get_by_id to retrieve a message using its identifier', nil) if server.length > 8
35
+ raise Mailosaur::MailosaurError.new('Must provide a valid Server ID.', 'invalid_request') if server.length != 8
33
36
 
34
- result = search(server, criteria, timeout: timeout, received_after: received_after)
37
+ result = search(server, criteria, page: 0, items_per_page: 1, timeout: timeout, received_after: received_after)
35
38
  get_by_id(result.items[0].id)
36
39
  end
37
40
 
@@ -47,13 +50,7 @@ module Mailosaur
47
50
  #
48
51
  def get_by_id(id)
49
52
  response = conn.get 'api/messages/' + id
50
-
51
- unless response.status == 200
52
- error_model = JSON.load(response.body)
53
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
54
- raise mailosaur_error
55
- end
56
-
53
+ @handle_http_error.call(response) unless response.status == 200
57
54
  model = JSON.load(response.body)
58
55
  Mailosaur::Models::Message.new(model)
59
56
  end
@@ -68,13 +65,7 @@ module Mailosaur
68
65
  #
69
66
  def delete(id)
70
67
  response = conn.delete 'api/messages/' + id
71
-
72
- unless response.status == 204
73
- error_model = JSON.load(response.body)
74
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
75
- raise mailosaur_error
76
- end
77
-
68
+ @handle_http_error.call(response) unless response.status == 204
78
69
  nil
79
70
  end
80
71
 
@@ -90,21 +81,20 @@ module Mailosaur
90
81
  # pagination.
91
82
  # @param items_per_page [Integer] A limit on the number of results to be
92
83
  # returned per page. Can be set between 1 and 1000 items, the default is 50.
84
+ # @param received_after [DateTime] Limits results to only messages received
85
+ # after this date/time.
93
86
  #
94
87
  # @return [MessageListResult] operation results.
95
88
  #
96
- def list(server, page: nil, items_per_page: nil)
89
+ def list(server, page: nil, items_per_page: nil, received_after: nil)
97
90
  url = 'api/messages?server=' + server
98
- url += page ? '&page=' + page : ''
99
- url += items_per_page ? '&itemsPerPage=' + items_per_page : ''
91
+ url += page ? '&page=' + page.to_s : ''
92
+ url += items_per_page ? '&itemsPerPage=' + items_per_page.to_s : ''
93
+ url += received_after ? '&receivedAfter=' + CGI.escape(received_after.iso8601) : ''
100
94
 
101
95
  response = conn.get url
102
96
 
103
- unless response.status == 200
104
- error_model = JSON.load(response.body)
105
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
106
- raise mailosaur_error
107
- end
97
+ @handle_http_error.call(response) unless response.status == 200
108
98
 
109
99
  model = JSON.load(response.body)
110
100
  Mailosaur::Models::MessageListResult.new(model)
@@ -120,13 +110,7 @@ module Mailosaur
120
110
  #
121
111
  def delete_all(server)
122
112
  response = conn.delete 'api/messages?server=' + server
123
-
124
- unless response.status == 204
125
- error_model = JSON.load(response.body)
126
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
127
- raise mailosaur_error
128
- end
129
-
113
+ @handle_http_error.call(response) unless response.status == 204
130
114
  nil
131
115
  end
132
116
 
@@ -148,14 +132,16 @@ module Mailosaur
148
132
  # (in milliseconds).
149
133
  # @param received_after [DateTime] Limits results to only messages received
150
134
  # after this date/time.
135
+ # @param error_on_timeout [Boolean] When set to false, an error will not be
136
+ # throw if timeout is reached (default: true).
151
137
  #
152
138
  # @return [MessageListResult] operation results.
153
139
  #
154
- def search(server, criteria, page: nil, items_per_page: nil, timeout: nil, received_after: nil) # rubocop:disable all
140
+ def search(server, criteria, page: nil, items_per_page: nil, timeout: nil, received_after: nil, error_on_timeout: true) # rubocop:disable all
155
141
  url = 'api/messages/search?server=' + server
156
142
  url += page ? '&page=' + page.to_s : ''
157
143
  url += items_per_page ? '&itemsPerPage=' + items_per_page.to_s : ''
158
- url += received_after ? '&receivedAfter=' + received_after.iso8601 : ''
144
+ url += received_after ? '&receivedAfter=' + CGI.escape(received_after.iso8601) : ''
159
145
 
160
146
  poll_count = 0
161
147
  start_time = Time.now.to_f
@@ -163,11 +149,7 @@ module Mailosaur
163
149
  loop do
164
150
  response = conn.post url, criteria.to_json
165
151
 
166
- unless response.status == 200
167
- error_model = JSON.load(response.body)
168
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model) # rubocop:disable Metrics/LineLength
169
- raise mailosaur_error
170
- end
152
+ @handle_http_error.call(response) unless response.status == 200
171
153
 
172
154
  model = JSON.load(response.body)
173
155
  return Mailosaur::Models::MessageListResult.new(model) if timeout.to_i.zero? || !model['items'].empty?
@@ -180,7 +162,9 @@ module Mailosaur
180
162
 
181
163
  ## Stop if timeout will be exceeded
182
164
  if ((1000 * (Time.now.to_f - start_time).to_i) + delay) > timeout
183
- raise Mailosaur::MailosaurError.new('No matching messages were found in time', nil)
165
+ return Mailosaur::Models::MessageListResult.new(model) unless error_on_timeout
166
+
167
+ raise Mailosaur::MailosaurError.new('No matching messages found in time. By default, only messages received in the last hour are checked (use receivedAfter to override this).', 'search_timeout')
184
168
  end
185
169
 
186
170
  sleep(delay / 1000)
@@ -2,11 +2,17 @@ module Mailosaur
2
2
  module Models
3
3
  class SearchCriteria < BaseModel
4
4
  def initialize(data = {})
5
+ @sent_from = data['sentFrom']
5
6
  @sent_to = data['sentTo']
6
7
  @subject = data['subject']
7
8
  @body = data['body']
9
+ @match = data['match'] || 'ALL'
8
10
  end
9
11
 
12
+ # @return [String] The full email address from which the target email was
13
+ # sent.
14
+ attr_accessor :sent_from
15
+
10
16
  # @return [String] The full email address to which the target email was
11
17
  # sent.
12
18
  attr_accessor :sent_to
@@ -18,6 +24,11 @@ module Mailosaur
18
24
  # @return [String] The value to seek within the target email's HTML or
19
25
  # text body.
20
26
  attr_accessor :body
27
+
28
+ # @return [String] If set to ALL (default), then only results that match all
29
+ # specified criteria will be returned. If set to ANY, results that match any of the
30
+ # specified criteria will be returned.
31
+ attr_accessor :match
21
32
  end
22
33
  end
23
34
  end
@@ -4,8 +4,9 @@ module Mailosaur
4
4
  # Creates and initializes a new instance of the Servers class.
5
5
  # @param client connection.
6
6
  #
7
- def initialize(conn)
7
+ def initialize(conn, handle_http_error)
8
8
  @conn = conn
9
+ @handle_http_error = handle_http_error
9
10
  end
10
11
 
11
12
  # @return [Connection] the client connection.
@@ -21,13 +22,7 @@ module Mailosaur
21
22
  #
22
23
  def list
23
24
  response = conn.get 'api/servers'
24
-
25
- unless response.status == 200
26
- error_model = JSON.load(response.body)
27
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
28
- raise mailosaur_error
29
- end
30
-
25
+ @handle_http_error.call(response) unless response.status == 200
31
26
  model = JSON.load(response.body)
32
27
  Mailosaur::Models::ServerListResult.new(model)
33
28
  end
@@ -43,13 +38,7 @@ module Mailosaur
43
38
  #
44
39
  def create(server_create_options)
45
40
  response = conn.post 'api/servers', server_create_options.to_json
46
-
47
- unless response.status == 200
48
- error_model = JSON.load(response.body)
49
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
50
- raise mailosaur_error
51
- end
52
-
41
+ @handle_http_error.call(response) unless response.status == 200
53
42
  model = JSON.load(response.body)
54
43
  Mailosaur::Models::Server.new(model)
55
44
  end
@@ -66,13 +55,7 @@ module Mailosaur
66
55
  #
67
56
  def get(id)
68
57
  response = conn.get 'api/servers/' + id
69
-
70
- unless response.status == 200
71
- error_model = JSON.load(response.body)
72
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
73
- raise mailosaur_error
74
- end
75
-
58
+ @handle_http_error.call(response) unless response.status == 200
76
59
  model = JSON.load(response.body)
77
60
  Mailosaur::Models::Server.new(model)
78
61
  end
@@ -89,13 +72,7 @@ module Mailosaur
89
72
  #
90
73
  def update(id, server)
91
74
  response = conn.put 'api/servers/' + id, server.to_json
92
-
93
- unless response.status == 200
94
- error_model = JSON.load(response.body)
95
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
96
- raise mailosaur_error
97
- end
98
-
75
+ @handle_http_error.call(response) unless response.status == 200
99
76
  model = JSON.load(response.body)
100
77
  Mailosaur::Models::Server.new(model)
101
78
  end
@@ -110,13 +87,7 @@ module Mailosaur
110
87
  #
111
88
  def delete(id)
112
89
  response = conn.delete 'api/servers/' + id
113
-
114
- unless response.status == 204
115
- error_model = JSON.load(response.body)
116
- mailosaur_error = Mailosaur::MailosaurError.new('Operation returned an invalid status code \'' + response.status.to_s + '\'', error_model)
117
- raise mailosaur_error
118
- end
119
-
90
+ @handle_http_error.call(response) unless response.status == 204
120
91
  nil
121
92
  end
122
93
 
@@ -1,3 +1,3 @@
1
1
  module Mailosaur
2
- VERSION = '6.0.3'.freeze
2
+ VERSION = '7.0.2'.freeze
3
3
  end
@@ -50,22 +50,22 @@ module Mailosaur
50
50
 
51
51
  # @return [Analysis] analysis
52
52
  def analysis
53
- @analysis ||= Analysis.new(connection)
53
+ @analysis ||= Analysis.new(connection, method(:handle_http_error))
54
54
  end
55
55
 
56
56
  # @return [Files] files
57
57
  def files
58
- @files ||= Files.new(connection)
58
+ @files ||= Files.new(connection, method(:handle_http_error))
59
59
  end
60
60
 
61
61
  # @return [Messages] messages
62
62
  def messages
63
- @messages ||= Messages.new(connection)
63
+ @messages ||= Messages.new(connection, method(:handle_http_error))
64
64
  end
65
65
 
66
66
  # @return [Servers] servers
67
67
  def servers
68
- @servers ||= Servers.new(connection)
68
+ @servers ||= Servers.new(connection, method(:handle_http_error))
69
69
  end
70
70
 
71
71
  private
@@ -78,5 +78,20 @@ module Mailosaur
78
78
  }
79
79
  }).tap { |conn| conn.basic_auth(@api_key, '') }
80
80
  end
81
+
82
+ def handle_http_error(response)
83
+ case response.status
84
+ when 400
85
+ raise Mailosaur::MailosaurError.new('Request had one or more invalid parameters.', 'invalid_request', response.status, response.body)
86
+ when 401
87
+ raise Mailosaur::MailosaurError.new('Authentication failed, check your API key.', 'authentication_error', response.status, response.body)
88
+ when 403
89
+ raise Mailosaur::MailosaurError.new('Insufficient permission to perform that task.', 'permission_error', response.status, response.body)
90
+ when 404
91
+ raise Mailosaur::MailosaurError.new('Request did not find any matching resources.', 'invalid_request', response.status, response.body)
92
+ else
93
+ raise Mailosaur::MailosaurError.new('An API error occurred, see httpResponse for further information.', 'api_error', response.status, response.body)
94
+ end
95
+ end
81
96
  end
82
97
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailosaur
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.3
4
+ version: 7.0.2
5
5
  platform: ruby
6
6
  authors:
7
- - Mailosaur Ltd
7
+ - Mailosaur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-19 00:00:00.000000000 Z
11
+ date: 2020-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -144,7 +144,8 @@ dependencies:
144
144
  - - ">="
145
145
  - !ruby/object:Gem::Version
146
146
  version: 3.2.7
147
- description: Ruby client library for Mailosaur.
147
+ description: The Mailosaur Ruby library lets you integrate email and SMS testing into
148
+ your continuous integration process.
148
149
  email: code@mailosaur.com
149
150
  executables: []
150
151
  extensions: []
@@ -179,10 +180,15 @@ files:
179
180
  - lib/Mailosaur/servers.rb
180
181
  - lib/Mailosaur/version.rb
181
182
  - lib/mailosaur.rb
182
- homepage: https://mailosaur.com
183
+ homepage: https://mailosaur.com/
183
184
  licenses:
184
185
  - MIT
185
- metadata: {}
186
+ metadata:
187
+ bug_tracker_uri: https://github.com/mailosaur/mailosaur-ruby/issues
188
+ documentation_uri: https://mailosaur.com/docs/email-testing/ruby/
189
+ github_repo: ssh://github.com/mailosaur/mailosaur-ruby
190
+ homepage_uri: https://mailosaur.com/
191
+ source_code_uri: https://github.com/mailosaur/mailosaur-ruby
186
192
  post_install_message:
187
193
  rdoc_options: []
188
194
  require_paths:
@@ -198,9 +204,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
204
  - !ruby/object:Gem::Version
199
205
  version: '0'
200
206
  requirements: []
201
- rubyforge_project:
202
- rubygems_version: 2.7.7
207
+ rubygems_version: 3.1.2
203
208
  signing_key:
204
209
  specification_version: 4
205
- summary: Ruby client library for Mailosaur
210
+ summary: The Mailosaur Ruby library
206
211
  test_files: []