Author: assaf
Date: Fri May 9 17:16:01 2008
New Revision: 654991
URL: http://svn.apache.org/viewvc?rev=654991&view=rev
Log:
Added tests for creator modification and for excluded owners.
Modified:
ode/sandbox/singleshot/app/models/person.rb
ode/sandbox/singleshot/app/models/stakeholder.rb
ode/sandbox/singleshot/spec/models/stakeholder_spec.rb
Modified: ode/sandbox/singleshot/app/models/person.rb
URL:
http://svn.apache.org/viewvc/ode/sandbox/singleshot/app/models/person.rb?rev=654991&r1=654990&r2=654991&view=diff
==============================================================================
--- ode/sandbox/singleshot/app/models/person.rb (original)
+++ ode/sandbox/singleshot/app/models/person.rb Fri May 9 17:16:01 2008
@@ -38,13 +38,11 @@
# Resolves a person based on their identity. For convenience, when called
with a Person object,
# returns that same object. You can also call this method with an array of
identities, and
# it will return an array of people. Matches against the identity
returned in to_param.
- def identify(*args)
- identities = args.flatten
- if identities.size > 1
- identities.map { |identity| identify(identity) }.uniq
- else
- identity = identities.first
- Person === identity ? identity : Person.find_by_identity(identity)
+ def identify(identity)
+ case identity
+ when Array then identity.flatten.map { |id| identify(id) }.uniq
+ when Person then identity
+ else Person.find_by_identity(identity)
end
end
Modified: ode/sandbox/singleshot/app/models/stakeholder.rb
URL:
http://svn.apache.org/viewvc/ode/sandbox/singleshot/app/models/stakeholder.rb?rev=654991&r1=654990&r2=654991&view=diff
==============================================================================
--- ode/sandbox/singleshot/app/models/stakeholder.rb (original)
+++ ode/sandbox/singleshot/app/models/stakeholder.rb Fri May 9 17:16:01 2008
@@ -56,12 +56,18 @@
define_method("#{role}=") { |identity| set_role role, identity }
end
- PLURAL_METHODS = {'potential_owners'=>'potential',
'excluded_owners'=>'excluded', 'observers'=>'observer', 'admins'=>'admin'}
+ def creator=(identity)
+ return unless new_record?
+ set_role 'creator', identity
+ end
- PLURAL_METHODS.each do |method, role|
- define_method(method) { in_role(role) }
- define_method("#{method}?") { |identity| in_role?(role, identity) }
- define_method("#{method}=") { |identities| set_role role, identities }
+ ACCESSORS = {'potential_owner'=>'potential', 'excluded_owner'=>'excluded',
'observer'=>'observer', 'admin'=>'admin'}
+
+ ACCESSORS.each do |accessor, role|
+ plural = accessor.pluralize
+ define_method(plural) { in_role(role) }
+ define_method("#{accessor}?") { |identity| in_role?(role, identity) }
+ define_method("#{plural}=") { |identities| set_role role, identities }
end
private
@@ -79,11 +85,11 @@
# Set people associated with this role.
def set_role(role, identities)
- people = Array(Person.identify(identities)).uniq
- existing = stakeholders.select { |sh| sh.role == role }
- stakeholders.delete existing.reject { |sh| people.include?(sh.person) }
- (people - existing.map(&:person)).each { |person| stakeholders.build
:person=>person, :role=>role }
- changed_attributes[role.to_sym] = existing unless
changed_attributes.has_key?(role.to_sym)
+ new_set = Array(identities).map { |id| Person.identify(id) }
+ old_set = stakeholders.select { |sh| sh.role == role }
+ stakeholders.delete old_set.reject { |sh| new_set.include?(sh.person) }
+ (new_set - old_set.map(&:person)).each { |person| stakeholders.build
:person=>person, :role=>role }
+ changed_attributes[role.to_sym] = old_set unless
changed_attributes.has_key?(role.to_sym)
end
end
@@ -91,17 +97,8 @@
module Validation
def self.included(base)
- base.before_validation do |record|
- # Delete potential owners listed in the excluded owners list. Use
identity to handle new records.
- #excluded = record.excluded_owners.map(&:identity)
- #record.stakeholders.delete
record.stakeholders.select(&:potential_owner?).select { |sh|
excluded.include?(sh.person.identity) }
-=begin
- # Assign owner if only one potential owner specified.
- unless record.owner
- potential = record.potential_owners - record.excluded_owners
- record.owner = potentia.first if potential.size == 1
- end
-=end
+ base.before_validation_on_create do |record|
+ record.owner = record.potential_owners.first unless record.owner ||
record.potential_owners.size > 1
end
# Can only have one member of a singular role.
@@ -112,11 +109,12 @@
end
base.validate do |record|
creator = record.stakeholders.detect { |sh| sh.role == 'creator' }
- record.errors.add :creator, 'Cannot change creator.' unless
creator.nil? || (record.new_record? == creator.new_record?)
-=begin
- record.errors.add :owner, "#{record.owner.fullname} is on the excluded
owners list and cannot claim this task." if
- record.owner &&
record.excluded_owners.map(&:identity).include?(record.owner.identity)
-=end
+ record.errors.add :creator, 'Cannot change creator.' if
record.changed.include?(:creator) && !record.new_record?
+ record.errors.add :owner, "#{record.owner.fullname} is on the excluded
owners list and cannot be owner of this task." if
+ record.excluded_owner?(record.owner)
+ conflicting = record.potential_owners & record.excluded_owners
+ record.errors.add :potential_owners,
"#{conflicting.map(&:fullname).join(', ')} listed on both excluded and
potential owners list" unless
+ conflicting.empty?
end
end
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=654991&r1=654990&r2=654991&view=diff
==============================================================================
--- ode/sandbox/singleshot/spec/models/stakeholder_spec.rb (original)
+++ ode/sandbox/singleshot/spec/models/stakeholder_spec.rb Fri May 9 17:16:01
2008
@@ -49,8 +49,8 @@
end
it 'should not exist unless specified' do
- task = Task.create(default_task.except(@role))
- Task.find(task.id).send(@role).should be_nil
+ Task.create default_task.except(@role)
+ Task.first.send(@role).should be_nil
end
it 'should accept person at task creation' do
@@ -58,14 +58,14 @@
end
it 'should return person when loading task' do
- task = Task.create(default_task.merge(@role=>person('foo')))
- Task.find(task.id).send(@role).should eql(person('foo'))
+ Task.create default_task.merge(@role=>person('foo'))
+ Task.first.send(@role).should eql(person('foo'))
end
it 'should identify person in role' do
- task = Task.create(default_task.merge(@role=>person('foo')))
- task.send("[EMAIL PROTECTED]", person('foo')).should be_true
- task.send("[EMAIL PROTECTED]", person('bar')).should be_false
+ Task.create default_task.merge(@role=>person('foo'))
+ Task.first.send("[EMAIL PROTECTED]", person('foo')).should be_true
+ Task.first.send("[EMAIL PROTECTED]", person('bar')).should be_false
end
end
@@ -75,15 +75,15 @@
it_should_behave_like 'singular role'
it 'should not allow changing creator' do
- task = Task.create(default_task.merge(:creator=>person('creator')))
- task.update_attributes :creator=>person('other')
- task.should have(1).errors_on(:creator)
+ Task.create default_task.merge(:creator=>person('creator'))
+ Task.first.update_attributes :creator=>person('other')
+ Task.first.creator.should == person('creator')
end
it 'should not allow setting creator on existing task' do
- task = Task.create(default_task)
- task.update_attributes :creator=>person('creator')
- task.should have(1).errors_on(:creator)
+ Task.create default_task
+ Task.first.update_attributes :creator=>person('creator')
+ Task.first.creator.should be_nil
end
end
@@ -94,33 +94,44 @@
it_should_behave_like 'singular role'
it 'should allow changing owner on existing task' do
- task = Task.create(default_task.merge(:owner=>person('owner')))
- task.update_attributes! :owner=>person('other')
- task.should have(:no).errors
- end
-
- it 'should return new owner after changing owner' do
- task = Task.create(default_task.merge(:owner=>person('owner')))
- task.update_attributes! :owner=>person('other')
- Task.find(task.id).owner.should eql(Person.find_by_email('[EMAIL
PROTECTED]'))
+ Task.create default_task.merge(:owner=>person('owner'))
+ Task.first.update_attributes! :owner=>person('other')
+ Task.first.owner.should == person('other')
end
it 'should only store one owner association for task' do
- task = Task.create(default_task.merge(:owner=>person('owner')))
- task.update_attributes! :owner=>person('other')
- Stakeholder.find(:all, :conditions=>{:task_id=>task.id}).size.should eql(1)
+ Task.create default_task.merge(:owner=>person('owner'))
+ Task.first.update_attributes! :owner=>person('other')
+ Stakeholder.find(:all, :conditions=>{:task_id=>Task.first.id}).size.should
== 1
end
it 'should allow setting owner to nil' do
- task = Task.create(default_task.merge(:owner=>person('owner')))
- task.update_attributes! :owner=>nil
- task.should have(:no).errors
+ Task.create default_task.merge(:owner=>person('owner'))
+ Task.first.update_attributes! :owner=>nil
+ Task.first.owner.should be_nil
end
- it 'should return no owner after changing to nil' do
- task = Task.create(default_task.merge(:owner=>person('owner')))
- task.update_attributes! :owner=>nil
- Task.find(task.id).owner.should be_nil
+ it 'should not allow owner if listed in excluded owners' do
+ Task.create default_task.merge(:excluded_owners=>person('excluded'))
+ lambda { Task.first.update_attributes! :owner=>person('excluded') }.should
raise_error
+ Task.first.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.first.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.first.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.first.update_attributes! :owner=>person('bar')
+ Task.first.update_attributes! :owner=>nil
+ Task.first.owner.should be(nil)
end
end
@@ -137,8 +148,8 @@
end
it 'should not exist unless specified' do
- task = Task.create(default_task.except(@role))
- Task.find(task.id).send(@role).should be_empty
+ Task.create default_task.except(@role)
+ Task.first.send(@role).should be_empty
end
it 'should accept list of people at task creation' do
@@ -146,53 +157,53 @@
end
it 'should list of people when loading task' do
- task = Task.create(default_task.merge(@role=>@people))
- Task.find(task.id).send(@role).should eql(@people)
+ Task.create default_task.merge(@role=>@people)
+ Task.first.send(@role).should == @people
end
it 'should accept single person' do
- task = Task.create(default_task.merge(@role=>person('foo')))
- Task.find(task.id).send(@role).should eql([person('foo')])
+ Task.create default_task.merge(@role=>person('foo'))
+ Task.first.send(@role).should == [person('foo')]
end
it 'should accept empty list' do
- task = Task.create(default_task.merge(@role=>[]))
- Task.find(task.id).send(@role).should be_empty
+ Task.create(default_task.merge(@role=>[]))
+ Task.first.send(@role).should be_empty
end
it 'should accept empty list and discard all stakeholders' do
- task = Task.create(default_task.merge(@role=>@people))
- task.update_attributes! @role=>[]
- Task.find(task.id).send(@role).should be_empty
+ Task.create default_task.merge(@role=>@people)
+ Task.first.update_attributes! @role=>[]
+ Task.first.send(@role).should be_empty
end
it 'should accept nil and treat it as empty list' do
- task = Task.create(default_task.merge(@role=>@people))
- task.update_attributes! @role=>nil
- Task.find(task.id).send(@role).should be_empty
+ Task.create default_task.merge(@role=>@people)
+ Task.first.update_attributes! @role=>nil
+ Task.first.send(@role).should be_empty
end
it 'should allow adding stakeholders' do
- task = Task.create(default_task.merge(@role=>person('foo')))
- task.update_attributes! @role=>task.send(@role) + [person('bar')]
- Task.find(task.id).send(@role).should include(person('foo'), person('bar'))
+ Task.create default_task.merge(@role=>person('foo'))
+ Task.first.update_attributes! @role=>[person('foo'), person('bar')]
+ Task.first.send(@role).should == [person('foo'), person('bar')]
end
it 'should add each person only once' do
- task = Task.create(default_task.merge(@role=>[person('foo')] *3))
- Task.find(task.id).send(@role).size.should eql(1)
+ Task.create default_task.merge(@role=>([person('foo')] *3))
+ Task.first.send(@role).size.should == 1
end
it 'should allow removing stakeholders' do
- task = Task.create(default_task.merge(@role=>[person('foo'),
person('bar')]))
- task.update_attributes! @role=>person('bar')
- Task.find(task.id).send(@role).should eql([person('bar')])
+ Task.create default_task.merge(@role=>[person('foo'), person('bar')])
+ Task.first.update_attributes! @role=>person('bar')
+ Task.first.send(@role).should == [person('bar')]
end
it 'should identify person in role' do
- task = Task.create(default_task.merge(@role=>person('foo')))
- Task.find(task.id).send("[EMAIL PROTECTED]", person('foo')).should be_true
- Task.find(task.id).send("[EMAIL PROTECTED]", person('bar')).should be_false
+ Task.create default_task.merge(@role=>person('foo'))
+ Task.first.send("[EMAIL PROTECTED]", person('foo')).should be_true
+ Task.first.send("[EMAIL PROTECTED]", person('bar')).should be_false
end
end
@@ -201,7 +212,11 @@
before { @role = :potential_owners }
it_should_behave_like 'plural role'
- it 'should never include excluded owners'
+ 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)
+ end
end