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