diff --git a/app/models/todo.rb b/app/models/todo.rb index 06b23699..dd309d94 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -288,6 +288,8 @@ class Todo < ActiveRecord::Base end def add_predecessor(t) + return if t.nil? + @predecessor_array = predecessors @predecessor_array << t end @@ -309,7 +311,62 @@ class Todo < ActiveRecord::Base def raw_notes=(value) self[:notes] = value end - + + # XML API fixups + def predecessor_dependencies=(params) + value = params[:predecessor] + + if !value.nil? + if value.class == Array + value.each do |ele| + if ele.is_a? String + add_predecessor(self.user.todos.find_by_id(ele.to_i)) unless ele.blank? + else + predecessor_dependencies.build(value) + end + end + else + if ele.is_a? String + add_predecessor(self.user.todos.find_by_id(ele.to_i)) unless ele.blank? + else + predecessor_dependencies.build(value) + end + end + end + end + + alias_method :original_context=, :context= + def context=(value) + if value.is_a? Context + self.original_context=(value) + else + self.original_context=(Context.create(value)) + end + end + + alias_method :original_project=, :project= + def project=(value) + if value.is_a? Project + self.original_project=(value) + else + self.original_project=(Project.create(value)) + end + end + + def tags=(params) + value = params[:tag] + + if !value.nil? + if value.class == Array + value.each do |attrs| + tags.build(attrs) + end + else + tags.build(value) + end + end + end + # Rich Todo API def self.from_rich_message(user, default_context_id, description, notes) diff --git a/test/integration/todo_xml_api_test.rb b/test/integration/todo_xml_api_test.rb index c7892490..6b080a41 100644 --- a/test/integration/todo_xml_api_test.rb +++ b/test/integration/todo_xml_api_test.rb @@ -8,8 +8,8 @@ class TodoXmlApiTest < ActionController::IntegrationTest def setup assert_test_environment_ok - @user = users(:other_user) - @password = 'sesame' + @user = users(:admin_user) + @password = 'abracadabra' end def test_get_tickler_succeeds @@ -25,10 +25,10 @@ class TodoXmlApiTest < ActionController::IntegrationTest assert_response 401 end - def test_get_tickler_returns_all_deferred_todos - number = @user.todos.deferred.count + def test_get_tickler_returns_all_deferred_and_pending_todos + number = @user.todos.deferred.count + @user.todos.pending.count authenticated_get_xml "/tickler", @user.login, @password, {} - assert_tag :tag => "todos", :children => { :count => number, :only => { :tag => "todo" } } + assert_tag :tag => "todos", :children => { :count => number } end def test_get_tickler_omits_user_id @@ -36,22 +36,97 @@ class TodoXmlApiTest < ActionController::IntegrationTest assert_no_tag :tag => "user_id" end - def test_create_todo_via_xml_show_from + def test_create_todo_with_show_from old_count = @user.todos.count authenticated_post_xml_to_todo_create " Call Warren Buffet to find out how much he makes per day - #{projects(:attendrailsconf).id} - #{contexts(:office_otheruser).id} + #{contexts(:office).id} + #{projects(:timemachine).id} #{1.week.from_now.xmlschema} " assert_response :success assert_equal @user.todos.count, old_count + 1 end + + def test_post_create_todo_with_dependencies + authenticated_post_xml_to_todo_create " + + this will succeed 2 + #{contexts(:office).id} + #{projects(:timemachine).id} + + 5 + 6 + +" + + assert_response :success + todo = @user.todos.find_by_description("this will succeed 2") + assert_not_nil todo + assert !todo.uncompleted_predecessors.empty? + end + + def test_post_create_todo_with_tags + authenticated_post_xml_to_todo_create " + + this will succeed 3 + #{contexts(:office).id} + #{projects(:timemachine).id} + + starred + starred2 + +" + + assert_response :success + todo = @user.todos.find_by_description("this will succeed 3") + assert_not_nil todo + assert !todo.starred? + end + + def test_post_create_todo_with_new_context + authenticated_post_xml_to_todo_create " + + this will succeed 4 + #{projects(:timemachine).id} + + @SomeNewContext + +" + + assert_response :success + todo = @user.todos.find_by_description("this will succeed 4") + assert_not_nil todo + assert_not_nil todo.context + assert_equal todo.context.name, "@SomeNewContext" + end + + def test_post_create_todo_with_new_project + authenticated_post_xml_to_todo_create " + + this will succeed 5 + #{contexts(:office).id} + + Make even more money + +" + + assert_response :success + todo = @user.todos.find_by_description("this will succeed 5") + assert_not_nil todo + assert_not_nil todo.project + assert_equal todo.project.name, "Make even more money" + end def test_post_create_todo_with_wrong_project_and_context_id - authenticated_post_xml_to_todo_create "this will fail-16-11" + authenticated_post_xml_to_todo_create " + + this will fail + -16 + -11 +" assert_response 422 assert_xml_select 'errors' do assert_select 'error', 2 @@ -65,7 +140,7 @@ class TodoXmlApiTest < ActionController::IntegrationTest private - def authenticated_post_xml_to_todo_create(postdata = @@valid_postdata, user = users(:other_user).login, password = 'sesame') + def authenticated_post_xml_to_todo_create(postdata = @@valid_postdata, user = @user.login, password = @password) authenticated_post_xml "/todos", user, password, postdata end