Commit 428da059b46d76aef63e4465896aa7e3e036a4ac

Authored by AntonioTerceiro
1 parent ca62da08

ActionItem70: implementing categories



git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@520 3f533792-8f58-4932-b0fe-aaf55b0a4547
app/models/category.rb 0 → 100644
... ... @@ -0,0 +1,32 @@
  1 +class Category < ActiveRecord::Base
  2 +
  3 + validates_presence_of :name, :environment_id
  4 + belongs_to :environment
  5 +
  6 + acts_as_tree :order => 'name'
  7 +
  8 + def full_name(sep = '/')
  9 + self.parent ? (self.parent.full_name(sep) + sep + self.name) : (self.name)
  10 + end
  11 + def level
  12 + self.parent ? (self.parent.level + 1) : 0
  13 + end
  14 + def top_level?
  15 + self.parent.nil?
  16 + end
  17 + def leaf?
  18 + self.children.empty?
  19 + end
  20 +
  21 + def self.top_level_for(environment)
  22 + self.find(:all, :conditions => ['parent_id is null and environment_id = ?', environment.id ])
  23 + end
  24 +
  25 + def name=(value)
  26 + self[:name] = value
  27 + unless self.name.empty?
  28 + self.slug = self.name.transliterate.downcase.gsub( /[^-a-z0-9~\s\.:;+=_]/, '').gsub(/[\s\.:;=_+]+/, '-').gsub(/[\-]{2,}/, '-').to_s
  29 + end
  30 + end
  31 +
  32 +end
... ...
config/environment.rb
... ... @@ -96,3 +96,5 @@ Comatose::AdminController.before_filter do |controller|
96 96 controller.instance_variable_set('@environment', environment)
97 97 end
98 98  
  99 +# string transliteration
  100 +require 'noosfero/transliterations'
... ...
db/migrate/016_create_categories.rb 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +class CreateCategories < ActiveRecord::Migration
  2 + def self.up
  3 + create_table :categories do |t|
  4 + t.column :name, :string
  5 + t.column :slug, :string
  6 + t.column :path, :text, :default => ''
  7 +
  8 + t.column :environment_id, :integer
  9 + t.column :parent_id, :integer
  10 + t.column :type, :string
  11 + end
  12 + end
  13 +
  14 + def self.down
  15 + drop_table :categories
  16 + end
  17 +end
... ...
test/unit/category_test.rb 0 → 100644
... ... @@ -0,0 +1,119 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class CategoryTest < Test::Unit::TestCase
  4 +
  5 + def setup
  6 + @env = Environment.create!(:name => 'Enviroment for testing')
  7 + end
  8 +
  9 + def test_mandatory_field_name
  10 + c = Category.new
  11 + c.organization = @env
  12 + c.save
  13 + assert c.errors.invalid?(:name)
  14 + end
  15 +
  16 + def test_mandatory_field_name
  17 + c = Category.new
  18 + c.name = 'product category for testing'
  19 + assert !c.valid?
  20 + assert c.errors.invalid?(:environment_id)
  21 + end
  22 +
  23 + def test_relationship_with_environment
  24 + c = Category.create!(:name => 'product category for testing', :environment_id => @env.id)
  25 + assert_equal @env, c.environment
  26 + end
  27 +
  28 + def test_relation_with_parent
  29 + parent_category = Category.create!(:name => 'parent category for testing', :environment_id => @env.id)
  30 + c = Category.create!(:name => 'product category for testing', :environment_id => @env.id, :parent_id => parent_category.id)
  31 + assert_equal parent_category, c.parent
  32 + end
  33 +
  34 + # def test_full_text_search
  35 + # c = Category.create!(:name => 'product category for testing', :environment_id => @env.id)
  36 + # assert @env.product_categories.full_text_search('product*').include?(c)
  37 + # end
  38 +
  39 + def test_category_full_name
  40 + cat = Category.new(:name => 'category_name')
  41 + assert_equal 'category_name', cat.full_name
  42 + end
  43 +
  44 + def test_subcategory_full_name
  45 + cat = Category.new(:name => 'category_name')
  46 + sub_cat = Category.new(:name => 'subcategory_name')
  47 + sub_cat.stubs(:parent).returns(cat)
  48 + sub_cat.parent = cat
  49 + assert_equal 'category_name/subcategory_name', sub_cat.full_name
  50 + end
  51 +
  52 + def test_category_level
  53 + cat = Category.new(:name => 'category_name')
  54 + assert_equal 0, cat.level
  55 + end
  56 +
  57 + def test_subegory_level
  58 + cat = Category.new(:name => 'category_name')
  59 + sub_cat = Category.new(:name => 'subcategory_name')
  60 + sub_cat.stubs(:parent).returns(cat)
  61 + sub_cat.parent = cat
  62 + assert_equal 1, sub_cat.level
  63 + end
  64 +
  65 + def test_top_level
  66 + cat = Category.new(:name => 'category_name')
  67 + assert cat.top_level?
  68 + end
  69 +
  70 + def test_not_top_level
  71 + cat = Category.new(:name => 'category_name')
  72 + sub_cat = Category.new(:name => 'subcategory_name')
  73 + sub_cat.stubs(:parent).returns(cat)
  74 + sub_cat.parent = cat
  75 + assert !sub_cat.top_level?
  76 + end
  77 +
  78 + def test_leaf
  79 + cat = Category.new(:name => 'category_name')
  80 + sub_cat = Category.new(:name => 'subcategory_name')
  81 + cat.stubs(:children).returns([sub_cat])
  82 + assert !cat.leaf?
  83 + end
  84 +
  85 + def test_not_leaf
  86 + cat = Category.new(:name => 'category_name')
  87 + sub_cat = Category.new(:name => 'subcategory_name')
  88 + cat.stubs(:children).returns([])
  89 + assert cat.leaf?
  90 + end
  91 +
  92 + def test_top_level_for
  93 + cat = Category.create(:name => 'Category for testing', :environment_id => @env.id)
  94 + sub_cat = Category.create(:name => 'SubCategory for testing', :environment_id => @env.id, :parent_id => cat.id)
  95 +
  96 + roots = Category.top_level_for(@env)
  97 +
  98 + assert_equal 1, roots.size
  99 + end
  100 +
  101 + def test_slug
  102 + c = Category.create(:name => 'Category name')
  103 + assert_equal 'category-name', c.slug
  104 + end
  105 +
  106 + def test_path_for_toplevel
  107 + c = Category.new(:name => 'top_level')
  108 + assert_equal 'top_level', c.path
  109 + end
  110 +
  111 + def test_path_for_subcategory
  112 + c1 = Category.new(:name => 'parent')
  113 + c2 = Category.new(:name => 'child')
  114 + c2.parent = c1
  115 +
  116 + assert_equal 'parent/child', c2.path
  117 + end
  118 +
  119 +end
... ...