Author: assaf
Date: Mon Jun  2 21:53:40 2008
New Revision: 662652

URL: http://svn.apache.org/viewvc?rev=662652&view=rev
Log:
Now all model specs are green.

Added:
    ode/sandbox/singleshot/spec/models/activity_spec.rb
      - copied, changed from r662651, 
ode/sandbox/singleshot/spec/models/activities.rb
    ode/sandbox/singleshot/spec/models/helper.rb
      - copied, changed from r662651, ode/sandbox/singleshot/spec/common.rb
Removed:
    ode/sandbox/singleshot/spec/common.rb
    ode/sandbox/singleshot/spec/models/activities.rb
Modified:
    ode/sandbox/singleshot/app/models/stakeholder.rb
    ode/sandbox/singleshot/app/models/task.rb
    ode/sandbox/singleshot/spec/models/stakeholder_spec.rb
    ode/sandbox/singleshot/spec/models/task_spec.rb
    ode/sandbox/singleshot/spec/spec_helper.rb

Modified: ode/sandbox/singleshot/app/models/stakeholder.rb
URL: 
http://svn.apache.org/viewvc/ode/sandbox/singleshot/app/models/stakeholder.rb?rev=662652&r1=662651&r2=662652&view=diff
==============================================================================
--- ode/sandbox/singleshot/app/models/stakeholder.rb (original)
+++ ode/sandbox/singleshot/app/models/stakeholder.rb Mon Jun  2 21:53:40 2008
@@ -40,4 +40,8 @@
   validates_inclusion_of :role, :in=>ALL_ROLES
   validates_uniqueness_of :role, :scope=>[:task_id, :person_id]
 
+  def readonly?
+    !new_record?
+  end
+
 end

Modified: ode/sandbox/singleshot/app/models/task.rb
URL: 
http://svn.apache.org/viewvc/ode/sandbox/singleshot/app/models/task.rb?rev=662652&r1=662651&r2=662652&view=diff
==============================================================================
--- ode/sandbox/singleshot/app/models/task.rb (original)
+++ ode/sandbox/singleshot/app/models/task.rb Mon Jun  2 21:53:40 2008
@@ -82,27 +82,31 @@
   validate do |task|
     # Check state transitions.
     from, to = task.status_change
-    case from # States you cannot transition from.
-    when 'suspended'
-      task.errors.add :status, 'You are not allowed to resume this task.' 
unless task.admin?(task.modified_by)
-    when 'completed'
-      task.errors.add :status, 'Cannot change status of completed task.'
-    when 'cancelled'
-      task.errors.add :status, 'Cannot change status of cancelled task.'
-    end or case to # or, states you cannot transition to.
-    when 'reserved'
-      task.errors.add :status, 'Cannot change status to reserved.' unless 
from.nil?
-    when 'active'
-      #task.errors.add :status, "#{task.owner.fullname} is not allowed to 
claim this task." unless
-      #  task.potential_owners.empty? || task.potential_owner?(task.owner) || 
task.admin?(task.owner)
-    when 'suspended'
-      task.errors.add :status, 'You are not allowed to suspend this task.' 
unless task.admin?(task.modified_by)
-    when 'completed'
-      task.errors.add :status, 'Cannot change to completed from any status but 
active.' unless from =='active'
-      task.errors.add :status, 'Only owner can complete task.' unless 
task.owner && task.modified_by == task.owner && !task.owner_changed?
-    when 'cancelled'
-      task.errors.add :status, 'You are not allowed to cancel this task.' 
unless task.admin?(task.modified_by)
+    if case from # States you cannot transition from.
+      when 'suspended'
+        task.errors.add :status, 'You are not allowed to resume this task.' 
unless task.admin?(task.modified_by)
+      when 'completed'
+        task.errors.add :status, 'Cannot change status of completed task.'
+      when 'cancelled'
+        task.errors.add :status, 'Cannot change status of cancelled task.'
+      end
+    else
+      case to # or, states you cannot transition to.
+      when 'reserved'
+        task.errors.add :status, 'Cannot change status to reserved.' unless 
from.nil?
+      when 'active'
+        #task.errors.add :status, "#{task.owner.fullname} is not allowed to 
claim this task." unless
+        #  task.potential_owners.empty? || task.potential_owner?(task.owner) 
|| task.admin?(task.owner)
+      when 'suspended'
+        task.errors.add :status, 'You are not allowed to suspend this task.' 
unless task.admin?(task.modified_by)
+      when 'completed'
+        task.errors.add :status, 'Cannot change to completed from any status 
but active.' unless from =='active'
+        task.errors.add :status, 'Only owner can complete task.' unless 
task.owner && task.modified_by == task.owner && !task.owner_changed?
+      when 'cancelled'
+        task.errors.add :status, 'You are not allowed to cancel this task.' 
unless task.admin?(task.modified_by)
+      end
     end
+    task.readonly! if !task.status_changed? && (task.completed? || 
task.cancelled?)
   end
 
 
@@ -203,9 +207,11 @@
     define_method("#{role}_was") { attribute_was(role) }
   end
 
-  def creator=(identity)
-    set_role 'creator', identity
+  def creator_with_change_check=(creator)
+    changed_attributes['creator'] = creator
+    self.creator_without_change_check = creator if reserved? || new_record?
   end
+  alias_method_chain :creator=, :change_check
 
   ACCESSOR_FROM_ROLE = { 'creator'=>'creator', 'owner'=>'owner', 
'potential'=>'potential_owners', 'excluded'=>'excluded_owners',
                          'observer'=>'observers', 'admin'=>'admins' }
@@ -251,7 +257,7 @@
     Stakeholder::SINGULAR_ROLES.each do |role|
       task.errors.add role, "Can only have one #{role}." if 
task.stakeholders.select { |sh| sh.role == role }.size > 1
     end
-    task.errors.add :creator, 'Cannot change creator.' if 
task.creator_changed? && !task.new_record?
+    task.errors.add :creator, 'Cannot change creator.' if 
task.creator_changed? && ![nil, 'reserved'].include?(task.status_was)
     task.errors.add :owner, "#{task.owner.fullname} is on the excluded owners 
list and cannot be owner of this task." if
       task.excluded_owner?(task.owner)
     to, from = task.owner_change

Copied: ode/sandbox/singleshot/spec/models/activity_spec.rb (from r662651, 
ode/sandbox/singleshot/spec/models/activities.rb)
URL: 
http://svn.apache.org/viewvc/ode/sandbox/singleshot/spec/models/activity_spec.rb?p2=ode/sandbox/singleshot/spec/models/activity_spec.rb&p1=ode/sandbox/singleshot/spec/models/activities.rb&r1=662651&r2=662652&rev=662652&view=diff
==============================================================================
--- ode/sandbox/singleshot/spec/models/activities.rb (original)
+++ ode/sandbox/singleshot/spec/models/activity_spec.rb Mon Jun  2 21:53:40 2008
@@ -1,23 +1,24 @@
 require File.dirname(__FILE__) + '/../spec_helper'
+require File.dirname(__FILE__) + '/helper'
+
 
 describe Activity do
-  include Specs::Tasks
 
   describe 'person' do
     it 'should be part of activity' do
-      Task.create! default_task(:creator=>person('person'))
+      Task.create! defaults(:creator=>person('person'))
       Activity.last.person.should == person('person')
     end
 
     it 'should be optional' do
-      lambda { Task.create! default_task }.should_not raise_error
+      lambda { Task.create! defaults }.should_not raise_error
       Activity.last.person.should be_nil
     end
   end
 
   describe 'task' do
     it 'should be part of activity' do
-      Task.create! default_task
+      Task.create! defaults
       Activity.last.task.should == Task.last
     end
 
@@ -28,41 +29,42 @@
 
   describe 'action' do
     it 'should be part of activity' do
-      Task.create! default_task
+      Task.create! defaults
       Activity.last.action.should == 'created'
     end
 
     it 'should be required' do
-      Task.create! default_task
+      Task.create! defaults
       Activity.create(:person=>person('person'), :task=>Task.last).should 
have(1).error_on(:action)
     end
   end
 
   it 'should have created_at timestamp' do
-    Task.create! default_task
+    Task.create! defaults
     Activity.last.created_at.should be_close(Time.now, 2)
   end
   
-  it 'should allow creation but not modification' do
-    Task.create! default_task
+  it 'should be read only' do
+    Task.create! defaults
     lambda { Activity.last.update_attributes! :action=>'updated' }.should 
raise_error(ActiveRecord::ReadOnlyRecord)
   end
 
   it 'should delete when destroying task' do
-    Task.create! default_task
+    Task.create! defaults
     lambda { Task.last.destroy }.should change(Activity, :count).to(0)
   end
 
   it 'should delete when destroying person' do
-    Task.create! default_task(:creator=>person('creator'))
+    Task.create! defaults(:creator=>person('creator'))
     lambda { person('creator').destroy }.should change(Activity, :count).to(0)
   end
 
+
   describe 'for_dates' do
     it 'should return activities in date range' do
       now = Time.zone.now
       activities = (0..3).each do |i|
-        Task.create! default_task(:creator=>person('creator'))
+        Task.create! defaults(:creator=>person('creator'))
         Activity.update_all ['created_at=?', now - i.day], ['id=?', 
Activity.last.id]
       end
       min, max = Activity.minimum(:created_at) + 1.day, 
Activity.maximum(:created_at)
@@ -73,22 +75,23 @@
     end
   end
 
+
   describe 'for_stakeholder' do
 
     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('person'))
+        Task.create! 
defaults.merge(Task::ACCESSOR_FROM_ROLE[role]=>person('person'))
       end
       Activity.for_stakeholder(person('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('person'))
+      Task.create! defaults.merge(:excluded_owners=>person('person'))
       Activity.for_stakeholder(person('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'))
+      Task.create! defaults.merge(:status=>'reserved', 
:potential_owners=>person('other'))
       Activity.for_stakeholder(person('person')).should be_empty
     end
 
@@ -100,12 +103,12 @@
     end
 
     it 'should not return activities for reserved tasks' do
-      Task.create! default_task.merge(:status=>'reserved', 
:potential_owners=>person('person'))
+      Task.create! defaults.merge(:status=>'reserved', 
:potential_owners=>person('person'))
       Activity.for_stakeholder(person('person')).should be_empty
     end
 
     it 'should return all activities for a visible task' do
-      Task.create! default_task.merge(:creator=>person('creator'))
+      Task.create! defaults.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')
@@ -113,7 +116,7 @@
     end
 
     it 'should return activities from most recent to last' do
-      Task.create! default_task.merge(:creator=>person('creator'))
+      Task.create! defaults.merge(:creator=>person('creator'))
       Activity.update_all ['created_at=?', Time.zone.now - 5.seconds]
       Task.last.update_attributes! :owner=>person('owner')
       activities = Activity.for_stakeholder(person('creator'))

Copied: ode/sandbox/singleshot/spec/models/helper.rb (from r662651, 
ode/sandbox/singleshot/spec/common.rb)
URL: 
http://svn.apache.org/viewvc/ode/sandbox/singleshot/spec/models/helper.rb?p2=ode/sandbox/singleshot/spec/models/helper.rb&p1=ode/sandbox/singleshot/spec/common.rb&r1=662651&r2=662652&rev=662652&view=diff
==============================================================================
--- ode/sandbox/singleshot/spec/common.rb (original)
+++ ode/sandbox/singleshot/spec/models/helper.rb Mon Jun  2 21:53:40 2008
@@ -1,9 +1,11 @@
-module Specs
-
-  module Authentication
+module Helper
+  module Models
 
     def self.included(base)
       base.after :all do
+        Activity.delete_all
+        Stakeholder.delete_all
+        Task.delete_all
         Person.delete_all
         @authenticated = nil
       end
@@ -36,20 +38,7 @@
         h.update(role.to_sym=>Array.new(3) { |i| 
person("#{role.singularize}#{i}") }) }
     end
 
-  end
-
-  module Tasks
-
-    def self.included(base)
-      base.after :all do
-        Activity.delete_all
-        Stakeholder.delete_all
-        Task.delete_all
-      end
-      base.send :include, Authentication
-    end
-
-    def default_task(attributes = {})
+    def defaults(attributes = {})
       { :title=>'Test this',
         :outcome_url=>'http://test.host/outcome' }.merge(attributes)
     end
@@ -59,17 +48,17 @@
       attributes = attributes.reverse_merge(:admins=>person('admin'))
       task = case status
       when 'active'
-        Task.create!(default_task.merge(attributes).merge(:status=>'active', 
:owner=>person('owner')))
+        Task.create!(defaults(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 = task_with_status('ready', attributes)
         active.modify_by(person('admin')).update_attributes! :status=>status
         active
       else
-        Task.create!(default_task.merge(attributes).merge(:status=>status))
+        Task.create!(defaults(attributes).merge(:status=>status))
       end
 
       def task.transition_to(status, attributes = nil)
@@ -79,6 +68,8 @@
       end
       def task.can_transition?(status, attributes = nil)
         transition_to(status, attributes).errors_on(:status).empty?
+      rescue ActiveRecord::ReadOnlyRecord
+        false
       end
       task
     end
@@ -86,3 +77,8 @@
   end
 
 end
+
+
+Spec::Runner.configure do |config|
+  config.include Helper::Models, :type=>:model
+end

Modified: ode/sandbox/singleshot/spec/models/stakeholder_spec.rb
URL: 
http://svn.apache.org/viewvc/ode/sandbox/singleshot/spec/models/stakeholder_spec.rb?rev=662652&r1=662651&r2=662652&view=diff
==============================================================================
--- ode/sandbox/singleshot/spec/models/stakeholder_spec.rb (original)
+++ ode/sandbox/singleshot/spec/models/stakeholder_spec.rb Mon Jun  2 21:53:40 
2008
@@ -1,239 +1,180 @@
 require File.dirname(__FILE__) + '/../spec_helper'
+require File.dirname(__FILE__) + '/helper'
 
 
 describe Stakeholder do
-  include Specs::Tasks
-
-  before :all do
-    @person = person('person')
-    @task = Task.create(default_task)
-  end
 
   describe 'person' do
-    it 'should be stored' do
-      Stakeholder.create! :task=>@task, :person=>@person, :role=>'admin'
-      Stakeholder.last.person.should == @person
+    it 'should be part of stakeholder' do
+      Task.create! defaults(:creator=>person('creator'))
+      Stakeholder.last.person.should == person('creator')
     end
 
     it 'should be required' do
-      Stakeholder.create(:task=>@task, :role=>'admin').should 
have(1).error_on(:person)
+      Task.create! defaults
+      Stakeholder.create(:task=>Task.last, :role=>'admin').should 
have(1).error_on(:person)
     end
   end
 
 
   describe 'task' do
-    it 'should be stored' do
-      Stakeholder.create! :task=>@task, :person=>@person, :role=>'admin'
-      Stakeholder.last.task.should == @task
+    it 'should be part of stakeholder' do
+      Task.create! defaults(:creator=>person('creator'))
+      Stakeholder.last.task.should == Task.last
     end
 
     it 'should be required' do
-      lambda { Stakeholder.create(:person=>@person, :role=>'admin') }.should 
raise_error(ActiveRecord::StatementInvalid)
+      lambda { Stakeholder.create(:person=>person('creator'), :role=>'admin') 
}.should raise_error(ActiveRecord::StatementInvalid)
     end
   end
 
 
   describe 'role' do
-    it 'should be stored' do
-      Stakeholder.create! :task=>@task, :person=>@person, :role=>'admin'
-      Stakeholder.last.role.should == 'admin'
+    it 'should be part of stakeholder' do
+      Task.create! defaults(:creator=>person('creator'))
+      Stakeholder.last.role.should == 'creator'
     end
 
     it 'should be required' do
-      Stakeholder.create(:person=>@person, :task=>@task).should 
have(1).error_on(:role)
+      Task.create! defaults
+      Stakeholder.create(:person=>person('me'), :task=>Task.last).should 
have(1).error_on(:role)
     end
 
     it 'should be any valid role names' do
+      Task.create! defaults
       Stakeholder::ALL_ROLES.each do |role|
-        Stakeholder.create(:person=>@person, :task=>@task, :role=>role).should 
have(:no).errors
+        Stakeholder.create(:person=>person('me'), :task=>Task.last, 
:role=>role).should have(:no).errors
       end
     end
 
     it 'should not allow unknown role names' do
+      Task.create! defaults
       ['foo', 'bar'].each do |role|
-        Stakeholder.create(:person=>@person, :task=>@task, :role=>role).should 
have(1).error_on(:role)
+        Stakeholder.create(:person=>person('me'), :task=>Task.last, 
:role=>role).should have(1).error_on(:role)
       end
     end
   end
 
 
   it 'should be unique combination of task person and role' do
-    Stakeholder.create(:person=>@person, :task=>@task, :role=>'admin').should 
have(:no).errors
-    Stakeholder.create(:person=>@person, :task=>@task, 
:role=>'observer').should have(:no).errors
-    Stakeholder.create(:person=>@person, :task=>@task, :role=>'admin').should 
have(1).errors_on(:role)
+    Task.create! defaults
+    Stakeholder.create(:person=>person('me'), :task=>Task.last, 
:role=>'admin').should have(:no).errors
+    Stakeholder.create(:person=>person('me'), :task=>Task.last, 
:role=>'observer').should have(:no).errors
+    Stakeholder.create(:person=>person('me'), :task=>Task.last, 
:role=>'admin').should have(1).errors_on(:role)
   end
 
   it 'should be deleted when task destroyed' do
-    Stakeholder.create! :person=>@person, :task=>@task, :role=>'admin'
-    lambda { @task.destroy }.should change(Stakeholder, :count).to(0)
+    Task.create! defaults(:creator=>person('creator'))
+    lambda { Task.last.destroy }.should change(Stakeholder, :count).to(0)
   end
 
   it 'should be deleted when person destroyed' do
-    Stakeholder.create! :person=>@person, :task=>@task, :role=>'admin'
-    lambda { @person.destroy }.should change(Stakeholder, :count).to(0)
-  end
-
-end
-
-
-shared_examples_for 'singular role' do
-  it 'should not be required' do
-    Task.create(default_task.except(@role)).should have(:no).errors
-  end
-
-  it 'should not exist unless specified' do
-    Task.create! default_task.except(@role)
-    Task.last.send(@role).should be_nil
-  end
-
-  it 'should accept person at task creation' do
-    Task.create(default_task.merge(@role=>person('foo'))).should 
have(:no).errors
-  end
-
-  it 'should return person when loading task' do
-    Task.create! default_task.merge(@role=>person('foo'))
-    Task.last.send(@role).should eql(person('foo'))
+    Task.create! defaults(:creator=>person('creator'))
+    lambda { person('creator').destroy }.should change(Stakeholder, 
:count).to(0)
   end
 
-  it 'should identify person in role' do
-    Task.create! default_task.merge(@role=>person('foo'))
-    Task.last.send("[EMAIL PROTECTED]", person('foo')).should be_true
-    Task.last.send("[EMAIL PROTECTED]", person('bar')).should be_false
+  it 'should be read only' do
+    Task.create! defaults(:creator=>person('creator'))
+    lambda { Stakeholder.last.update_attributes! :role=>'owner' }.should 
raise_error(ActiveRecord::ReadOnlyRecord)
   end
 end
 
 
-shared_examples_for 'plural role' do
-  before do
-    @people = person('foo'), person('bar'), person('baz')
-  end
-
-  it 'should not be required' do
-    Task.create(default_task.except(@role)).should have(:no).errors
-  end
-
-  it 'should not exist unless specified' do
-    Task.create! default_task.except(@role)
-    Task.last.send(@role).should be_empty
-  end
-
-  it 'should accept list of people at task creation' do
-    Task.create(default_task.merge(@role=>@people)).should have(:no).errors
-  end
-
-  it 'should list of people when loading task' do
-    Task.create! default_task.merge(@role=>@people)
-    Task.last.send(@role).should == @people
-  end
-
-  it 'should accept single person' do
-    Task.create! default_task.merge(@role=>person('foo'))
-    Task.last.send(@role).should == [person('foo')]
-  end
-
-  it 'should accept empty list' do
-    Task.create(default_task.merge(@role=>[]))
-    Task.last.send(@role).should be_empty
-  end
-
-  it 'should accept empty list and discard all stakeholders' do
-    Task.create! default_task.merge(@role=>@people)
-    Task.last.update_attributes! @role=>[]
-    Task.last.send(@role).should be_empty
-  end
+describe Task do
 
-  it 'should accept nil and treat it as empty list' do
-    Task.create! default_task.merge(@role=>@people)
-    Task.last.update_attributes! @role=>nil
-    Task.last.send(@role).should be_empty
-  end
+  shared_examples_for 'singular role' do
+    it 'should not be required' do
+      Task.create(defaults.except(@role)).should have(:no).errors
+    end
 
-  it 'should allow adding stakeholders' do
-    Task.create! default_task.merge(@role=>person('foo'))
-    Task.last.update_attributes! @role=>[person('foo'), person('bar')]
-    Task.last.send(@role).should == [person('foo'), person('bar')]
-  end
+    it 'should not exist unless specified' do
+      Task.create! defaults.except(@role)
+      Task.last.send(@role).should be_nil
+    end
 
-  it 'should add each person only once' do
-    Task.create! default_task.merge(@role=>([person('foo')] *3))
-    Task.last.send(@role).size.should == 1
-  end
+    it 'should accept person at task creation' do
+      Task.create(defaults.merge(@role=>person('foo'))).should have(:no).errors
+    end
 
-  it 'should allow removing stakeholders' do
-    Task.create! default_task.merge(@role=>[person('foo'), person('bar')])
-    Task.last.update_attributes! @role=>person('bar')
-    Task.last.send(@role).should == [person('bar')]
-  end
+    it 'should return person when loading task' do
+      Task.create! defaults.merge(@role=>person('foo'))
+      Task.last.send(@role).should eql(person('foo'))
+    end
 
-  it 'should identify person in role' do
-    Task.create! default_task.merge(@role=>person('foo'))
-    Task.last.send("[EMAIL PROTECTED]", person('foo')).should be_true
-    Task.last.send("[EMAIL PROTECTED]", person('bar')).should be_false
+    it 'should identify person in role' do
+      Task.create! defaults.merge(@role=>person('foo'))
+      Task.last.send("[EMAIL PROTECTED]", person('foo')).should be_true
+      Task.last.send("[EMAIL PROTECTED]", person('bar')).should be_false
+    end
   end
-end
-
-
-describe Task do
-  include Specs::Tasks
 
   describe 'creator' do
     before { @role = :creator }
     it_should_behave_like 'singular role'
 
     it 'should not allow changing creator' do
-      Task.create! default_task.merge(:creator=>person('creator'))
-      Task.last.update_attributes :creator=>person('other')
-      Task.last.creator.should == person('creator')
+      Task.create! defaults.merge(:creator=>person('creator'))
+      lambda { Task.last.update_attributes :creator=>person('other') 
}.should_not change { Task.last.creator }
+      lambda { Task.last.update_attributes :creator=>nil }.should_not change { 
Task.last.creator }
     end
 
     it 'should not allow setting creator on existing task' do
-      Task.create! default_task
-      Task.last.update_attributes :creator=>person('creator')
-      Task.last.creator.should be_nil
+      Task.create! defaults
+      lambda { Task.last.update_attributes :creator=>person('creator') 
}.should_not change { Task.last.creator }
+    end
+
+    it 'should report error when changing creator' do
+      task = Task.create! defaults
+      task.update_attributes :creator=>person('creator')
+      task.should have(1).error_on(:creator)
     end
-  end
 
+    it 'should allow changing creator on reserved task only' do
+      Task.create! defaults.merge(:status=>'reserved', 
:creator=>person('creator'))
+      lambda { Task.last.update_attributes :creator=>person('other') }.should 
change { Task.last.creator }
+    end
+  end
 
   describe 'owner' do
     before { @role = :owner }
     it_should_behave_like 'singular role'
 
     it 'should allow changing owner on existing task' do
-      Task.create! default_task.merge(:owner=>person('owner'))
+      Task.create! defaults.merge(:owner=>person('owner'))
       Task.last.update_attributes! :owner=>person('other')
       Task.last.owner.should == person('other')
     end
 
     it 'should only store one owner association for task' do
-      Task.create! default_task.merge(:owner=>person('owner'))
+      Task.create! defaults.merge(:owner=>person('owner'))
       Task.last.update_attributes! :owner=>person('other')
       Stakeholder.find(:all, 
:conditions=>{:task_id=>Task.last.id}).size.should == 1
     end
 
     it 'should allow setting owner to nil' do
-      Task.create! default_task.merge(:owner=>person('owner'))
+      Task.create! defaults.merge(:owner=>person('owner'))
       Task.last.update_attributes! :owner=>nil
       Task.last.owner.should be_nil
     end
 
     it 'should not allow owner if listed in excluded owners' do
-      Task.create! default_task.merge(:excluded_owners=>person('excluded'))
+      Task.create! defaults.merge(:excluded_owners=>person('excluded'))
       lambda { Task.last.update_attributes! :owner=>person('excluded') 
}.should raise_error
       Task.last.owner.should be_nil
     end
 
     it 'should be potential owner if task created with one potential owner' do
-      Task.create! default_task.merge(:potential_owners=>person('foo'))
+      Task.create! defaults.merge(:potential_owners=>person('foo'))
       Task.last.owner.should == person('foo')
     end
 
     it 'should not be potential owner if task created with more than one' do
-      Task.create! default_task.merge(:potential_owners=>people('foo', 'bar'))
+      Task.create! defaults.merge(:potential_owners=>people('foo', 'bar'))
       Task.last.owner.should be_nil
     end
 
     it 'should not be potential owner if task updated to have no owner' do
-      Task.create! default_task.merge(:potential_owners=>person('foo'))
+      Task.create! defaults.merge(:potential_owners=>person('foo'))
       Task.last.update_attributes! :owner=>person('bar')
       Task.last.update_attributes! :owner=>nil
       Task.last.owner.should be(nil)
@@ -241,6 +182,75 @@
   end
 
 
+  shared_examples_for 'plural role' do
+    before do
+      @people = person('foo'), person('bar'), person('baz')
+    end
+
+    it 'should not be required' do
+      Task.create(defaults.except(@role)).should have(:no).errors
+    end
+
+    it 'should not exist unless specified' do
+      Task.create! defaults.except(@role)
+      Task.last.send(@role).should be_empty
+    end
+
+    it 'should accept list of people at task creation' do
+      Task.create(defaults.merge(@role=>@people)).should have(:no).errors
+    end
+
+    it 'should list of people when loading task' do
+      Task.create! defaults.merge(@role=>@people)
+      Task.last.send(@role).should == @people
+    end
+
+    it 'should accept single person' do
+      Task.create! defaults.merge(@role=>person('foo'))
+      Task.last.send(@role).should == [person('foo')]
+    end
+
+    it 'should accept empty list' do
+      Task.create(defaults.merge(@role=>[]))
+      Task.last.send(@role).should be_empty
+    end
+
+    it 'should accept empty list and discard all stakeholders' do
+      Task.create! defaults.merge(@role=>@people)
+      Task.last.update_attributes! @role=>[]
+      Task.last.send(@role).should be_empty
+    end
+
+    it 'should accept nil and treat it as empty list' do
+      Task.create! defaults.merge(@role=>@people)
+      Task.last.update_attributes! @role=>nil
+      Task.last.send(@role).should be_empty
+    end
+
+    it 'should allow adding stakeholders' do
+      Task.create! defaults.merge(@role=>person('foo'))
+      Task.last.update_attributes! @role=>[person('foo'), person('bar')]
+      Task.last.send(@role).should == [person('foo'), person('bar')]
+    end
+
+    it 'should add each person only once' do
+      Task.create! defaults.merge(@role=>([person('foo')] *3))
+      Task.last.send(@role).size.should == 1
+    end
+
+    it 'should allow removing stakeholders' do
+      Task.create! defaults.merge(@role=>[person('foo'), person('bar')])
+      Task.last.update_attributes! @role=>person('bar')
+      Task.last.send(@role).should == [person('bar')]
+    end
+
+    it 'should identify person in role' do
+      Task.create! defaults.merge(@role=>person('foo'))
+      Task.last.send("[EMAIL PROTECTED]", person('foo')).should be_true
+      Task.last.send("[EMAIL PROTECTED]", person('bar')).should be_false
+    end
+  end
+
   describe 'potential_owners' do
     before { @role = :potential_owners }
     it_should_behave_like 'plural role'
@@ -248,25 +258,23 @@
     it 'should not allow excluded owners' do
       mixed_up = { :potential_owners=>[person('foo'), person('bar')],
                    :excluded_owners=>[person('bar'), person('baz')] }
-      Task.create(default_task.merge(mixed_up)).should 
have(1).error_on(:potential_owners)
+      Task.create(defaults.merge(mixed_up)).should 
have(1).error_on(:potential_owners)
     end
   end
 
-
   describe 'excluded_owners' do
     before { @role = :excluded_owners }
     it_should_behave_like 'plural role'
   end
 
-
   describe 'observers' do
     before { @role = :observers }
     it_should_behave_like 'plural role'
   end
 
-
   describe 'admins' do
     before { @role = :admins }
     it_should_behave_like 'plural role'
   end
+
 end

Modified: ode/sandbox/singleshot/spec/models/task_spec.rb
URL: 
http://svn.apache.org/viewvc/ode/sandbox/singleshot/spec/models/task_spec.rb?rev=662652&r1=662651&r2=662652&view=diff
==============================================================================
--- ode/sandbox/singleshot/spec/models/task_spec.rb (original)
+++ ode/sandbox/singleshot/spec/models/task_spec.rb Mon Jun  2 21:53:40 2008
@@ -1,8 +1,8 @@
 require File.dirname(__FILE__) + '/../spec_helper'
+require File.dirname(__FILE__) + '/helper'
 
 
 describe Task do
-  include Specs::Tasks
 
   describe 'to_param' do
 
@@ -11,28 +11,28 @@
     end
 
     it 'should begin with task ID' do
-      Task.create!(default_task).to_param.to_i.should == Task.last.id
+      Task.create!(defaults).to_param.to_i.should == Task.last.id
     end
 
     it 'should include task title' do
-      Task.create!(default_task.merge(:title=>'Task 
Title')).to_param[/^\d+-(.*)/, 1].should == 'Task-Title'
+      Task.create!(defaults(:title=>'Task Title')).to_param[/^\d+-(.*)/, 
1].should == 'Task-Title'
     end
 
     it 'should properly encode task title' do
-      Task.create!(default_task.merge(:title=>'Test:encoding, ignoring 
"unprintable" characters')).
+      Task.create!(defaults(:title=>'Test:encoding, ignoring "unprintable" 
characters')).
         to_param[/^\d+-(.*)/, 1].should == 
'Test-encoding-ignoring-unprintable-characters'
     end
 
     it 'should remove redundant hyphens' do
-      Task.create!(default_task.merge(:title=>'-Test  
redundant--hyphens--')).to_param[/^\d+-(.*)/, 1].should == 
'Test-redundant-hyphens'
+      Task.create!(defaults(:title=>'-Test  
redundant--hyphens--')).to_param[/^\d+-(.*)/, 1].should == 
'Test-redundant-hyphens'
     end
 
     it 'should deal gracefully with missing title' do
-      Task.create!(default_task.merge(:title=>'--')).to_param.should =~ /^\d+$/
+      Task.create!(defaults(:title=>'--')).to_param.should =~ /^\d+$/
     end
 
     it 'should leave UTF-8 text alone' do
-      Task.create!(default_task.merge(:title=>'jösé')).to_param[/^\d+-(.*)/, 
1].should == 'jösé'
+      Task.create!(defaults(:title=>'jösé')).to_param[/^\d+-(.*)/, 1].should 
== 'jösé'
     end
 
   end
@@ -41,11 +41,11 @@
   describe 'version' do
 
     it 'should begin at zero' do
-      Task.create!(default_task).version.should == 0 
+      Task.create!(defaults).version.should == 0 
     end
 
     it 'should increment each time task is updated' do
-      Task.create! default_task
+      Task.create! defaults
       lambda { Task.last.update_attributes :priority=>1 }.should change { 
Task.last.version }.from(0).to(1)
       lambda { Task.last.update_attributes :due_on=>Time.now }.should change { 
Task.last.version }.from(1).to(2)
     end
@@ -55,20 +55,20 @@
   describe 'etag' do
 
     it 'should be hex digest' do
-      Task.create!(default_task).etag.should =~ /^[0-9a-f]{32}$/
+      Task.create!(defaults).etag.should =~ /^[0-9a-f]{32}$/
     end
 
     it 'should remain the same if task not modified' do
-      Task.create! default_task
+      Task.create! defaults
       Task.last.etag.should == Task.last.etag
     end
 
     it 'should be different for two different tasks' do
-      Task.create!(default_task).etag.should_not == 
Task.create(default_task).etag
+      Task.create!(defaults).etag.should_not == Task.create(defaults).etag
     end
 
     it 'should change whenever task is saved' do
-      Task.create! default_task
+      Task.create! defaults
       lambda { Task.last.update_attributes! :priority=>1 }.should change { 
Task.last.etag }
       lambda { Task.last.update_attributes! :due_on=>Time.now }.should change 
{ Task.last.etag }
     end
@@ -78,37 +78,8 @@
 
   describe 'status' do
 
-    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
-
     it 'should start as ready' do
-      Task.create!(default_task).status.should == 'ready'
+      Task.create!(defaults).status.should == 'ready'
     end
 
     it 'should only accept supported value' do
@@ -116,7 +87,7 @@
     end
 
     it 'should allow starting in reserved' do
-      Task.create!(default_task.merge(:status=>'reserved')).status.should == 
'reserved'
+      Task.create!(defaults(:status=>'reserved')).status.should == 'reserved'
     end
 
     it 'should not transition to reserved from any other status' do
@@ -126,19 +97,19 @@
     end
 
     it 'should start as ready if started as active but not associated with 
owner' do
-      Task.create!(default_task.merge(:status=>'active')).status.should == 
'ready'
+      Task.create!(defaults(:status=>'active')).status.should == 'ready'
     end
 
     it 'should start as active if started as ready and associated with owner' 
do
-      Task.create!(default_task.merge(:owner=>person('owner'))).status.should 
== 'active'
+      Task.create!(defaults(:owner=>person('owner'))).status.should == 'active'
     end
 
     it 'should start as active if started as ready and associated with one 
potential owner' do
-      
Task.create!(default_task.merge(:potential_owners=>people('owner'))).status.should
 == 'active'
+      Task.create!(defaults(:potential_owners=>people('owner'))).status.should 
== 'active'
     end
 
     it 'should start as ready if started as ready and associated with several 
potential owners' do
-      Task.create!(default_task.merge(:potential_owners=>people('foo', 
'bar'))).status.should == 'ready'
+      Task.create!(defaults(:potential_owners=>people('foo', 
'bar'))).status.should == 'ready'
     end
 
     it 'should transition from ready to active when associated with owner' do
@@ -152,7 +123,7 @@
     end
 
     it 'should not accept suspended as initial value' do
-      Task.create(default_task.merge(:status=>'suspended')).should 
have(1).error_on(:status)
+      Task.create(defaults(:status=>'suspended')).should 
have(1).error_on(:status)
     end
 
     it 'should transition from ready to suspended' do
@@ -212,11 +183,11 @@
   describe 'title' do
 
     it 'should be required' do
-      Task.new(default_task.except(:title)).should have(1).error_on(:title)
+      Task.new(defaults.except(:title)).should have(1).error_on(:title)
     end
 
     it 'should not be empty' do
-      Task.new(default_task.merge(:title=>' ')).should have(1).error_on(:title)
+      Task.new(defaults.merge(:title=>' ')).should have(1).error_on(:title)
     end
 
   end
@@ -225,20 +196,20 @@
   describe 'priority' do
 
     it 'should default to 2' do
-      Task.create(default_task.except(:priority)).priority.should == 2
+      Task.create(defaults.except(:priority)).priority.should == 2
     end
 
     it 'should allow values from 1 to 3' do
       priorities = Array.new(5) { |i| i }
-      priorities.map { |p| Task.new(default_task.merge(:priority=>p)).valid? 
}.should eql([false] + [true] * 3 + [false])
+      priorities.map { |p| Task.new(defaults(:priority=>p)).valid? }.should 
eql([false] + [true] * 3 + [false])
     end
 
     it 'should accept string value' do
-      Task.create(default_task.merge(:priority=>'1')).priority.should == 1
+      Task.create(defaults(:priority=>'1')).priority.should == 1
     end
 
     it 'should accept nil and reset to default' do
-      Task.create default_task.merge(:priority=>1)
+      Task.create defaults(:priority=>1)
       lambda { Task.last.update_attributes! :priority=>nil }.should change { 
Task.last.priority }.to(2)
     end
 
@@ -263,35 +234,35 @@
   describe 'due_on' do
 
     it 'should not be required' do
-      Task.create(default_task.except(:due_on)).should have(:no).errors
+      Task.create(defaults.except(:due_on)).should have(:no).errors
     end
 
     it 'should accept time and return date' do
       now = Time.now
-      Task.create! default_task.merge(:due_on=>now)
+      Task.create! defaults(:due_on=>now)
       Task.last.due_on.should == now.to_date
     end
 
     it 'should accept date and return it' do
       today = Date.today
-      Task.create! default_task.merge(:due_on=>today)
+      Task.create! defaults(:due_on=>today)
       Task.last.due_on.should == today
     end
 
     it 'should accept ISO 8601 date string and return date' do
       today = Date.today
-      Task.create! default_task.merge(:due_on=>today.to_s)
+      Task.create! defaults(:due_on=>today.to_s)
       Task.last.due_on.should == today
     end
 
     it 'should accept ISO 8601 time string and return date' do
       now = Time.now
-      Task.create! default_task.merge(:due_on=>now.iso8601)
+      Task.create! defaults(:due_on=>now.iso8601)
       Task.last.due_on.should == now.to_date
     end
 
     it 'should accept blank string and set to nil' do
-      Task.create! default_task.merge(:due_on=>Time.now)
+      Task.create! defaults(:due_on=>Time.now)
       Task.last.update_attributes :due_on=>''
       Task.last.due_on.should be_nil
     end
@@ -320,15 +291,14 @@
   end
 
 
-  describe 'ranking'
+  #pending 'ranking'
 
-  describe 'modified_by'
+  #pending 'modified_by'
 
-  describe 'activities'
+  #pending 'with_stakeholders'
 
-  describe 'with_stakeholders'
+  #pending 'for_stakeholder'
 
-  describe 'for_stakeholder'
 
   describe 'data' do
 
@@ -337,23 +307,23 @@
     end
 
     it 'should return nothing for new task' do
-      Task.create default_task.except(:data)
+      Task.create defaults.except(:data)
       Task.last.data.should == {}
     end
 
     it 'should accept argument for mass assignment' do
-      Task.create default_task
+      Task.create defaults
       lambda { Task.last.update_attributes :data=>{'foo'=>'bar'} }.should 
change { Task.last.data }.to('foo'=>'bar')
     end
 
     it 'should accept nil' do
-      Task.create default_task.merge(:data=>{'foo'=>'bar'})
+      Task.create defaults(:data=>{'foo'=>'bar'})
       lambda { Task.last.update_attributes :data=>nil }.should change { 
Task.last.data }.to({})
     end
 
     it 'should reject any other value' do
-      Task.create(default_task.merge(:data=>[])).should have(1).error_on(:data)
-      Task.create(default_task.merge(:data=>'string')).should 
have(1).error_on(:data)
+      Task.create(defaults(:data=>[])).should have(1).error_on(:data)
+      Task.create(defaults(:data=>'string')).should have(1).error_on(:data)
     end
 
   end
@@ -396,7 +366,6 @@
 
 
 describe Task, 'frame_url' do
-  include Specs::Tasks
   it_should_behave_like 'Task url'
 
   before :all do
@@ -411,7 +380,6 @@
 
 
 describe Task, 'outcome_url' do
-  include Specs::Tasks
   it_should_behave_like 'Task url'
 
   before :all do
@@ -426,10 +394,9 @@
 
 
 describe Task, 'outcome_type' do
-  include Specs::Tasks
 
   def outcome_values(mime_type)
-    default_task.merge(:outcome_url=>'http://test.host/outcome', 
:outcome_type=>mime_type)
+    defaults(:outcome_url=>'http://test.host/outcome', 
:outcome_type=>mime_type)
   end
 
   it 'should be ignored unless outcome URL specified' do
@@ -482,12 +449,11 @@
 
 
 describe Task, 'token' do
-  include Specs::Tasks
 
   before :each do
     @creator = person('creator')
     @owner = person('owner')
-    @task = Task.new(default_task.merge(:creator=>@creator, :owner=>@owner))
+    @task = Task.new(defaults(:creator=>@creator, :owner=>@owner))
     @creator_token = @task.token_for(@creator)
     @owner_token = @task.token_for(@owner)
   end
@@ -523,7 +489,6 @@
 
 
 describe Task, 'stakeholder?' do
-  include Specs::Tasks
 
   before :all do
     @task = Task.new(@roles = all_roles)
@@ -563,62 +528,10 @@
 end
 
 
-describe Task, 'version' do
-  include Specs::Tasks
-
-  before :each do
-    @task = Task.create!(default_task)
-  end
-
-  it 'should start at zero' do
-    @task.version.should eql(0)
-  end
-
-  it 'should increment when task saved' do
-    5.times do |n|
-      lambda { @task.save }.should change(@task, :version).from(n).to(n + 1)
-    end
-  end
-
-end
-
-
-describe Task, 'etag' do
-  include Specs::Tasks
-
-  before :each do
-    @task = Task.create!(default_task)
-  end
-
-  it 'should return same value if task not udpated' do
-    @task.etag.should eql(@task.etag)
-  end
-
-  it 'should change when task updated' do
-    3.times do
-      lambda { @task.save }.should change(@task, :etag)
-    end
-  end
-
-  it 'should be unique across tasks' do
-    @task.etag.should_not eql(Task.create!(default_task))
-  end
-
-  it 'should be MD5 hash' do
-    2.times do
-      @task.etag.should match(/^[a-f0-9]{32}$/)
-      @task.save
-    end
-  end
-
-end
-
-
 describe Task, 'cancellation' do
-  include Specs::Tasks
 
   before :each do
-    @task = Task.new(default_task.merge(@roles = all_roles))
+    @task = Task.new(defaults(@roles = all_roles))
   end
 
   it 'should default to :admin' do
@@ -646,14 +559,13 @@
 
 
 describe Task, 'completion' do
-  include Specs::Tasks
 
   before :all do
     @roles = all_roles
   end
 
   before :each do
-    @task = Task.create(default_task.merge(@roles))
+    @task = Task.create(defaults(@roles))
   end
 
   it 'should allow owner to complete task' do

Modified: ode/sandbox/singleshot/spec/spec_helper.rb
URL: 
http://svn.apache.org/viewvc/ode/sandbox/singleshot/spec/spec_helper.rb?rev=662652&r1=662651&r2=662652&view=diff
==============================================================================
--- ode/sandbox/singleshot/spec/spec_helper.rb (original)
+++ ode/sandbox/singleshot/spec/spec_helper.rb Mon Jun  2 21:53:40 2008
@@ -4,7 +4,6 @@
 require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
 require 'spec/rails'
 require File.expand_path(File.dirname(__FILE__) + "/enhancements")
-require File.expand_path(File.dirname(__FILE__) + "/common")
 
 Spec::Runner.configure do |config|
   config.use_transactional_fixtures = true


Reply via email to