From b7ce19088387971f9965dc202bbd57d2728c77ce Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 5 Sep 2015 23:56:47 -0400 Subject: [PATCH] More tests for users, attachments and wiki pages --- test/fixtures/users.yml | 14 +- .../functional/attachments_controller_test.rb | 1 - test/functional/courses_controller_test.rb | 159 +++++++++++++++--- test/functional/wiki_controller_test.rb | 116 ++++++------- test/test_helper.rb | 50 +++--- 5 files changed, 231 insertions(+), 109 deletions(-) diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index ebab2a6..f8dc2c3 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -18,6 +18,18 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +admin: + id: 1000000 + login: admin + salt: 1000 + name: admin + email: admin@website.com + hashed_password: 77a0d943cdbace52716a9ef9fae12e45e2788d39 # test + display_name: admin + last_seen: <%= Time.now.to_s(:db) %> + admin: true + secret: admin + bob: id: 1000001 login: bob @@ -27,7 +39,7 @@ bob: hashed_password: 77a0d943cdbace52716a9ef9fae12e45e2788d39 # test display_name: bob last_seen: <%= Time.now.to_s(:db) %> - admin: true + admin: false secret: bob existingbob: diff --git a/test/functional/attachments_controller_test.rb b/test/functional/attachments_controller_test.rb index 99dcb1e..7472d4a 100644 --- a/test/functional/attachments_controller_test.rb +++ b/test/functional/attachments_controller_test.rb @@ -85,7 +85,6 @@ class AttachmentsControllerTest < ActionController::TestCase context "on get to :edit" do setup { get :edit, :course_id => @course.id, :id => @att.id } - #should render_a_form should render_template 'edit' end diff --git a/test/functional/courses_controller_test.rb b/test/functional/courses_controller_test.rb index b54a785..aab7d95 100644 --- a/test/functional/courses_controller_test.rb +++ b/test/functional/courses_controller_test.rb @@ -25,22 +25,21 @@ require 'courses_controller' # class CoursesController; def rescue_action(e) raise e end; end class CoursesControllerTest < ActionController::TestCase - def setup @course = courses(:course_1) + @course_id = @course.id @old_course = courses(:old_course) LogEntry.delete_all end context "An anonymous user" do - - should_request_login_on_post_to(:new, {}) - should_request_login_on_post_to(:create, {}) - should_request_login_on_post_to(:edit, id: 1) - should_request_login_on_post_to(:update, id: 1) - should_request_login_on_post_to(:destroy, id: 1) - should_request_login_on_post_to(:enroll, id: 1) - should_request_login_on_post_to(:unenroll, id: 1) + should_request_login_on_post_to(:new) + should_request_login_on_post_to(:create) + should_request_login_on_post_to(:edit, id: 0) + should_request_login_on_post_to(:update, id: 0) + should_request_login_on_post_to(:destroy, id: 0) + should_request_login_on_post_to(:enroll, id: 0) + should_request_login_on_post_to(:unenroll, id: 0) context "on get to :index" do setup { get :index } @@ -60,36 +59,153 @@ class CoursesControllerTest < ActionController::TestCase end context "on get to :show" do - setup { get :show, id: @course.id } + setup do + get :show, id: @course.id + end should respond_with :success should render_template 'show' should "display the course" do assert_select 'a[href=?]', course_log_url(@course) - assert_select 'a[href=?]', course_news_url(@course) - assert_select 'a[href=?]', course_events_url(@course) - assert_select 'a[href=?]', new_course_event_url(@course) - assert_select 'a[href=?]', new_course_attachment_url(@course) - assert_select 'a[href=?]', new_course_wiki_instance_url(@course) + assert_select 'h1', @course.full_name end end end - context "An authenticated user" do - setup { login_as :bob } + context "on :show unknown course" do + setup { get :show, id: 891729312 } + should respond_with :missing + end + + context "A regular user" do + setup do + login_as :bob + end + + should_have_access_denied_on_post_to(:new) + should_have_access_denied_on_post_to(:create) + should_have_access_denied_on_post_to(:edit, id: 0) + should_have_access_denied_on_post_to(:update, id: 0) + should_have_access_denied_on_post_to(:destroy, id: 0) + + context "on get to :enroll" do + setup { get :enroll, id: @course.id } + + should respond_with :redirect + should redirect_to('courses') { courses_path } + + should "enroll on the course" do + assert @user.courses.include?(@course) + end + end + + context "on get to :unenroll" do + setup do + @user.courses << @course + get :unenroll, id: @course.id + end + + should respond_with :redirect + should redirect_to('courses') { courses_path } + + should "disenroll from the course" do + assert !@user.courses.include?(@course) + end + end + end + + context "An admin" do + setup do + login_as :admin + end + + context "on post to :create" do + setup do + post :create, course: { full_name: 'New Course', + short_name: 'new_course', code: 'CK001', + grade: '1', period: '2007.1', hidden: false, + description: '' } + end + + should respond_with :redirect + should set_flash.to(/created/i) + should redirect_to('the new course') { course_path(assigns(:course)) } + end + + context "on get to :edit" do + setup { get :edit, id: @course.id } + + should respond_with :success + should render_template 'edit' + should 'assign to :course' do + assert assigns(:course) + end + end + + context "on post to :update" do + setup do + post :update, id: @course.id, + course: { full_name: 'new full name', + short_name: 'new_short_name', + code: 'CK9999', grade: '999', period: '2999.1', + hidden: true, + description: 'new description' } + end + + should respond_with :redirect + should redirect_to('the updated course') { course_path(assigns(:course)) } + + should "update attributes of course" do + @course = Course.find(@course.id) + assert @course.full_name == 'new full name' + assert @course.short_name == 'new_short_name' + assert @course.code == 'CK9999' + assert @course.grade == 999 + assert @course.period == '2999.1' + assert @course.hidden == true + assert @course.description == 'new description' + end + end + + context "on post to :update with invalid data" do + setup do + post :update, id: @course.id, + course: { full_name: '', + short_name: '', + code: '', grade: 'xxx', period: '', + hidden: 'xxx', + description: '' } + end + + should respond_with :success + should render_template 'edit' + end + + context "on post to :destroy" do + setup { post :destroy, id: @course.id } + + should respond_with :redirect + should redirect_to('courses') { courses_path } + + should "remove course from db" do + assert_raise ActiveRecord::RecordNotFound do + Course.find(@course.id) + end + end + end end - #context "A user" do + # context "A user" do # setup { login_as :bob } # should_be_restful do |resource| # resource.create.params = { short_name: 'test', full_name: 'test', description: 'test' } # resource.update.params = { short_name: 'test', full_name: 'test', description: 'test' } # end - #end + # end ## REST - usuários quaisquer - #context "A stranger" do + # context "A stranger" do # setup { logout } # should_be_restful do |resource| # resource.create.params = { short_name: 'test', full_name: 'test', description: 'test' } @@ -98,6 +214,5 @@ class CoursesControllerTest < ActionController::TestCase # resource.denied.redirect = "'/login'" # resource.denied.flash = /must be logged in/i # end - #end - + # end end diff --git a/test/functional/wiki_controller_test.rb b/test/functional/wiki_controller_test.rb index cf77ae3..30ac4d1 100644 --- a/test/functional/wiki_controller_test.rb +++ b/test/functional/wiki_controller_test.rb @@ -22,20 +22,18 @@ require File.dirname(__FILE__) + '/../test_helper' require 'wiki_controller' # Re-raise errors caught by the controller. -class WikiController; +class WikiController def rescue_action(e) - raise e + fail e end - - ; end class WikiControllerTest < ActionController::TestCase def setup @course = Course.first - @wiki_page = @course.wiki_pages.new(:title => 'test1', - :content => 'content1', :description => 'test', :front_page => true) + @wiki_page = @course.wiki_pages.new(title: 'test1', + content: 'content1', description: 'test', front_page: true) @wiki_page.user = users(:bob) @wiki_page.version = 1 @wiki_page.save! @@ -43,8 +41,8 @@ class WikiControllerTest < ActionController::TestCase @wiki_page.title = 'new title' @wiki_page.save! - @another_wiki_page = @course.wiki_pages.new(:title => 'another', - :content => 'another', :description => 'test', :front_page => true) + @another_wiki_page = @course.wiki_pages.new(title: 'another', + content: 'another', description: 'test', front_page: true) @another_wiki_page.user = users(:bob) @another_wiki_page.version = 1 @another_wiki_page.save! @@ -57,22 +55,23 @@ class WikiControllerTest < ActionController::TestCase end context "An anonymous user" do + should_request_login_on_post_to(:new, { course_id: 1 }) + should_request_login_on_post_to(:create, { course_id: 1 }) + should_request_login_on_post_to(:edit, { course_id: 1, id: 1 }) + should_request_login_on_post_to(:update, { course_id: 1, id: 1 }) + should_request_login_on_post_to(:destroy, { course_id: 1, id: 1 }) + should_request_login_on_post_to(:move_up, { course_id: 1, id: 1 }) + should_request_login_on_post_to(:move_down, { course_id: 1, id: 1 }) - should_request_login_on_post_to(:new, {:course_id => 1}) - should_request_login_on_post_to(:create, {:course_id => 1}) - should_request_login_on_post_to(:edit, {:course_id => 1, :id => 1}) - should_request_login_on_post_to(:update, {:course_id => 1, :id => 1}) - should_request_login_on_post_to(:destroy, {:course_id => 1, :id => 1}) - should_request_login_on_post_to(:move_up, {:course_id => 1, :id => 1}) - should_request_login_on_post_to(:move_down, {:course_id => 1, :id => 1}) + context "on get to :index" do + setup { get :index, course_id: @course.id } - #context "on get to :index" do - # setup { get :index, :course_id => @course.id } - # should redirect_to('the course page') { course_url(@course) } - #end + should respond_with :success + should render_template 'index' + end context "on get to :show" do - setup { get :show, :course_id => @course.id, :id => @wiki_page.id } + setup { get :show, course_id: @course.id, id: @wiki_page.id } should respond_with :success should render_template 'show' @@ -83,27 +82,27 @@ class WikiControllerTest < ActionController::TestCase should "show the selected version" do @wiki_page.revert_to(1) - get :show, :course_id => @course.id, :id => @wiki_page.id, :version => 1 + get :show, course_id: @course.id, id: @wiki_page.id, version: 1 assert_select 'h1.title', @wiki_page.title end end context "on get to :versions" do - setup { get :versions, :course_id => @course.id, :id => @wiki_page.id } + setup { get :versions, course_id: @course.id, id: @wiki_page.id } should respond_with :success should render_template 'versions' should "show the wiki page versions" do @wiki_page.versions.each do |v| - assert_select 'a[href=?]', course_wiki_instance_url(@course, @wiki_page, :version => v.version) + assert_select 'a[href=?]', course_wiki_instance_url(@course, @wiki_page, version: v.version) end end end context "on get to :preview" do context "with valid markup" do - setup { get :preview, :text => "hello {$x$} x" } + setup { get :preview, text: "hello {$x$} x" } should respond_with :success @@ -114,50 +113,53 @@ class WikiControllerTest < ActionController::TestCase end context "with invalid markup" do - setup { get :preview, :text => " @course.id, :id => @wiki_page.id, :from => 1, :to => 2 } + setup { get :diff, course_id: @course.id, id: @wiki_page.id, from: 1, to: 2 } should respond_with :success - #should assign_to :diff + # should assign_to :diff end - end context "An authenticated user" do setup { login_as :bob } context "on get to :new" do - setup { get :new, :course_id => @course.id } - #should render_a_form + setup { get :new, course_id: @course.id } should respond_with :success end context "on post to :create" do setup do - assert_nil @course.wiki_pages.find_by_title('test2') - post :create, :course_id => @course.id, :wiki_page => {:title => 'test2', :content => 'test2'} - @wiki_page = @course.wiki_pages.find_by_title('test2') + post :create, course_id: @course.id, + wiki_page: { title: 'New Wiki Page', + content: 'This is a new wiki page.' } end + should respond_with :redirect should set_flash.to(/created/i) - should redirect_to('the wiki page') { course_wiki_instance_url(@course, @wiki_page) } - should_create_log_entry { [WikiCreateLogEntry, @wiki_page.id, users(:bob).id] } + should redirect_to('the wiki page') { + course_wiki_instance_url(@course, assigns(:wiki_page)) + } + should_create_log_entry do + [WikiCreateLogEntry, assigns(:wiki_page).id, users(:bob).id] + end should "create a new wiki page" do - assert @wiki_page - assert_equal @wiki_page.version, 1 - assert_equal users(:bob).id, @wiki_page.user_id + assert assigns(:wiki_page) + assert_equal assigns(:wiki_page).version, 1 + assert_equal users(:bob).id, assigns(:wiki_page).user_id end end context "on get to :edit" do - setup { get :edit, :course_id => @course.id, :id => @wiki_page.id } + setup { get :edit, course_id: @course.id, id: @wiki_page.id } - #should render_a_form + # should render_a_form should render_template 'edit' should "render a form with the correct fields" do @@ -168,7 +170,7 @@ class WikiControllerTest < ActionController::TestCase should "edit the selected version" do @wiki_page.revert_to(1) - get :edit, :course_id => @course.id, :id => @wiki_page.id, :version => 1 + get :edit, course_id: @course.id, id: @wiki_page.id, version: 1 assert_select "input[name='wiki_page[title]'][value=?]", @wiki_page.title assert_select 'textarea', @wiki_page.content end @@ -177,22 +179,22 @@ class WikiControllerTest < ActionController::TestCase context "on post to :update" do context "with unmodified data" do setup do - post :update, :course_id => @course.id, :id => @wiki_page.id, :wiki_page => { - :title => @wiki_page.title, :content => @wiki_page.content} + post :update, course_id: @course.id, id: @wiki_page.id, wiki_page: { + title: @wiki_page.title, content: @wiki_page.content } end should_not set_flash should redirect_to('the wiki page') { course_wiki_instance_url(@course, @wiki_page) } should "not create a new log entry" do - assert_nil WikiEditLogEntry.find(:first, :conditions => {:target_id => @wiki_page.id}) + assert_nil WikiEditLogEntry.find(:first, conditions: { target_id: @wiki_page.id }) end end context "with new data" do setup do - post :update, :course_id => @course.id, :id => @wiki_page.id, :wiki_page => { - :title => 'brand new title', :content => 'brand new content'} + post :update, course_id: @course.id, id: @wiki_page.id, wiki_page: { + title: 'brand new title', content: 'brand new content' } @wiki_page.reload end @@ -210,7 +212,7 @@ class WikiControllerTest < ActionController::TestCase end context "on post to :destroy" do - setup { post :destroy, :course_id => @course.id, :id => @wiki_page.id } + setup { post :destroy, course_id: @course.id, id: @wiki_page.id } should set_flash.to(/removed/i) should redirect_to('the course page') { course_url(@course) } @@ -226,7 +228,7 @@ class WikiControllerTest < ActionController::TestCase setup do assert_equal 1, @wiki_page.position assert_equal 2, @another_wiki_page.position - get :move_up, :course_id => @course.id, :id => @another_wiki_page.id + get :move_up, course_id: @course.id, id: @another_wiki_page.id end should redirect_to('the course page') { course_url(@course) } @@ -243,7 +245,7 @@ class WikiControllerTest < ActionController::TestCase setup do assert_equal 1, @wiki_page.position assert_equal 2, @another_wiki_page.position - get :move_down, :course_id => @course.id, :id => @wiki_page.id + get :move_down, course_id: @course.id, id: @wiki_page.id end should redirect_to('the course page') { course_url(@course) } @@ -255,21 +257,5 @@ class WikiControllerTest < ActionController::TestCase assert_equal 1, @another_wiki_page.position end end - end - - #def test_should accept_text_on_show - # get :show, :format => 'txt', :course_id => 1, :id => @wiki_page.id - # assert_formatted_response :text - #end - - #def test_should accept_html_on_versions - # get :versions, :course_id => 1, :id => @wiki_page.id - # assert_response :success - #end - - #def test_should accept_xml_on_versions - # get :versions, :format => 'xml', :course_id => 1, :id => @wiki_page.id - # assert_formatted_response :xml, :versions - #end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 4a19bcb..5bc4cd7 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,6 +1,15 @@ require 'simplecov' SimpleCov.start +require 'turn/colorize' +module Turn + module Colorize + def self.color_supported? + true + end + end +end + ENV["RAILS_ENV"] = "test" require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' @@ -14,8 +23,9 @@ class ActiveSupport::TestCase # Add more helper methods to be used by all tests here... def login_as(user) - @request.session[:user_id] = users(user).id - @request.env["HTTP_AUTHORIZATION"] = user ? "Basic #{Base64.encode64("#{users(user).login}:test")}" : nil + @user = users(user) + @request.session[:user_id] = @user.id + @request.env["HTTP_AUTHORIZATION"] = user ? "Basic #{Base64.encode64("#{@user.login}:test")}" : nil end def logout @@ -23,45 +33,45 @@ class ActiveSupport::TestCase @request.env["HTTP_AUTHORIZATION"] = nil end - def assert_formatted_response(type, element=nil) + def assert_formatted_response(type, element = nil) assert_response :success snippet = "Body: #{@response.body.first(100).chomp}..." case type - when :rss - assert_equal Mime::RSS, @response.content_type, snippet - assert_select "channel", 1, snippet - when :ics - assert_equal Mime::ICS, @response.content_type, snippet - when :text - assert_equal Mime::TEXT, @response.content_type, snippet - when :xml - assert_select element.to_s.dasherize, 1, snippet - else - raise ArgumentError + when :rss + assert_equal Mime::RSS, @response.content_type, snippet + assert_select "channel", 1, snippet + when :ics + assert_equal Mime::ICS, @response.content_type, snippet + when :text + assert_equal Mime::TEXT, @response.content_type, snippet + when :xml + assert_select element.to_s.dasherize, 1, snippet + else + fail ArgumentError end end end class Test::Unit::TestCase - def self.should_request_login_on_post_to(action, params) + def self.should_request_login_on_post_to(action, params = {}) should "request login on post to #{action}" do post action, params assert_redirected_to login_url end end - def self.should_have_access_denied_on_post_to(action, params) + def self.should_have_access_denied_on_post_to(action, params = {}) should "have access denied on post to #{action}" do - assert_raises AccessDenied do - post action, params - end + post action, params + assert_response 401 end end def self.should_create_log_entry(&block) should "create log entry" do log_entry_class, target_id, user_id = instance_eval(&block) - assert log_entry_class.find(:first, :conditions => {:user_id => user_id, :target_id => target_id}) + assert log_entry_class.find(:first, conditions: { user_id: user_id, + target_id: target_id }) end end end