spreewald 4.1.0 → 4.2.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 +4 -4
- data/.github/workflows/test.yml +3 -6
- data/.ruby-version +1 -1
- data/CHANGELOG.md +27 -0
- data/Gemfile.lock +1 -1
- data/{Gemfile.ruby245 → Gemfile.ruby300} +2 -0
- data/Gemfile.ruby300.lock +108 -0
- data/README.md +1 -1
- data/Rakefile +3 -11
- data/lib/spreewald/browser_tab_steps.rb +1 -1
- data/lib/spreewald/development_steps.rb +5 -5
- data/lib/spreewald/email_steps.rb +4 -18
- data/lib/spreewald_support/version.rb +1 -1
- data/lib/steps/follow_the_link.rb +63 -0
- data/lib/steps/show_me_the_mails.rb +20 -0
- data/spec/steps/follow_the_link_spec.rb +81 -0
- data/spec/steps/show_me_the_mails_spec.rb +96 -0
- data/tests/rails-6_capybara-3/.ruby-version +1 -1
- data/tests/rails-6_capybara-3/Gemfile +4 -2
- data/tests/rails-6_capybara-3/Gemfile.lock +176 -142
- data/tests/rails-6_capybara-3/config.ru +1 -0
- data/tests/rails-6_capybara-3/config/cucumber.yml +1 -1
- data/tests/rails-6_capybara-3/config/environments/development.rb +21 -3
- data/tests/rails-6_capybara-3/config/environments/test.rb +12 -1
- data/tests/rails-6_capybara-3/config/initializers/backtrace_silencers.rb +4 -3
- data/tests/rails-6_capybara-3/config/initializers/filter_parameter_logging.rb +3 -1
- data/tests/rails-6_capybara-3/config/initializers/new_framework_defaults_6_1.rb +67 -0
- data/tests/rails-6_capybara-3/config/initializers/permissions_policy.rb +11 -0
- data/tests/shared/features/shared/iframe_steps.feature +1 -2
- metadata +13 -111
- data/Gemfile.ruby245.lock +0 -73
- data/tests/rails-4_capybara-2/Gemfile +0 -24
- data/tests/rails-4_capybara-2/Gemfile.lock +0 -230
- data/tests/rails-4_capybara-2/README.rdoc +0 -28
- data/tests/rails-4_capybara-2/Rakefile +0 -6
- data/tests/rails-4_capybara-2/app +0 -1
- data/tests/rails-4_capybara-2/bin/bundle +0 -3
- data/tests/rails-4_capybara-2/bin/rails +0 -4
- data/tests/rails-4_capybara-2/bin/rake +0 -4
- data/tests/rails-4_capybara-2/bin/setup +0 -29
- data/tests/rails-4_capybara-2/config.ru +0 -4
- data/tests/rails-4_capybara-2/config/application.rb +0 -35
- data/tests/rails-4_capybara-2/config/boot.rb +0 -3
- data/tests/rails-4_capybara-2/config/cucumber.yml +0 -8
- data/tests/rails-4_capybara-2/config/database.yml +0 -18
- data/tests/rails-4_capybara-2/config/environment.rb +0 -5
- data/tests/rails-4_capybara-2/config/environments/development.rb +0 -28
- data/tests/rails-4_capybara-2/config/environments/test.rb +0 -42
- data/tests/rails-4_capybara-2/config/initializers/backtrace_silencers.rb +0 -7
- data/tests/rails-4_capybara-2/config/initializers/cookies_serializer.rb +0 -3
- data/tests/rails-4_capybara-2/config/initializers/filter_parameter_logging.rb +0 -4
- data/tests/rails-4_capybara-2/config/initializers/inflections.rb +0 -16
- data/tests/rails-4_capybara-2/config/initializers/mime_types.rb +0 -4
- data/tests/rails-4_capybara-2/config/initializers/session_store.rb +0 -3
- data/tests/rails-4_capybara-2/config/initializers/silence_deprecation_warnings.rb +0 -11
- data/tests/rails-4_capybara-2/config/initializers/to_time_preserves_timezone.rb +0 -10
- data/tests/rails-4_capybara-2/config/initializers/wrap_parameters.rb +0 -14
- data/tests/rails-4_capybara-2/config/locales/en.yml +0 -23
- data/tests/rails-4_capybara-2/config/routes.rb +0 -1
- data/tests/rails-4_capybara-2/config/secrets.yml +0 -22
- data/tests/rails-4_capybara-2/db +0 -1
- data/tests/rails-4_capybara-2/features/browser_tab_steps.feature +0 -1
- data/tests/rails-4_capybara-2/features/development_steps.feature +0 -1
- data/tests/rails-4_capybara-2/features/email_steps.feature +0 -1
- data/tests/rails-4_capybara-2/features/iframe_steps.feature +0 -1
- data/tests/rails-4_capybara-2/features/overriding.feature +0 -1
- data/tests/rails-4_capybara-2/features/session_steps.feature +0 -1
- data/tests/rails-4_capybara-2/features/step_definitions/overriding_steps.rb +0 -1
- data/tests/rails-4_capybara-2/features/step_definitions/test_steps.rb +0 -1
- data/tests/rails-4_capybara-2/features/support/env.rb +0 -66
- data/tests/rails-4_capybara-2/features/support/paths.rb +0 -1
- data/tests/rails-4_capybara-2/features/support/selectors.rb +0 -1
- data/tests/rails-4_capybara-2/features/support/selenium.rb +0 -1
- data/tests/rails-4_capybara-2/features/table_steps.feature +0 -1
- data/tests/rails-4_capybara-2/features/time_steps.feature +0 -1
- data/tests/rails-4_capybara-2/features/web_steps.feature +0 -1
- data/tests/rails-4_capybara-2/lib/tasks/cucumber.rake +0 -65
- data/tests/rails-4_capybara-2/log/.keep +0 -0
- data/tests/rails-4_capybara-2/public/404.html +0 -67
- data/tests/rails-4_capybara-2/public/422.html +0 -67
- data/tests/rails-4_capybara-2/public/500.html +0 -66
- data/tests/rails-4_capybara-2/public/favicon.ico +0 -0
- data/tests/rails-4_capybara-2/public/fixture_files +0 -1
- data/tests/rails-4_capybara-2/script/cucumber +0 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9d3a85d0ee7a8a0ebd403ef168a1788a21ce14dd3b3966aa431b1d0481f25e05
|
|
4
|
+
data.tar.gz: f68eb3cecf0e1792fada9ec58a664f6d8652fb700ebd07cee9a9789c260690a4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8276a0f55cfbdab771e028d05117291ce3cff8ad082e66a8a6828805392ae7e36c26240033fa6f9e37e1de25f2c6c9ff6f5a3a6c7f8b4b16210a1287819a5cf8
|
|
7
|
+
data.tar.gz: 35d84f7231336eb6edf2e44c91d128b6ebb38a2f7c0119906c0df9f29f94f41d5f2b5ba51532156fd465533adfa8fbc061ce824d9f90b433a0c20ee50fc76d01
|
data/.github/workflows/test.yml
CHANGED
|
@@ -14,16 +14,13 @@ jobs:
|
|
|
14
14
|
fail-fast: false
|
|
15
15
|
matrix:
|
|
16
16
|
include:
|
|
17
|
-
|
|
18
|
-
- ruby: 2.4.5
|
|
19
|
-
gemfile: tests/rails-4_capybara-2/Gemfile
|
|
20
|
-
- ruby: 2.6.6
|
|
17
|
+
- ruby: 3.0.0
|
|
21
18
|
gemfile: tests/rails-6_capybara-3/Gemfile
|
|
22
19
|
# Used to run rspec and integration tests for spreewald binary:
|
|
23
|
-
- ruby: 2.4.5
|
|
24
|
-
gemfile: Gemfile.ruby245
|
|
25
20
|
- ruby: 2.6.6
|
|
26
21
|
gemfile: Gemfile.ruby266
|
|
22
|
+
- ruby: 3.0.0
|
|
23
|
+
gemfile: Gemfile.ruby300
|
|
27
24
|
env:
|
|
28
25
|
BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
|
|
29
26
|
steps:
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
3.0.0
|
data/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,33 @@ All notable changes to this project will be documented in this file.
|
|
|
3
3
|
|
|
4
4
|
This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
5
5
|
|
|
6
|
+
## 4.2.2
|
|
7
|
+
- Fixes the "Show me the email" step (#171)
|
|
8
|
+
- Fixes the "I follow the link in the email" step. (#172, #173)
|
|
9
|
+
- It works for emails with and without explicit html parts
|
|
10
|
+
- There's a better error message if no links are found
|
|
11
|
+
|
|
12
|
+
## 4.1.2
|
|
13
|
+
- Multiple invocations of console don't raise anymore
|
|
14
|
+
|
|
15
|
+
## 4.1.1
|
|
16
|
+
- The step `I open .. in a new browser tab` is now using the `noopener` option (see issue [#174])
|
|
17
|
+
|
|
18
|
+
## 4.1.0
|
|
19
|
+
|
|
20
|
+
- New steps:
|
|
21
|
+
- When ... inside the ... iframe
|
|
22
|
+
|
|
23
|
+
- New steps only available for Capybara 3+:
|
|
24
|
+
- When I switch to the ... iframe
|
|
25
|
+
- When I switch back to the whole page
|
|
26
|
+
- The I switch back to the whole page step does not work reliably with Capybara 2 and lead to StaleReferenceErrors, therefore we decided to not make these steps available for Capybara 2.
|
|
27
|
+
|
|
28
|
+
- Small improvements:
|
|
29
|
+
- Trying to match against unsupported email headers will raise an error. Supported headers are "To", "CC", "BCC", "From", "Reply-To", "Subject", "Attachments"
|
|
30
|
+
- It's now possible to have indented header lines in email steps.
|
|
31
|
+
- If there's not an explicit text part in a mail, Spreewald determines if the email body is HTML or plaintext and converts it to plaintext accordingly.
|
|
32
|
+
|
|
6
33
|
## 4.0.0
|
|
7
34
|
|
|
8
35
|
- Dropped support for capybara 1, Ruby 2.1 and Rails 3.2.
|
data/Gemfile.lock
CHANGED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
GEM
|
|
2
|
+
remote: https://rubygems.org/
|
|
3
|
+
specs:
|
|
4
|
+
activesupport (6.1.3.1)
|
|
5
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
6
|
+
i18n (>= 1.6, < 2)
|
|
7
|
+
minitest (>= 5.1)
|
|
8
|
+
tzinfo (~> 2.0)
|
|
9
|
+
zeitwerk (~> 2.3)
|
|
10
|
+
aruba (1.0.4)
|
|
11
|
+
childprocess (>= 2.0, < 5.0)
|
|
12
|
+
contracts (~> 0.16.0)
|
|
13
|
+
cucumber (>= 2.4, < 6.0)
|
|
14
|
+
rspec-expectations (~> 3.4)
|
|
15
|
+
thor (~> 1.0)
|
|
16
|
+
builder (3.2.4)
|
|
17
|
+
childprocess (4.0.0)
|
|
18
|
+
concurrent-ruby (1.1.8)
|
|
19
|
+
contracts (0.16.0)
|
|
20
|
+
cucumber (5.3.0)
|
|
21
|
+
builder (~> 3.2, >= 3.2.4)
|
|
22
|
+
cucumber-core (~> 8.0, >= 8.0.1)
|
|
23
|
+
cucumber-create-meta (~> 2.0, >= 2.0.2)
|
|
24
|
+
cucumber-cucumber-expressions (~> 10.3, >= 10.3.0)
|
|
25
|
+
cucumber-gherkin (~> 15.0, >= 15.0.2)
|
|
26
|
+
cucumber-html-formatter (~> 9.0, >= 9.0.0)
|
|
27
|
+
cucumber-messages (~> 13.1, >= 13.1.0)
|
|
28
|
+
cucumber-wire (~> 4.0, >= 4.0.1)
|
|
29
|
+
diff-lcs (~> 1.4, >= 1.4.4)
|
|
30
|
+
multi_test (~> 0.1, >= 0.1.2)
|
|
31
|
+
sys-uname (~> 1.2, >= 1.2.1)
|
|
32
|
+
cucumber-core (8.0.1)
|
|
33
|
+
cucumber-gherkin (~> 15.0, >= 15.0.2)
|
|
34
|
+
cucumber-messages (~> 13.0, >= 13.0.1)
|
|
35
|
+
cucumber-tag-expressions (~> 2.0, >= 2.0.4)
|
|
36
|
+
cucumber-create-meta (2.0.4)
|
|
37
|
+
cucumber-messages (~> 13.1, >= 13.1.0)
|
|
38
|
+
sys-uname (~> 1.2, >= 1.2.1)
|
|
39
|
+
cucumber-cucumber-expressions (10.3.0)
|
|
40
|
+
cucumber-gherkin (15.0.2)
|
|
41
|
+
cucumber-messages (~> 13.0, >= 13.0.1)
|
|
42
|
+
cucumber-html-formatter (9.0.0)
|
|
43
|
+
cucumber-messages (~> 13.0, >= 13.0.1)
|
|
44
|
+
cucumber-messages (13.2.1)
|
|
45
|
+
protobuf-cucumber (~> 3.10, >= 3.10.8)
|
|
46
|
+
cucumber-tag-expressions (2.0.4)
|
|
47
|
+
cucumber-wire (4.0.1)
|
|
48
|
+
cucumber-core (~> 8.0, >= 8.0.1)
|
|
49
|
+
cucumber-cucumber-expressions (~> 10.3, >= 10.3.0)
|
|
50
|
+
cucumber-messages (~> 13.0, >= 13.0.1)
|
|
51
|
+
diff-lcs (1.4.4)
|
|
52
|
+
ffi (1.15.0)
|
|
53
|
+
gemika (0.5.0)
|
|
54
|
+
i18n (1.8.10)
|
|
55
|
+
concurrent-ruby (~> 1.0)
|
|
56
|
+
mail (2.7.1)
|
|
57
|
+
mini_mime (>= 0.1.1)
|
|
58
|
+
middleware (0.1.0)
|
|
59
|
+
mini_mime (1.0.3)
|
|
60
|
+
minitest (5.14.4)
|
|
61
|
+
multi_test (0.1.2)
|
|
62
|
+
nokogiri (1.11.2-x86_64-linux)
|
|
63
|
+
racc (~> 1.4)
|
|
64
|
+
protobuf-cucumber (3.10.8)
|
|
65
|
+
activesupport (>= 3.2)
|
|
66
|
+
middleware
|
|
67
|
+
thor
|
|
68
|
+
thread_safe
|
|
69
|
+
racc (1.5.2)
|
|
70
|
+
rake (13.0.3)
|
|
71
|
+
rspec (3.10.0)
|
|
72
|
+
rspec-core (~> 3.10.0)
|
|
73
|
+
rspec-expectations (~> 3.10.0)
|
|
74
|
+
rspec-mocks (~> 3.10.0)
|
|
75
|
+
rspec-core (3.10.1)
|
|
76
|
+
rspec-support (~> 3.10.0)
|
|
77
|
+
rspec-expectations (3.10.1)
|
|
78
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
79
|
+
rspec-support (~> 3.10.0)
|
|
80
|
+
rspec-mocks (3.10.2)
|
|
81
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
82
|
+
rspec-support (~> 3.10.0)
|
|
83
|
+
rspec-support (3.10.2)
|
|
84
|
+
sys-uname (1.2.2)
|
|
85
|
+
ffi (~> 1.1)
|
|
86
|
+
thor (1.1.0)
|
|
87
|
+
thread_safe (0.3.6)
|
|
88
|
+
tzinfo (2.0.4)
|
|
89
|
+
concurrent-ruby (~> 1.0)
|
|
90
|
+
zeitwerk (2.4.2)
|
|
91
|
+
|
|
92
|
+
PLATFORMS
|
|
93
|
+
x86_64-linux
|
|
94
|
+
|
|
95
|
+
DEPENDENCIES
|
|
96
|
+
aruba
|
|
97
|
+
cucumber
|
|
98
|
+
gemika
|
|
99
|
+
mail
|
|
100
|
+
nokogiri
|
|
101
|
+
rake
|
|
102
|
+
rspec
|
|
103
|
+
|
|
104
|
+
RUBY VERSION
|
|
105
|
+
ruby 3.0.0p0
|
|
106
|
+
|
|
107
|
+
BUNDLED WITH
|
|
108
|
+
2.2.3
|
data/README.md
CHANGED
|
@@ -21,7 +21,7 @@ Or install it yourself as:
|
|
|
21
21
|
|
|
22
22
|
## Supported versions
|
|
23
23
|
|
|
24
|
-
Spreewald is currently tested against
|
|
24
|
+
Spreewald is currently tested against and Ruby 2.6.6 with Rails 6 and Capybara 3.
|
|
25
25
|
|
|
26
26
|
## Usage
|
|
27
27
|
|
data/Rakefile
CHANGED
|
@@ -65,22 +65,14 @@ def run_tests(gemfile, ruby)
|
|
|
65
65
|
# Run specs and integration tests for Spreewald binary
|
|
66
66
|
[
|
|
67
67
|
system("BUNDLE_GEMFILE=#{gemfile} bundle exec rspec"),
|
|
68
|
-
system("BUNDLE_GEMFILE=#{gemfile} bundle exec cucumber"),
|
|
68
|
+
system("BUNDLE_GEMFILE=#{gemfile} bundle exec cucumber --publish-quiet"),
|
|
69
69
|
].all?
|
|
70
70
|
end
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
def cucumber_command(directory, ruby_version)
|
|
74
|
-
command = "cd #{directory} && BUNDLE_GEMFILE=Gemfile bundle exec cucumber"
|
|
75
|
-
|
|
76
|
-
# Modern cucumber sees pending tests as failures.
|
|
77
|
-
# We don't want this.
|
|
78
|
-
command << ' --no-strict-pending'
|
|
79
|
-
else
|
|
80
|
-
# Ruby < 2.5 means the capybara 2 Test project.
|
|
81
|
-
# Omit scenarios that only work with modern Capybara.
|
|
82
|
-
command << ' --tags "not @not-capybara-2"'
|
|
83
|
-
end
|
|
74
|
+
command = "cd #{directory} && BUNDLE_GEMFILE=Gemfile bundle exec cucumber --publish-quiet"
|
|
75
|
+
command << ' --no-strict-pending'
|
|
84
76
|
command
|
|
85
77
|
end
|
|
86
78
|
|
|
@@ -19,7 +19,7 @@ When /^I open (.+?) in a new browser tab$/ do |page_name|
|
|
|
19
19
|
previous_handles_count = browser.window_handles.size
|
|
20
20
|
relative_target_path = path_to(page_name)
|
|
21
21
|
|
|
22
|
-
page.execute_script "window.open('#{relative_target_path}', '_blank')"
|
|
22
|
+
page.execute_script "window.open('#{relative_target_path}', '_blank', 'noopener')"
|
|
23
23
|
step "there should be #{previous_handles_count + 1} browser tabs"
|
|
24
24
|
step "I switch to the new browser tab"
|
|
25
25
|
end.overridable
|
|
@@ -11,11 +11,6 @@ Then 'console' do
|
|
|
11
11
|
require 'irb'
|
|
12
12
|
ARGV.clear # IRB takes ARGV as its own arguments
|
|
13
13
|
|
|
14
|
-
# `source` is defined by Capybara as a shortcut to `page.source`. IRB tries to
|
|
15
|
-
# create an alias with the same name and fails with a warning. To avoid this,
|
|
16
|
-
# we remove the alias here.
|
|
17
|
-
undef :source
|
|
18
|
-
|
|
19
14
|
# We adapted the steps of IRB.run
|
|
20
15
|
# https://github.com/ruby/ruby/blob/c08f7b80889b531865e74bc5f573df8fa27f2088/lib/irb.rb#L418
|
|
21
16
|
# with injected workspace. See https://github.com/makandra/spreewald/issues/77 for reasons.
|
|
@@ -24,6 +19,11 @@ Then 'console' do
|
|
|
24
19
|
# "already initialized constant" warnings
|
|
25
20
|
unless IRB.conf[:LOAD_MODULES]
|
|
26
21
|
IRB.setup(nil)
|
|
22
|
+
|
|
23
|
+
# `source` is defined by Capybara as a shortcut to `page.source`. IRB tries to
|
|
24
|
+
# create an alias with the same name and fails with a warning. To avoid this,
|
|
25
|
+
# we remove the alias here.
|
|
26
|
+
undef :source
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
workspace = IRB::WorkSpace.new(binding)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# coding: UTF-8
|
|
2
2
|
|
|
3
3
|
require 'spreewald_support/mail_finder'
|
|
4
|
+
require 'steps/show_me_the_mails'
|
|
5
|
+
require 'steps/follow_the_link'
|
|
4
6
|
|
|
5
7
|
Before do
|
|
6
8
|
ActionMailer::Base.deliveries.clear
|
|
@@ -73,18 +75,7 @@ end.overridable
|
|
|
73
75
|
# Other links (such as mailto: or ftp:// links) are ignored.
|
|
74
76
|
When /^I follow the (first|second|third)? ?link in the e?mail$/ do |index_in_words|
|
|
75
77
|
mail = @mail || ActionMailer::Base.deliveries.last
|
|
76
|
-
|
|
77
|
-
url_pattern = %r((?:https?://[^/]+)([^"'\s]+))
|
|
78
|
-
|
|
79
|
-
paths = if mail.html_part
|
|
80
|
-
dom = Nokogiri::HTML(mail.html_part.body.to_s)
|
|
81
|
-
(dom / 'a[href]').map { |a| a['href'].match(url_pattern) }.compact.map { |match| match[1] }
|
|
82
|
-
else
|
|
83
|
-
mail_body = MailFinder.email_text_body(mail).to_s
|
|
84
|
-
mail_body.scan(url_pattern).flatten(1)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
visit paths[index]
|
|
78
|
+
Spreewald::Steps::FollowTheLink.new(mail, index_in_words).run
|
|
88
79
|
end.overridable
|
|
89
80
|
|
|
90
81
|
Then /^no e?mail should have been sent$/ do
|
|
@@ -98,12 +89,7 @@ end.overridable
|
|
|
98
89
|
|
|
99
90
|
# Print all sent emails to STDOUT (optionally only the headers).
|
|
100
91
|
Then /^show me the e?mail( header)?s$/ do |only_header|
|
|
101
|
-
|
|
102
|
-
puts MailFinder.show_mails(ActionMailer::Base.deliveries, only_header)
|
|
103
|
-
else
|
|
104
|
-
puts "No emails found" if ActionMailer::Base.deliveries.empty?
|
|
105
|
-
end
|
|
106
|
-
|
|
92
|
+
Spreewald::Steps::ShowMeTheMails.new(ActionMailer::Base.deliveries, only_header).run
|
|
107
93
|
end.overridable
|
|
108
94
|
|
|
109
95
|
# Print a subset of all sent emails to STDOUT
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Spreewald
|
|
2
|
+
module Steps
|
|
3
|
+
class FollowTheLink
|
|
4
|
+
class NoVisitableLinkFound < StandardError
|
|
5
|
+
def initialize(paths, index)
|
|
6
|
+
error_message = <<~MESSAGE
|
|
7
|
+
Could not follow the #{index} link in the email.
|
|
8
|
+
MESSAGE
|
|
9
|
+
if paths&.empty?
|
|
10
|
+
error_message << "Found no link paths in the email."
|
|
11
|
+
else
|
|
12
|
+
error_message << "Found these link paths in the email: #{paths.join(', ')}"
|
|
13
|
+
end
|
|
14
|
+
super(error_message)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
URL_PATTERN = %r((?:https?://[^/]+)([^"'\s]+))
|
|
19
|
+
|
|
20
|
+
def initialize(mail, index_in_words)
|
|
21
|
+
@mail = mail
|
|
22
|
+
@index_in_words = index_in_words
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def run
|
|
26
|
+
index = { nil => 0, 'first' => 0, 'second' => 1, 'third' => 2 }[@index_in_words]
|
|
27
|
+
|
|
28
|
+
paths = if @mail.html_part || body_text_html?
|
|
29
|
+
search_for_links_in_html
|
|
30
|
+
else
|
|
31
|
+
search_for_links_in_plaintext
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
if paths[index]
|
|
35
|
+
visit_path paths[index]
|
|
36
|
+
else
|
|
37
|
+
raise NoVisitableLinkFound.new(paths, @index_in_words) unless paths[index]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def visit_path(path)
|
|
44
|
+
Capybara.visit(path)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def body_text_html?
|
|
48
|
+
@mail.body.to_s.include? "<html>"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def search_for_links_in_html
|
|
52
|
+
body = @mail.html_part ? @mail.html_part.body : @mail.body
|
|
53
|
+
dom = Nokogiri::HTML(body.to_s)
|
|
54
|
+
(dom / 'a[href]').map { |a| a['href'].match(URL_PATTERN) }.compact.map { |match| match[1] }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def search_for_links_in_plaintext
|
|
58
|
+
mail_body = MailFinder.email_text_body(@mail).to_s
|
|
59
|
+
mail_body.scan(URL_PATTERN).flatten(1)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require 'spreewald_support/mail_finder'
|
|
2
|
+
|
|
3
|
+
module Spreewald
|
|
4
|
+
module Steps
|
|
5
|
+
class ShowMeTheMails
|
|
6
|
+
def initialize(mails, only_header = false)
|
|
7
|
+
@mails = mails
|
|
8
|
+
@only_header = only_header
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def run
|
|
12
|
+
if @mails.empty?
|
|
13
|
+
puts "No emails found"
|
|
14
|
+
else
|
|
15
|
+
puts MailFinder.show_mails(@mails, @only_header)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require "steps/follow_the_link"
|
|
2
|
+
|
|
3
|
+
describe Spreewald::Steps::FollowTheLink do
|
|
4
|
+
it "raises helpful error message if no link is found" do
|
|
5
|
+
mail_without_links = Mail.new do
|
|
6
|
+
html_part do
|
|
7
|
+
body "<html><body>no link</body></html>"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
text_part do
|
|
11
|
+
body "no link either"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
step = ->() { Spreewald::Steps::FollowTheLink.new(mail_without_links, "first").run }
|
|
16
|
+
expect(step).to raise_error Spreewald::Steps::FollowTheLink::NoVisitableLinkFound
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "finds links in multipart html email" do
|
|
20
|
+
mail = Mail.new do
|
|
21
|
+
html_part do
|
|
22
|
+
body "<html><body><a href='https://www.example.com/abc'>a link</a><a href='https://www.example.com/def'>second link</a></body></html>"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
text_part do
|
|
26
|
+
body "no link here"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
step = Spreewald::Steps::FollowTheLink.new(mail, "first")
|
|
31
|
+
expect(step).to receive(:visit_path).with("/abc")
|
|
32
|
+
step.run
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "finds the second link in a multipart html email" do
|
|
36
|
+
mail = Mail.new do
|
|
37
|
+
html_part do
|
|
38
|
+
body "<html><body><a href='https://www.example.com/abc'>a link</a><a href='https://www.example.com/def'>second link</a></body></html>"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
text_part do
|
|
42
|
+
body "no link here"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
step = Spreewald::Steps::FollowTheLink.new(mail, "second")
|
|
47
|
+
expect(step).to receive(:visit_path).with("/def")
|
|
48
|
+
step.run
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "finds links in html email" do
|
|
52
|
+
mail = Mail.new do
|
|
53
|
+
text_part do
|
|
54
|
+
body "my link: https://www.example.com/abc"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
step = Spreewald::Steps::FollowTheLink.new(mail, "first")
|
|
59
|
+
expect(step).to receive(:visit_path).with("/abc")
|
|
60
|
+
step.run
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "finds links in non multipart text emails" do
|
|
64
|
+
plaintext_email = Mail.new(body: 'a link: https://www.example.com/abc')
|
|
65
|
+
step = Spreewald::Steps::FollowTheLink.new(plaintext_email, "first")
|
|
66
|
+
|
|
67
|
+
expect(step).to receive(:visit_path).with("/abc")
|
|
68
|
+
step.run
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "finds links in non multipart html emails" do
|
|
72
|
+
html_mail = Mail.new(body: <<-HTML)
|
|
73
|
+
<html><body><a href="https://www.example.com/abc">this is a link!</a></body></html>
|
|
74
|
+
HTML
|
|
75
|
+
step = Spreewald::Steps::FollowTheLink.new(html_mail, "first")
|
|
76
|
+
|
|
77
|
+
expect(step).to receive(:visit_path).with("/abc")
|
|
78
|
+
step.run
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|