From 428da059b46d76aef63e4465896aa7e3e036a4ac Mon Sep 17 00:00:00 2001 From: AntonioTerceiro Date: Sat, 22 Sep 2007 21:11:16 +0000 Subject: [PATCH] ActionItem70: implementing categories --- app/models/category.rb | 32 ++++++++++++++++++++++++++++++++ config/environment.rb | 2 ++ db/migrate/016_create_categories.rb | 17 +++++++++++++++++ test/unit/category_test.rb | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 170 insertions(+), 0 deletions(-) create mode 100644 app/models/category.rb create mode 100644 db/migrate/016_create_categories.rb create mode 100644 test/unit/category_test.rb diff --git a/app/models/category.rb b/app/models/category.rb new file mode 100644 index 0000000..17c4d68 --- /dev/null +++ b/app/models/category.rb @@ -0,0 +1,32 @@ +class Category < ActiveRecord::Base + + validates_presence_of :name, :environment_id + belongs_to :environment + + acts_as_tree :order => 'name' + + def full_name(sep = '/') + self.parent ? (self.parent.full_name(sep) + sep + self.name) : (self.name) + end + def level + self.parent ? (self.parent.level + 1) : 0 + end + def top_level? + self.parent.nil? + end + def leaf? + self.children.empty? + end + + def self.top_level_for(environment) + self.find(:all, :conditions => ['parent_id is null and environment_id = ?', environment.id ]) + end + + def name=(value) + self[:name] = value + unless self.name.empty? + self.slug = self.name.transliterate.downcase.gsub( /[^-a-z0-9~\s\.:;+=_]/, '').gsub(/[\s\.:;=_+]+/, '-').gsub(/[\-]{2,}/, '-').to_s + end + end + +end diff --git a/config/environment.rb b/config/environment.rb index 14a6a69..0cfa6d2 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -96,3 +96,5 @@ Comatose::AdminController.before_filter do |controller| controller.instance_variable_set('@environment', environment) end +# string transliteration +require 'noosfero/transliterations' diff --git a/db/migrate/016_create_categories.rb b/db/migrate/016_create_categories.rb new file mode 100644 index 0000000..f3a3eec --- /dev/null +++ b/db/migrate/016_create_categories.rb @@ -0,0 +1,17 @@ +class CreateCategories < ActiveRecord::Migration + def self.up + create_table :categories do |t| + t.column :name, :string + t.column :slug, :string + t.column :path, :text, :default => '' + + t.column :environment_id, :integer + t.column :parent_id, :integer + t.column :type, :string + end + end + + def self.down + drop_table :categories + end +end diff --git a/test/unit/category_test.rb b/test/unit/category_test.rb new file mode 100644 index 0000000..40ae55d --- /dev/null +++ b/test/unit/category_test.rb @@ -0,0 +1,119 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class CategoryTest < Test::Unit::TestCase + + def setup + @env = Environment.create!(:name => 'Enviroment for testing') + end + + def test_mandatory_field_name + c = Category.new + c.organization = @env + c.save + assert c.errors.invalid?(:name) + end + + def test_mandatory_field_name + c = Category.new + c.name = 'product category for testing' + assert !c.valid? + assert c.errors.invalid?(:environment_id) + end + + def test_relationship_with_environment + c = Category.create!(:name => 'product category for testing', :environment_id => @env.id) + assert_equal @env, c.environment + end + + def test_relation_with_parent + parent_category = Category.create!(:name => 'parent category for testing', :environment_id => @env.id) + c = Category.create!(:name => 'product category for testing', :environment_id => @env.id, :parent_id => parent_category.id) + assert_equal parent_category, c.parent + end + + # def test_full_text_search + # c = Category.create!(:name => 'product category for testing', :environment_id => @env.id) + # assert @env.product_categories.full_text_search('product*').include?(c) + # end + + def test_category_full_name + cat = Category.new(:name => 'category_name') + assert_equal 'category_name', cat.full_name + end + + def test_subcategory_full_name + cat = Category.new(:name => 'category_name') + sub_cat = Category.new(:name => 'subcategory_name') + sub_cat.stubs(:parent).returns(cat) + sub_cat.parent = cat + assert_equal 'category_name/subcategory_name', sub_cat.full_name + end + + def test_category_level + cat = Category.new(:name => 'category_name') + assert_equal 0, cat.level + end + + def test_subegory_level + cat = Category.new(:name => 'category_name') + sub_cat = Category.new(:name => 'subcategory_name') + sub_cat.stubs(:parent).returns(cat) + sub_cat.parent = cat + assert_equal 1, sub_cat.level + end + + def test_top_level + cat = Category.new(:name => 'category_name') + assert cat.top_level? + end + + def test_not_top_level + cat = Category.new(:name => 'category_name') + sub_cat = Category.new(:name => 'subcategory_name') + sub_cat.stubs(:parent).returns(cat) + sub_cat.parent = cat + assert !sub_cat.top_level? + end + + def test_leaf + cat = Category.new(:name => 'category_name') + sub_cat = Category.new(:name => 'subcategory_name') + cat.stubs(:children).returns([sub_cat]) + assert !cat.leaf? + end + + def test_not_leaf + cat = Category.new(:name => 'category_name') + sub_cat = Category.new(:name => 'subcategory_name') + cat.stubs(:children).returns([]) + assert cat.leaf? + end + + def test_top_level_for + cat = Category.create(:name => 'Category for testing', :environment_id => @env.id) + sub_cat = Category.create(:name => 'SubCategory for testing', :environment_id => @env.id, :parent_id => cat.id) + + roots = Category.top_level_for(@env) + + assert_equal 1, roots.size + end + + def test_slug + c = Category.create(:name => 'Category name') + assert_equal 'category-name', c.slug + end + + def test_path_for_toplevel + c = Category.new(:name => 'top_level') + assert_equal 'top_level', c.path + end + + def test_path_for_subcategory + c1 = Category.new(:name => 'parent') + c2 = Category.new(:name => 'child') + c2.parent = c1 + + assert_equal 'parent/child', c2.path + end + +end -- libgit2 0.21.2