From f4395fae01a6b86eb06123e8317e5cba95312f8c Mon Sep 17 00:00:00 2001 From: AntonioTerceiro Date: Tue, 9 Oct 2007 18:17:48 +0000 Subject: [PATCH] ActionItem78: generating unique codes for tasks --- app/models/task.rb | 23 +++++++++++++++++++++++ db/migrate/017_create_tasks.rb | 2 +- test/unit/task_test.rb | 18 ++++++++++++++++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/app/models/task.rb b/app/models/task.rb index 33c57d3..2f8433a 100644 --- a/app/models/task.rb +++ b/app/models/task.rb @@ -24,11 +24,23 @@ class Task < ActiveRecord::Base belongs_to :requestor, :class_name => 'Person', :foreign_key => :requestor_id belongs_to :target, :class_name => 'Profile', :foreign_key => :target_id + validates_uniqueness_of :code + validates_presence_of :code + def initialize(*args) super self.status ||= Task::Status::ACTIVE end + before_validation_on_create do |task| + if task.code.nil? + task.code = Task.generate_code + while (Task.find_by_code(task.code)) + task.code = Task.generate_code + end + end + end + after_create do |task| TaskMailer.deliver_task_created(task) end @@ -95,4 +107,15 @@ class Task < ActiveRecord::Base def perform end + class << self + def generate_code + chars = ('a'..'z').to_a + ('0'..'9').to_a + code = "" + chars.size.times do |n| + code << chars[rand(chars.size)] + end + code + end + end + end diff --git a/db/migrate/017_create_tasks.rb b/db/migrate/017_create_tasks.rb index 26ccdec..5b3817b 100644 --- a/db/migrate/017_create_tasks.rb +++ b/db/migrate/017_create_tasks.rb @@ -8,7 +8,7 @@ class CreateTasks < ActiveRecord::Migration t.column :requestor_id, :integer t.column :target_id, :integer - t.column :hash, :string + t.column :code, :string, :limit => 40 end end diff --git a/test/unit/task_test.rb b/test/unit/task_test.rb index 89a7e46..8977f3f 100644 --- a/test/unit/task_test.rb +++ b/test/unit/task_test.rb @@ -88,9 +88,23 @@ class TaskTest < Test::Unit::TestCase task.save! end - should 'generate a random hash when creating' do - flunk 'not implemented yet' + should 'generate a random code before validation' do + Task.expects(:generate_code) + Task.new.valid? end + should 'make sure that codes are unique' do + task1 = Task.create! + task2 = Task.new(:code => task1.code) + + assert !task2.valid? + assert task2.errors.invalid?(:code) + end + + should 'generate a code with chars from a-z and 0-9' do + code = Task.generate_code + assert(code =~ /^[a-z0-9]+$/) + assert_equal 36, code.size + end end -- libgit2 0.21.2