There are a few non-obvious changes to routes, and an extra testing library (factory_girl). As a result, we can now (but don't _have to_) use factories instead of yaml files for test data. The idea here is to make things more readable, as well as remove duplication, since one Factory can inherit from another. Each still gets it's own object-named file though, so the structure is similar to what we have done in the past. See http://github.com/thoughtbot/factory_girl for more details.
All existing TestUnit tests should still run (with rake test), and the new rspec tests can be run in a similar manner with: rake spec --- src/app/controllers/user_sessions_controller.rb | 6 +- src/app/views/user_sessions/login.html.erb | 18 -------- src/app/views/user_sessions/new.html.erb | 18 ++++++++ src/config/environments/cucumber.rb | 1 + src/config/environments/test.rb | 3 +- src/config/initializers/abstract_request.rb | 26 +++++++---- src/config/routes.rb | 25 +++-------- .../controllers/user_sessions_controller_spec.rb | 31 ++++++++++++++ src/spec/controllers/users_controller_spec.rb | 44 ++++++++++++++++++++ src/spec/factories/user.rb | 13 ++++++ src/spec/helpers/user_sessions_helper_spec.rb | 11 +++++ src/spec/helpers/users_helper_spec.rb | 11 +++++ src/spec/models/provider_spec.rb | 14 ++++++ src/spec/models/user_spec.rb | 13 ++++++ src/spec/spec_helper.rb | 7 +++ .../functional/user_sessions_controller_test.rb | 6 +- 16 files changed, 193 insertions(+), 54 deletions(-) delete mode 100644 src/app/views/user_sessions/login.html.erb create mode 100644 src/app/views/user_sessions/new.html.erb create mode 100644 src/spec/controllers/user_sessions_controller_spec.rb create mode 100644 src/spec/controllers/users_controller_spec.rb create mode 100644 src/spec/factories/user.rb create mode 100644 src/spec/helpers/user_sessions_helper_spec.rb create mode 100644 src/spec/helpers/users_helper_spec.rb create mode 100644 src/spec/models/provider_spec.rb create mode 100644 src/spec/models/user_spec.rb
diff --git a/src/app/controllers/user_sessions_controller.rb b/src/app/controllers/user_sessions_controller.rb index f48f8e0..d5dcfd2 100644 --- a/src/app/controllers/user_sessions_controller.rb +++ b/src/app/controllers/user_sessions_controller.rb @@ -23,7 +23,7 @@ class UserSessionsController < ApplicationController before_filter :require_no_user, :only => [:new, :create] before_filter :require_user, :only => :destroy
- def login + def new @user_session = UserSession.new end
@@ -33,11 +33,11 @@ class UserSessionsController < ApplicationController flash[:notice] = "Login successful!" redirect_back_or_default account_url else - render :action => :login + render :action => :new end end
- def logout + def destroy current_user_session.destroy flash[:notice] = "Logout successful!" redirect_back_or_default login_url diff --git a/src/app/views/user_sessions/login.html.erb b/src/app/views/user_sessions/login.html.erb deleted file mode 100644 index ee7da51..0000000 --- a/src/app/views/user_sessions/login.html.erb +++ /dev/null @@ -1,18 +0,0 @@ -<div class="dcloud_form"> - <h2>Login</h2> - - <% form_for @user_session, :url => user_session_path do |f| %> - <%= f.error_messages %> - <%= f.label :login %><br /> - <%= f.text_field :login %><br /> - <br /> - <%= f.label :password %><br /> - <%= f.password_field :password %><br /> - <br /> - <%= f.check_box :remember_me %><%= f.label :remember_me %><br /> - <br /> - <%= f.submit "Login" %> - <% end %> - <%= link_to 'Register', {:controller => 'users', :action => 'new'}, :class => 'actionlink' %> - -</div> diff --git a/src/app/views/user_sessions/new.html.erb b/src/app/views/user_sessions/new.html.erb new file mode 100644 index 0000000..ee7da51 --- /dev/null +++ b/src/app/views/user_sessions/new.html.erb @@ -0,0 +1,18 @@ +<div class="dcloud_form"> + <h2>Login</h2> + + <% form_for @user_session, :url => user_session_path do |f| %> + <%= f.error_messages %> + <%= f.label :login %><br /> + <%= f.text_field :login %><br /> + <br /> + <%= f.label :password %><br /> + <%= f.password_field :password %><br /> + <br /> + <%= f.check_box :remember_me %><%= f.label :remember_me %><br /> + <br /> + <%= f.submit "Login" %> + <% end %> + <%= link_to 'Register', {:controller => 'users', :action => 'new'}, :class => 'actionlink' %> + +</div> diff --git a/src/config/environments/cucumber.rb b/src/config/environments/cucumber.rb index 5edfa2b..efe0b40 100644 --- a/src/config/environments/cucumber.rb +++ b/src/config/environments/cucumber.rb @@ -26,3 +26,4 @@ config.gem 'database_cleaner', :lib => false, :version => '>=0.4.3' unless File. config.gem 'webrat', :lib => false, :version => '>=0.6.0' unless File.directory?(File.join(Rails.root, 'vendor/plugins/webrat')) config.gem 'rspec', :lib => false, :version => '>=1.3.0' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec')) config.gem 'rspec-rails', :lib => false, :version => '>=1.3.2' unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails')) +config.gem "factory_girl", :lib => "factory_girl", :version => ">=1.2.3" diff --git a/src/config/environments/test.rb b/src/config/environments/test.rb index 2d0704e..188f711 100644 --- a/src/config/environments/test.rb +++ b/src/config/environments/test.rb @@ -37,4 +37,5 @@ config.action_controller.perform_caching = false # ActionMailer::Base.deliveries array. config.action_mailer.delivery_method = :test
- config.gem 'rspec-rails', :version => '>= 1.3.2', :lib => false unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails')) +config.gem 'rspec-rails', :version => '>= 1.3.2', :lib => false unless File.directory?(File.join(Rails.root, 'vendor/plugins/rspec-rails')) +config.gem "factory_girl", :lib => "factory_girl", :version => ">=1.2.3" diff --git a/src/config/initializers/abstract_request.rb b/src/config/initializers/abstract_request.rb index 938106d..480241c 100644 --- a/src/config/initializers/abstract_request.rb +++ b/src/config/initializers/abstract_request.rb @@ -1,14 +1,20 @@ -#This is a (hopefully) temporary workaround to help -#mongrel, since it hooks into the now-gone AbstracRequest -#class. +# This is a (hopefully) temporary workaround to help +# mongrel, since it hooks into the now-gone AbstractRequest +# class. We should test if this issue occurs with thin +# webserver, perhaps we can use that instead of mongrel +# and drop this altogether. Set only to production, otherwise +# it kills our test suite.
-module ActionController - class AbstractRequest < ActionController::Request - def self.relative_url_root=(path) - ActionController::Base.relative_url_root=(path) - end - def self.relative_url_root - ActionController::Base.relative_url_root +config = Rails::Configuration.new +if config.environment == 'production' + module ActionController + class AbstractRequest < ActionController::Request + def self.relative_url_root=(path) + ActionController::Base.relative_url_root=(path) + end + def self.relative_url_root + ActionController::Base.relative_url_root + end end end end diff --git a/src/config/routes.rb b/src/config/routes.rb index 853ecec..d991be7 100644 --- a/src/config/routes.rb +++ b/src/config/routes.rb @@ -31,14 +31,16 @@ ActionController::Routing::Routes.draw do |map|
# You can have the root of your site routed by hooking up '' # -- just remember to delete public/index.html. - map.default '', :controller => 'provider' + map.connect '', :controller => 'provider'
+ map.login 'login', :controller => "user_sessions", :action => "new" + map.logout 'logout', :controller => "user_sessions", :action => "destroy" map.resource :user_session - map.root :controller => "user_sessions", :action => "login" - map.login 'login', :controller => "user_sessions", :action => "login" - map.logout 'logout', :controller => "user_sessions", :action => "logout" + map.register 'register', :controller => 'users', :action => 'new' map.resource :account, :controller => "users" map.resources :users + map.root :login + map.resources :provider
# Allow downloading Web Service WSDL as a file with an extension @@ -46,21 +48,6 @@ ActionController::Routing::Routes.draw do |map| map.connect ':controller/service.wsdl', :action => 'wsdl'
# Install the default route as the lowest priority. - map.connect 'graph/flexchart_data/:id/:target/:startTime/:endTime/:dataFunction', :controller => 'graph', :action => 'flexchart_data' - map.connect 'graph/host_chart_data/:id/:target/:startTime/:resolution/:dataFunction', :controller => 'graph', :action => 'host_chart_data' map.connect ':controller/:action/:id.:format' map.connect ':controller/:action/:id' - - # We put routes for the REST API _after_ the default routes so that we - # don't disturb existing routes for the Server - # FIXME: Eventually, we want to rename the controllers in a way that makes - # REST work out of the box, and use these as the default routes - map.resources :hosts, :controller => 'host' - map.resources :storage_pools, :controller => 'storage' - map.resources :storage_volumes, :controller => 'storage_volume' - map.resources :hardware_pools, :controller => 'hardware' do |hardware_pools| - hardware_pools.resources :hosts, :controller => 'host' - hardware_pools.resources :storage_pools, :controller => 'storage' - end - map.resources :vms, :controller => 'vm' end diff --git a/src/spec/controllers/user_sessions_controller_spec.rb b/src/spec/controllers/user_sessions_controller_spec.rb new file mode 100644 index 0000000..f2b80d5 --- /dev/null +++ b/src/spec/controllers/user_sessions_controller_spec.rb @@ -0,0 +1,31 @@ +require 'spec_helper' + +describe UserSessionsController do + + before(:each) do + @tuser = Factory :tuser + activate_authlogic + end + + it "should call new method" do + route_for(:controller => 'user_sessions', :action => 'new').should == 'login' + get :new + @current_user.should == nil + UserSession.find.should == nil + response.should be_success + end + + it "should create user session" do + post :create, :user_session => { :login => "tuser", :password => "secret" } + UserSession.find.should_not == nil + @tuser.should == UserSession.find.user + response.should redirect_to(account_path) + end + + it "should destroy user session" do + post :create, :user_session => { :login => "tuser", :password => "secret" } + delete :destroy + UserSession.find.should == nil + response.should redirect_to(login_path) + end +end diff --git a/src/spec/controllers/users_controller_spec.rb b/src/spec/controllers/users_controller_spec.rb new file mode 100644 index 0000000..1c18ba7 --- /dev/null +++ b/src/spec/controllers/users_controller_spec.rb @@ -0,0 +1,44 @@ +require 'spec_helper' + +describe UsersController do + + before(:each) do + @tuser = Factory :tuser + activate_authlogic + end + + it "should call new method" do + route_for(:controller => 'user_sessions', :action => 'new').should == 'login' + get :new + @current_user.should == nil + UserSession.find.should == nil + response.should be_success + end + + it "should create user" do + lambda { + post :create, :user => { :login => "tuser2", :email => "tuser2@example.com", + :password => "testpass", + :password_confirmation => "testpass" } + }.should change{ User.count } + response.should redirect_to(account_path) + end + + it "should show user" do + UserSession.create(@tuser) + get :show + response.should be_success + end + + it "should get edit" do + UserSession.create(@tuser) + get :edit, :id => @tuser.id + response.should be_success + end + + test "should update user" do + UserSession.create(@tuser) + put :update, :id => @tuser.id, :user => { } + response.should redirect_to(account_path) + end +end diff --git a/src/spec/factories/user.rb b/src/spec/factories/user.rb new file mode 100644 index 0000000..637600c --- /dev/null +++ b/src/spec/factories/user.rb @@ -0,0 +1,13 @@ +Factory.define :user do |u| + u.login 'myuser' + u.email 'myuser@example.com' + u.password 'secret' + u.password_confirmation 'secret' + #u.first_name 'John' + #u.last_name 'Smith' +end + +Factory.define :tuser, :parent => :user do |u| + u.login 'tuser' + u.email 'tuser@example.com' +end diff --git a/src/spec/helpers/user_sessions_helper_spec.rb b/src/spec/helpers/user_sessions_helper_spec.rb new file mode 100644 index 0000000..99cee55 --- /dev/null +++ b/src/spec/helpers/user_sessions_helper_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe UserSessionsHelper do + + #Delete this example and add some real ones or delete this file + it "should be included in the object returned by #helper" do + included_modules = (class << helper; self; end).send :included_modules + included_modules.should include(UserSessionsHelper) + end + +end diff --git a/src/spec/helpers/users_helper_spec.rb b/src/spec/helpers/users_helper_spec.rb new file mode 100644 index 0000000..8dae79b --- /dev/null +++ b/src/spec/helpers/users_helper_spec.rb @@ -0,0 +1,11 @@ +require 'spec_helper' + +describe UsersHelper do + + #Delete this example and add some real ones or delete this file + it "should be included in the object returned by #helper" do + included_modules = (class << helper; self; end).send :included_modules + included_modules.should include(UsersHelper) + end + +end diff --git a/src/spec/models/provider_spec.rb b/src/spec/models/provider_spec.rb new file mode 100644 index 0000000..b95e5f2 --- /dev/null +++ b/src/spec/models/provider_spec.rb @@ -0,0 +1,14 @@ +require 'spec_helper' + +describe Provider do + before(:each) do + @valid_attributes = { + + } + end + + it "should create a new instance given valid attributes" do + # pending + # Provider.create!(@valid_attributes) + end +end diff --git a/src/spec/models/user_spec.rb b/src/spec/models/user_spec.rb new file mode 100644 index 0000000..388b116 --- /dev/null +++ b/src/spec/models/user_spec.rb @@ -0,0 +1,13 @@ +require 'spec_helper' + +describe User do + before(:each) do + @valid_attributes = { + + } + end + + it "should create a new user 'tuser'" do + Factory.create(:tuser) + end +end diff --git a/src/spec/spec_helper.rb b/src/spec/spec_helper.rb index 1f72de0..5181389 100644 --- a/src/spec/spec_helper.rb +++ b/src/spec/spec_helper.rb @@ -4,6 +4,7 @@ ENV["RAILS_ENV"] ||= 'test' require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment')) require 'spec/autorun' require 'spec/rails' +require 'authlogic/test_case'
# Uncomment the next line to use webrat's matchers #require 'webrat/integrations/rspec-rails' @@ -51,4 +52,10 @@ Spec::Runner.configure do |config| # == Notes # # For more information take a look at Spec::Runner::Configuration and Spec::Runner + config.before(:each, :type => :controller) do + #activate_authlogic + end + config.after(:each, :type => :controller) do + #current_user_session.destroy + end end diff --git a/src/test/functional/user_sessions_controller_test.rb b/src/test/functional/user_sessions_controller_test.rb index cac84a9..fae1757 100644 --- a/src/test/functional/user_sessions_controller_test.rb +++ b/src/test/functional/user_sessions_controller_test.rb @@ -3,7 +3,7 @@ require 'test_helper' class UserSessionsControllerTest < ActionController::TestCase fixtures :users test "should get new" do - get :login + get :new assert_response :success end
@@ -15,8 +15,8 @@ class UserSessionsControllerTest < ActionController::TestCase end
test "should destroy user session" do - post :create, :user_session => { :login => "tuser", :password => "testpass" } - delete :logout + post :create, :user_session => { :login => "tomuser", :password => "testpass" } + delete :destroy assert_nil UserSession.find assert_redirected_to login_path end