# Copyright (c) 2012 Nexedi SA and Contributors. All Rights Reserved.
import unittest
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase

class TestERP5ComputerWithComputerModel(ERP5TypeTestCase):

  def getBusinessTemplateList(self):
    return [ 'erp5_base', 'erp5_computer_immobilisation' ]

  def afterSetUp(self):
    pass

  def beforeTearDown(self):
    pass

  def newModel(self, **kw):
    return self.portal.computer_model_module.newContent(
      portal_type='Computer Model', **kw)

  def newComputer(self, **kw):
    return self.portal.computer_module.newContent(
      portal_type='Computer', **kw)

  def test_apply_model_empty_computer(self):
    category_list = ['mana', 'mahna']
    model = self.newModel(group=category_list)
    computer = self.newComputer(specialise_value=model)
    self.assertEqual(computer.getPropertyList('group'), [])
    result = computer.Computer_applyComputerModel()
    self.assertEqual(computer.getPropertyList('group'), category_list)
    self.assertTrue('=Computer%20Model%20applied.' in result, result)

  def test_apply_model_empty_computer_batch_mode(self):
    category_list = ['mana', 'mahna']
    model = self.newModel(group=category_list)
    computer = self.newComputer(specialise_value=model)
    self.assertEqual(computer.getPropertyList('group'), [])
    result = computer.Computer_applyComputerModel(batch_mode=1)
    self.assertEqual(computer.getPropertyList('group'), category_list)
    self.assertTrue(result)

  def test_apply_model_filled_computer(self):
    computer_category_list = ['oink']
    category_list = ['mana', 'mahna']
    model = self.newModel(group=category_list)
    computer = self.newComputer(specialise_value=model,
      group=computer_category_list)
    self.assertEqual(computer.getPropertyList('group'),
      computer_category_list)
    result = computer.Computer_applyComputerModel()
    self.assertEqual(computer.getPropertyList('group'),
      computer_category_list)
    self.assertTrue('=No%20changes%20applied.' in result, result)

  def test_apply_model_filled_computer_batch_mode(self):
    computer_category_list = ['oink']
    category_list = ['mana', 'mahna']
    model = self.newModel(group=category_list)
    computer = self.newComputer(specialise_value=model,
      group=computer_category_list)
    self.assertEqual(computer.getPropertyList('group'),
      computer_category_list)
    result = computer.Computer_applyComputerModel()
    self.assertEqual(computer.getPropertyList('group'),
      computer_category_list)
    self.assertTrue(result)

  def test_apply_model_filled_computer_forced(self):
    computer_category_list = ['oink']
    category_list = ['mana', 'mahna']
    model = self.newModel(group=category_list)
    computer = self.newComputer(specialise_value=model,
      group=computer_category_list)
    self.assertEqual(computer.getPropertyList('group'),
      computer_category_list)
    result = computer.Computer_applyComputerModel(force=1)
    self.assertEqual(computer.getPropertyList('group'),
      category_list)
    self.assertTrue('=Computer%20Model%20applied.' in result, result)

  def test_apply_model_filled_computer_force_batch_mode(self):
    computer_category_list = ['oink']
    category_list = ['mana', 'mahna']
    model = self.newModel(group=category_list)
    computer = self.newComputer(specialise_value=model,
      group=computer_category_list)
    self.assertEqual(computer.getPropertyList('group'),
      computer_category_list)
    result = computer.Computer_applyComputerModel(force=1, batch_mode=1)
    self.assertEqual(computer.getPropertyList('group'),
      category_list)
    self.assertTrue(result)

  def test_apply_no_model(self):
    computer = self.newComputer()
    result = computer.Computer_applyComputerModel()
    self.assertTrue('=No%20Computer%20Model.' in result, result)

  def test_apply_no_model_batch_mode(self):
    computer = self.newComputer()
    result = computer.Computer_applyComputerModel(batch_mode=1)
    self.assertEqual(False, result)

  def test_category_coverage(self):
    category_dict = {
      'allocation_scope': ['allocation_scope1', 'allocation_scope2'],
      'cpu_core': ['cpu_core1', 'cpu_core2'],
      'cpu_frequency': ['cpu_frequency1', 'cpu_frequency2'],
      'cpu_type': ['cpu_type1', 'cpu_type2'],
      'function': ['function1', 'function2'],
      'group': ['group1', 'group2'],
      'local_area_network_type': ['local_area_network_type1',
        'local_area_network_type2'],
      'memory_size': ['memory_size1', 'memory_size2'],
      'memory_type': ['memory_type1', 'memory_type2'],
      'product_line': ['product_line1', 'product_line2'],
      'role': ['role1', 'role2'],
      'storage_capacity': ['storage_capacity1', 'storage_capacity2'],
      'storage_interface': ['storage_interface1', 'storage_interface2'],
      'storage_redundancy': ['storage_redundancy1', 'storage_redundancy2'],
    }
    model = self.newModel(**category_dict)

    category_list = []
    for k, v in category_dict.iteritems():
      for l in v:
        category_list.append('%s/%s' % (k,l))
    category_list.append('specialise/%s' % model.getRelativeUrl())
    computer = self.newComputer(specialise_value=model)
    result = computer.Computer_applyComputerModel()
    self.assertSameSet(category_list, computer.getCategoryList())
    self.assertTrue('=Computer%20Model%20applied.', result)

def test_suite():
  suite = unittest.TestSuite()
  suite.addTest(unittest.makeSuite(TestERP5ComputerWithComputerModel))
  return suite