From a1d51c769d422c460728c3eae4bd24d8560e8edd Mon Sep 17 00:00:00 2001 From: Rodrigo Souto Date: Tue, 1 Nov 2011 23:49:18 -0300 Subject: [PATCH] [bsc-contract] Models and migrations --- app/helpers/dates_helper.rb | 6 +++--- plugins/bsc/db/migrate/20111018201143_create_bsc_plugin_sale.rb | 15 +++++++++++++++ plugins/bsc/db/migrate/20111018201220_create_bsc_plugin_contracts_enterprises.rb | 12 ++++++++++++ plugins/bsc/db/migrate/20111018201239_create_bsc_plugin_contract.rb | 22 ++++++++++++++++++++++ plugins/bsc/lib/bsc_plugin/bsc.rb | 5 +++-- plugins/bsc/lib/bsc_plugin/bsc_helper.rb | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/bsc/lib/bsc_plugin/contract.rb | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/bsc/lib/bsc_plugin/sale.rb | 19 +++++++++++++++++++ plugins/bsc/lib/ext/enterprise.rb | 2 ++ plugins/bsc/lib/ext/product.rb | 4 ++++ plugins/bsc/test/unit/bsc_plugin/bsc_test.rb | 20 +++++++++++++++----- plugins/bsc/test/unit/bsc_plugin/contract_test.rb | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/bsc/test/unit/bsc_plugin/enterprise_test.rb | 26 -------------------------- plugins/bsc/test/unit/bsc_plugin/product_test.rb | 14 -------------- plugins/bsc/test/unit/bsc_plugin/sale_test.rb | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/bsc/test/unit/ext/enterprise_test.rb | 41 +++++++++++++++++++++++++++++++++++++++++ plugins/bsc/test/unit/ext/product_test.rb | 25 +++++++++++++++++++++++++ 17 files changed, 515 insertions(+), 50 deletions(-) create mode 100644 plugins/bsc/db/migrate/20111018201143_create_bsc_plugin_sale.rb create mode 100644 plugins/bsc/db/migrate/20111018201220_create_bsc_plugin_contracts_enterprises.rb create mode 100644 plugins/bsc/db/migrate/20111018201239_create_bsc_plugin_contract.rb create mode 100644 plugins/bsc/lib/bsc_plugin/bsc_helper.rb create mode 100644 plugins/bsc/lib/bsc_plugin/contract.rb create mode 100644 plugins/bsc/lib/bsc_plugin/sale.rb create mode 100644 plugins/bsc/test/unit/bsc_plugin/contract_test.rb delete mode 100644 plugins/bsc/test/unit/bsc_plugin/enterprise_test.rb delete mode 100644 plugins/bsc/test/unit/bsc_plugin/product_test.rb create mode 100644 plugins/bsc/test/unit/bsc_plugin/sale_test.rb create mode 100644 plugins/bsc/test/unit/ext/enterprise_test.rb create mode 100644 plugins/bsc/test/unit/ext/product_test.rb diff --git a/app/helpers/dates_helper.rb b/app/helpers/dates_helper.rb index d54af52..46ea061 100644 --- a/app/helpers/dates_helper.rb +++ b/app/helpers/dates_helper.rb @@ -42,11 +42,11 @@ module DatesHelper end end - def show_period(date1, date2 = nil) + def show_period(date1, date2 = nil, use_numbers = false) if (date1 == date2) || (date2.nil?) - show_date(date1) + show_date(date1, use_numbers) else - _('from %{date1} to %{date2}') % {:date1 => show_date(date1), :date2 => show_date(date2)} + _('from %{date1} to %{date2}') % {:date1 => show_date(date1, use_numbers), :date2 => show_date(date2, use_numbers)} end end diff --git a/plugins/bsc/db/migrate/20111018201143_create_bsc_plugin_sale.rb b/plugins/bsc/db/migrate/20111018201143_create_bsc_plugin_sale.rb new file mode 100644 index 0000000..57f784f --- /dev/null +++ b/plugins/bsc/db/migrate/20111018201143_create_bsc_plugin_sale.rb @@ -0,0 +1,15 @@ +class CreateBscPluginSale < ActiveRecord::Migration + def self.up + create_table :bsc_plugin_sales do |t| + t.references :product, :null => false + t.references :contract, :null => false + t.integer :quantity, :null => false + t.decimal :price + t.timestamps + end + end + + def self.down + drop_table :bsc_plugin_sales + end +end diff --git a/plugins/bsc/db/migrate/20111018201220_create_bsc_plugin_contracts_enterprises.rb b/plugins/bsc/db/migrate/20111018201220_create_bsc_plugin_contracts_enterprises.rb new file mode 100644 index 0000000..bd9b07a --- /dev/null +++ b/plugins/bsc/db/migrate/20111018201220_create_bsc_plugin_contracts_enterprises.rb @@ -0,0 +1,12 @@ +class CreateBscPluginContractsEnterprises < ActiveRecord::Migration + def self.up + create_table :bsc_plugin_contracts_enterprises, :id => false do |t| + t.references :contract + t.references :enterprise + end + end + + def self.down + drop_table :bsc_plugin_contracts_enterprises + end +end diff --git a/plugins/bsc/db/migrate/20111018201239_create_bsc_plugin_contract.rb b/plugins/bsc/db/migrate/20111018201239_create_bsc_plugin_contract.rb new file mode 100644 index 0000000..d16faa4 --- /dev/null +++ b/plugins/bsc/db/migrate/20111018201239_create_bsc_plugin_contract.rb @@ -0,0 +1,22 @@ +class CreateBscPluginContract < ActiveRecord::Migration + def self.up + create_table :bsc_plugin_contracts do |t| + t.string :client_name + t.integer :client_type + t.integer :business_type + t.string :state + t.string :city + t.integer :status, :default => 0 + t.integer :number_of_producers, :default => 0 + t.datetime :supply_start + t.datetime :supply_end + t.text :annotations + t.references :bsc + t.timestamps + end + end + + def self.down + drop_table :bsc_plugin_contracts + end +end diff --git a/plugins/bsc/lib/bsc_plugin/bsc.rb b/plugins/bsc/lib/bsc_plugin/bsc.rb index 6907739..75a5aca 100644 --- a/plugins/bsc/lib/bsc_plugin/bsc.rb +++ b/plugins/bsc/lib/bsc_plugin/bsc.rb @@ -3,6 +3,7 @@ class BscPlugin::Bsc < Enterprise has_many :enterprises has_many :enterprise_requests, :class_name => 'BscPlugin::AssociateEnterprise' has_many :products, :finder_sql => 'select * from products where enterprise_id in (#{enterprises.map(&:id).join(",")})' + has_many :contracts, :class_name => 'BscPlugin::Contract' validates_presence_of :nickname validates_presence_of :company_name @@ -19,8 +20,8 @@ class BscPlugin::Bsc < Enterprise enterprise_requests.pending.map(&:enterprise).include?(enterprise) end - def enterprises_to_json - enterprises.map { |enterprise| {:id => enterprise.id, :name => enterprise.name} }.to_json + def enterprises_to_token_input + enterprises.map { |enterprise| {:id => enterprise.id, :name => enterprise.name} } end def control_panel_settings_button diff --git a/plugins/bsc/lib/bsc_plugin/bsc_helper.rb b/plugins/bsc/lib/bsc_plugin/bsc_helper.rb new file mode 100644 index 0000000..08286c5 --- /dev/null +++ b/plugins/bsc/lib/bsc_plugin/bsc_helper.rb @@ -0,0 +1,75 @@ +module BscPlugin::BscHelper + include ActionView::Helpers::FormTagHelper + + def token_input_field_tag(name, element_id, search_action, options = {}, text_field_options = {}, html_options = {}) + options[:min_chars] ||= 3 + options[:hint_text] ||= _("Type in a search term") + options[:no_results_text] ||= _("No results") + options[:searching_text] ||= _("Searching...") + options[:search_delay] ||= 1000 + options[:prevent_duplicates] ||= true + options[:backspace_delete_item] ||= false + options[:focus] ||= false + options[:avoid_enter] ||= true + options[:on_result] ||= 'null' + options[:on_add] ||= 'null' + options[:on_delete] ||= 'null' + options[:on_ready] ||= 'null' + + result = text_field_tag(name, nil, text_field_options.merge(html_options.merge({:id => element_id}))) + result += + " + " + result + end + + def product_display_name(product) + "#{product.name} (#{product.enterprise.name})" + end + + def display_text_field(name, value, options={:display_nil => false, :nil_symbol => '---'}) + value = value.to_s + if !value.blank? || options[:display_nil] + value = value.blank? ? options[:nil_symbol] : value + content_tag('tr', content_tag('td', name+': ', :class => 'bsc-field-label') + content_tag('td', value, :class => 'bsc-field-value')) + end + end + + def display_list_field(list, options={:nil_symbol => '---'}) + list.map do |item| + item = item.blank? ? options[:nil_symbol] : item + content_tag('tr', content_tag('td', item, :class => 'bsc-field-value')) + end.join + end + + def short_text(name, chars = 40) + truncate name, chars, '...' + end + +end diff --git a/plugins/bsc/lib/bsc_plugin/contract.rb b/plugins/bsc/lib/bsc_plugin/contract.rb new file mode 100644 index 0000000..9184d48 --- /dev/null +++ b/plugins/bsc/lib/bsc_plugin/contract.rb @@ -0,0 +1,84 @@ +class BscPlugin::Contract < Noosfero::Plugin::ActiveRecord + validates_presence_of :bsc, :client_name + + has_many :sales, :class_name => 'BscPlugin::Sale' + has_many :products, :through => :sales + has_and_belongs_to_many :enterprises, :join_table => 'bsc_plugin_contracts_enterprises' + + belongs_to :bsc, :class_name => 'BscPlugin::Bsc' + + named_scope :status, lambda { |status_list| status_list.blank? ? {} : {:conditions => ['status in (?)', status_list]} } + named_scope :sorted_by, lambda { |sorter, direction| {:order => "#{sorter} #{direction}"} } + + before_create do |contract| + contract.created_at ||= Time.now.utc + contract.updated_at ||= Time.now.utc + end + + before_update do |contract| + contract.updated_at ||= Time.now.utc + end + + module Status + OPENED = 0 + NEGOTIATING = 1 + EXECUTING = 2 + CLOSED = 3 + + def self.types + [OPENED, NEGOTIATING, EXECUTING, CLOSED] + end + + def self.names + [_('Opened'), _('Negotiating'), _('Executing'), _('Closed')] + end + end + + module ClientType + STATE = 0 + FEDERAL = 1 + + def self.types + [STATE, FEDERAL] + end + + def self.names + [_('State'), _('Federal')] + end + end + + module BusinessType + PROJECTA = 0 + PROJECTB = 1 + + def self.types + [PROJECTA, PROJECTB] + end + + def self.names + [_('ProjectA'), _('ProjectB')] + end + end + + def enterprises_to_token_input + enterprises.map { |enterprise| {:id => enterprise.id, :name => enterprise.name} } + end + + def save_sales(sales) + failed_sales = {} + sales.each do |sale| + sale.merge!({:contract_id => id}) + begin + BscPlugin::Sale.create!(sale) + rescue Exception => exception + name = Product.find(sale[:product_id]).name + failed_sales[exception.clean_message] ? failed_sales[exception.clean_message] << name : failed_sales[exception.clean_message] = [name] + end + end + failed_sales + end + + def total_price + sales.inject(0) {|result, sale| sale.price*sale.quantity + result} + end +end diff --git a/plugins/bsc/lib/bsc_plugin/sale.rb b/plugins/bsc/lib/bsc_plugin/sale.rb new file mode 100644 index 0000000..e6d5ba1 --- /dev/null +++ b/plugins/bsc/lib/bsc_plugin/sale.rb @@ -0,0 +1,19 @@ +class BscPlugin::Sale < Noosfero::Plugin::ActiveRecord + validates_presence_of :product, :contract + validates_uniqueness_of :product_id, :scope => :contract_id + validates_numericality_of :quantity, :only_integer => true, :greater_than_or_equal_to => 0 + validates_numericality_of :price, :allow_nil => true + + belongs_to :product + belongs_to :contract, :class_name => 'BscPlugin::Contract' + + before_create do |sale| + sale.price ||= sale.product.price || 0 + sale.created_at ||= Time.now.utc + sale.updated_at ||= Time.now.utc + end + + before_update do |contract| + contract.updated_at ||= Time.now.utc + end +end diff --git a/plugins/bsc/lib/ext/enterprise.rb b/plugins/bsc/lib/ext/enterprise.rb index ff3f68b..160077c 100644 --- a/plugins/bsc/lib/ext/enterprise.rb +++ b/plugins/bsc/lib/ext/enterprise.rb @@ -2,6 +2,8 @@ require_dependency 'enterprise' class Enterprise belongs_to :bsc, :class_name => 'BscPlugin::Bsc' + has_and_belongs_to_many :contracts, :class_name => 'BscPlugin::Contract', :join_table => 'bsc_plugin_contracts_enterprises' + FIELDS << 'bsc_id' FIELDS << 'enabled' FIELDS << 'validated' diff --git a/plugins/bsc/lib/ext/product.rb b/plugins/bsc/lib/ext/product.rb index bdd10fd..d808f48 100644 --- a/plugins/bsc/lib/ext/product.rb +++ b/plugins/bsc/lib/ext/product.rb @@ -1,6 +1,10 @@ require_dependency 'product' class Product + + has_many :sales, :class_name => 'BscPlugin::Sale' + has_many :contracts, :through => :sales, :class_name => 'BscPlugin::Contract' + def bsc enterprise.bsc if enterprise end diff --git a/plugins/bsc/test/unit/bsc_plugin/bsc_test.rb b/plugins/bsc/test/unit/bsc_plugin/bsc_test.rb index 6ef248f..43ce88b 100644 --- a/plugins/bsc/test/unit/bsc_plugin/bsc_test.rb +++ b/plugins/bsc/test/unit/bsc_plugin/bsc_test.rb @@ -5,6 +5,12 @@ require File.dirname(__FILE__) + '/../../../lib/ext/enterprise' class BscPlugin::BscTest < Test::Unit::TestCase VALID_CNPJ = '94.132.024/0001-48' + def setup + @bsc = BscPlugin::Bsc.create!(:business_name => 'Sample Bsc', :company_name => 'Sample Bsc', :identifier => 'sample-bsc', :cnpj => VALID_CNPJ) + end + + attr_accessor :bsc + should 'validate presence of cnpj' do bsc = BscPlugin::Bsc.new() bsc.valid? @@ -13,7 +19,7 @@ class BscPlugin::BscTest < Test::Unit::TestCase end should 'validate uniqueness of cnpj' do - bsc1 = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) + bsc1 = bsc bsc2 = BscPlugin::Bsc.new(:cnpj => VALID_CNPJ) bsc2.valid? assert bsc2.errors.invalid?(:cnpj) @@ -22,7 +28,6 @@ class BscPlugin::BscTest < Test::Unit::TestCase should 'have many enterprises' do e1 = Enterprise.new(:name => 'Enterprise1', :identifier => 'enterprise1') e2 = Enterprise.new(:name => 'Enterprise2', :identifier => 'enterprise2') - bsc = BscPlugin::Bsc.new(:business_name => 'Sample Bsc', :company_name => 'Sample Bsc Ltda.', :identifier => 'sample-bsc', :cnpj => VALID_CNPJ) bsc.enterprises << e1 bsc.enterprises << e2 bsc.save! @@ -34,7 +39,6 @@ class BscPlugin::BscTest < Test::Unit::TestCase should 'verify already requested enterprises' do e1 = fast_create(Enterprise) e2 = fast_create(Enterprise) - bsc = BscPlugin::Bsc.new() task = BscPlugin::AssociateEnterprise.new(:target => e1, :bsc => bsc) bsc.enterprise_requests.stubs(:pending).returns([task]) @@ -46,7 +50,6 @@ class BscPlugin::BscTest < Test::Unit::TestCase e1 = fast_create(Enterprise) e2 = fast_create(Enterprise) category = fast_create(ProductCategory) - bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) p1 = fast_create(Product, :product_category_id => category.id) p2 = fast_create(Product, :product_category_id => category.id) @@ -67,8 +70,15 @@ class BscPlugin::BscTest < Test::Unit::TestCase end should 'not be able to create product' do - bsc = BscPlugin::Bsc.new assert !bsc.create_product? end + should 'have many contracts' do + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin') + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin') + + assert_includes bsc.contracts, contract1 + assert_includes bsc.contracts, contract2 + end + end diff --git a/plugins/bsc/test/unit/bsc_plugin/contract_test.rb b/plugins/bsc/test/unit/bsc_plugin/contract_test.rb new file mode 100644 index 0000000..8f5871c --- /dev/null +++ b/plugins/bsc/test/unit/bsc_plugin/contract_test.rb @@ -0,0 +1,109 @@ +require File.dirname(__FILE__) + '/../../../../../test/test_helper' +#require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file' +#require File.dirname(__FILE__) + '/../../../lib/ext/enterprise' + +class BscPlugin::ContractTest < Test::Unit::TestCase + def setup + @contract = BscPlugin::Contract.new(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin') + end + + attr_accessor :contract + + should 'validates presence of bsc' do + contract.bsc = nil + contract.valid? + assert contract.errors.invalid?(:bsc) + + contract.bsc = BscPlugin::Bsc.new + contract.valid? + assert !contract.errors.invalid?(:bsc) + end + + should 'associate contract with products through sales' do + contract.save! + product1 = fast_create(Product) + product2 = fast_create(Product) + sale1 = BscPlugin::Sale.create!(:product => product1, :contract => contract, :quantity => 3) + sale2 = BscPlugin::Sale.create!(:product => product2, :contract => contract, :quantity => 5) + + assert_includes contract.products, product1 + assert_includes contract.products, product2 + end + + should 'have many enterprises' do + contract.save! + enterprise1 = fast_create(Enterprise) + contract.enterprises << enterprise1 + enterprise2 = fast_create(Enterprise) + contract.enterprises << enterprise2 + + assert_includes contract.enterprises, enterprise1 + assert_includes contract.enterprises, enterprise2 + end + + should 'filter contracts by status' do + bsc = BscPlugin::Bsc.new + opened = BscPlugin::Contract::Status::OPENED + negotiating = BscPlugin::Contract::Status::NEGOTIATING + executing = BscPlugin::Contract::Status::EXECUTING + closed = BscPlugin::Contract::Status::CLOSED + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :status => opened, :client_name => 'Marvin') + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :status => negotiating, :client_name => 'Marvin') + contract3 = BscPlugin::Contract.create!(:bsc => bsc, :status => executing, :client_name => 'Marvin') + contract4 = BscPlugin::Contract.create!(:bsc => bsc, :status => closed, :client_name => 'Marvin') + + opened_and_executing = BscPlugin::Contract.status([opened, executing]) + negotiating_and_closed = BscPlugin::Contract.status([negotiating, closed]) + all = BscPlugin::Contract.status([]) + + assert_includes opened_and_executing, contract1 + assert_not_includes opened_and_executing, contract2 + assert_includes opened_and_executing, contract3 + assert_not_includes opened_and_executing, contract4 + + assert_not_includes negotiating_and_closed, contract1 + assert_includes negotiating_and_closed, contract2 + assert_not_includes negotiating_and_closed, contract3 + assert_includes negotiating_and_closed, contract4 + + assert_includes all, contract1 + assert_includes all, contract2 + assert_includes all, contract3 + assert_includes all, contract4 + end + + should 'sort contracts by date' do + bsc = BscPlugin::Bsc.new + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :created_at => 2.day.ago, :client_name => 'Marvin') + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :created_at => 1.day.ago, :client_name => 'Marvin') + contract3 = BscPlugin::Contract.create!(:bsc => bsc, :created_at => 3.day.ago, :client_name => 'Marvin') + + assert_equal [contract3, contract1, contract2], BscPlugin::Contract.sorted_by('created_at', 'asc') + end + + should 'sort contracts by client name' do + bsc = BscPlugin::Bsc.new + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvim') + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Adam') + contract3 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Eva') + + assert_equal [contract2, contract3, contract1], BscPlugin::Contract.sorted_by('client_name', 'asc') + end + + should 'return contract total price' do + contract.save! + price1 = 1 + quantity1 = 3 + price2 = 2 + quantity2 = 5 + total = price1*quantity1 + price2*quantity2 + product1 = fast_create(Product, :price => price1) + product2 = fast_create(Product, :price => price2) + sale1 = BscPlugin::Sale.create!(:product => product1, :contract => contract, :quantity => quantity1) + sale2 = BscPlugin::Sale.create!(:product => product2, :contract => contract, :quantity => quantity2) + + contract.reload + + assert_equal total, contract.total_price + end +end diff --git a/plugins/bsc/test/unit/bsc_plugin/enterprise_test.rb b/plugins/bsc/test/unit/bsc_plugin/enterprise_test.rb deleted file mode 100644 index e4cbe2f..0000000 --- a/plugins/bsc/test/unit/bsc_plugin/enterprise_test.rb +++ /dev/null @@ -1,26 +0,0 @@ -require File.dirname(__FILE__) + '/../../../../../test/test_helper' -require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file' -require File.dirname(__FILE__) + '/../../../../../app/models/enterprise' -require File.dirname(__FILE__) + '/../../../lib/ext/enterprise' - -class ProductTest < Test::Unit::TestCase - VALID_CNPJ = '94.132.024/0001-48' - - should 'belongs to a bsc' do - bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) - enterprise = fast_create(Enterprise, :bsc_id => bsc.id) - - assert_equal bsc, enterprise.bsc - end - - should 'return correct enterprises on validated and not validated namedscopes' do - validated_enterprise = fast_create(Enterprise, :validated => true) - not_validated_enterprise = fast_create(Enterprise, :validated => false) - - assert_includes Enterprise.validated, validated_enterprise - assert_not_includes Enterprise.validated, not_validated_enterprise - assert_not_includes Enterprise.not_validated, validated_enterprise - assert_includes Enterprise.not_validated, not_validated_enterprise - end -end - diff --git a/plugins/bsc/test/unit/bsc_plugin/product_test.rb b/plugins/bsc/test/unit/bsc_plugin/product_test.rb deleted file mode 100644 index 81a1930..0000000 --- a/plugins/bsc/test/unit/bsc_plugin/product_test.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/../../../../../test/test_helper' -require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file' - -class ProductTest < Test::Unit::TestCase - VALID_CNPJ = '94.132.024/0001-48' - - should 'return have bsc' do - bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) - enterprise = fast_create(Enterprise, :bsc_id => bsc.id) - product = fast_create(Product, :enterprise_id => enterprise.id) - - assert_equal bsc, product.bsc - end -end diff --git a/plugins/bsc/test/unit/bsc_plugin/sale_test.rb b/plugins/bsc/test/unit/bsc_plugin/sale_test.rb new file mode 100644 index 0000000..ca9fd1f --- /dev/null +++ b/plugins/bsc/test/unit/bsc_plugin/sale_test.rb @@ -0,0 +1,86 @@ +require File.dirname(__FILE__) + '/../../../../../test/test_helper' + +class BscPlugin::SaleTest < Test::Unit::TestCase + def setup + @sale = BscPlugin::Sale.new + end + + attr_accessor :sale + + should 'validate presence of product and contract' do + sale.valid? + + assert sale.errors.invalid?(:product) + assert sale.errors.invalid?(:contract) + + product = Product.new + contract = BscPlugin::Contract.new + sale.product = product + sale.contract = contract + + assert !sale.errors.invalid?(product) + assert !sale.errors.invalid?(contract) + end + + should 'validate uniqueness of product and contract composed' do + product = fast_create(Product) + contract = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin') + sale1 = BscPlugin::Sale.create!(:product => product, :contract => contract, :quantity => 1) + sale2 = BscPlugin::Sale.new(:product => product, :contract => contract, :quantity => 1) + sale2.valid? + + assert sale2.errors.invalid?(:product_id) + end + + should 'validate quantity as a positive integer' do + sale.quantity = -1 + sale.valid? + assert sale.errors.invalid?(:quantity) + + sale.quantity = 1.5 + sale.valid? + assert sale.errors.invalid?(:quantity) + + sale.quantity = 3 + sale.valid? + assert !sale.errors.invalid?(:quantity) + end + + should 'set default price as product price if no price indicated' do + product = fast_create(Product, :price => 3.50) + contract = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin') + sale.product = product + sale.contract = contract + sale.quantity = 1 + sale.save! + + assert_equal product.price, sale.price + end + + should 'not overwrite with the product price if price informed' do + product = fast_create(Product, :price => 3.50) + contract = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin') + sale.product = product + sale.contract = contract + sale.quantity = 1 + sale.price = 2.50 + sale.save! + + assert_equal 2.50, sale.price + end + + should 'have default value for price' do + product1 = fast_create(Product, :price => 1) + product2 = fast_create(Product, :price => 1) + product3 = fast_create(Product) + contract = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin') + sale1 = BscPlugin::Sale.create!(:price => 2, :product => product1, :contract => contract, :quantity => 1) + sale2 = BscPlugin::Sale.create!(:product => product2, :contract => contract, :quantity => 1) + sale3 = BscPlugin::Sale.create!(:product => product3, :contract => contract, :quantity => 1) + + assert_equal 2, sale1.price + assert_equal 1, sale2.price + assert_equal 0, sale3.price + end +end + diff --git a/plugins/bsc/test/unit/ext/enterprise_test.rb b/plugins/bsc/test/unit/ext/enterprise_test.rb new file mode 100644 index 0000000..afb5966 --- /dev/null +++ b/plugins/bsc/test/unit/ext/enterprise_test.rb @@ -0,0 +1,41 @@ +require File.dirname(__FILE__) + '/../../../../../test/test_helper' +require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file' +require File.dirname(__FILE__) + '/../../../../../app/models/enterprise' +require File.dirname(__FILE__) + '/../../../lib/ext/enterprise' + +class EnterpriseTest < Test::Unit::TestCase + VALID_CNPJ = '94.132.024/0001-48' + + def setup + @bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) + end + + attr_accessor :bsc + + should 'belongs to a bsc' do + enterprise = fast_create(Enterprise, :bsc_id => bsc.id) + assert_equal bsc, enterprise.bsc + end + + should 'return correct enterprises on validated and not validated namedscopes' do + validated_enterprise = fast_create(Enterprise, :validated => true) + not_validated_enterprise = fast_create(Enterprise, :validated => false) + + assert_includes Enterprise.validated, validated_enterprise + assert_not_includes Enterprise.validated, not_validated_enterprise + assert_not_includes Enterprise.not_validated, validated_enterprise + assert_includes Enterprise.not_validated, not_validated_enterprise + end + + should 'be involved with many contracts' do + enterprise = fast_create(Enterprise) + contract1 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin') + contract2 = BscPlugin::Contract.create!(:bsc => bsc, :client_name => 'Marvin') + enterprise.contracts << contract1 + enterprise.contracts << contract2 + + assert_includes enterprise.contracts, contract1 + assert_includes enterprise.contracts, contract2 + end +end + diff --git a/plugins/bsc/test/unit/ext/product_test.rb b/plugins/bsc/test/unit/ext/product_test.rb new file mode 100644 index 0000000..4ded8fc --- /dev/null +++ b/plugins/bsc/test/unit/ext/product_test.rb @@ -0,0 +1,25 @@ +require File.dirname(__FILE__) + '/../../../../../test/test_helper' +require File.dirname(__FILE__) + '/../../../../../app/models/uploaded_file' + +class ProductTest < Test::Unit::TestCase + VALID_CNPJ = '94.132.024/0001-48' + + should 'return have bsc' do + bsc = BscPlugin::Bsc.create!({:business_name => 'Sample Bsc', :identifier => 'sample-bsc', :company_name => 'Sample Bsc Ltda.', :cnpj => VALID_CNPJ}) + enterprise = fast_create(Enterprise, :bsc_id => bsc.id) + product = fast_create(Product, :enterprise_id => enterprise.id) + + assert_equal bsc, product.bsc + end + + should 'have contracts through sales' do + product = fast_create(Product) + contract1 = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin') + contract2 = BscPlugin::Contract.create!(:bsc => BscPlugin::Bsc.new, :client_name => 'Marvin') + sale1 = BscPlugin::Sale.create!(:product => product, :contract => contract1, :quantity => 3) + sale2 = BscPlugin::Sale.create!(:product => product, :contract => contract2, :quantity => 5) + + assert_includes product.contracts, contract1 + assert_includes product.contracts, contract2 + end +end -- libgit2 0.21.2