Bundle update & restructure tests (RSpec 3)

This commit is contained in:
wvengen 2015-04-24 15:19:57 +02:00
parent 7b2bcedb16
commit aa7a2a31ae
14 changed files with 412 additions and 413 deletions

View File

@ -103,8 +103,9 @@ group :test do
gem 'database_cleaner' gem 'database_cleaner'
gem 'connection_pool' gem 'connection_pool'
# need to include rspec components before i18n-spec or rake fails in test environment # need to include rspec components before i18n-spec or rake fails in test environment
gem 'rspec-core', '~> 2.99' # almost ready for RSpec 3 gem 'rspec-core', '~> 3.2'
gem 'rspec-rerun' gem 'rspec-rerun'
gem 'rspec-legacy_formatters'
gem 'i18n-spec' gem 'i18n-spec'
# code coverage # code coverage
gem 'simplecov', require: false gem 'simplecov', require: false

View File

@ -337,27 +337,32 @@ GEM
nokogiri nokogiri
rubyzip rubyzip
spreadsheet (> 0.6.4) spreadsheet (> 0.6.4)
rspec (2.99.0) rspec (3.2.0)
rspec-core (~> 2.99.0) rspec-core (~> 3.2.0)
rspec-expectations (~> 2.99.0) rspec-expectations (~> 3.2.0)
rspec-mocks (~> 2.99.0) rspec-mocks (~> 3.2.0)
rspec-collection_matchers (1.1.2) rspec-core (3.2.3)
rspec-expectations (>= 2.99.0.beta1) rspec-support (~> 3.2.0)
rspec-core (2.99.2) rspec-expectations (3.2.1)
rspec-expectations (2.99.2) diff-lcs (>= 1.2.0, < 2.0)
diff-lcs (>= 1.1.3, < 2.0) rspec-support (~> 3.2.0)
rspec-mocks (2.99.3) rspec-legacy_formatters (1.0.0)
rspec-rails (2.99.0) rspec-core (>= 3.0.0.beta2)
actionpack (>= 3.0) rspec-support (>= 3.0.0.beta2)
activemodel (>= 3.0) rspec-mocks (3.2.1)
activesupport (>= 3.0) diff-lcs (>= 1.2.0, < 2.0)
railties (>= 3.0) rspec-support (~> 3.2.0)
rspec-collection_matchers rspec-rails (3.2.1)
rspec-core (~> 2.99.0) actionpack (>= 3.0, < 4.3)
rspec-expectations (~> 2.99.0) activesupport (>= 3.0, < 4.3)
rspec-mocks (~> 2.99.0) railties (>= 3.0, < 4.3)
rspec-core (~> 3.2.0)
rspec-expectations (~> 3.2.0)
rspec-mocks (~> 3.2.0)
rspec-support (~> 3.2.0)
rspec-rerun (0.3.0) rspec-rerun (0.3.0)
rspec rspec
rspec-support (3.2.2)
ruby-ole (1.2.11.8) ruby-ole (1.2.11.8)
ruby-prof (0.15.6) ruby-prof (0.15.6)
ruby-units (1.4.5) ruby-units (1.4.5)
@ -518,7 +523,8 @@ DEPENDENCIES
recurring_select recurring_select
resque resque
roo (~> 1.13.2) roo (~> 1.13.2)
rspec-core (~> 2.99) rspec-core (~> 3.2)
rspec-legacy_formatters
rspec-rails rspec-rails
rspec-rerun rspec-rerun
ruby-prof ruby-prof

View File

@ -15,12 +15,7 @@ class LoginController < ApplicationController
end end
if (user = User.find_by_email(params[:user][:email])) if (user = User.find_by_email(params[:user][:email]))
user.reset_password_token = user.new_random_password(16) user.request_password_reset!
user.reset_password_expires = Time.now.advance(:days => 2)
if user.save
Mailer.reset_password(user).deliver_now
logger.debug("Sent password reset email to #{user.email}.")
end
end end
redirect_to login_url, :notice => I18n.t('login.controller.reset_password.notice') redirect_to login_url, :notice => I18n.t('login.controller.reset_password.notice')
end end

View File

@ -120,6 +120,20 @@ class User < ActiveRecord::Base
r r
end end
# Generates password reset token and sends email
# @return [Boolean] Whether it succeeded or not
def request_password_reset!
self.reset_password_token = new_random_password(16)
self.reset_password_expires = Time.now.advance(days: 2)
if save!
Mailer.reset_password(self).deliver_now
logger.debug("Sent password reset email to #{email}.")
true
else
false
end
end
# Checks the admin role # Checks the admin role
def role_admin? def role_admin?
groups.detect {|group| group.role_admin?} groups.detect {|group| group.role_admin?}

View File

@ -1,14 +1,14 @@
# encoding: utf-8 # encoding: utf-8
require_relative '../spec_helper' require_relative '../spec_helper'
describe ArticlesController, :type => :feature do feature ArticlesController do
let(:user) { create :user, groups:[create(:workgroup, role_article_meta: true)] } let(:user) { create :user, groups:[create(:workgroup, role_article_meta: true)] }
let (:supplier) { create :supplier } let (:supplier) { create :supplier }
let!(:article_category) { create :article_category } let!(:article_category) { create :article_category }
before { login user } before { login user }
describe ":index", :type => :feature, :js => true do describe ':index', js: true do
before { visit supplier_articles_path(supplier) } before { visit supplier_articles_path(supplier_id: supplier.id) }
it 'can visit supplier articles path' do it 'can visit supplier articles path' do
expect(page).to have_content(supplier.name) expect(page).to have_content(supplier.name)
@ -35,11 +35,11 @@ describe ArticlesController, :type => :feature do
end end
end end
describe ":upload", :type => :feature, :js => true do describe ':upload' do
let(:filename) { 'foodsoft_file_02.csv' } let(:filename) { 'foodsoft_file_02.csv' }
let(:file) { Rails.root.join("spec/fixtures/#{filename}") } let(:file) { Rails.root.join("spec/fixtures/#{filename}") }
before do before do
visit upload_supplier_articles_path(supplier) visit upload_supplier_articles_path(supplier_id: supplier.id)
attach_file 'articles_file', file attach_file 'articles_file', file
end end

View File

@ -1,6 +1,6 @@
require_relative '../spec_helper' require_relative '../spec_helper'
describe 'settling an order', :type => :feature do feature 'settling an order', js: true do
let(:admin) { create :user, groups:[create(:workgroup, role_finance: true)] } let(:admin) { create :user, groups:[create(:workgroup, role_finance: true)] }
let(:user) { create :user, groups:[create(:ordergroup)] } let(:user) { create :user, groups:[create(:ordergroup)] }
let(:supplier) { create :supplier } let(:supplier) { create :supplier }
@ -27,7 +27,6 @@ describe 'settling an order', :type => :feature do
expect(goa2.result).to eq(1) expect(goa2.result).to eq(1)
end end
describe :type => :feature, :js => true do
before { login admin } before { login admin }
before { visit new_finance_order_path(order_id: order.id) } before { visit new_finance_order_path(order_id: order.id) }
@ -178,7 +177,4 @@ describe 'settling an order', :type => :feature do
expect(page).to have_content(new_article.name) expect(page).to have_content(new_article.name)
expect(order.order_articles.where(article_id: new_article.id)).to_not be nil expect(order.order_articles.where(article_id: new_article.id)).to_not be nil
end end
end
end end

View File

@ -1,11 +1,10 @@
require_relative '../spec_helper' require_relative '../spec_helper'
describe 'admin/configs', type: :feature do feature 'admin/configs' do
let(:name) { Faker::Lorem.words(rand(2..4)).join(' ') } let(:name) { Faker::Lorem.words(rand(2..4)).join(' ') }
let(:email) { Faker::Internet.email } let(:email) { Faker::Internet.email }
describe type: :feature, js: true do
let(:admin) { create :admin } let(:admin) { create :admin }
before { login admin } before { login admin }
it 'has initial value' do it 'has initial value' do
@ -61,6 +60,4 @@ describe 'admin/configs', type: :feature do
h.reject! {|k,v| v.blank?} h.reject! {|k,v| v.blank?}
h h
end end
end
end end

View File

@ -1,42 +1,45 @@
require_relative '../spec_helper' require_relative '../spec_helper'
describe LoginController, :type => :feature do feature LoginController do
let(:user) { create :user } let(:user) { create :user }
describe 'forgot password', :type => :feature do describe 'forgot password' do
before { visit forgot_password_path }
it 'is accessible' do it 'is accessible' do
get forgot_password_path expect(page).to have_selector 'input[id=user_email]'
expect(response).to be_success
end end
it 'sends a reset email' do it 'sends a reset email' do
post reset_password_path, user: {email: user.email} fill_in 'user_email', with: user.email
find('input[type=submit]').click
expect(page).to have_selector '.alert-success'
email = ActionMailer::Base.deliveries.first email = ActionMailer::Base.deliveries.first
expect(email.to).to eq [user.email] expect(email.to).to eq [user.email]
end end
end end
describe 'reset password', :type => :feature do describe 'and reset it' do
let(:token) { user.reset_password_token } let(:token) { user.reset_password_token }
let(:newpass) { user.new_random_password } let(:newpass) { user.new_random_password }
before do before { user.request_password_reset! }
post reset_password_path, user: {email: user.email} before { visit new_password_path(id: user.id, token: token) }
user.reload
end
it 'is accessible' do it 'is accessible' do
get new_password_path, id: user.id, token: token expect(page).to have_selector 'input[type=password]'
expect(response).to be_success
end end
it 'is not accessible with wrong token' do describe 'with wrong token' do
get new_password_path, id: user.id, token: '123' let(:token) { 'foobar' }
expect(response).to_not be_success it 'is not accessible' do
expect(page).to have_selector '.alert-error'
expect(page).to_not have_selector 'input[type=password]'
end
end end
it 'changes the password' do it 'changes the password' do
patch update_password_path, id: user.id, token: token, user: {password: newpass, password_confirmation: newpass} fill_in 'user_password', with: newpass
expect(page).to_not have_selector('.alert-error') fill_in 'user_password_confirmation', with: newpass
find('input[type=submit]').click
expect(User.authenticate(user.email, newpass)).to eq user expect(User.authenticate(user.email, newpass)).to eq user
end end
end end

View File

@ -1,6 +1,6 @@
require_relative '../spec_helper' require_relative '../spec_helper'
describe Order, type: :feature do feature Order, js: true do
let(:admin) { create :user, groups:[create(:workgroup, role_orders: true)] } let(:admin) { create :user, groups:[create(:workgroup, role_orders: true)] }
let(:article) { create :article, unit_quantity: 1 } let(:article) { create :article, unit_quantity: 1 }
let(:order) { create :order, supplier: article.supplier, article_ids: [article.id] } # need to ref article let(:order) { create :order, supplier: article.supplier, article_ids: [article.id] } # need to ref article
@ -8,7 +8,6 @@ describe Order, type: :feature do
let(:oa) { order.order_articles.find_by_article_id(article.id) } let(:oa) { order.order_articles.find_by_article_id(article.id) }
let(:goa1) { create :group_order_article, group_order: go1, order_article: oa } let(:goa1) { create :group_order_article, group_order: go1, order_article: oa }
describe type: :feature, js: true do
before { login admin } before { login admin }
it 'can get to the new order page' do it 'can get to the new order page' do
@ -43,7 +42,6 @@ describe Order, type: :feature do
expect(page).to_not have_link I18n.t('orders.index.action_end') expect(page).to_not have_link I18n.t('orders.index.action_end')
expect(oa.units_to_order).to eq 1 expect(oa.units_to_order).to eq 1
end end
end
def setup_and_close_order def setup_and_close_order
# have at least something ordered # have at least something ordered
@ -57,5 +55,4 @@ describe Order, type: :feature do
order.reload order.reload
oa.reload oa.reload
end end
end end

View File

@ -1,6 +1,6 @@
require_relative '../spec_helper' require_relative '../spec_helper'
describe 'product distribution', :type => :feature do feature 'product distribution', js: true do
let(:admin) { create :admin } let(:admin) { create :admin }
let(:user_a) { create :user, groups: [create(:ordergroup)] } let(:user_a) { create :user, groups: [create(:ordergroup)] }
let(:user_b) { create :user, groups: [create(:ordergroup)] } let(:user_b) { create :user, groups: [create(:ordergroup)] }
@ -9,32 +9,32 @@ describe 'product distribution', :type => :feature do
let(:order) { create(:order, supplier: supplier, article_ids: [article.id]) } let(:order) { create(:order, supplier: supplier, article_ids: [article.id]) }
let(:oa) { order.order_articles.first } let(:oa) { order.order_articles.first }
describe :type => :feature do
# make sure users have enough money to order
before do before do
# make sure users have enough money to order
[user_a, user_b].each do |user| [user_a, user_b].each do |user|
ordergroup = Ordergroup.find(user.ordergroup.id) ordergroup = Ordergroup.find(user.ordergroup.id)
ordergroup.add_financial_transaction! 5000, 'for ordering', admin ordergroup.add_financial_transaction! 5000, 'for ordering', admin
end end
order # make sure order is referenced
end end
it 'agrees to documented example', :js => true do it 'agrees to documented example' do
# gruppe a bestellt 2(3), weil sie auf jeden fall was von x bekommen will # gruppe a bestellt 2(3), weil sie auf jeden fall was von x bekommen will
login user_a login user_a
visit new_group_order_path(:order_id => order.id) visit new_group_order_path(order_id: order.id)
2.times { find("[data-increase_quantity='#{oa.id}']").click } 2.times { find("[data-increase_quantity='#{oa.id}']").click }
3.times { find("[data-increase_tolerance='#{oa.id}']").click } 3.times { find("[data-increase_tolerance='#{oa.id}']").click }
find('input[type=submit]').click find('input[type=submit]').click
expect(page).to have_selector('body') expect(page).to have_selector('body')
# gruppe b bestellt 2(0) # gruppe b bestellt 2(0)
login user_b login user_b
visit new_group_order_path(:order_id => order.id) visit new_group_order_path(order_id: order.id)
2.times { find("[data-increase_quantity='#{oa.id}']").click } 2.times { find("[data-increase_quantity='#{oa.id}']").click }
find('input[type=submit]').click find('input[type=submit]').click
expect(page).to have_selector('body') expect(page).to have_selector('body')
# gruppe a faellt ein dass sie doch noch mehr braucht von x und aendert auf 4(1). # gruppe a faellt ein dass sie doch noch mehr braucht von x und aendert auf 4(1).
login user_a login user_a
visit edit_group_order_path(order.group_order(user_a.ordergroup), :order_id => order.id) visit edit_group_order_path(id: order.group_order(user_a.ordergroup).id, order_id: order.id)
2.times { find("[data-increase_quantity='#{oa.id}']").click } 2.times { find("[data-increase_quantity='#{oa.id}']").click }
2.times { find("[data-decrease_tolerance='#{oa.id}']").click } 2.times { find("[data-decrease_tolerance='#{oa.id}']").click }
find('input[type=submit]').click find('input[type=submit]').click
@ -53,5 +53,3 @@ describe 'product distribution', :type => :feature do
expect(goa_b.result).to eq(2) expect(goa_b.result).to eq(2)
end end
end end
end

View File

@ -1,6 +1,6 @@
require_relative '../spec_helper' require_relative '../spec_helper'
describe 'receiving an order', :type => :feature do feature 'receiving an order', js: true do
let(:admin) { create :user, groups:[create(:workgroup, role_orders: true)] } let(:admin) { create :user, groups:[create(:workgroup, role_orders: true)] }
let(:supplier) { create :supplier } let(:supplier) { create :supplier }
let(:article) { create :article, supplier: supplier, unit_quantity: 3 } let(:article) { create :article, supplier: supplier, unit_quantity: 3 }
@ -34,32 +34,30 @@ describe 'receiving an order', :type => :feature do
expect(goa2.destroyed? ? 0 : goa2.result).to be_within(1e-3).of q2 expect(goa2.destroyed? ? 0 : goa2.result).to be_within(1e-3).of q2
end end
describe :type => :feature, :js => true do
before { login admin } before { login admin }
it 'has product ordered visible' do it 'has product ordered visible' do
set_quantities [3,0], [0,0] set_quantities [3,0], [0,0]
visit receive_order_path(order) visit receive_order_path(id: order.id)
expect(page).to have_content(article.name) expect(page).to have_content(article.name)
expect(page).to have_selector("#order_article_#{oa.id}") expect(page).to have_selector("#order_article_#{oa.id}")
end end
it 'has product not ordered invisible' do it 'has product not ordered invisible' do
set_quantities [0,0], [0,0] set_quantities [0,0], [0,0]
visit receive_order_path(order) visit receive_order_path(id: order.id)
expect(page).to_not have_selector("#order_article_#{oa.id}") expect(page).to_not have_selector("#order_article_#{oa.id}")
end end
it 'is not received by default' do it 'is not received by default' do
set_quantities [3,0], [0,0] set_quantities [3,0], [0,0]
visit receive_order_path(order) visit receive_order_path(id: order.id)
expect(find("#order_articles_#{oa.id}_units_received").value).to eq '' expect(find("#order_articles_#{oa.id}_units_received").value).to be_blank
end end
it 'does not change anything when received is ordered' do it 'does not change anything when received is ordered' do
set_quantities [2,0], [3,2] set_quantities [2,0], [3,2]
visit receive_order_path(order) visit receive_order_path(id: order.id)
fill_in "order_articles_#{oa.id}_units_received", :with => oa.units_to_order fill_in "order_articles_#{oa.id}_units_received", :with => oa.units_to_order
find('input[type="submit"]').click find('input[type="submit"]').click
expect(page).to have_selector('body') expect(page).to have_selector('body')
@ -68,7 +66,7 @@ describe 'receiving an order', :type => :feature do
it 'redistributes properly when received is more' do it 'redistributes properly when received is more' do
set_quantities [2,0], [3,2] set_quantities [2,0], [3,2]
visit receive_order_path(order) visit receive_order_path(id: order.id)
fill_in "order_articles_#{oa.id}_units_received", :with => 3 fill_in "order_articles_#{oa.id}_units_received", :with => 3
find('input[type="submit"]').click find('input[type="submit"]').click
expect(page).to have_selector('body') expect(page).to have_selector('body')
@ -77,7 +75,7 @@ describe 'receiving an order', :type => :feature do
it 'redistributes properly when received is less' do it 'redistributes properly when received is less' do
set_quantities [2,0], [3,2] set_quantities [2,0], [3,2]
visit receive_order_path(order) visit receive_order_path(id: order.id)
fill_in "order_articles_#{oa.id}_units_received", :with => 1 fill_in "order_articles_#{oa.id}_units_received", :with => 1
find('input[type="submit"]').click find('input[type="submit"]').click
expect(page).to have_selector('body') expect(page).to have_selector('body')
@ -88,7 +86,7 @@ describe 'receiving an order', :type => :feature do
set_quantities [2,0], [3,2] set_quantities [2,0], [3,2]
goa1.result = goa1.result + 1 goa1.result = goa1.result + 1
goa1.save! goa1.save!
visit receive_order_path(order) visit receive_order_path(id: order.id)
expect(find("#order_articles_#{oa.id}_units_received")).to be_disabled expect(find("#order_articles_#{oa.id}_units_received")).to be_disabled
end end
@ -96,12 +94,9 @@ describe 'receiving an order', :type => :feature do
set_quantities [2,0], [3,2] set_quantities [2,0], [3,2]
goa1.result = goa1.result + 1 goa1.result = goa1.result + 1
goa1.save! goa1.save!
visit receive_order_path(order) visit receive_order_path(id: order.id)
find('input[type="submit"]').click find('input[type="submit"]').click
expect(page).to have_selector('body') expect(page).to have_selector('body')
check_quantities 2, 3, 4 check_quantities 2, 3, 4
end end
end
end end

View File

@ -1,12 +1,12 @@
require_relative '../spec_helper' require_relative '../spec_helper'
describe 'the session', :type => :feature do feature 'the session' do
let(:user) { create :user } let(:user) { create :user }
describe 'login page', :type => :feature do describe 'login page' do
it 'is accessible' do it 'is accessible' do
get login_path visit login_path
expect(response).to be_success expect(page).to have_selector('input[type=password]')
end end
it 'logs me in' do it 'logs me in' do
login user login user

View File

@ -1,10 +1,10 @@
# encoding: utf-8 # encoding: utf-8
require_relative '../spec_helper' require_relative '../spec_helper'
describe SuppliersController, :type => :feature do feature 'supplier' do
let(:supplier) { create :supplier } let(:supplier) { create :supplier }
describe :type => :feature, :js => true do describe 'create new' do
let(:user) { create :user, groups:[create(:workgroup, role_suppliers: true)] } let(:user) { create :user, groups:[create(:workgroup, role_suppliers: true)] }
before { login user } before { login user }

View File

@ -4,10 +4,7 @@ ENV["FOODSOFT_APP_CONFIG"] ||= 'spec/app_config.yml' # load special foodsoft con
require_relative 'support/coverage' # needs to be first require_relative 'support/coverage' # needs to be first
require File.expand_path("../../config/environment", __FILE__) require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails' require 'rspec/rails'
require 'rspec/autorun'
require 'capybara/rails' require 'capybara/rails'
require 'capybara/rspec'
# 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.
@ -58,7 +55,7 @@ RSpec.configure do |config|
# --seed 1234 # --seed 1234
config.order = "random" config.order = "random"
config.include SessionHelper config.include SessionHelper, type: :feature
# Automatically determine spec from directory structure, see: # Automatically determine spec from directory structure, see:
# https://www.relishapp.com/rspec/rspec-rails/v/3-0/docs/directory-structure # https://www.relishapp.com/rspec/rspec-rails/v/3-0/docs/directory-structure
@ -76,8 +73,8 @@ module Faker
end end
# include default foodsoft scope in urls, so that *_path works # include default foodsoft scope in urls, so that *_path works
ActionDispatch::Integration::Runner.class_eval do # https://github.com/rspec/rspec-rails/issues/255
undef default_url_options class ActionDispatch::Routing::RouteSet
def default_url_options(options={}) def default_url_options(options={})
{foodcoop: FoodsoftConfig.scope}.merge(options) {foodcoop: FoodsoftConfig.scope}.merge(options)
end end