This repository has been archived by the owner on May 29, 2019. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add simple cucumber integration test
- Loading branch information
Showing
10 changed files
with
381 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
source :rubygems | ||
|
||
gem 'sinatra' | ||
gem 'json' | ||
|
||
|
||
group :test do | ||
gem "cucumber" | ||
gem "rspec-expectations" | ||
gem "capybara-webkit" | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
GEM | ||
remote: http://rubygems.org/ | ||
specs: | ||
addressable (2.2.8) | ||
builder (3.0.0) | ||
capybara (1.1.2) | ||
mime-types (>= 1.16) | ||
nokogiri (>= 1.3.3) | ||
rack (>= 1.0.0) | ||
rack-test (>= 0.5.4) | ||
selenium-webdriver (~> 2.0) | ||
xpath (~> 0.1.4) | ||
capybara-webkit (0.12.0) | ||
capybara (>= 1.0.0, < 1.2) | ||
json | ||
childprocess (0.3.2) | ||
ffi (~> 1.0.6) | ||
cucumber (1.2.0) | ||
builder (>= 2.1.2) | ||
diff-lcs (>= 1.1.3) | ||
gherkin (~> 2.10.0) | ||
json (>= 1.4.6) | ||
diff-lcs (1.1.3) | ||
ffi (1.0.11) | ||
gherkin (2.10.0) | ||
json (>= 1.4.6) | ||
json (1.7.3) | ||
libwebsocket (0.1.3) | ||
addressable | ||
mime-types (1.18) | ||
multi_json (1.3.5) | ||
nokogiri (1.5.2) | ||
rack (1.4.1) | ||
rack-protection (1.2.0) | ||
rack | ||
rack-test (0.6.1) | ||
rack (>= 1.0) | ||
rspec-expectations (2.9.1) | ||
diff-lcs (~> 1.1.3) | ||
rubyzip (0.9.8) | ||
selenium-webdriver (2.21.2) | ||
childprocess (>= 0.2.5) | ||
ffi (~> 1.0) | ||
libwebsocket (~> 0.1.3) | ||
multi_json (~> 1.0) | ||
rubyzip | ||
sinatra (1.3.2) | ||
rack (~> 1.3, >= 1.3.6) | ||
rack-protection (~> 1.2) | ||
tilt (~> 1.3, >= 1.3.3) | ||
tilt (1.3.3) | ||
xpath (0.1.4) | ||
nokogiri (~> 1.3) | ||
|
||
PLATFORMS | ||
ruby | ||
|
||
DEPENDENCIES | ||
capybara-webkit | ||
cucumber | ||
json | ||
rspec-expectations | ||
sinatra |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
<% | ||
rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : "" | ||
rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}" | ||
std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip" | ||
%> | ||
default: <%= std_opts %> features | ||
wip: --tags @wip:3 --wip features | ||
rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
Feature: Posting Statuses | ||
|
||
Scenario: Succesfully posting a status | ||
When I am on the home page | ||
And I fill in "Status" with "Integration testing helps ensure your coworkers don't break shit" | ||
And I press "Post Update" | ||
Then I should see "Integration testing helps ensure your coworkers don't break shit" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,205 @@ | ||
require 'uri' | ||
require 'cgi' | ||
require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths")) | ||
require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "selectors")) | ||
|
||
module WithinHelpers | ||
def with_scope(locator) | ||
locator ? within(*selector_for(locator)) { yield } : yield | ||
end | ||
end | ||
World(WithinHelpers) | ||
|
||
# Single-line step scoper | ||
When /^(.*) within (.*[^:])$/ do |step, parent| | ||
with_scope(parent) { When step } | ||
end | ||
|
||
# Multi-line step scoper | ||
When /^(.*) within (.*[^:]):$/ do |step, parent, table_or_string| | ||
with_scope(parent) { When "#{step}:", table_or_string } | ||
end | ||
|
||
Given /^(?:|I )am on (.+)$/ do |page_name| | ||
visit path_to(page_name) | ||
end | ||
|
||
When /^(?:|I )go to (.+)$/ do |page_name| | ||
visit path_to(page_name) | ||
end | ||
|
||
When /^(?:|I )press "([^"]*)"$/ do |button| | ||
click_button(button) | ||
end | ||
|
||
When /^(?:|I )follow "([^"]*)"$/ do |link| | ||
click_link(link) | ||
end | ||
|
||
When /^(?:|I )fill in "([^"]*)" with "([^"]*)"$/ do |field, value| | ||
fill_in(field, :with => value) | ||
end | ||
|
||
When /^(?:|I )fill in "([^"]*)" for "([^"]*)"$/ do |value, field| | ||
fill_in(field, :with => value) | ||
end | ||
|
||
# Use this to fill in an entire form with data from a table. Example: | ||
# | ||
# When I fill in the following: | ||
# | Account Number | 5002 | | ||
# | Expiry date | 2009-11-01 | | ||
# | Note | Nice guy | | ||
# | Wants Email? | | | ||
# | ||
# TODO: Add support for checkbox, select og option | ||
# based on naming conventions. | ||
# | ||
When /^(?:|I )fill in the following:$/ do |fields| | ||
fields.rows_hash.each do |name, value| | ||
When %{I fill in "#{name}" with "#{value}"} | ||
end | ||
end | ||
|
||
When /^(?:|I )select "([^"]*)" from "([^"]*)"$/ do |value, field| | ||
select(value, :from => field) | ||
end | ||
|
||
When /^(?:|I )check "([^"]*)"$/ do |field| | ||
check(field) | ||
end | ||
|
||
When /^(?:|I )uncheck "([^"]*)"$/ do |field| | ||
uncheck(field) | ||
end | ||
|
||
When /^(?:|I )choose "([^"]*)"$/ do |field| | ||
choose(field) | ||
end | ||
|
||
When /^(?:|I )attach the file "([^"]*)" to "([^"]*)"$/ do |path, field| | ||
attach_file(field, File.expand_path(path)) | ||
end | ||
|
||
Then /^(?:|I )should see "([^"]*)"$/ do |text| | ||
if page.respond_to? :should | ||
page.should have_content(text) | ||
else | ||
assert page.has_content?(text) | ||
end | ||
end | ||
|
||
Then /^(?:|I )should see \/([^\/]*)\/$/ do |regexp| | ||
regexp = Regexp.new(regexp) | ||
|
||
if page.respond_to? :should | ||
page.should have_xpath('//*', :text => regexp) | ||
else | ||
assert page.has_xpath?('//*', :text => regexp) | ||
end | ||
end | ||
|
||
Then /^(?:|I )should not see "([^"]*)"$/ do |text| | ||
if page.respond_to? :should | ||
page.should have_no_content(text) | ||
else | ||
assert page.has_no_content?(text) | ||
end | ||
end | ||
|
||
Then /^(?:|I )should not see \/([^\/]*)\/$/ do |regexp| | ||
regexp = Regexp.new(regexp) | ||
|
||
if page.respond_to? :should | ||
page.should have_no_xpath('//*', :text => regexp) | ||
else | ||
assert page.has_no_xpath?('//*', :text => regexp) | ||
end | ||
end | ||
|
||
Then /^the "([^"]*)" field(?: within (.*))? should contain "([^"]*)"$/ do |field, parent, value| | ||
with_scope(parent) do | ||
field = find_field(field) | ||
field_value = (field.tag_name == 'textarea') ? field.text : field.value | ||
if field_value.respond_to? :should | ||
field_value.should =~ /#{value}/ | ||
else | ||
assert_match(/#{value}/, field_value) | ||
end | ||
end | ||
end | ||
|
||
Then /^the "([^"]*)" field(?: within (.*))? should not contain "([^"]*)"$/ do |field, parent, value| | ||
with_scope(parent) do | ||
field = find_field(field) | ||
field_value = (field.tag_name == 'textarea') ? field.text : field.value | ||
if field_value.respond_to? :should_not | ||
field_value.should_not =~ /#{value}/ | ||
else | ||
assert_no_match(/#{value}/, field_value) | ||
end | ||
end | ||
end | ||
|
||
Then /^the "([^"]*)" checkbox(?: within (.*))? should be checked$/ do |label, parent| | ||
with_scope(parent) do | ||
field_checked = find_field(label)['checked'] | ||
if field_checked.respond_to? :should | ||
field_checked.should be_true | ||
else | ||
assert field_checked | ||
end | ||
end | ||
end | ||
|
||
Then /^the "([^"]*)" checkbox(?: within (.*))? should not be checked$/ do |label, parent| | ||
with_scope(parent) do | ||
field_checked = find_field(label)['checked'] | ||
if field_checked.respond_to? :should | ||
field_checked.should be_false | ||
else | ||
assert !field_checked | ||
end | ||
end | ||
end | ||
|
||
Then /^(?:|I )should be on (.+)$/ do |page_name| | ||
current_path = URI.parse(current_url).path | ||
if current_path.respond_to? :should | ||
current_path.should == path_to(page_name) | ||
else | ||
assert_equal path_to(page_name), current_path | ||
end | ||
end | ||
|
||
Then /^(?:|I )should have the following query string:$/ do |expected_pairs| | ||
query = URI.parse(current_url).query | ||
actual_params = query ? CGI.parse(query) : {} | ||
expected_params = {} | ||
expected_pairs.rows_hash.each_pair{|k,v| expected_params[k] = v.split(',')} | ||
|
||
if actual_params.respond_to? :should | ||
actual_params.should == expected_params | ||
else | ||
assert_equal expected_params, actual_params | ||
end | ||
end | ||
|
||
Then /^show me the page$/ do | ||
save_and_open_page | ||
end | ||
|
||
When 'I debug' do | ||
debugger | ||
true | ||
end | ||
|
||
Then /^the "([^"]*)" radio should be "([^"]*)"$/ do |field, value| | ||
field = find(:xpath, XPath::HTML.field(field, :checked => true)) | ||
field.value.should == value | ||
end | ||
|
||
And 'I pause' do | ||
gets | ||
true | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
ENV['RACK_ENV'] = 'test' | ||
APP_ROOT = File.expand_path('../../..', __FILE__) | ||
|
||
require File.join(APP_ROOT, 'server') | ||
Bundler.require :test | ||
require 'capybara/cucumber' | ||
Capybara.app = Sinatra::Application.new | ||
Capybara.default_driver = ENV['SELENIUM'] ? :selenium : :webkit | ||
|
||
Capybara.register_driver :selenium do |app| | ||
Capybara::Selenium::Driver.new(app, :browser => :chrome) | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
module NavigationHelpers | ||
# Maps a name to a path. Used by the | ||
# | ||
# When /^I go to (.+)$/ do |page_name| | ||
# | ||
# step definition in web_steps.rb | ||
# | ||
def path_to(page_name) | ||
case page_name | ||
|
||
when /^the home\s?page$/ | ||
'/' | ||
|
||
# Add more mappings here. | ||
# Here is an example that pulls values out of the Regexp: | ||
# | ||
# when /^(.*)'s profile page$/i | ||
# user_profile_path(User.find_by_login($1)) | ||
|
||
else | ||
begin | ||
page_name =~ /^the (.*) page$/ | ||
path_components = $1.split(/\s+/) | ||
self.send(path_components.push('path').join('_').to_sym) | ||
rescue NoMethodError, ArgumentError | ||
raise "Can't find mapping from \"#{page_name}\" to a path.\n" + | ||
"Now, go and add a mapping in #{__FILE__}" | ||
end | ||
end | ||
end | ||
end | ||
|
||
World(NavigationHelpers) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
module HtmlSelectorsHelpers | ||
# Maps a name to a selector. Used primarily by the | ||
# | ||
# When /^(.+) within (.+)$/ do |step, scope| | ||
# | ||
# step definitions in web_steps.rb | ||
# | ||
def selector_for(locator) | ||
case locator | ||
|
||
when "the page" | ||
"html > body" | ||
|
||
# Add more mappings here. | ||
# Here is an example that pulls values out of the Regexp: | ||
# | ||
# when /^the (notice|error|info) flash$/ | ||
# ".flash.#{$1}" | ||
|
||
# You can also return an array to use a different selector | ||
# type, like: | ||
# | ||
# when /the header/ | ||
# [:xpath, "//header"] | ||
|
||
# This allows you to provide a quoted selector as the scope | ||
# for "within" steps as was previously the default for the | ||
# web steps: | ||
when /^"(.+)"$/ | ||
$1 | ||
|
||
else | ||
raise "Can't find mapping from \"#{locator}\" to a selector.\n" + | ||
"Now, go and add a mapping in #{__FILE__}" | ||
end | ||
end | ||
end | ||
|
||
World(HtmlSelectorsHelpers) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.