diff --git a/app/models/todo.rb b/app/models/todo.rb
index db5a7453..fe31417c 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -143,19 +143,6 @@ class Todo < ActiveRecord::Base
end
end
- def predecessor_dependencies=(params)
- value = params[:predecessor_dependencies]
- if !value.nil?
- if value.class == Array
- value.each do |attrs|
- predecessor_dependencies.build(attrs)
- end
- else
- predecessor_dependencies.build(value)
- end
- end
- end
-
def save_predecessors
unless @predecessor_array.nil? # Only save predecessors if they changed
current_array = self.predecessors
@@ -190,19 +177,6 @@ class Todo < ActiveRecord::Base
self.activate!
end
- def successor_dependencies=(params)
- value = params[:successor_dependencies]
- if !value.nil?
- if value.class == Array
- value.each do |attrs|
- successor_dependencies.build(attrs)
- end
- else
- successor_dependencies.build(value)
- end
- end
- end
-
# Returns true if t is equal to self or a successor of self
def is_successor?(todo)
if self == todo
@@ -314,6 +288,8 @@ class Todo < ActiveRecord::Base
end
def add_predecessor(t)
+ return if t.nil?
+
@predecessor_array = predecessors
@predecessor_array << t
end
@@ -335,7 +311,63 @@ 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
+
+ alias_method :original_tags=, :tags=
+ 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 20171f99..21da3fdb 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
@@ -51,39 +51,73 @@ class TodoXmlApiTest < ActionController::IntegrationTest
end
def test_post_create_todo_with_dependencies
- old_count = @user.todos.count
authenticated_post_xml_to_todo_create "
this will succeed 2
- 10
- 4
+ 8
+ 1
- 12
+ 5
+ 6
-
- 12
-
"
assert_response :success
- assert_equal @user.todos.count, old_count + 1
+ 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
- old_count = @user.todos.count
authenticated_post_xml_to_todo_create "
- this will succeed 2
- 10
- 4
+ this will succeed 3
+ 8
+ 1
starred
+ starred2
"
- puts @response.body
assert_response :success
- assert_equal @user.todos.count, old_count + 1
+ 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
+ 1
+
+ @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_context
+ authenticated_post_xml_to_todo_create "
+
+ this will succeed 5
+ 8
+
+ 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
@@ -101,7 +135,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