dkdeploy-cucumber 4.0.0

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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rubocop.yml +18 -0
  4. data/.travis.yml +15 -0
  5. data/CHANGELOG.md +12 -0
  6. data/CONTRIBUTORS.md +16 -0
  7. data/Gemfile +4 -0
  8. data/LICENSE +7 -0
  9. data/README.md +57 -0
  10. data/Rakefile +1 -0
  11. data/assets/dkdeploy-logo.png +0 -0
  12. data/config/cucumber.yml +4 -0
  13. data/dkdeploy-cucumber.gemspec +35 -0
  14. data/features/click.feature +52 -0
  15. data/features/content.feature +95 -0
  16. data/features/form.feature +136 -0
  17. data/features/htdocs/click.html +18 -0
  18. data/features/htdocs/click1.html +20 -0
  19. data/features/htdocs/click2.html +10 -0
  20. data/features/htdocs/content.html +17 -0
  21. data/features/htdocs/content.json +3 -0
  22. data/features/htdocs/form.html +26 -0
  23. data/features/htdocs/misc.html +13 -0
  24. data/features/htdocs/url.html +10 -0
  25. data/features/misc.feature +18 -0
  26. data/features/support/env.rb +35 -0
  27. data/features/url.feature +28 -0
  28. data/lib/dkdeploy/cucumber.rb +1 -0
  29. data/lib/dkdeploy/cucumber/step_definitions/click_steps.rb +39 -0
  30. data/lib/dkdeploy/cucumber/step_definitions/content_steps.rb +88 -0
  31. data/lib/dkdeploy/cucumber/step_definitions/form_steps.rb +146 -0
  32. data/lib/dkdeploy/cucumber/step_definitions/images.rb +11 -0
  33. data/lib/dkdeploy/cucumber/step_definitions/misc_steps.rb +105 -0
  34. data/lib/dkdeploy/cucumber/step_definitions/url_steps.rb +31 -0
  35. data/lib/dkdeploy/cucumber/steps.rb +2 -0
  36. data/lib/dkdeploy/cucumber/support.rb +3 -0
  37. data/lib/dkdeploy/cucumber/support/path.rb +13 -0
  38. data/lib/dkdeploy/cucumber/support/selectors.rb +15 -0
  39. data/lib/dkdeploy/cucumber/support/with.rb +9 -0
  40. data/lib/dkdeploy/cucumber/version.rb +15 -0
  41. metadata +257 -0
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="UTF-8">
5
+ <title>Empty html</title>
6
+ </head>
7
+ <body>
8
+ <p id="tochange"></p>
9
+ <p id="tochange2"></p>
10
+ <button id="b1" onclick="document.getElementById('tochange').textContent='changed'">click</button>
11
+ <div id="scope">
12
+ <button id="b2" onclick="document.getElementById('tochange2').textContent='changed2'">click</button>
13
+ </div>
14
+
15
+ <p id="tochange3"></p>
16
+ <p id="clickelement" onclick="document.getElementById('tochange3').textContent='changed3'">clickable</p>
17
+ </body>
18
+ </html>
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="UTF-8">
5
+ <title>Empty html</title>
6
+ </head>
7
+ <body>
8
+ <a href="click2.html" id="link">test</a>
9
+ <p>link1</p>
10
+
11
+ <ul>
12
+ <li>
13
+ <p>text</p>
14
+ </li>
15
+ <li>
16
+ <a href="click2.html">other</a>
17
+ </li>
18
+ </ul>
19
+ </body>
20
+ </html>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="UTF-8">
5
+ <title>Empty html</title>
6
+ </head>
7
+ <body>
8
+ <p>link2site</p>
9
+ </body>
10
+ </html>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="UTF-8">
5
+ <title>Empty html</title>
6
+ </head>
7
+ <body>
8
+ <p>something</p>
9
+ <p id="date">23.03.1718</p>
10
+ <p id="falsedate">234.93.1718</p>
11
+
12
+ <p id="p1"></p>
13
+ <p id="p2" style="display:none"></p>
14
+ <p id="p3">before</p>
15
+ <p id="hover" onmouseover="document.getElementById('p3').textContent='after'">hover</p>
16
+ </body>
17
+ </html>
@@ -0,0 +1,3 @@
1
+ {
2
+ "test": 1
3
+ }
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="UTF-8">
5
+ <title>Empty html</title>
6
+ </head>
7
+ <body>
8
+ <form id="f1" action="form.html" method="GET">
9
+ <input id="developer" type="text" name="developer" value="Timo"/>
10
+ <input id="manager" type="text" name="manager" value="Alex"/>
11
+ <select name="selection">
12
+ <option value="value1">Value 1</option>
13
+ <option value="value2" selected>Value 2</option>
14
+ <option value="value3">Value 3</option>
15
+ </select>
16
+ <input type="checkbox" name="validation" value="validation"/>
17
+
18
+ <input id="radio1" type="radio" name="group" value="radio1"/>
19
+ <input id="radio2" type="radio" name="group" value="radio2"/>
20
+
21
+ <input id="file1" type="file" name="file1" value=""/>
22
+
23
+ <input id="blurer" type="text" onblur="this.value='after'" value="before"/>
24
+ </form>
25
+ </body>
26
+ </html>
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="UTF-8">
5
+ <title>Empty html</title>
6
+ </head>
7
+ <body>
8
+ <p id="p1">before</p>
9
+ <button id="b1" onclick="setTimeout(function(){document.getElementById('p1').textContent = 'after';},3000)">Try it</button>
10
+ <p id="p2">before</p>
11
+ <button id="b2" onclick="setTimeout(function(){document.getElementById('p2').textContent = 'after';},5000)">Try it</button>
12
+ </body>
13
+ </html>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="UTF-8">
5
+ <title>Empty html</title>
6
+ </head>
7
+ <body>
8
+
9
+ </body>
10
+ </html>
@@ -0,0 +1,18 @@
1
+ Feature: Content Checks
2
+ Background:
3
+ Given I am on "misc.html"
4
+
5
+ Scenario: timer
6
+ Then I should see "before" within "#p1"
7
+ Then I press "b1"
8
+ Then I wait for 1 second
9
+ Then I should see "before" within "#p1"
10
+ Then I wait for 3 second
11
+ Then I should see "after" within "#p1"
12
+
13
+ @should_fail
14
+ Scenario: timer fail
15
+ Then I should see "before" within "#p2"
16
+ Then I press "b2"
17
+ Then I wait for 1 second
18
+ Then I should see "after" within "#p2"
@@ -0,0 +1,35 @@
1
+ # Capybara configuration (using phantomjs)
2
+
3
+ require 'capybara/cucumber'
4
+ require 'phantomjs'
5
+ require 'capybara/poltergeist'
6
+ require 'rspec/expectations'
7
+
8
+ require 'dkdeploy/cucumber/steps'
9
+ require 'dkdeploy/cucumber/support'
10
+
11
+ Capybara.register_driver :poltergeist do |app|
12
+ Capybara::Poltergeist::Driver.new(app, phantomjs: Phantomjs.path)
13
+ end
14
+ Capybara.default_driver = :poltergeist
15
+ Capybara.javascript_driver = :poltergeist
16
+ Capybara.default_selector = :css
17
+
18
+ Capybara.app = Rack::Directory.new File.expand_path('../../htdocs', __FILE__)
19
+
20
+ # register Capybara
21
+ World(Capybara)
22
+
23
+ # Workaround for Poltergeist
24
+ #
25
+ # needs to be deleted when headless browser engine is switched out
26
+ #
27
+ # Workaround for a bug, in newer poltergeist versions
28
+ # see https://github.com/teampoltergeist/poltergeist/issues/754
29
+ # Page object (capybara session) is fine except for status_code always returning nil when we have multiple
30
+ # successful page loads in one cucumber run
31
+ # Return value of page.visit is always {"state":'success'}
32
+ # Although it has been observed that the status_code is returned properly on a 404 error, this work-around is just to be sure
33
+ Before do
34
+ page.driver.clear_memory_cache
35
+ end
@@ -0,0 +1,28 @@
1
+ Feature: URLs
2
+
3
+ Scenario: I am on existing page
4
+ Given I am on "url.html"
5
+ Then I should be on "/url.html"
6
+
7
+ @should_fail
8
+ Scenario: I should be on fail
9
+ Given I am on "url.html"
10
+ Then I should be on "/url2.html"
11
+
12
+ @should_fail
13
+ Scenario: I am on fail
14
+ Given I am on "not_exists.html"
15
+
16
+ Scenario: Query String
17
+ Given I am on "url.html?test=abbrev&again=abnormally"
18
+ Then I should be on "/url.html"
19
+ Then I should have the following query string:
20
+ | test | abbrev |
21
+ | again | abnormally |
22
+
23
+ @should_fail
24
+ Scenario: Query String fail
25
+ Given I am on "url.html?test=abbrev&again=abnormally"
26
+ Then I should have the following query string:
27
+ | test | abbrev3 |
28
+ | again | abnormally3 |
@@ -0,0 +1 @@
1
+ require 'dkdeploy/cucumber/version'
@@ -0,0 +1,39 @@
1
+ # Click button.
2
+ #
3
+ # @yieldparam button [String] Name of button. Relative to selector.
4
+ # @yieldparam selector [String] Define scope per css selector.
5
+ When(/^(?:|I )press "([^"]*)"(?: within "([^"]*)")?$/) do |button, selector|
6
+ with_scope(selector) do
7
+ click_button(button)
8
+ end
9
+ end
10
+
11
+ # Click link.
12
+ #
13
+ # @yieldparam button [String] Name of link. Relative to selector.
14
+ # @yieldparam selector [String] Define scope per css selector.
15
+ When(/^(?:|I )follow "([^"]*)"(?: within "([^"]*)")?$/) do |link, selector|
16
+ with_scope(selector) do
17
+ click_link(link)
18
+ end
19
+ end
20
+
21
+ # Click xpath.
22
+ #
23
+ # @yieldparam xpath [String] xpath to link. Relative to selector.
24
+ # @yieldparam selector [String] Define scope per css selector.
25
+ When(/^(?:|I )click xpath "([^"]*)"(?: within "([^"]*)")?$/) do |xpath, selector|
26
+ with_scope(selector) do
27
+ find(:xpath, xpath).click
28
+ end
29
+ end
30
+
31
+ # Click element.
32
+ #
33
+ # @yieldparam element [String] Css selector for element.
34
+ # @yieldparam selector [String] Define scope per css selector.
35
+ When(/^I click on element "([^"]*)"(?: within "([^"]*)")?$/) do |element, selector|
36
+ with_scope(selector) do
37
+ find(element.to_s).click
38
+ end
39
+ end
@@ -0,0 +1,88 @@
1
+ # Check json body.
2
+ #
3
+ # @yieldparam expected_json [String] Expected json string.
4
+ Then(/^(?:|I )should see JSON:$/) do |expected_json|
5
+ require 'json'
6
+ expected = JSON.pretty_generate(JSON.parse(expected_json))
7
+ actual = JSON.pretty_generate(JSON.parse(page.text))
8
+ expect(actual).to eq(expected)
9
+ end
10
+
11
+ # Search text on page.
12
+ #
13
+ # @yieldparam text [String] Text to search on page.
14
+ # @yieldparam selector [String] Define scope per css selector.
15
+ Then(/^(?:|I )(should|should not) see "([^"]*)"(?: within "([^"]*)")?$/) do |should_or_not, text, selector|
16
+ should_or_not = should_or_not == 'should'
17
+ with_scope(selector) do
18
+ expect(page).to(should_or_not ? have_content(text) : have_no_content(text))
19
+ end
20
+ end
21
+
22
+ # Search regex on page.
23
+ #
24
+ # @yieldparam regexp [String] Regex to search on page.
25
+ # @yieldparam selector [String] Define scope per css selector.
26
+ Then(%r{^(?:|I )(should|should not) see /([^/]*)/(?: within "([^"]*)")?$}) do |should_or_not, regexp, selector|
27
+ regexp = Regexp.new(regexp)
28
+ should_or_not = should_or_not == 'should'
29
+ with_scope(selector) do
30
+ expect(page).to(should_or_not ? have_xpath('//*', text: regexp) : have_no_xpath('//*', text: regexp))
31
+ end
32
+ end
33
+
34
+ # Search for xpath existance on page.
35
+ #
36
+ # @yieldparam xpath [String] xpath to search on page.
37
+ # @yieldparam selector [String] Define scope per css selector.
38
+ Then(/^(?:|I )(should|should not) see xpath "([^"]*)"(?: within "([^"]*)")?$/) do |should_or_not, xpath, selector|
39
+ should_or_not = should_or_not == 'should'
40
+ with_scope(selector) do
41
+ expect(page).to(should_or_not ? have_xpath(xpath) : have_no_xpath(xpath))
42
+ end
43
+ end
44
+
45
+ # Check if ruby can parse content within scope as element.
46
+ #
47
+ # @yieldparam selector [String] Define scope per css selector.
48
+ Then(/^I should see a date within "([^"]*)"$/) do |selector|
49
+ with_scope(selector) do
50
+ require 'date'
51
+ expect(Date.parse(page.text)).not_to be_nil
52
+ end
53
+ end
54
+
55
+ # Check if element is visible.
56
+ #
57
+ # @yieldparam element [String] Css selector for element.
58
+ Then(/^the element "([^"]*)" (should|should not) be visible$/) do |element, should_or_not|
59
+ should_or_not = should_or_not == 'should'
60
+ element = find(selector_for(element).to_s, visible: false)
61
+ expect(element.visible?).to should_or_not ? be_truthy : be_falsey
62
+ end
63
+
64
+ # Check if at least x elements are existant
65
+ #
66
+ # @yieldparam number_of_elements [String] Count of elements.
67
+ # @yieldparam selector [String] Css selector for elements.
68
+ # @yieldparam parent [String] Define scope per css selector.
69
+ Then(/^I should have at least (\d+) "([^"]*)" within "([^"]*)"$/) do |number_of_elements, selector, parent|
70
+ with_scope(parent) do
71
+ elements = all(selector_for(selector))
72
+ expect(elements.size).to be >= number_of_elements.to_i
73
+ end
74
+ end
75
+
76
+ # Check if page has a certain title.
77
+ #
78
+ # @yieldparam selector [String] Define page title.
79
+ Then(/^the page should have a title of "([^"]*)"$/) do |title|
80
+ expect(page).to have_title(title)
81
+ end
82
+
83
+ # Check if page has a certain title.
84
+ #
85
+ # @yieldparam selector [String] Define page title.
86
+ Then(%r{^the page title should match /([^/]*)/$}) do |title_regex|
87
+ expect(page.title).to match(title_regex)
88
+ end
@@ -0,0 +1,146 @@
1
+ # Fill text into form field
2
+ #
3
+ # @yieldparam field [String] Field name.
4
+ # @yieldparam value [String] Field value.
5
+ # @yieldparam selector [String] Define scope per css selector.
6
+ When(/^(?:|I )fill in "([^"]*)" for "([^"]*)"(?: within "([^"]*)")?$/) do |value, field, selector|
7
+ with_scope selector do
8
+ fill_in field, with: value
9
+ end
10
+ end
11
+
12
+ # Use this to fill in an entire form with data from a table. Example:
13
+ #
14
+ # When I fill in the following:
15
+ # | Account Number | 5002 |
16
+ # | Expiry date | 2009-11-01 |
17
+ # | Note | Nice guy |
18
+ # | Wants Email? | |
19
+ #
20
+ # TODO: Add support for checkbox, select og option
21
+ # based on naming conventions.
22
+ #
23
+ # @yieldparam selector [String] Define scope per css selector.
24
+ # @yieldparam fields [Hash] See above
25
+ When(/^(?:|I )fill in the following(?: within "([^"]*)")?:$/) do |selector, fields|
26
+ with_scope selector do
27
+ fields.rows_hash.each do |name, value|
28
+ step %(I fill in "#{value}" for "#{name}")
29
+ end
30
+ end
31
+ end
32
+
33
+ # Select value with form select box
34
+ #
35
+ # @yieldparam value [String] Field value.
36
+ # @yieldparam field [String] Field name.
37
+ # @yieldparam selector [String] Define scope per css selector.
38
+ When(/^(?:|I )select "([^"]*)" from "([^"]*)"(?: within "([^"]*)")?$/) do |value, field, selector|
39
+ with_scope selector do
40
+ select value, from: field
41
+ end
42
+ end
43
+
44
+ # Activate checkbox.
45
+ #
46
+ # @yieldparam field [String] Field name.
47
+ # @yieldparam selector [String] Define scope per css selector.
48
+ When(/^(?:|I )check "([^"]*)"(?: within "([^"]*)")?$/) do |field, selector|
49
+ with_scope selector do
50
+ check field
51
+ end
52
+ end
53
+
54
+ # Deactivate checkbox.
55
+ #
56
+ # @yieldparam field [String] Field name.
57
+ # @yieldparam selector [String] Define scope per css selector.
58
+ When(/^(?:|I )uncheck "([^"]*)"(?: within "([^"]*)")?$/) do |field, selector|
59
+ with_scope selector do
60
+ uncheck field
61
+ end
62
+ end
63
+
64
+ # Activate radiobutton
65
+ #
66
+ # @yieldparam field [String] Field name.
67
+ # @yieldparam selector [String] Define scope per css selector.
68
+ When(/^(?:|I )choose "([^"]*)"(?: within "([^"]*)")?$/) do |field, selector|
69
+ with_scope selector do
70
+ choose field
71
+ end
72
+ end
73
+
74
+ # Attach file to field.
75
+ #
76
+ # @yieldparam path [String] Path to file.
77
+ # @yieldparam field [String] Field name.
78
+ # @yieldparam selector [String] Define scope per css selector.
79
+ When(/^(?:|I )attach the file "([^"]*)" to "([^"]*)"(?: within "([^"]*)")?$/) do |path, field, selector|
80
+ with_scope selector do
81
+ attach_file field, path
82
+ end
83
+ end
84
+
85
+ # Check if value of given form field match current value.
86
+ #
87
+ # @yieldparam field [String] Field name.
88
+ # @yieldparam selector [String] Define scope per css selector.
89
+ # @yieldparam value [String] Value to check.
90
+ Then(/^"([^"]*)" (should|should not) be contained in field "([^"]*)"(?: within "([^"]*)")?$/) do |value, should_or_not, field, selector|
91
+ should_or_not = should_or_not.eql? 'should'
92
+ with_scope selector do
93
+ field = find_field field
94
+ field_value = field.tag_name == 'textarea' ? field.text : field.value
95
+ decision = field_value =~ /#{value}/
96
+ expect(decision).to(should_or_not ? be_truthy : be_falsey)
97
+ end
98
+ end
99
+
100
+ # Check if value of given form field match exactly the current value or not.
101
+ #
102
+ # @yieldparam field [String] Field name.
103
+ # @yieldparam selector [String] Define scope per css selector.
104
+ # @yieldparam negate [Boolean] Negative check?
105
+ # @yieldparam value [String] Value to check.
106
+ Then(/^"([^"]*)" should( not)? be equal to field "([^"]*)"(?: within "([^"]*)")?$/) do |value, negate, field, selector|
107
+ expectation = negate ? :not_to : :to
108
+ with_scope selector do
109
+ field = find_field(field)
110
+ field_value = field.tag_name == 'textarea' ? field.text : field.value
111
+ if value.nil? # Capybara returns nil for empty fields, so we can't test for equality
112
+ expect(field_value).send(expectation, be_blank)
113
+ else
114
+ expect(field_value).send(expectation, eq(value))
115
+ end
116
+ end
117
+ end
118
+
119
+ # Check if checkbox or radio button is (not) checked.
120
+ #
121
+ # @yieldparam field [String] Field name.
122
+ # @yieldparam selector [String] Define scope per css selector.
123
+ Then(/^(should|should not) be checked "([^"]*)"(?: within "([^"]*)")?$/) do |should_or_not, field, selector|
124
+ should_or_not = should_or_not.eql? 'should'
125
+ with_scope selector do
126
+ field_checked = find_field(field)['checked']
127
+ expect(field_checked).to(should_or_not ? be_truthy : be_falsey)
128
+ end
129
+ end
130
+
131
+ # Lost focus of current field. Execute event "blur".
132
+ #
133
+ # @yieldparam field [String] Field name.
134
+ # @yieldparam selector [String] Define scope per css selector.
135
+ When(/^I leave the field "([^"]*)"(?: within "([^"]*)")?$/) do |field, selector|
136
+ with_scope selector do
137
+ field = find_field(field).trigger 'blur'
138
+ end
139
+ end
140
+
141
+ # Submit form by id.
142
+ #
143
+ # @yieldparam form_id [String] Form id.
144
+ Then(/^I submit form "([^\"]*)"?$/) do |form_id|
145
+ page.execute_script "document.forms['#{form_id}'].submit();"
146
+ end