Commit 18bbbd048d5806859fef5fb67c6f559f562578da

Authored by Rodrigo Souto
1 parent 2c1b5026

New subcategory uses parent class

  * Also including a migration to remove subcategories of
    ProductCategory that aren't a subclass of ProductCategory.

(ActionItem2007)
app/controllers/admin/categories_controller.rb
... ... @@ -14,7 +14,7 @@ class CategoriesController < AdminController
14 14  
15 15 # posts back
16 16 def new
17   - type = (params[:type] || 'Category')
  17 + type = (params[:type] || params[:parent_type] || 'Category')
18 18 raise 'Type not allowed' unless ALLOWED_TYPES.include?(type)
19 19  
20 20 @category = type.constantize.new(params[:category])
... ...
app/controllers/my_profile/manage_products_controller.rb
... ... @@ -40,8 +40,8 @@ class ManageProductsController < ApplicationController
40 40 end
41 41  
42 42 def new
43   - @product = @profile.products.build(:product_category_id => params[:selected_category_id])
44   - @category = @product.product_category
  43 + @category = params[:selected_category_id] ? Category.find(params[:selected_category_id]) : nil
  44 + @product = @profile.products.build(:product_category => @category)
45 45 @categories = ProductCategory.top_level_for(environment)
46 46 @level = 0
47 47 if request.post?
... ...
db/migrate/20110520150544_remove_categories_with_invalid_type.rb 0 → 100644
... ... @@ -0,0 +1,18 @@
  1 +class RemoveCategoriesWithInvalidType < ActiveRecord::Migration
  2 +
  3 + def self.remove_invalid(category)
  4 + if category.class != ProductCategory && !category.class.ancestors.include?(ProductCategory)
  5 + category.destroy
  6 + else
  7 + category.children.map { |child| remove_invalid(child) }
  8 + end
  9 + end
  10 +
  11 + def self.up
  12 + ProductCategory.all.map { |category| remove_invalid(category)}
  13 + end
  14 +
  15 + def self.down
  16 + say "this migration can't be reverted"
  17 + end
  18 +end
... ...
test/functional/categories_controller_test.rb
... ... @@ -167,4 +167,11 @@ class CategoriesControllerTest &lt; Test::Unit::TestCase
167 167 assert_equal [r], assigns(:regions)
168 168 end
169 169  
  170 + should 'use parent\'s type to determine subcategory\'s type' do
  171 + parent = ProductCategory.create!(:name => 'Sample category', :environment => Environment.default)
  172 + post :new, :parent_id => parent.id, :parent_type => parent.class.name, :category => {:name => 'Subcategory'}
  173 + sub = Category.last
  174 + assert_equal parent.class, sub.class
  175 + end
  176 +
170 177 end
... ...
test/functional/manage_products_controller_test.rb
... ... @@ -170,6 +170,14 @@ class ManageProductsControllerTest &lt; Test::Unit::TestCase
170 170 end
171 171 end
172 172  
  173 + should 'not create a new product with an invalid category' do
  174 + category1 = fast_create(Category, :name => 'Category 1')
  175 + category2 = fast_create(Category, :name => 'Category 2', :parent_id => category1)
  176 + assert_raise ActiveRecord::AssociationTypeMismatch do
  177 + post 'new', :profile => @enterprise.identifier, :product => { :name => 'test product' }, :selected_category_id => category2.id
  178 + end
  179 + end
  180 +
173 181 should 'filter html from name of product' do
174 182 category = fast_create(ProductCategory, :name => 'Category 1')
175 183 post 'new', :profile => @enterprise.identifier, :product => { :name => "<b id='html_name'>name bold</b>" }, :selected_category_id => category.id
... ...
test/unit/product_test.rb
... ... @@ -244,6 +244,13 @@ class ProductTest &lt; Test::Unit::TestCase
244 244 assert product.errors.invalid?(:product_category_id)
245 245 end
246 246  
  247 + should 'not save with a invalid category' do
  248 + category = Category.new(:name => 'Region', :environment => Environment.default)
  249 + assert_raise ActiveRecord::AssociationTypeMismatch do
  250 + Product.new(:name => 'Invalid category product', :product_category => category)
  251 + end
  252 + end
  253 +
247 254 should 'format values to float with 2 decimals' do
248 255 ent = fast_create(Enterprise, :name => 'test ent 1', :identifier => 'test_ent1')
249 256 product = fast_create(Product, :enterprise_id => ent.id, :price => 12.994, :discount => 1.994)
... ...