Author: assaf
Date: Mon Jun 2 21:53:27 2008
New Revision: 662650
URL: http://svn.apache.org/viewvc?rev=662650&view=rev
Log:
Added specs for Activity model.
Added:
ode/sandbox/singleshot/spec/models/activities.rb
Modified:
ode/sandbox/singleshot/app/models/activity.rb
ode/sandbox/singleshot/spec/common.rb
Modified: ode/sandbox/singleshot/app/models/activity.rb
URL:
http://svn.apache.org/viewvc/ode/sandbox/singleshot/app/models/activity.rb?rev=662650&r1=662649&r2=662650&view=diff
==============================================================================
--- ode/sandbox/singleshot/app/models/activity.rb (original)
+++ ode/sandbox/singleshot/app/models/activity.rb Mon Jun 2 21:53:27 2008
@@ -14,15 +14,19 @@
belongs_to :person
belongs_to :task
- validates_presence_of :task_id
+ validates_presence_of :task
+ validates_presence_of :action
- attr_readonly :person, :task, :action
+ def readonly?
+ !new_record?
+ end
named_scope :for_stakeholder, lambda { |person|
{ :joins=>'JOIN stakeholders AS involved ON involved.task_id=tasks.id',
:conditions=>["involved.person_id=? AND involved.role != 'excluded'",
person.id],
:include=>[:task, :person], :order=>'activities.created_at DESC' } }
named_scope :for_dates, lambda { |dates|
- { :conditions=>{ :created_at=>dates } } }
+ range = dates.min.to_time.beginning_of_day..dates.max.to_time.end_of_day
+ { :conditions=>{ :created_at=>range } } }
end
Modified: ode/sandbox/singleshot/spec/common.rb
URL:
http://svn.apache.org/viewvc/ode/sandbox/singleshot/spec/common.rb?rev=662650&r1=662649&r2=662650&view=diff
==============================================================================
--- ode/sandbox/singleshot/spec/common.rb (original)
+++ ode/sandbox/singleshot/spec/common.rb Mon Jun 2 21:53:27 2008
@@ -43,6 +43,7 @@
def self.included(base)
base.after :all do
+ Activity.delete_all
Stakeholder.delete_all
Task.delete_all
end
@@ -54,6 +55,35 @@
:outcome_url=>'http://test.host/outcome' }.merge(with)
end
+ def task_with_status(status, attributes = nil)
+ attributes ||= {}
+ attributes = attributes.reverse_merge(:admins=>person('admin'))
+ task = case status
+ when 'active'
+ Task.create!(default_task.merge(attributes).merge(:status=>'active',
:owner=>person('owner')))
+ when 'completed' # Start as active, modified by owner.
+ active = task_with_status('active', attributes)
+ active.modify_by(person('owner')).update_attributes!
:status=>'completed'
+ active
+ when 'cancelled', 'suspended' # Start as active, modified by admin.
+ active = task_with_status('active', attributes)
+ active.modify_by(person('admin')).update_attributes! :status=>status
+ active
+ else
+ Task.create!(default_task.merge(attributes).merge(:status=>status))
+ end
+
+ def task.transition_to(status, attributes = nil)
+ attributes ||= {}
+ modify_by(attributes.delete(:modified_by) ||
Person.identify('admin')).update_attributes attributes.merge(:status=>status)
+ self
+ end
+ def task.can_transition?(status, attributes = nil)
+ transition_to(status, attributes).errors_on(:status).empty?
+ end
+ task
+ end
+
end
end
Added: ode/sandbox/singleshot/spec/models/activities.rb
URL:
http://svn.apache.org/viewvc/ode/sandbox/singleshot/spec/models/activities.rb?rev=662650&view=auto
==============================================================================
--- ode/sandbox/singleshot/spec/models/activities.rb (added)
+++ ode/sandbox/singleshot/spec/models/activities.rb Mon Jun 2 21:53:27 2008
@@ -0,0 +1,111 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe Activity do
+ include Specs::Tasks
+
+ before :all do
+ @person = person('person')
+ @task = Task.create(default_task)
+ end
+
+ describe 'person' do
+ it 'should be stored' do
+ Activity.create! :person=>@person, :action=>'created', :task=>@task
+ Activity.last.person.should == @person
+ end
+
+ it 'should be optional' do
+ lambda { Activity.create! :action=>'created', :task=>@task }.should_not
raise_error
+ Activity.last.person.should be_nil
+ end
+ end
+
+ describe 'task' do
+ it 'should be stored' do
+ Activity.create! :person=>@person, :action=>'created', :task=>@task
+ Activity.last.task.should == @task
+ end
+
+ it 'should be required' do
+ Activity.create(:person=>@person, :action=>'created').should
have(1).error_on(:task)
+ end
+ end
+
+ describe 'action' do
+ it 'should be stored' do
+ Activity.create! :person=>@person, :action=>'created', :task=>@task
+ Activity.last.action.should == 'created'
+ end
+
+ it 'should be required' do
+ Activity.create(:person=>@person, :task=>@task).should
have(1).error_on(:action)
+ end
+ end
+
+ it 'should have created_at timestamp' do
+ Activity.create!(:person=>@person, :action=>'created',
:task=>@task).created_at.should be_close(Time.now, 2)
+ end
+
+ it 'should allow creation but not modification' do
+ Activity.create! :person=>@person, :action=>'created', :task=>@task
+ lambda { Activity.last.update_attributes! :action=>'updated' }.should
raise_error(ActiveRecord::ReadOnlyRecord)
+ end
+
+ describe 'for_dates' do
+ it 'should return activities in date range' do
+ # 0 days (today) already created for activity associated with task
creation.
+ now = Activity.last.created_at
+ activities = (1..3).each do |i|
+ last = Activity.create! :person=>@person, :action=>'created',
:task=>@task
+ Activity.update_all(['created_at=?', now - i.day], ['id=?', last.id])
+ end
+ Activity.for_dates(now.to_date - 2.days..now.to_date).count == 1
+ Activity.for_dates(now.to_date - 2.days..now.to_date).each do |activity|
+ activity.created_at.should >= now - 2.days and activity.created_at <=
now.end_of_date
+ end
+ end
+ end
+
+ describe 'for_stakeholder' do
+ before { Activity.delete_all }
+
+ it 'should return activities for tasks associated with person' do
+ for role in Stakeholder::ALL_ROLES - ['excluded_owners']
+ Task.create!
default_task.merge(Task::ACCESSOR_FROM_ROLE[role]=>@person)
+ end
+ Activity.for_stakeholder(@person).map(&:task).uniq.size.should ==
Stakeholder::ALL_ROLES.size - 1
+ end
+
+ it 'should not return activities for excluded owners' do
+ Task.create! default_task.merge(:excluded_owners=>@person)
+ Activity.for_stakeholder(@person).should be_empty
+ end
+
+ it 'should not return activities for other stakeholders' do
+ Task.create! default_task.merge(:status=>'reserved',
:potential_owners=>person('other'))
+ Activity.for_stakeholder(@person).should be_empty
+ end
+
+ it 'should return activities for tasks with visible status' do
+ for status in Task::STATUSES - ['reserved']
+ task_with_status status, :potential_owners=>@person
+ end
+ Activity.for_stakeholder(@person).map(&:task).uniq.size.should ==
Task::STATUSES.size - 1
+ end
+
+ it 'should not return activities for reserved tasks' do
+ Task.create! default_task.merge(:status=>'reserved',
:potential_owners=>@person)
+ Activity.for_stakeholder(@person).should be_empty
+ end
+
+ it 'should return all activities for a visible task' do
+ Task.create! default_task.merge(:creator=>person('creator'))
+ Task.last.update_attributes(:owner=>person('owner'))
+ Activity.for_stakeholder(person('creator')).should ==
Activity.for_stakeholder(person('owner'))
+ Activity.for_stakeholder(person('creator')).map(&:action).should
include('created', 'is owner of')
+ Activity.for_stakeholder(person('owner')).map(&:person).should
include(person('creator'), person('owner'))
+ end
+
+ end
+
+end