From ba3757f29ef011467b954ebf5abc65788b0c7662 Mon Sep 17 00:00:00 2001 From: lukemelia Date: Sat, 16 Sep 2006 06:50:22 +0000 Subject: [PATCH] Rename new_context and new_project actions to create to fit into the CRUD model, add tests for these methods, too. Add a plugin to allow executing tests using an in-memory sqlite database. Faster! git-svn-id: http://www.rousette.org.uk/svn/tracks-repos/trunk@318 a4c988fc-2ded-0310-b66e-134b36920a42 --- tracks/app/controllers/application.rb | 4 + tracks/app/controllers/backend_controller.rb | 6 +- tracks/app/controllers/context_controller.rb | 25 +++++- tracks/app/controllers/project_controller.rb | 25 +++++- tracks/app/controllers/todo_controller.rb | 16 ++-- tracks/app/controllers/user_controller.rb | 8 +- .../app/views/context/_context_listing.rhtml | 2 +- .../context/{new_context.rjs => create.rjs} | 0 tracks/app/views/context/list.rhtml | 2 +- .../app/views/project/_project_listing.rhtml | 2 +- .../project/{new_project.rjs => create.rjs} | 0 tracks/app/views/project/list.rhtml | 2 +- .../views/todo/{add_item.rjs => create.rjs} | 0 tracks/config/database.yml.tmpl | 7 +- tracks/config/routes.rb | 4 +- tracks/db/schema.rb | 22 +++--- .../functional/context_controller_test.rb | 30 ++++---- .../functional/project_controller_test.rb | 29 +++---- .../todo_container_controller_test_base.rb | 32 ++++++++ .../test/integration/context_xml_api_test.rb | 76 +++++++++++++++++++ .../test/integration/create_user_api_test.rb | 60 +++++---------- .../test/integration/project_xml_api_test.rb | 76 +++++++++++++++++++ tracks/test/integration/stories_test.rb | 2 +- tracks/test/test_helper.rb | 37 +++++++++ tracks/vendor/plugins/memory_test_fix/README | 20 +++++ .../vendor/plugins/memory_test_fix/Rakefile | 22 ++++++ .../vendor/plugins/memory_test_fix/about.yml | 7 ++ tracks/vendor/plugins/memory_test_fix/init.rb | 2 + .../memory_test_fix/lib/memory_test_fix.rb | 12 +++ 29 files changed, 416 insertions(+), 114 deletions(-) rename tracks/app/views/context/{new_context.rjs => create.rjs} (100%) rename tracks/app/views/project/{new_project.rjs => create.rjs} (100%) rename tracks/app/views/todo/{add_item.rjs => create.rjs} (100%) create mode 100644 tracks/test/functional/todo_container_controller_test_base.rb create mode 100644 tracks/test/integration/context_xml_api_test.rb create mode 100644 tracks/test/integration/project_xml_api_test.rb create mode 100644 tracks/vendor/plugins/memory_test_fix/README create mode 100644 tracks/vendor/plugins/memory_test_fix/Rakefile create mode 100644 tracks/vendor/plugins/memory_test_fix/about.yml create mode 100644 tracks/vendor/plugins/memory_test_fix/init.rb create mode 100644 tracks/vendor/plugins/memory_test_fix/lib/memory_test_fix.rb diff --git a/tracks/app/controllers/application.rb b/tracks/app/controllers/application.rb index e040795a..8f7ef3f4 100644 --- a/tracks/app/controllers/application.rb +++ b/tracks/app/controllers/application.rb @@ -66,6 +66,10 @@ class ApplicationController < ActionController::Base redirect_with_flash message, options end + def render_failure message, status = 404 + render :text => message, :status => status + end + private def get_current_user diff --git a/tracks/app/controllers/backend_controller.rb b/tracks/app/controllers/backend_controller.rb index 51ec3e1c..6507bfba 100644 --- a/tracks/app/controllers/backend_controller.rb +++ b/tracks/app/controllers/backend_controller.rb @@ -32,14 +32,14 @@ class BackendController < ApplicationController # Check whether the token in the URL matches the word in the User's table def check_token_against_user_word(username, token) @user = User.find_by_login( username ) - unless ( token == @user.word) - raise (InvalidToken, "Sorry, you don't have permission to perform this action.") + unless (token == @user.word) + raise(InvalidToken, "Sorry, you don't have permission to perform this action.") end end def check_context_belongs_to_user(context_id) unless @user.contexts.exists? context_id - raise (CannotAccessContext, "Cannot access a context that does not belong to this user.") + raise(CannotAccessContext, "Cannot access a context that does not belong to this user.") end end diff --git a/tracks/app/controllers/context_controller.rb b/tracks/app/controllers/context_controller.rb index c3ead4de..8ab6f991 100644 --- a/tracks/app/controllers/context_controller.rb +++ b/tracks/app/controllers/context_controller.rb @@ -32,14 +32,33 @@ class ContextController < ApplicationController @page_title = "TRACKS::Context: #{@context.name}" end - # Creates a new context via Ajax helpers + # Example XML usage: curl -H 'Accept: application/xml' -H 'Content-Type: application/xml' + # -u username:password + # -d 'new context_name' + # http://our.tracks.host/context/create # - def new_context + def create @context = @user.contexts.build - @context.attributes = params['context'] + params_are_invalid = true + if (params['context'] || (params['request'] && params['request']['context'])) + @context.attributes = params['context'] || params['request']['context'] + params_are_invalid = false + end @context.name = deurlize(@context.name) @saved = @context.save @context_not_done_counts = { @context.id => 0 } + respond_to do |wants| + wants.js + wants.xml do + if @context.new_record? && params_are_invalid + render_failure "Expected post format is xml like so: context name." + elsif @context.new_record? + render_failure @context.errors.full_messages.join(', ') + else + render :xml => @context.to_xml( :except => :user_id ) + end + end + end end # Called by a form button diff --git a/tracks/app/controllers/project_controller.rb b/tracks/app/controllers/project_controller.rb index ac6c0404..9f1bdfb8 100644 --- a/tracks/app/controllers/project_controller.rb +++ b/tracks/app/controllers/project_controller.rb @@ -56,12 +56,33 @@ class ProjectController < ApplicationController end end - def new_project + # Example XML usage: curl -H 'Accept: application/xml' -H 'Content-Type: application/xml' + # -u username:password + # -d 'new project_name' + # http://our.tracks.host/project/create + # + def create @project = @user.projects.build - @project.attributes = params['project'] + params_are_invalid = true + if (params['project'] || (params['request'] && params['request']['project'])) + @project.attributes = params['project'] || params['request']['project'] + params_are_invalid = false + end @project.name = deurlize(@project.name) @saved = @project.save @project_not_done_counts = { @project.id => 0 } + respond_to do |wants| + wants.js + wants.xml do + if @project.new_record? && params_are_invalid + render_failure "Expected post format is xml like so: project name." + elsif @project.new_record? + render_failure @project.errors.full_messages.join(', ') + else + render :xml => @project.to_xml( :except => :user_id ) + end + end + end end # Called by a form button diff --git a/tracks/app/controllers/todo_controller.rb b/tracks/app/controllers/todo_controller.rb index cfedb562..3002c3bd 100644 --- a/tracks/app/controllers/todo_controller.rb +++ b/tracks/app/controllers/todo_controller.rb @@ -47,16 +47,14 @@ class TodoController < ApplicationController end end - # Called by a form button - # Parameters from form fields are passed to create new action - # in the selected context. - def add_item + def create init @item = @user.todos.build - @item.attributes = params["todo"] + p = params['todo'] || params['request']['todo'] + @item.attributes = p if @item.due? - @item.due = parse_date_per_user_prefs(params["todo"]["due"]) + @item.due = parse_date_per_user_prefs(p["due"]) else @item.due = "" end @@ -70,7 +68,7 @@ class TodoController < ApplicationController init_todos @up_count = @todos.reject { |x| x.done? or x.context.hide? }.size.to_s end - render + render :action => 'create' end wants.xml { render :xml => @item.to_xml( :root => 'todo', :except => :user_id ) } end @@ -86,6 +84,10 @@ class TodoController < ApplicationController wants.xml { render :text => 'An error occurred on the server.' + $! } end end + + def add_item + create + end def edit init diff --git a/tracks/app/controllers/user_controller.rb b/tracks/app/controllers/user_controller.rb index 1e8d6e68..338825eb 100644 --- a/tracks/app/controllers/user_controller.rb +++ b/tracks/app/controllers/user_controller.rb @@ -18,7 +18,7 @@ class UserController < ApplicationController # Example usage: curl -H 'Accept: application/xml' -H 'Content-Type: application/xml' # -u admin:up2n0g00d # -d 'usernameabc123' - # http://our.tracks.host/cpa/create_user + # http://our.tracks.host/user/create # def create admin = User.find_admin @@ -108,11 +108,7 @@ class UserController < ApplicationController end private - - def render_failure message, status = 404 - render :text => message, :status => status - end - + def check_create_user_params return false unless params.has_key?(:request) return false unless params[:request].has_key?(:login) diff --git a/tracks/app/views/context/_context_listing.rhtml b/tracks/app/views/context/_context_listing.rhtml index 4dc2ae50..1cbb6ae2 100644 --- a/tracks/app/views/context/_context_listing.rhtml +++ b/tracks/app/views/context/_context_listing.rhtml @@ -41,7 +41,7 @@ <%= end_form_tag %> -<% if controller.action_name == 'new_context' %> +<% if controller.action_name == 'create' %> diff --git a/tracks/app/views/context/new_context.rjs b/tracks/app/views/context/create.rjs similarity index 100% rename from tracks/app/views/context/new_context.rjs rename to tracks/app/views/context/create.rjs diff --git a/tracks/app/views/context/list.rhtml b/tracks/app/views/context/list.rhtml index 39faec8c..3d31d992 100644 --- a/tracks/app/views/context/list.rhtml +++ b/tracks/app/views/context/list.rhtml @@ -16,7 +16,7 @@ Create new context » -<% if controller.action_name == 'new_project' %> +<% if controller.action_name == 'create' %> diff --git a/tracks/app/views/project/new_project.rjs b/tracks/app/views/project/create.rjs similarity index 100% rename from tracks/app/views/project/new_project.rjs rename to tracks/app/views/project/create.rjs diff --git a/tracks/app/views/project/list.rhtml b/tracks/app/views/project/list.rhtml index 5f53798c..b8c570bb 100644 --- a/tracks/app/views/project/list.rhtml +++ b/tracks/app/views/project/list.rhtml @@ -15,7 +15,7 @@ Create new project »