contract_test.rb 4.17 KB
require File.dirname(__FILE__) + '/../../../../../test/test_helper'

class BscPlugin::ContractTest < ActiveSupport::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