Commit f4395fae01a6b86eb06123e8317e5cba95312f8c

Authored by AntonioTerceiro
1 parent 34043d4f

ActionItem78: generating unique codes for tasks



git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@636 3f533792-8f58-4932-b0fe-aaf55b0a4547
app/models/task.rb
... ... @@ -24,11 +24,23 @@ class Task < ActiveRecord::Base
24 24 belongs_to :requestor, :class_name => 'Person', :foreign_key => :requestor_id
25 25 belongs_to :target, :class_name => 'Profile', :foreign_key => :target_id
26 26  
  27 + validates_uniqueness_of :code
  28 + validates_presence_of :code
  29 +
27 30 def initialize(*args)
28 31 super
29 32 self.status ||= Task::Status::ACTIVE
30 33 end
31 34  
  35 + before_validation_on_create do |task|
  36 + if task.code.nil?
  37 + task.code = Task.generate_code
  38 + while (Task.find_by_code(task.code))
  39 + task.code = Task.generate_code
  40 + end
  41 + end
  42 + end
  43 +
32 44 after_create do |task|
33 45 TaskMailer.deliver_task_created(task)
34 46 end
... ... @@ -95,4 +107,15 @@ class Task < ActiveRecord::Base
95 107 def perform
96 108 end
97 109  
  110 + class << self
  111 + def generate_code
  112 + chars = ('a'..'z').to_a + ('0'..'9').to_a
  113 + code = ""
  114 + chars.size.times do |n|
  115 + code << chars[rand(chars.size)]
  116 + end
  117 + code
  118 + end
  119 + end
  120 +
98 121 end
... ...
db/migrate/017_create_tasks.rb
... ... @@ -8,7 +8,7 @@ class CreateTasks &lt; ActiveRecord::Migration
8 8 t.column :requestor_id, :integer
9 9 t.column :target_id, :integer
10 10  
11   - t.column :hash, :string
  11 + t.column :code, :string, :limit => 40
12 12 end
13 13 end
14 14  
... ...
test/unit/task_test.rb
... ... @@ -88,9 +88,23 @@ class TaskTest &lt; Test::Unit::TestCase
88 88 task.save!
89 89 end
90 90  
91   - should 'generate a random hash when creating' do
92   - flunk 'not implemented yet'
  91 + should 'generate a random code before validation' do
  92 + Task.expects(:generate_code)
  93 + Task.new.valid?
93 94 end
94 95  
  96 + should 'make sure that codes are unique' do
  97 + task1 = Task.create!
  98 + task2 = Task.new(:code => task1.code)
  99 +
  100 + assert !task2.valid?
  101 + assert task2.errors.invalid?(:code)
  102 + end
  103 +
  104 + should 'generate a code with chars from a-z and 0-9' do
  105 + code = Task.generate_code
  106 + assert(code =~ /^[a-z0-9]+$/)
  107 + assert_equal 36, code.size
  108 + end
95 109  
96 110 end
... ...