howitzer 2.0.3 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +69 -11
  3. data/LICENSE +1 -1
  4. data/README.md +21 -17
  5. data/bin/howitzer +7 -6
  6. data/generators/base_generator.rb +31 -17
  7. data/generators/config/config_generator.rb +11 -3
  8. data/generators/config/templates/boot.rb +3 -3
  9. data/generators/config/templates/capybara.rb +6 -131
  10. data/generators/config/templates/default.yml +34 -13
  11. data/generators/config/templates/drivers/appium.rb +25 -0
  12. data/generators/config/templates/drivers/browserstack.rb +23 -0
  13. data/generators/config/templates/drivers/crossbrowsertesting.rb +29 -0
  14. data/generators/config/templates/drivers/headless_chrome.rb +15 -0
  15. data/generators/config/templates/drivers/headless_firefox.rb +23 -0
  16. data/generators/config/templates/drivers/sauce.rb +25 -0
  17. data/generators/config/templates/drivers/selenium.rb +24 -0
  18. data/generators/config/templates/drivers/selenium_grid.rb +31 -0
  19. data/generators/config/templates/drivers/testingbot.rb +24 -0
  20. data/generators/cucumber/cucumber_generator.rb +2 -2
  21. data/generators/cucumber/templates/common_steps.rb +3 -3
  22. data/generators/cucumber/templates/cucumber.rake +5 -13
  23. data/generators/cucumber/templates/cuke_sniffer.rake +2 -2
  24. data/generators/cucumber/templates/env.rb +9 -1
  25. data/generators/cucumber/templates/hooks.rb +8 -2
  26. data/generators/cucumber/templates/transformers.rb +11 -25
  27. data/generators/emails/emails_generator.rb +2 -2
  28. data/generators/emails/templates/example_email.rb +1 -1
  29. data/generators/prerequisites/prerequisites_generator.rb +3 -3
  30. data/generators/prerequisites/templates/base.rb +1 -1
  31. data/generators/prerequisites/templates/{factory_girl.rb → factory_bot.rb} +7 -6
  32. data/generators/prerequisites/templates/users.rb +1 -1
  33. data/generators/root/root_generator.rb +3 -3
  34. data/generators/root/templates/Gemfile.erb +16 -22
  35. data/generators/rspec/rspec_generator.rb +2 -2
  36. data/generators/rspec/templates/rspec.rake +8 -8
  37. data/generators/rspec/templates/spec_helper.rb +6 -5
  38. data/generators/tasks/tasks_generator.rb +2 -2
  39. data/generators/turnip/templates/spec_helper.rb +6 -5
  40. data/generators/turnip/turnip_generator.rb +2 -2
  41. data/generators/web/templates/example_page.rb +1 -1
  42. data/generators/web/web_generator.rb +2 -2
  43. data/lib/howitzer/cache.rb +20 -19
  44. data/lib/howitzer/capybara_helpers.rb +58 -13
  45. data/lib/howitzer/email.rb +3 -2
  46. data/lib/howitzer/exceptions.rb +21 -20
  47. data/lib/howitzer/gmail_api/client.rb +31 -0
  48. data/lib/howitzer/gmail_api.rb +7 -0
  49. data/lib/howitzer/log.rb +6 -6
  50. data/lib/howitzer/mail_adapters/gmail.rb +96 -0
  51. data/lib/howitzer/mail_adapters/mailgun.rb +4 -2
  52. data/lib/howitzer/mail_adapters/mailtrap.rb +108 -0
  53. data/lib/howitzer/mailgun_api/client.rb +3 -2
  54. data/lib/howitzer/mailgun_api/connector.rb +1 -0
  55. data/lib/howitzer/mailgun_api/response.rb +1 -2
  56. data/lib/howitzer/mailtrap_api/client.rb +52 -0
  57. data/lib/howitzer/mailtrap_api.rb +7 -0
  58. data/lib/howitzer/meta/actions.rb +35 -0
  59. data/lib/howitzer/meta/element.rb +40 -0
  60. data/lib/howitzer/meta/entry.rb +62 -0
  61. data/lib/howitzer/meta/iframe.rb +41 -0
  62. data/lib/howitzer/meta/section.rb +30 -0
  63. data/lib/howitzer/meta.rb +11 -0
  64. data/lib/howitzer/utils/string_extensions.rb +6 -2
  65. data/lib/howitzer/version.rb +1 -1
  66. data/lib/howitzer/web/base_section.rb +1 -1
  67. data/lib/howitzer/web/capybara_context_holder.rb +1 -0
  68. data/lib/howitzer/web/capybara_methods_proxy.rb +15 -6
  69. data/lib/howitzer/web/element_dsl.rb +104 -44
  70. data/lib/howitzer/web/iframe_dsl.rb +23 -3
  71. data/lib/howitzer/web/page.rb +16 -4
  72. data/lib/howitzer/web/page_dsl.rb +19 -7
  73. data/lib/howitzer/web/page_validator.rb +27 -26
  74. data/lib/howitzer/web/section.rb +13 -2
  75. data/lib/howitzer/web/section_dsl.rb +65 -30
  76. data/lib/howitzer.rb +66 -10
  77. metadata +67 -133
  78. data/.coveralls.yml +0 -1
  79. data/.gitignore +0 -14
  80. data/.rspec +0 -3
  81. data/.rubocop.yml +0 -44
  82. data/.ruby-gemset +0 -1
  83. data/.travis.yml +0 -7
  84. data/Gemfile +0 -13
  85. data/MAINTENANCE.md +0 -32
  86. data/Rakefile +0 -22
  87. data/features/cli_help.feature +0 -31
  88. data/features/cli_new.feature +0 -349
  89. data/features/cli_unknown.feature +0 -17
  90. data/features/cli_update.feature +0 -178
  91. data/features/cli_version.feature +0 -14
  92. data/features/step_definitions/common_steps.rb +0 -29
  93. data/features/support/env.rb +0 -1
  94. data/features/support/transformers.rb +0 -3
  95. data/generators/root/templates/.gitignore +0 -21
  96. data/generators/root/templates/.rubocop.yml +0 -35
  97. data/generators/turnip/templates/.rspec +0 -1
  98. data/howitzer.gemspec +0 -37
  99. data/lib/howitzer/mail_adapters/debugmail.rb +0 -0
  100. data/spec/config/custom.yml +0 -9
  101. data/spec/spec_helper.rb +0 -72
  102. data/spec/support/generator_helper.rb +0 -21
  103. data/spec/support/logger_helper.rb +0 -13
  104. data/spec/support/mailgun_unit_client.rb +0 -68
  105. data/spec/support/shared_examples/capybara_context_holder.rb +0 -33
  106. data/spec/support/shared_examples/capybara_methods_proxy.rb +0 -94
  107. data/spec/support/shared_examples/dynamic_section_methods.rb +0 -35
  108. data/spec/support/shared_examples/element_dsl.rb +0 -242
  109. data/spec/unit/generators/base_generator_spec.rb +0 -272
  110. data/spec/unit/generators/config_generator_spec.rb +0 -38
  111. data/spec/unit/generators/cucumber_generator_spec.rb +0 -62
  112. data/spec/unit/generators/emails_generator_spec.rb +0 -35
  113. data/spec/unit/generators/prerequisites_generator_spec.rb +0 -53
  114. data/spec/unit/generators/root_generator_spec.rb +0 -72
  115. data/spec/unit/generators/rspec_generator_spec.rb +0 -36
  116. data/spec/unit/generators/tasks_generator_spec.rb +0 -31
  117. data/spec/unit/generators/turnip_generator_spec.rb +0 -52
  118. data/spec/unit/generators/web_generator_spec.rb +0 -52
  119. data/spec/unit/lib/cache_spec.rb +0 -85
  120. data/spec/unit/lib/capybara_helpers_spec.rb +0 -696
  121. data/spec/unit/lib/email_spec.rb +0 -186
  122. data/spec/unit/lib/howitzer_spec.rb +0 -40
  123. data/spec/unit/lib/init_spec.rb +0 -2
  124. data/spec/unit/lib/log_spec.rb +0 -122
  125. data/spec/unit/lib/mail_adapters/abstract_spec.rb +0 -62
  126. data/spec/unit/lib/mail_adapters/mailgun_spec.rb +0 -163
  127. data/spec/unit/lib/mailgun_api/client_spec.rb +0 -58
  128. data/spec/unit/lib/mailgun_api/connector_spec.rb +0 -54
  129. data/spec/unit/lib/mailgun_api/response_spec.rb +0 -28
  130. data/spec/unit/lib/utils/string_extensions_spec.rb +0 -77
  131. data/spec/unit/lib/web/base_section_spec.rb +0 -43
  132. data/spec/unit/lib/web/element_dsl_spec.rb +0 -22
  133. data/spec/unit/lib/web/iframe_dsl_spec.rb +0 -144
  134. data/spec/unit/lib/web/page_dsl_spec.rb +0 -74
  135. data/spec/unit/lib/web/page_spec.rb +0 -349
  136. data/spec/unit/lib/web/page_validator_spec.rb +0 -276
  137. data/spec/unit/lib/web/section_dsl_spec.rb +0 -165
  138. data/spec/unit/lib/web/section_spec.rb +0 -63
  139. data/spec/unit/version_spec.rb +0 -8
@@ -1,186 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer/email'
3
- require 'howitzer/log'
4
- require 'howitzer/exceptions'
5
-
6
- RSpec.describe Howitzer::Email do
7
- let(:recipient) { 'first_tester@gmail.com' }
8
- let(:message_subject) { 'test subject' }
9
- let(:message) { double(:message) }
10
- let(:email_object) { described_class.new(message) }
11
-
12
- describe '.adapter' do
13
- it do
14
- expect(described_class.adapter)
15
- .to eql(Howitzer::MailAdapters.const_get(Howitzer.mail_adapter.to_s.capitalize))
16
- end
17
- end
18
-
19
- describe '.adapter_name' do
20
- it { expect(described_class.adapter_name).to eql Howitzer.mail_adapter.to_sym }
21
- end
22
-
23
- describe '.adapter=' do
24
- subject { described_class.adapter = name }
25
-
26
- context 'when adapter_name is Symbol or String' do
27
- let(:name) { Howitzer.mail_adapter }
28
- it { expect(described_class.adapter).to eql Howitzer::MailAdapters.const_get(name.to_s.capitalize) }
29
- end
30
-
31
- context 'when adapter_name is not Symbol or String' do
32
- let(:name) { nil }
33
- it { expect { subject }.to raise_error(Howitzer::NoMailAdapterError) }
34
- end
35
- end
36
-
37
- describe '.subject' do
38
- it do
39
- described_class.send(:subject, message_subject)
40
- expect(described_class.send(:subject_value)).to eql message_subject
41
- expect(described_class.private_methods(true)).to include(:subject_value)
42
- end
43
- it 'should be protected' do
44
- expect { described_class.subject(message_subject) }.to raise_error(NoMethodError)
45
- end
46
- end
47
-
48
- describe '.wait_time' do
49
- subject { Class.new(described_class) }
50
- it 'should be protected' do
51
- expect { subject.wait_time(10) }.to raise_error(NoMethodError)
52
- end
53
-
54
- context 'when specified' do
55
- before { subject.send(:wait_time, 10) }
56
- it do
57
- expect(subject.send(:wait_time_value)).to eql 10
58
- expect(subject.private_methods(true)).to include(:wait_time_value)
59
- end
60
- end
61
-
62
- context 'when missing' do
63
- it do
64
- expect(subject.send(:wait_time_value)).to eql 60
65
- end
66
- end
67
- end
68
-
69
- describe '.find_by_recipient' do
70
- let(:recipient) { 'test@user.com' }
71
-
72
- context 'simple subject without parameters' do
73
- before { described_class.class_eval { subject 'Some title' } }
74
- it do
75
- expect(described_class.adapter).to receive(:find).with(recipient, 'Some title', wait: 60).once
76
- described_class.find_by_recipient(recipient)
77
- end
78
- end
79
-
80
- context 'complex subject with 1 parameter' do
81
- subject { described_class.find_by_recipient(recipient, name: 'Vasya') }
82
- before { described_class.class_eval { subject 'Some title from :name' } }
83
- it do
84
- expect(described_class.adapter).to receive(:find).with(recipient, 'Some title from Vasya', wait: 60).once
85
- subject
86
- end
87
- end
88
-
89
- context 'complex subject with 2 parameters' do
90
- subject { described_class.find_by_recipient(recipient, foo: 1, bar: 2) }
91
- before { described_class.class_eval { subject 'Some title with :foo and :bar' } }
92
- it do
93
- expect(described_class.adapter).to receive(:find).with(recipient, 'Some title with 1 and 2', wait: 60).once
94
- subject
95
- end
96
- end
97
-
98
- context 'missing subject' do
99
- subject { described_class.find_by_recipient(recipient) }
100
- before do
101
- described_class.instance_eval { undef :subject_value }
102
- end
103
- it do
104
- expect { subject }.to raise_error(Howitzer::NoEmailSubjectError)
105
- end
106
- end
107
-
108
- context 'nil subject' do
109
- subject { described_class.find_by_recipient(recipient) }
110
- before { described_class.class_eval { subject nil } }
111
- it do
112
- expect { subject }.to raise_error(Howitzer::NoEmailSubjectError)
113
- end
114
- end
115
- end
116
-
117
- describe '#new' do
118
- context 'when Email instance receive message and add create @message variable that' do
119
- it { expect(email_object.instance_variable_get(:@message)).to eql message }
120
- end
121
- end
122
-
123
- describe '#plain_text_body' do
124
- subject { email_object.plain_text_body }
125
- it do
126
- expect(message).to receive(:plain_text_body).once
127
- subject
128
- end
129
- end
130
-
131
- describe '#html_body' do
132
- subject { email_object.html_body }
133
- it do
134
- expect(message).to receive(:html_body).once
135
- subject
136
- end
137
- end
138
-
139
- describe '#text' do
140
- subject { email_object.text }
141
- it do
142
- expect(message).to receive(:text).once
143
- subject
144
- end
145
- end
146
-
147
- describe '#mail_from' do
148
- subject { email_object.mail_from }
149
- it do
150
- expect(message).to receive(:mail_from).once
151
- subject
152
- end
153
- end
154
-
155
- describe '#recipients' do
156
- subject { email_object.recipients }
157
- it do
158
- expect(message).to receive(:recipients).once
159
- subject
160
- end
161
- end
162
-
163
- describe '#received_time' do
164
- subject { email_object.received_time }
165
- it do
166
- expect(message).to receive(:received_time).once
167
- subject
168
- end
169
- end
170
-
171
- describe '#sender_email' do
172
- subject { email_object.sender_email }
173
- it do
174
- expect(message).to receive(:sender_email).once
175
- subject
176
- end
177
- end
178
-
179
- describe '#mime_part' do
180
- subject { email_object.mime_part }
181
- it do
182
- expect(message).to receive(:mime_part).once
183
- subject
184
- end
185
- end
186
- end
@@ -1,40 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer'
3
-
4
- RSpec.describe 'Howitzer' do
5
- describe 'SexySettings configuration' do
6
- subject { SexySettings.configuration }
7
- it { expect(subject.path_to_custom_settings).to include('config/custom.yml') }
8
- it { expect(subject.path_to_default_settings).to include('config/default.yml') }
9
- end
10
- describe '.app_uri' do
11
- before do
12
- allow(Howitzer).to receive(:app_base_auth_login) { app_base_auth_login_setting }
13
- allow(Howitzer).to receive(:app_base_auth_pass) { app_base_auth_pass_setting }
14
- allow(Howitzer).to receive(:app_protocol) { app_protocol_setting }
15
- allow(Howitzer).to receive(:app_host) { app_host_setting }
16
- end
17
- let(:app_protocol_setting) { nil }
18
- let(:app_host_setting) { 'redmine.strongqa.com' }
19
- context 'when login and password present' do
20
- let(:app_base_auth_login_setting) { 'alex' }
21
- let(:app_base_auth_pass_setting) { 'pa$$w0rd' }
22
- it { expect(Howitzer.app_uri.site).to eq('http://alex:pa$$w0rd@redmine.strongqa.com') }
23
- it { expect(Howitzer.app_uri.origin).to eq('http://redmine.strongqa.com') }
24
- end
25
- context 'when login and password blank' do
26
- let(:app_base_auth_login_setting) { nil }
27
- let(:app_base_auth_pass_setting) { nil }
28
- it { expect(Howitzer.app_uri.site).to eq('http://redmine.strongqa.com') }
29
- end
30
- end
31
- describe '.mailgun_idle_timeout' do
32
- subject { Howitzer.mailgun_idle_timeout }
33
- before do
34
- expect_any_instance_of(Object).to receive(:puts).with(
35
- "WARNING! 'mailgun_idle_timeout' setting is deprecated. Please replace with 'mail_wait_time' setting."
36
- )
37
- end
38
- it { is_expected.to be_nil }
39
- end
40
- end
@@ -1,2 +0,0 @@
1
- require 'spec_helper'
2
- require 'capybara/dsl'
@@ -1,122 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer/log'
3
- include Howitzer::LoggerHelper
4
-
5
- RSpec.describe Howitzer::Log do
6
- context '.instance' do
7
- subject { described_class.instance }
8
- let(:other_log) { described_class.instance }
9
- it { is_expected.to be_a_kind_of(described_class) }
10
- it { is_expected.to equal(other_log) }
11
- end
12
-
13
- context '.debug' do
14
- it do
15
- expect(described_class.instance).to receive(:debug).with('Foo')
16
- described_class.debug('Foo')
17
- end
18
- end
19
-
20
- context '.info' do
21
- it do
22
- expect(described_class.instance).to receive(:info).with('Foo')
23
- described_class.info('Foo')
24
- end
25
- end
26
-
27
- context '.warn' do
28
- it do
29
- expect(described_class.instance).to receive(:warn).with('Foo')
30
- described_class.warn('Foo')
31
- end
32
- end
33
-
34
- context '.fatal' do
35
- it do
36
- expect(described_class.instance).to receive(:fatal).with('Foo')
37
- described_class.fatal('Foo')
38
- end
39
- end
40
-
41
- context '.error' do
42
- it do
43
- expect(described_class.instance).to receive(:error).with('Foo')
44
- described_class.error('Foo')
45
- end
46
- end
47
-
48
- context '.print_feature_name' do
49
- it do
50
- expect(described_class.instance).to receive(:print_feature_name).with('Foo')
51
- described_class.print_feature_name('Foo')
52
- end
53
- end
54
-
55
- context '.settings_as_formatted_text' do
56
- it do
57
- expect(described_class.instance).to receive(:settings_as_formatted_text).with(no_args)
58
- described_class.settings_as_formatted_text
59
- end
60
- end
61
-
62
- context '.print_scenario_name' do
63
- it do
64
- expect(described_class.instance).to receive(:print_scenario_name).with('Foo')
65
- described_class.print_scenario_name('Foo')
66
- end
67
- end
68
-
69
- describe '#debug' do
70
- it do
71
- expect(described_class.instance.instance_variable_get(:@logger)).to receive(:debug).with(:foo)
72
- described_class.instance.debug :foo
73
- end
74
- end
75
- describe '#info' do
76
- it do
77
- expect(described_class.instance.instance_variable_get(:@logger)).to receive(:info).with(:foo)
78
- described_class.instance.info :foo
79
- end
80
- end
81
- describe '#warn' do
82
- it do
83
- expect(described_class.instance.instance_variable_get(:@logger)).to receive(:warn).with(:foo)
84
- described_class.instance.warn :foo
85
- end
86
- end
87
- describe '#fatal' do
88
- it do
89
- expect(described_class.instance.instance_variable_get(:@logger)).to receive(:fatal).with(:foo)
90
- described_class.instance.fatal :foo
91
- end
92
- end
93
-
94
- describe '#error' do
95
- it do
96
- expect(described_class.instance.instance_variable_get(:@logger)).to receive(:error).with(:foo)
97
- described_class.instance.error :foo
98
- end
99
- end
100
-
101
- describe '#print_feature_name' do
102
- it do
103
- expect(described_class.instance).to receive(:log_without_formatting) { |&arg| arg.call }
104
- expect(described_class.instance).to receive(:info).with('*** Feature: FOO ***')
105
- described_class.instance.print_feature_name('Foo')
106
- end
107
- end
108
- describe '#settings_as_formatted_text' do
109
- it do
110
- expect(described_class.instance).to receive(:log_without_formatting) { |&arg| arg.call }
111
- expect(described_class.instance).to receive(:info).with(SexySettings::Base.instance.as_formatted_text)
112
- described_class.instance.settings_as_formatted_text
113
- end
114
- end
115
- describe '#print_scenario_name' do
116
- it do
117
- expect(described_class.instance).to receive(:log_without_formatting) { |&arg| arg.call }
118
- expect(described_class.instance).to receive(:info).with(' => Scenario: Foo')
119
- described_class.instance.print_scenario_name('Foo')
120
- end
121
- end
122
- end
@@ -1,62 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer/email'
3
- require 'howitzer/mail_adapters/abstract'
4
-
5
- RSpec.describe Howitzer::MailAdapters::Abstract do
6
- let(:recipient) { 'first_tester@gmail.com' }
7
- let(:message_subject) { 'test subject' }
8
- let(:message) { double(:message) }
9
- let(:abstract_adapter) { described_class.new(message) }
10
- let(:email_object) { Howitzer::Email.adapter.new(message) }
11
-
12
- describe '.find' do
13
- subject { described_class.find(recipient, message_subject, _wait: 10) }
14
- it { expect { subject }.to raise_error(NotImplementedError) }
15
- end
16
-
17
- describe '#new' do
18
- context 'when Email instance receive message and add create @message variable that' do
19
- it { expect(email_object.instance_variable_get(:@message)).to eql message }
20
- end
21
- end
22
-
23
- describe '#plain_text_body' do
24
- subject { abstract_adapter.plain_text_body }
25
- it { expect { subject }.to raise_error(NotImplementedError) }
26
- end
27
-
28
- describe '#html_body' do
29
- subject { abstract_adapter.html_body }
30
- it { expect { subject }.to raise_error(NotImplementedError) }
31
- end
32
-
33
- describe '#text' do
34
- subject { abstract_adapter.text }
35
- it { expect { subject }.to raise_error(NotImplementedError) }
36
- end
37
-
38
- describe '#mail_from' do
39
- subject { abstract_adapter.mail_from }
40
- it { expect { subject }.to raise_error(NotImplementedError) }
41
- end
42
-
43
- describe '#recipients' do
44
- subject { abstract_adapter.recipients }
45
- it { expect { subject }.to raise_error(NotImplementedError) }
46
- end
47
-
48
- describe '#received_time' do
49
- subject { abstract_adapter.received_time }
50
- it { expect { subject }.to raise_error(NotImplementedError) }
51
- end
52
-
53
- describe '#sender_email' do
54
- subject { abstract_adapter.sender_email }
55
- it { expect { subject }.to raise_error(NotImplementedError) }
56
- end
57
-
58
- describe '#mime_part' do
59
- subject { abstract_adapter.mime_part }
60
- it { expect { subject }.to raise_error(NotImplementedError) }
61
- end
62
- end
@@ -1,163 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer/email'
3
- require 'howitzer/log'
4
- require 'howitzer/exceptions'
5
- require 'howitzer/mailgun_api/connector'
6
-
7
- RSpec.describe 'Mailgun Email Adapter' do
8
- let(:recipient) { 'first_tester@gmail.com' }
9
- let(:message) do
10
- {
11
- 'body-plain' => 'test body footer',
12
- 'stripped-html' => '<p> test body </p> <p> footer </p>',
13
- 'stripped-text' => 'test body',
14
- 'From' => 'Strong Tester <tester@gmail.com>',
15
- 'To' => recipient,
16
- 'Received' => 'by 10.216.46.75 with HTTP; Sat, 5 Apr 2014 05:10:42 -0700 (PDT)',
17
- 'sender' => 'tester@gmail.com',
18
- 'attachments' => []
19
- }
20
- end
21
- let(:message_subject) { 'test subject' }
22
- let(:mail_address) { double }
23
- let(:email_object) { Howitzer::Email.adapter.new(message) }
24
-
25
- before do
26
- stub_const('Howitzer::Email::SUBJECT', message_subject)
27
- end
28
-
29
- describe '.find' do
30
- let(:mailgun_message) { double(to_h: message) }
31
- let(:events) { double(to_h: { 'items' => [event] }) }
32
- subject { Howitzer::MailAdapters::Mailgun.find(recipient, message_subject, wait: 0.01) }
33
-
34
- context 'when message is found' do
35
- let(:event) do
36
- {
37
- 'message' => {
38
- 'recipients' => [recipient],
39
- 'headers' => {
40
- 'subject' => message_subject
41
- }
42
- },
43
- 'storage' => {
44
- 'key' => '1234567890',
45
- 'url' => 'https://si.api.mailgun.net/v3/domains/mg.strongqa.com/messages/1234567890'
46
- }
47
- }
48
- end
49
- before do
50
- allow(Howitzer::MailgunApi::Connector.instance.client).to receive(:get).with(
51
- 'mailgun@test.domain/events',
52
- params: { event: 'stored' }
53
- ) { events }
54
- allow(Howitzer::MailgunApi::Connector.instance.client).to receive(:get_url).with(
55
- 'https://si.api.mailgun.net/v3/domains/mg.strongqa.com/messages/1234567890'
56
- ) { mailgun_message }
57
- end
58
- it do
59
- expect(Howitzer::Email.adapter).to receive(:new).with(message).once
60
- subject
61
- end
62
- end
63
-
64
- context 'when message is not found' do
65
- let(:event) do
66
- {
67
- 'message' => {
68
- 'recipients' => ['other@test.com'],
69
- 'headers' => {
70
- 'subject' => message_subject
71
- }
72
- },
73
- 'storage' => {
74
- 'key' => '1234567890',
75
- 'url' => 'https://si.api.mailgun.net/v3/domains/mg.strongqa.com/messages/1234567890'
76
- }
77
- }
78
- end
79
- before do
80
- allow(Howitzer::MailgunApi::Connector.instance.client).to receive(:get).with(
81
- 'mailgun@test.domain/events',
82
- params: { event: 'stored' }
83
- ) { events }
84
- end
85
- it do
86
- expect { subject }.to raise_error(
87
- Howitzer::EmailNotFoundError,
88
- "Message with subject '#{message_subject}' for recipient '#{recipient}' was not found."
89
- )
90
- end
91
- end
92
- end
93
-
94
- describe '#plain_text_body' do
95
- it { expect(email_object.plain_text_body).to eql message['body-plain'] }
96
- end
97
-
98
- describe '#html_body' do
99
- it { expect(email_object.html_body).to eql message['stripped-html'] }
100
- end
101
-
102
- describe '#text' do
103
- it { expect(email_object.text).to eql message['stripped-text'] }
104
- end
105
-
106
- describe '#mail_from' do
107
- it { expect(email_object.mail_from).to eql message['From'] }
108
- end
109
-
110
- describe '#recipients' do
111
- subject { email_object.recipients }
112
- it { is_expected.to be_a_kind_of Array }
113
-
114
- context 'when one recipient' do
115
- it { is_expected.to include message['To'] }
116
- end
117
-
118
- context 'when more than one recipient' do
119
- let(:second_recipient) { 'second_tester@gmail.com' }
120
- let(:message_with_multiple_recipients) { message.merge('To' => "#{recipient}, #{second_recipient}") }
121
- let(:email_object) { Howitzer::Email.adapter.new(message_with_multiple_recipients) }
122
- it { is_expected.to eql [recipient, second_recipient] }
123
- end
124
- end
125
-
126
- describe '#received_time' do
127
- it { expect(email_object.received_time).to eql message['Received'][27..63] }
128
- end
129
-
130
- describe '#sender_email' do
131
- it { expect(email_object.sender_email).to eql message['sender'] }
132
- end
133
-
134
- describe '#mime_part' do
135
- subject { email_object.mime_part }
136
-
137
- context 'when has attachments' do
138
- let(:files) { [double] }
139
- before { email_object.instance_variable_set(:@message, 'attachments' => files) }
140
- it { is_expected.to eq(files) }
141
- end
142
-
143
- context 'when no attachments' do
144
- it { is_expected.to eq([]) }
145
- end
146
- end
147
-
148
- describe '#mime_part!' do
149
- subject { email_object.mime_part! }
150
-
151
- context 'when has attachments' do
152
- let(:files) { [double] }
153
- before { email_object.instance_variable_set(:@message, 'attachments' => files) }
154
- it { is_expected.to eq(files) }
155
- end
156
-
157
- context 'when no attachments' do
158
- it do
159
- expect { subject }.to raise_error(Howitzer::NoAttachmentsError, 'No attachments where found.')
160
- end
161
- end
162
- end
163
- end
@@ -1,58 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer/mailgun_api/client'
3
-
4
- RSpec.describe Howitzer::MailgunApi::Client do
5
- let(:mg_obj) { described_class.new(api_key: 'Fake-API-Key') }
6
- describe '.new' do
7
- subject { mg_obj }
8
- it { expect { subject }.not_to raise_error }
9
- end
10
-
11
- describe '#get' do
12
- let(:query_string) { { 'skip' => '10', 'limit' => '5' } }
13
- subject { mg_obj.get('test.com/bounces', params: query_string) }
14
- context 'when simulation of client' do
15
- before do
16
- expect(RestClient::Resource).to receive(:new)
17
- .once.and_return(Howitzer::MailgunApi::UnitClient.new('Fake-API-Key', 'api.mailgun.net', 'v2'))
18
- end
19
- it do
20
- expect(subject.body).to include('total_count')
21
- expect(subject.body).to include('items')
22
- end
23
- end
24
- context 'when real client' do
25
- let(:resource) { double }
26
- before do
27
- allow(resource).to receive('[]').and_return(resource)
28
- allow(resource).to receive(:get).and_raise(StandardError, '401 Unauthorized: Forbidden')
29
- allow(RestClient::Resource).to receive(:new).and_return(resource)
30
- end
31
- it do
32
- expect { subject }.to raise_error(Howitzer::CommunicationError, '401 Unauthorized: Forbidden')
33
- end
34
- end
35
- end
36
-
37
- describe '#get_url' do
38
- let(:response_raw) { double }
39
- subject { mg_obj.get_url('https://ci.api.mailgan.com/domains/test_domain/messages/asdfasdf') }
40
- context 'when success request' do
41
- let(:response_raw) { double }
42
- let(:response_real) { double }
43
- before do
44
- allow(RestClient::Request).to receive(:execute).with(any_args).and_return(response_raw)
45
- allow(Howitzer::MailgunApi::Response).to receive(:new).with(response_raw).and_return(response_real)
46
- end
47
- it { is_expected.to eq(response_real) }
48
- end
49
- context 'when error happens' do
50
- before do
51
- allow(RestClient::Resource).to receive(:new).with(any_args).and_return(response_raw)
52
- mg_obj
53
- allow(RestClient::Request).to receive(:execute).with(any_args).and_raise(StandardError, 'Some message')
54
- end
55
- it { expect { subject }.to raise_error(Howitzer::CommunicationError, 'Some message') }
56
- end
57
- end
58
- end
@@ -1,54 +0,0 @@
1
- require 'spec_helper'
2
- require 'howitzer/mailgun_api/connector'
3
-
4
- RSpec.describe Howitzer::MailgunApi::Connector do
5
- let(:connector) { described_class.instance }
6
- let(:domain_name) { 'test@domain.com' }
7
- describe '#client' do
8
- subject { connector.client }
9
- context 'when api_key is default' do
10
- context 'when client is not initialized' do
11
- it { is_expected.to be_an_instance_of Howitzer::MailgunApi::Client }
12
- end
13
- context 'when client is already initialized' do
14
- it do
15
- object_id = connector.client.object_id
16
- expect(subject.object_id).to eq(object_id)
17
- end
18
- end
19
- end
20
- context 'when api_key is custom' do
21
- let(:key) { 'some api key' }
22
- subject { connector.client(key) }
23
- it { is_expected.to be_an_instance_of Howitzer::MailgunApi::Client }
24
- end
25
- context 'when api_key is nil' do
26
- let(:key) { nil }
27
- subject { connector.client(key) }
28
- it do
29
- expect { subject }.to raise_error(Howitzer::InvalidApiKeyError, 'Api key can not be blank')
30
- end
31
- end
32
- context 'when api_key is blank string' do
33
- let(:key) { '' }
34
- subject { connector.client(key) }
35
- it do
36
- expect { subject }.to raise_error(Howitzer::InvalidApiKeyError, 'Api key can not be blank')
37
- end
38
- end
39
- end
40
- describe '#domain' do
41
- subject { connector.domain }
42
- context 'when default domain' do
43
- it do
44
- is_expected.to eq(Howitzer.mailgun_domain)
45
- end
46
- end
47
- context 'when domain is already set' do
48
- before do
49
- connector.domain = domain_name
50
- end
51
- it { is_expected.to eql(domain_name) }
52
- end
53
- end
54
- end