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


Reply via email to