Commit a828e425 by tady

Merge pull request #55 from tadyjp/wip/140309_turnip

[WIP] Turnip test
parents 80f78bec 54bca565
--color --color
-r turnip/rspec
...@@ -95,7 +95,8 @@ group :test do ...@@ -95,7 +95,8 @@ group :test do
gem 'capybara' gem 'capybara'
gem 'launchy' gem 'launchy'
gem 'poltergeist' gem 'poltergeist'
gem 'coveralls', :require => false gem 'coveralls', require: false
gem 'turnip'
end end
# tree structure # tree structure
......
...@@ -126,6 +126,8 @@ GEM ...@@ -126,6 +126,8 @@ GEM
multipart-post (>= 1.2, < 3) multipart-post (>= 1.2, < 3)
ffi (1.9.3) ffi (1.9.3)
formatador (0.2.4) formatador (0.2.4)
gherkin (2.12.2)
multi_json (~> 1.3)
github-markdown (0.6.4) github-markdown (0.6.4)
gmail_xoauth (0.4.1) gmail_xoauth (0.4.1)
oauth (>= 0.3.6) oauth (>= 0.3.6)
...@@ -334,6 +336,9 @@ GEM ...@@ -334,6 +336,9 @@ GEM
treetop (1.4.15) treetop (1.4.15)
polyglot polyglot
polyglot (>= 0.3.1) polyglot (>= 0.3.1)
turnip (1.2.1)
gherkin (>= 2.5)
rspec (>= 2.0, < 4.0)
tzinfo (0.3.38) tzinfo (0.3.38)
uglifier (2.4.0) uglifier (2.4.0)
execjs (>= 0.3.0) execjs (>= 0.3.0)
...@@ -397,5 +402,6 @@ DEPENDENCIES ...@@ -397,5 +402,6 @@ DEPENDENCIES
settingslogic settingslogic
therubyracer therubyracer
thin thin
turnip
uglifier uglifier
validates_email_format_of validates_email_format_of
...@@ -11,4 +11,8 @@ guard :rspec do ...@@ -11,4 +11,8 @@ guard :rspec do
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) do |m| watch(%r{^app/controllers/(.+)_(controller)\.rb$}) do |m|
%W(spec/routing/#{m[1]}_routing_spec.rb spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb spec/requests/#{m[1]}_spec.rb) %W(spec/routing/#{m[1]}_routing_spec.rb spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb spec/requests/#{m[1]}_spec.rb)
end end
watch(%r{^spec/acceptance/(.+)\.feature$})
watch(%r{^spec/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
end end
...@@ -12,13 +12,13 @@ class User < ActiveRecord::Base ...@@ -12,13 +12,13 @@ class User < ActiveRecord::Base
# Device # Device
def self.find_for_google_oauth2(access_token, signed_in_resource = nil) def self.find_for_google_oauth2(access_token, signed_in_resource = nil)
data = access_token.info info = access_token.info
user = User.where(email: data['email']).first user = User.where(email: info['email']).first
unless user unless user
user = User.create(name: data['name'], user = User.create(name: info['name'],
image_url: data['image'], image_url: info['image'],
email: data['email'], email: info['email'],
password: Devise.friendly_token[0, 20] password: Devise.friendly_token[0, 20]
) )
end end
......
<!-- view:home/login -->
<div class="login"> <div class="login">
<!-- Marketing messaging and featurettes <!-- Marketing messaging and featurettes
......
<!-- view:post/index -->
<div class="row"> <div class="row">
<div class="col-xs-6 col-md-4" id="sidebar" role="navigation"> <div class="col-xs-6 col-md-4" id="sidebar" role="navigation">
......
Feature: アクセス制限
Scenario: 非ログイン --> TOPページ
When visit '/'
Then response code is 200
Then response includes '<!-- view:home/login -->'
Scenario: 非ログイン --> postsページ
When visit '/posts'
Then response code is 200
Then response includes '<!-- view:home/login -->'
# Scenario: 禁止ユーザーログイン --> TOPページ
# Given login via google with 'taro@example.com'
# Then response code is 200
# Then page includes 'Your email address is not permitted'
# Scenario: 禁止ユーザーログイン --> postsページ
# Given login via google with 'taro@example.com'
# When visit '/posts'
# Then response code is 200
# Then response includes '<!-- view:home/login -->'
Scenario: ログイン --> TOPページ
Given login
When visit '/'
Then response code is 200
Then response includes '<!-- view:post/index -->'
Scenario: ログイン --> postsページ
Given login
When visit '/posts'
Then response code is 200
Then response includes '<!-- view:post/index -->'
Scenario: ログイン --> ログアウト
Given login
When logout
Then response code is 200
Then response includes '<!-- view:home/login -->'
# Feature: 検索
# @javascript2
# Scenario: 検索 --> Post表示
# Given login
# And create post 'ruby is ...'
# When visit '/posts'
# And search by 'ruby'
# And click item
# Then response code is 200
# And post 'ruby' shown
...@@ -8,9 +8,9 @@ describe 'Request via js', js: true do ...@@ -8,9 +8,9 @@ describe 'Request via js', js: true do
let(:user) { FactoryGirl.create(:login_user_1) } let(:user) { FactoryGirl.create(:login_user_1) }
before do before do
@post1 = Post.create title: 'ruby rspec', body: 'This is first espec test: ruby', author_id: user.id @post1 = Post.create title: 'ruby rspec', body: 'This is first espec test: ruby', author_id: user.id, updated_at: Time.new(2014, 1, 1, 12, 0, 0)
@post2 = Post.create title: 'php test', body: 'PHP is very easy', author_id: user.id @post2 = Post.create title: 'php test', body: 'PHP is very easy', author_id: user.id, updated_at: Time.new(2014, 1, 1, 13, 0, 0)
@post3 = Post.create title: 'java java...', body: 'Java is not ruby...', author_id: user.id @post3 = Post.create title: 'java java...', body: 'Java is not ruby...', author_id: user.id, updated_at: Time.new(2014, 1, 1, 14, 0, 0)
end end
before :each do before :each do
...@@ -20,13 +20,13 @@ describe 'Request via js', js: true do ...@@ -20,13 +20,13 @@ describe 'Request via js', js: true do
it 'show first post' do it 'show first post' do
page.save_screenshot(Rails.root.join('tmp', 'screenshots', "a-#{Time.now.strftime('%Y-%m-%d %H%M%S')}.png")) page.save_screenshot(Rails.root.join('tmp', 'screenshots', "a-#{Time.now.strftime('%Y-%m-%d %H%M%S')}.png"))
expect(page.find('.panel-title a').text).to include('ruby rspec') expect(page.find('.panel-title a').text).to include('java java')
end end
it 'click post and show' do it 'click post and show' do
find('.post-list:nth-child(3)').click find('.post-list:nth-child(3)').click
page.save_screenshot(Rails.root.join('tmp', 'screenshots', "b-#{Time.now.strftime('%Y-%m-%d %H%M%S')}.png")) page.save_screenshot(Rails.root.join('tmp', 'screenshots', "b-#{Time.now.strftime('%Y-%m-%d %H%M%S')}.png"))
expect(page.find('.panel-title a').text).to include('java java...') expect(page.find('.panel-title a').text).to include('ruby rspec')
end end
after :each do after :each do
......
...@@ -5,6 +5,9 @@ Coveralls.wear! ...@@ -5,6 +5,9 @@ Coveralls.wear!
# This file is copied to spec/ when you run 'rails generate rspec:install' # This file is copied to spec/ when you run 'rails generate rspec:install'
ENV['RAILS_ENV'] ||= 'test' ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__) require File.expand_path('../../config/environment', __FILE__)
Dir["./spec/support/**/*.rb"].sort.each { |f| require f }
require 'rspec/rails' require 'rspec/rails'
require 'rspec/autorun' require 'rspec/autorun'
# require 'email_spec' # require 'email_spec'
...@@ -13,15 +16,19 @@ require 'factory_girl' ...@@ -13,15 +16,19 @@ require 'factory_girl'
require 'capybara' require 'capybara'
require 'capybara/rspec' require 'capybara/rspec'
## Setting for polterguist. ## Setting for polterguist.
require 'capybara/poltergeist' require 'capybara/poltergeist'
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, timeout: 30)
end
Capybara.javascript_driver = :poltergeist
# Set capybara wait time (default: 2) def register_poltergeist(config)
Capybara.default_wait_time = 10 Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, timeout: 60)
end
# Capybara.run_server = true
# Capybara.default_driver = :poltergeist
Capybara.javascript_driver = :poltergeist
Capybara.default_wait_time = 10
end
# Requires supporting ruby files with custom matchers and macros, etc, # Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories. # in spec/support/ and its subdirectories.
...@@ -31,6 +38,12 @@ Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } ...@@ -31,6 +38,12 @@ Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
# If you are not using ActiveRecord, you can remove this line. # If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration) ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
# Setting for turnip.
Dir.glob("spec/steps/**/*steps.rb") { |f| load f, true }
require 'turnip'
require 'turnip/capybara'
RSpec.configure do |config| RSpec.configure do |config|
# ## Mock Framework # ## Mock Framework
# #
...@@ -80,4 +93,16 @@ RSpec.configure do |config| ...@@ -80,4 +93,16 @@ RSpec.configure do |config|
config.after :each do config.after :each do
DatabaseRewinder.clean DatabaseRewinder.clean
end end
# Capybara.app_host = "http://127.0.0.1/"
register_poltergeist(config)
OmniAuth.config.test_mode = true
OmniAuth.config.add_mock(:google_oauth2, {
'uid' => '12345',
'provider' => 'google_oauth2',
'info' => {'name' => 'Taro Yamada', 'email' => 'taro@zigexn.co.jp'},
'credentials' => {'token' => 'aaaaa', 'refresh_token' => 'bbbbb', 'expires_at' => 9999999999}
})
end end
step 'access :site' do |site|
Capybara.app_host = site
end
step 'visit :path' do |path|
visit path
end
step 'response code is :code' do |code|
expect(page.status_code.to_i).to eq(code.to_i)
end
step 'page includes :string' do |string|
expect(page).to have_content(string)
end
step 'response includes :string' do |string|
expect(page.body).to include(string)
end
step 'h1 include :string' do |string|
expect(page.find('h1')).to have_content(string)
end
step 'login' do
visit '/users/auth/google_oauth2'
end
step 'logout' do
click_on 'SignOut'
end
step 'create post :title' do |title|
Post.create title: title
end
step 'search by :query' do |query|
within("#app-search-form") do
fill_in 'q', :with => query
end
first(:css, "#app-search-form button[type='submit']").click
end
step 'click item' do
first(:css, '.post-list').click
end
step 'post :title shown' do |title|
expect(page.find('.panel-title a')).to have_content(title)
end
# class ActiveRecord::Base
# mattr_accessor :shared_connection
# @@shared_connection = nil
# def self.connection
# @@shared_connection || retrieve_connection
# end
# end
# # Forces all threads to share the same connection. This works on
# # Capybara because it starts the web server in a thread.
# ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment