backlog 0.6.6 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,14 @@
1
+ == 0.7.0 2007-08-14
2
+
3
+ * Back in business after halting to avoid spamming people.
4
+ * Fixed work flow when moving task to other period using drag&drop in side bar
5
+ * Fixed bug in moving tasks to other periods
6
+ * Optimized slightly by omitting generating layout data for no_layout action
7
+ * Added more validation of "position" fields
8
+ * Added completed tasks to backlog edit view
9
+ * Removed unique index for periods(party_id, position) since it broke list updates in PostgreSQL
10
+ * Added better assertion of position sequences in tests
11
+
1
12
  == 0.6.6 2007-08-07
2
13
 
3
14
  * Improved task lists in backlog edit view.
@@ -4,6 +4,7 @@ require 'user_system'
4
4
  class ApplicationController < ActionController::Base
5
5
  include Localization
6
6
  include UserSystem
7
+ include ApplicationHelper
7
8
  include ActionView::Helpers::TagHelper
8
9
  include ActionView::Helpers::JavaScriptHelper
9
10
  include ActionView::Helpers::PrototypeHelper
@@ -138,7 +139,7 @@ class ApplicationController < ActionController::Base
138
139
  content << "</ul>\n"
139
140
  content << drop_receiving_element("sidebar_#{period.id}",
140
141
  :update => "spotlight",
141
- :url => { :controller => 'tasks', :action => "move_to_period", :period_id => period.id},
142
+ :url => with_detour({:controller => 'tasks', :action => "move_to_period", :period_id => period.id, :layout => false}),
142
143
  :accept => "tasks", :loading => "", :complete => "",
143
144
  :hoverclass => 'highlight')
144
145
 
@@ -1,5 +1,5 @@
1
1
  class PeriodsController < ApplicationController
2
- skip_before_filter :populate_layout, :only => [:index, :show_nolayout, :destroy, :burn_down_chart_thumbnail, :burn_down_chart]
2
+ skip_before_filter :populate_layout, :only => [:index, :show_no_layout, :destroy, :burn_down_chart_thumbnail, :burn_down_chart]
3
3
  skip_before_filter :authenticate_user, :only => [:burn_down_chart, :burn_down_chart_thumbnail, :burn_down_chart_large]
4
4
 
5
5
  def index
@@ -59,18 +59,24 @@ class TasksController < ApplicationController
59
59
  back_or_redirect_to :controller => 'periods', :action => :show, :id => @task.period, :task => @task.id
60
60
  return
61
61
  end
62
+
63
+ # TODO (uwe): This should be moved to the Task model: Task#period=
62
64
  if params[:task] && params[:task][:period_id]
63
65
  if params[:task][:period_id] != ''
64
66
  if params[:task][:period_id].to_i != @task.period_id
67
+ @task.remove_from_list
65
68
  params[:task][:position] = Period.find(params[:task][:period_id]).tasks.size
66
69
  end
67
70
  else
68
71
  if @task.period_id != nil
72
+ @task.remove_from_list
69
73
  @task.period = nil
70
- params[:task][:position] = @task.backlog.tasks.count(:conditions => 'period_id IS NULL') + 1
74
+ new_pos = @task.backlog.tasks.count(:conditions => 'period_id IS NULL') + 1
75
+ params[:task][:position] = new_pos
71
76
  end
72
77
  end
73
78
  end
79
+
74
80
  if params[:task] && @task.update_attributes(params[:task])
75
81
  flash[:notice] = 'Task was successfully updated.'
76
82
  if params[:task][:todo] && params[:task][:todo].to_i == 0
@@ -137,11 +143,11 @@ class TasksController < ApplicationController
137
143
  end
138
144
  task.insert_at params[:position]
139
145
  task.save!
140
- back_or_redirect_to :controller => 'periods', :action => :show_nolayout, :id => task.period, :task => task.id
146
+ back_or_redirect_to :controller => 'periods', :action => :show_no_layout, :id => task.period, :task => task.id
141
147
  end
142
148
 
143
149
  def move_to_period(with_layout = false)
144
- task = Task.find(params[:id])
150
+ task = Task.find(params[:id][5..-1])
145
151
  if request.post?
146
152
  period = params[:period_id] && Period.find(params[:period_id])
147
153
  if period && period.active_or_future?
@@ -150,7 +156,7 @@ class TasksController < ApplicationController
150
156
  if with_layout
151
157
  back_or_redirect_to :controller => 'periods', :action => :show, :id => next_task.period, :task_id => next_task.id
152
158
  else
153
- back_or_redirect_to :controller => 'periods', :action => :show_nolayout, :id => next_task.period, :task_id => next_task.id
159
+ back_or_redirect_to :controller => 'periods', :action => :show_no_layout, :id => next_task.period, :task_id => next_task.id
154
160
  end
155
161
  else
156
162
  detour_to :controller => 'periods', :action => :new, :period => {:party_id => task.period.party_id}, :layout => with_layout && determine_layout
@@ -164,6 +170,7 @@ class TasksController < ApplicationController
164
170
  task = Task.find(params[:id])
165
171
  if task.period
166
172
  params[:period_id] = task.period.lower_item && task.period.lower_item.id
173
+ params[:id] = 'task_' + task.id.to_s
167
174
  move_to_period(true)
168
175
  else
169
176
  redirect_to :action => :edit, :id => task
@@ -11,10 +11,10 @@ module ApplicationHelper
11
11
  end
12
12
 
13
13
  def detour_to(title, options, html_options = nil)
14
- link_to title, options_for_detour(options), html_options
14
+ link_to title, with_detour(options), html_options
15
15
  end
16
16
 
17
- def options_for_detour(options)
17
+ def with_detour(options)
18
18
  detour_options = {:detour => params.reject {|k, v| [:detour, :return_from_detour].include? k.to_sym}}.update(options)
19
19
  if options[:layout]== false
20
20
  if params[:action] !~ /_no_layout$/
@@ -10,6 +10,7 @@ class Backlog < ActiveRecord::Base
10
10
  validates_length_of :invoice_code, :allow_nil => true, :maximum => 255
11
11
 
12
12
  has_many :tasks, :order => 'period_id, position', :dependent => :destroy
13
+ has_many :unplanned_tasks, :class_name => 'Task', :conditions => 'period_id IS NULL', :order => 'position'
13
14
 
14
15
  def active_tasks
15
16
  tasks.find(:all, :conditions => "finished_at IS NULL", :order => "position")
data/app/models/group.rb CHANGED
@@ -1,4 +1,3 @@
1
- #class Group < ActiveRecord::Base
2
1
  class Group < Party
3
2
  class_table_inheritance
4
3
 
data/app/models/task.rb CHANGED
@@ -16,11 +16,11 @@ class Task < ActiveRecord::Base
16
16
 
17
17
  validates_presence_of :backlog_id, :if => Proc.new { |task| task.parent_id.nil? }
18
18
  validates_presence_of :parent_id, :if => Proc.new { |task| task.backlog_id.nil? }
19
- #validates_absence_of :position, :if => :finished_at
20
- #validates_absence_of :finished_at, :if => :position
19
+ validates_presence_of :position, :if => Proc.new { |task| task.finished_at.nil? }
20
+ validates_presence_of :finished_at, :if => Proc.new { |task| task.position.nil? }
21
21
  validates_presence_of :resolution, :if => :finished_at
22
22
  validates_presence_of :description, :if => :backlog_id
23
-
23
+
24
24
  validates_size_of :description, :maximum => 80, :if => :description
25
25
  validates_size_of :customer, :maximum => 64, :if => :customer
26
26
 
@@ -121,7 +121,7 @@ class Task < ActiveRecord::Base
121
121
  parent.open if parent
122
122
  end
123
123
  end
124
-
124
+
125
125
  def reopen
126
126
  if period.passed?
127
127
  flash[:notice] = "You cannot reopen a task in a period that is passed."
@@ -132,23 +132,46 @@ class Task < ActiveRecord::Base
132
132
  end
133
133
  end
134
134
 
135
- def move_to_period(period)
136
- raise "Period missing" unless period
135
+ def move_to_period(new_period)
136
+ raise "Period missing" unless new_period
137
137
  raise "Cannot move finished tasks" unless active?
138
+ return if new_period == period
138
139
 
139
- ancestor_id = self.previous_task_id || self.id
140
- new_task = Task.find_by_period_id_and_id(period.id, ancestor_id)
141
- new_task ||= Task.find_by_period_id_and_previous_task_id(period.id, ancestor_id)
142
- new_task ||= Task.new
143
- new_task.open
144
- new_task.previous_task_id = self.previous_task_id || self.id
145
- new_task.backlog = root_task.backlog
146
- new_task.period = period
147
- new_task.description = self.description
148
- new_task.save!
149
- new_task.estimate(self.todo)
150
- new_task.move_to_top
151
- self.finish(new_task.period.party == self.period.party ? Task::POSTPONED : Task::MOVED, true)
140
+ self.remove_from_list
141
+ self.position = nil
142
+
143
+ if self.period
144
+ self.finish(new_period.party == self.period.party ? Task::POSTPONED : Task::MOVED, true)
145
+ ancestor_id = self.previous_task_id || self.id
146
+ existing_task = Task.find_by_period_id_and_id(new_period.id, ancestor_id)
147
+ if existing_task ||= Task.find_by_period_id_and_previous_task_id(new_period.id, ancestor_id)
148
+ raise "mismatch" unless existing_task.backlog == root_task.backlog
149
+ raise "Mismatch" unless existing_task.period == new_period
150
+ existing_task.open
151
+ existing_task.previous_task_id = self.previous_task_id || self.id
152
+ existing_task.description = self.description
153
+ existing_task.save!
154
+ existing_task.estimate(self.todo)
155
+ existing_task.move_to_top
156
+ existing_task.save!
157
+ else
158
+ new_task = Task.new
159
+ new_task.previous_task_id = self.previous_task_id || self.id
160
+ new_task.backlog = root_task.backlog
161
+ new_task.period = new_period
162
+ new_task.description = self.description
163
+ new_task.insert_at 1
164
+ new_task.save!
165
+ new_task.estimate(self.todo)
166
+ end
167
+ else
168
+ self.period_id = new_period.id
169
+ self.period = new_period
170
+ self.insert_at(1)
171
+ self.position = 1
172
+ self.move_to_bottom
173
+ self.save!
174
+ end
152
175
  end
153
176
 
154
177
  def finish(resolution, save_work)
@@ -10,11 +10,20 @@
10
10
  <% current_period = nil %>
11
11
  <% for @task in tasks %>
12
12
  <% if @task.period != current_period %>
13
- <tr><th colspan="6"><%=link_to (@task.period ? h(@task.period.name) : l(:unplanned_tasks)), :controller => 'periods', :action => :show, :id => @task.period%></th></tr>
14
- <%= render :partial => '/tasks/fields_header', :locals => {:backlog => @backlog, :track_times => tasks.find {|t|t.period && t.period.active?}} %>
13
+ <%= render :partial => '/tasks/period_header', :locals => {:period => @task.period} %>
14
+ <%= render :partial => '/tasks/fields_header', :locals => {:backlog => @backlog, :active => true, :track_times => tasks.find {|t|t.period && t.period.active?}} %>
15
15
  <% current_period = @task.period %>
16
16
  <% end %>
17
17
  <%= render :partial => '/tasks/task/', :locals => {:task => @task, :i => i += 1, :active => true, :highlight_task => false, :update => :maincontent} %>
18
18
  <% end %>
19
19
  </table>
20
20
  </div>
21
+
22
+ <div class="mainblock">
23
+ <div class="btitle">
24
+ <h4><%=l(:completed_tasks) %></h4>
25
+ </div>
26
+
27
+ <%=render :partial => '/tasks/completed', :locals => {:i => 1} %>
28
+ </div>
29
+
@@ -10,14 +10,5 @@
10
10
 
11
11
  <div id="maincontent">
12
12
  <%=render :partial => 'tasks', :locals => {:tasks => @tasks}%>
13
-
14
- <div class="mainblock">
15
- <div class="btitle">
16
- <h4><%=l(:completed_tasks) %></h4>
17
- </div>
18
-
19
- <%=render :partial => '/tasks/completed', :locals => {:i => 1} %>
20
- </div>
21
-
22
13
  </div>
23
14
 
@@ -38,7 +38,7 @@ function handleEvent(field, event, id) {
38
38
  <% if task.backlog != current_backlog %>
39
39
  <%= '<tr><td>&nbsp;</td></tr>' if current_backlog %>
40
40
  <%=render :partial => '/tasks/backlog_header', :locals => { :backlog => task.backlog, :track_times => @tasks.find {|t|t.period && t.period.active?} } %>
41
- <%= render :partial => '/tasks/fields_header', :locals => { :backlog => task.backlog, :track_times => @tasks.find {|t|t.period && t.period.active?} } %>
41
+ <%= render :partial => '/tasks/fields_header', :locals => { :backlog => task.backlog, :active => true, :track_times => @tasks.find {|t|t.period && t.period.active?} } %>
42
42
  <% current_backlog = task.backlog %>
43
43
  <% end %>
44
44
  <%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => true, :highlight_task => task == @selected_task, :update => :spotlight } %>
@@ -1,4 +1,5 @@
1
1
  <table class="input">
2
+ <!--
2
3
  <tr>
3
4
  <th/>
4
5
  <th align="left"><%=l :resolution %></th>
@@ -6,7 +7,14 @@
6
7
  <th></th>
7
8
  <th><%=l(:done) if (@period && @period.track_work?) || @completed_tasks.find {|t| t.track_times?} %></th>
8
9
  </tr>
10
+ -->
11
+ <% current_period = @completed_tasks.map(&:period).uniq.size == 1 ? @completed_tasks.first.period : nil%>
9
12
  <% for task in @completed_tasks %>
13
+ <% if task.period != current_period %>
14
+ <%= render :partial => '/tasks/period_header', :locals => {:period => task.period} %>
15
+ <%= render :partial => '/tasks/fields_header', :locals => {:backlog => @backlog, :active => false, :track_times => false} %>
16
+ <% current_period = task.period %>
17
+ <% end %>
10
18
  <%=render :partial => '/tasks/task', :locals => { :task => task, :i => i, :active => false, :highlight_task => task == @selected_task } %>
11
19
  <% i += 1 %>
12
20
  <% end %>
@@ -1,6 +1,6 @@
1
1
  <tr>
2
2
  <th/>
3
- <th align="center">#</th>
3
+ <th align="center"><%=active ? '#' : l(:resolution)%></th>
4
4
  <th><%=l :task %></th>
5
5
  <th><%=l :start if backlog.track_times? && track_times %></th>
6
6
  <th><%=l :done if backlog.track_done? %></th>
@@ -29,12 +29,12 @@
29
29
  <p><label for="task_description"><%=l :task%></label><br/>
30
30
  <%= text_field 'task', 'description', :size => 64, :maxlength => 80 %></p>
31
31
 
32
- <% if @task.period.nil? || @task.enable_customer? %>
32
+ <% if @task.enable_customer? %>
33
33
  <p><label for="task_customer"><%=l :customer%></label><br/>
34
34
  <%= text_field 'task', 'customer', :size => 64 %></p>
35
35
  <% end %>
36
36
 
37
- <% if @task.period.nil? || @task.track_todo? %>
37
+ <% if @task.track_todo? %>
38
38
  <p><label for="task_initial_estimate"><%=l :estimate%></label><br/>
39
39
  <%= text_field 'task', 'initial_estimate', :size => 4 %></p>
40
40
  <% end %>
@@ -0,0 +1 @@
1
+ <tr><th colspan="6"><%=link_to (period ? h(period.name) : l(:unplanned_tasks)), :controller => 'periods', :action => :show, :id => period%></th></tr>
@@ -85,10 +85,10 @@
85
85
  </td>
86
86
  </tr>
87
87
 
88
- <% if active && (@task.period.nil? || @task.period.active_or_future?) && (not @task.work_started?) %>
89
- <%= draggable_element "task_#{@task.id}", :revert => true, :constraint => "'vertical'" %>
88
+ <% if active && (@task.period.nil? || @task.period.active_or_future?) %>
89
+ <%= draggable_element "task_#{@task.id}", :revert => true %>
90
90
  <%= drop_receiving_element "task_#{@task.id}",
91
- :update => update, :url => options_for_detour({:controller => 'tasks', :action => "move_to", :period_id => @task.period_id, :position => @task.position, :layout => false}),
91
+ :update => update, :url => with_detour({:controller => 'tasks', :action => "move_to", :period_id => @task.period_id, :position => @task.position, :layout => false}),
92
92
  :accept => "tasks",
93
93
  :loading => "",
94
94
  :complete => "",
@@ -0,0 +1,9 @@
1
+ class RemoveUniqueIndexForPeriodPosition < ActiveRecord::Migration
2
+ def self.up
3
+ remove_index "periods", ["party_id", "position"]
4
+ end
5
+
6
+ def self.down
7
+ add_index "periods", ["position", "party_id"], :name => "index_periods_on_party_id_and_position", :unique => true
8
+ end
9
+ end
data/db/schema.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  # migrations feature of ActiveRecord to incrementally modify your database, and
3
3
  # then regenerate this schema definition.
4
4
 
5
- ActiveRecord::Schema.define(:version => 18) do
5
+ ActiveRecord::Schema.define(:version => 19) do
6
6
 
7
7
  create_table "backlogs", :force => true do |t|
8
8
  t.string "name", :limit => 64, :null => false
@@ -44,8 +44,6 @@ ActiveRecord::Schema.define(:version => 18) do
44
44
  t.integer "party_id"
45
45
  end
46
46
 
47
- add_index "periods", ["position", "party_id"], :name => "index_periods_on_party_id_and_position", :unique => true
48
-
49
47
  create_table "tasks", :force => true do |t|
50
48
  t.integer "position"
51
49
  t.string "description", :limit => 80, :null => false
@@ -1,4 +1,3 @@
1
- # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
2
1
  past:
3
2
  id: 1
4
3
  party_id: 1
@@ -11,4 +10,9 @@ active:
11
10
  position: 2
12
11
  start_on: 2007-06-25
13
12
  end_on: 2907-07-08
14
-
13
+ future:
14
+ id: 3
15
+ party_id: 1
16
+ position: 3
17
+ start_on: 2907-07-09
18
+ end_on: 2907-07-22
@@ -5,26 +5,32 @@ first:
5
5
  backlog_id: 1
6
6
  period_id: 1
7
7
  description: first task
8
- position: 0
8
+ position: 1
9
9
  another:
10
10
  id: 2
11
11
  created_at: 2007-06-12
12
12
  backlog_id: 1
13
13
  period_id: 2
14
14
  description: second task
15
- position: 0
15
+ position: 1
16
16
  started:
17
17
  id: 3
18
18
  created_at: 2007-08-02 14:15:42
19
- backlog_id: 1
19
+ backlog_id: 2
20
20
  period_id: 2
21
21
  description: third task
22
- position: 1
23
- last:
22
+ position: 2
23
+ in_last_period:
24
24
  id: 4
25
25
  created_at: 2007-08-02 14:15:42
26
26
  backlog_id: 1
27
- period_id: 2
28
- description: last task
29
- position: 2
27
+ period_id: 3
28
+ description: task in last period
29
+ position: 1
30
+ not_planned:
31
+ id: 5
32
+ created_at: 2007-08-02 14:15:42
33
+ backlog_id: 1
34
+ description: unplanned task
35
+ position: 1
30
36
 
@@ -12,6 +12,11 @@ class PeriodsControllerTest < Test::Unit::TestCase
12
12
  @request = ActionController::TestRequest.new
13
13
  @response = ActionController::TestResponse.new
14
14
  @request.session[:user_id] = 1000001
15
+ assert_sequences
16
+ end
17
+
18
+ def teardown
19
+ assert_sequences
15
20
  end
16
21
 
17
22
  def test_index
@@ -45,7 +50,7 @@ class PeriodsControllerTest < Test::Unit::TestCase
45
50
  post :create, :period => {:party_id => 1, :start_on => '2007-06-11', :end_on => '2007-06-24'}
46
51
 
47
52
  assert_response :redirect
48
- assert_redirected_to :action => :show, :id => 2
53
+ assert_redirected_to :action => :show, :id => 3
49
54
 
50
55
  assert_equal num_periods + 1, Period.count
51
56
  end
@@ -54,7 +54,8 @@ class TasksControllerTest < Test::Unit::TestCase
54
54
  def test_create
55
55
  num_tasks = Task.count
56
56
 
57
- post :create, :task => {:description => 'an important task', :backlog_id => '2', :period_id => '2'}
57
+ post :create, :task => {:description => 'an important task', :backlog_id => '2',
58
+ :period_id => '2', :position => '4'}
58
59
 
59
60
  task = assigns(:task)
60
61
  assert_equal [], task.errors.full_messages
@@ -68,7 +69,8 @@ class TasksControllerTest < Test::Unit::TestCase
68
69
  def test_create_without_period
69
70
  num_tasks = Task.count
70
71
 
71
- post :create, :task => {:description => 'an important task', :backlog_id => '2'}
72
+ post :create, :task => {:description => 'an important task', :backlog_id => '2',
73
+ :position => '1'}
72
74
 
73
75
  task = assigns(:task)
74
76
  assert_equal [], task.errors.full_messages
@@ -127,18 +129,38 @@ class TasksControllerTest < Test::Unit::TestCase
127
129
  end
128
130
 
129
131
  def test_move_to_next_period_at_end
130
- before = Task.find(2)
131
- assert_equal 2, before.period_id
132
+ before = Task.find(tasks(:in_last_period).id)
133
+ assert_equal tasks(:in_last_period).period_id, before.period_id
132
134
 
133
- post :move_to_next_period, :id => 2
135
+ post :move_to_next_period, :id => tasks(:in_last_period).id
134
136
 
135
137
  assert_response :redirect
136
138
  assert_redirected_to :controller => 'periods',
137
139
  :action => :new,
138
140
  :period => {:party_id => 1}
139
141
 
140
- after = Task.find(2)
141
- assert_equal 2, before.period_id
142
+ before.reload
143
+ assert_equal tasks(:in_last_period).period_id, before.period_id
144
+
145
+ after = Task.find(tasks(:in_last_period).id)
146
+ assert_equal before.period_id, after.period_id
147
+ end
148
+
149
+ def test_move_to_period
150
+ highest = Task.find(:first, :order => 'id DESC')
151
+ post :move_to_period, :id => 'task_2',
152
+ :detour => {:action => 'show_no_layout', :id => '2', :controller => 'periods'},
153
+ :period_id => '3'
154
+ new_task = Task.find(:first, :order => 'id DESC')
155
+ assert new_task.id != highest.id
156
+ assert_equal 3, new_task.period_id
157
+ end
158
+
159
+ def test_move_to_period_past
160
+ post :move_to_period, :id => 'task_2',
161
+ :detour => {:action => 'show_no_layout', :id => '2', :controller => 'periods'},
162
+ :period_id => '1'
163
+ assert_equal 2, tasks(:another).period_id
142
164
  end
143
165
 
144
166
  end
@@ -5,113 +5,106 @@ require 'works_controller'
5
5
  class WorksController; def rescue_action(e) raise e end; end
6
6
 
7
7
  class WorksControllerTest < Test::Unit::TestCase
8
- fixtures :users, :groups_users, :backlogs, :periods, :tasks, :works, :estimates
9
-
8
+ fixtures :parties, :users, :groups, :groups_users, :backlogs, :periods, :tasks, :works, :estimates
9
+
10
10
  def setup
11
11
  @controller = WorksController.new
12
12
  @request = ActionController::TestRequest.new
13
13
  @response = ActionController::TestResponse.new
14
14
  @request.session[:user_id] = 1000001
15
+ assert_sequences
15
16
  end
16
-
17
+
18
+ def teardown
19
+ assert_sequences
20
+ end
21
+
17
22
  def test_index
18
23
  get :index
19
24
  assert_response :success
20
25
  assert_template 'list'
21
26
  end
22
-
27
+
23
28
  def test_list
24
29
  get :list
25
-
30
+
26
31
  assert_response :success
27
32
  assert_template 'list'
28
-
33
+
29
34
  assert_not_nil assigns(:works)
30
35
  end
31
-
36
+
32
37
  def test_show
33
38
  get :show, :id => 1
34
-
39
+
35
40
  assert_response :success
36
41
  assert_template 'show'
37
-
42
+
38
43
  assert_not_nil assigns(:work)
39
44
  assert assigns(:work).valid?
40
45
  end
41
-
46
+
42
47
  def test_new
43
48
  get :new, :work => {:task_id => 1}
44
-
49
+
45
50
  assert_response :success
46
51
  assert_template 'new'
47
-
52
+
48
53
  assert_not_nil assigns(:work)
49
54
  end
50
-
55
+
51
56
  def test_create
52
57
  num_works = Work.count
53
-
58
+
54
59
  post :create, :work => {:task_id => 1, :started_at => Time.now.iso8601}
55
-
60
+
56
61
  assert_response :redirect
57
62
  assert_redirected_to :controller => 'periods', :action => 'show', :id => 1, :task_id => 1
58
-
63
+
59
64
  assert_equal num_works + 1, Work.count
60
65
  end
61
-
66
+
62
67
  def test_edit
63
68
  get :edit, :id => 1
64
-
69
+
65
70
  assert_response :success
66
71
  assert_template 'edit'
67
-
72
+
68
73
  assert_not_nil assigns(:work)
69
74
  assert assigns(:work).valid?
70
75
  end
71
-
76
+
72
77
  def test_update
73
78
  post :update, :id => 1
74
79
  assert_response :redirect
75
80
  assert_redirected_to :action => 'show', :id => 1
76
81
  end
77
-
82
+
78
83
  def test_destroy
79
84
  assert_not_nil Work.find(1)
80
-
85
+
81
86
  post :destroy, :id => 1
82
87
  assert_response :redirect
83
88
  assert_redirected_to :controller => 'periods', :action => 'list_work'
84
-
89
+
85
90
  assert_raise(ActiveRecord::RecordNotFound) {
86
91
  Work.find(1)
87
92
  }
88
93
  end
89
-
94
+
90
95
  def test_update_with_finish
91
96
  num_tasks = Task.count
92
97
  num_open_tasks = Task.find_open.size
93
98
  task = tasks(:started)
94
99
  work = works(:started)
95
-
100
+
96
101
  post :update, "commit"=>"Lagre", "action"=>"update", "id"=>work.id.to_s, "controller"=>"works", "estimate"=>{"todo"=>"0"}, "work"=>{"completed_at"=>"2007-08-02 14:15", "task_id"=> task.id.to_s, "user_id"=>"1000001", "started_at"=>"2007-08-02 14:00"}
97
102
 
98
103
  assert_response :redirect
99
104
  assert_redirected_to :controller => 'periods', :action => :show, :id => task.period, :task => nil
100
-
105
+
101
106
  assert_equal num_tasks, Task.count
102
107
  assert_equal num_open_tasks - 1, Task.find_open.size
103
- assert_sequence
104
- end
105
-
106
-
107
- private
108
-
109
- def assert_sequence
110
- Period.find(:all).each do |p|
111
- p.open_tasks.each_with_index do |t, i|
112
- assert_equal i, t.position
113
- end
114
- end
115
108
  end
116
109
 
117
110
  end
data/test/test_helper.rb CHANGED
@@ -17,18 +17,38 @@ class Test::Unit::TestCase
17
17
  # don't care one way or the other, switching from MyISAM to InnoDB tables
18
18
  # is recommended.
19
19
  self.use_transactional_fixtures = true
20
-
20
+
21
21
  # Instantiated fixtures are slow, but give you @david where otherwise you
22
22
  # would need people(:david). If you don't want to migrate your existing
23
23
  # test cases which use the @david style and don't mind the speed hit (each
24
24
  # instantiated fixtures translates to a database query per test method),
25
25
  # then set this back to true.
26
26
  self.use_instantiated_fixtures = false
27
-
27
+
28
28
  # Add more helper methods to be used by all tests here...
29
-
29
+
30
30
  def add_stored_detour
31
31
  @request.session[:detours] = [{:controller => 'bogus', :action => :location}]
32
32
  end
33
-
33
+
34
+ def assert_sequences
35
+ Backlog.find(:all).each do |b|
36
+ b.unplanned_tasks.each_with_index do |t, i|
37
+ assert_equal i+1, t.position
38
+ end
39
+ end
40
+
41
+ Party.find(:all).each do |p|
42
+ p.periods.each_with_index do |period, i|
43
+ assert_equal i+1, period.position
44
+ end
45
+ end
46
+
47
+ Period.find(:all).each do |p|
48
+ p.open_tasks.each_with_index do |t, i|
49
+ assert_equal i+1, t.position
50
+ end
51
+ end
52
+ end
53
+
34
54
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: backlog
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.6.6
7
- date: 2007-08-07 00:00:00 +02:00
6
+ version: 0.7.0
7
+ date: 2007-08-14 00:00:00 +02:00
8
8
  summary: Application to aid collecting, processing, organizing, reviewing and doing tasks.
9
9
  require_paths:
10
10
  - lib
@@ -114,6 +114,7 @@ files:
114
114
  - db/migrate
115
115
  - db/migrate/008_add_backlog_options.rb
116
116
  - db/migrate/014_add_customer_option.rb
117
+ - db/migrate/019_remove_unique_index_for_period_position.rb
117
118
  - db/migrate/011_login_sugar.rb
118
119
  - db/migrate/010_add_work_start.rb
119
120
  - db/migrate/017_insert_datek_projects.rb
@@ -226,7 +227,6 @@ files:
226
227
  - config/environments/datek_production.rb
227
228
  - LICENSE_LOCALIZATION
228
229
  - README.txt
229
- - doc
230
230
  - Manifest.txt
231
231
  - vendor
232
232
  - vendor/plugins
@@ -1730,6 +1730,7 @@ files:
1730
1730
  - app/views/tasks/_backlog_header.rhtml
1731
1731
  - app/views/tasks/list.rhtml
1732
1732
  - app/views/tasks/_form.rhtml
1733
+ - app/views/tasks/_period_header.rhtml
1733
1734
  - app/views/tasks/new.rhtml
1734
1735
  - app/views/tasks/_fields_header.rhtml
1735
1736
  - app/views/tasks/_completed.rhtml