testItem.py 25.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
##############################################################################
#
# Copyright (c) 2004, 2005 Nexedi SARL and Contributors. All Rights Reserved.
#          Sebastien Robin <seb@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################

import unittest

31 32
import transaction
from DateTime import DateTime
33
from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
34
from Products.ERP5Type.tests.utils import reindex
35
from zLOG import LOG
36
from AccessControl.SecurityManagement import newSecurityManager
37
from Products.ERP5Type.tests.Sequence import SequenceList
38
from testInvoice import TestSaleInvoiceMixin
39

40
class TestItemMixin(TestSaleInvoiceMixin):
41 42 43 44 45 46 47 48
  """
    Test business template erp5_trade 
  """
  item_portal_type = 'Item'

  def getBusinessTemplateList(self):
    """
    """
49
    return TestSaleInvoiceMixin.getBusinessTemplateList(self) + ('erp5_item',)
50
  
51 52 53 54 55 56 57 58
  def login(self, quiet=0, run=1):
    uf = self.getPortal().acl_users
    uf._doAddUser('rc', '', ['Manager', 'Member', 'Assignee'], [])
    user = uf.getUserById('rc').__of__(uf)
    newSecurityManager(None, user)
    
  def createOrganisation(self,title=None):
    organisation_portal_type = 'Organisation'
Jérome Perrin's avatar
Jérome Perrin committed
59
    portal = self.getPortal()
60 61 62 63 64 65 66
    organisation_module = portal.getDefaultModule( \
                                   portal_type=organisation_portal_type)
    organisation = organisation_module.newContent( \
                                   portal_type=organisation_portal_type)
    if title is None:
      organisation.edit(title='organisation%s' % organisation.getId())
    else:
Jérome Perrin's avatar
Jérome Perrin committed
67 68 69
      organisation.edit(title=title)
    return organisation

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
  def createNotVariatedResource(self,title=None):
    """
      Create a resource with no variation
    """
    portal = self.getPortal()
    resource_portal_type = 'Product'
    resource_module = portal.getDefaultModule(resource_portal_type)
    resource = resource_module.newContent(portal_type=resource_portal_type)
    resource.edit(
      title = "NotVariatedResource%s" % resource.getId(),
      quantity_unit='unit/piece',
      aggregated_portal_type_list=['Item'],
      required_aggregated_portal_type_list=['Item']
    )
    return resource
Jérome Perrin's avatar
Jérome Perrin committed
85
  
86 87 88 89 90 91
  def createVariatedResource(self,title=None):
    preference = self.portal.portal_preferences
    portal_workflow = self.portal.portal_workflow
    pref = preference.newContent(portal_type='System Preference')
    pref.setPreferredProductIndividualVariationBaseCategoryList(['size'])
    portal_workflow.doActionFor(pref, 'enable_action')
Jérome Perrin's avatar
Jérome Perrin committed
92
    transaction.commit()
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
    self.tic()
    
    portal = self.getPortal()
    resource_portal_type = 'Product'
    resource_module = portal.getDefaultModule(resource_portal_type)
    resource = resource_module.newContent(portal_type=resource_portal_type)
    resource.edit(
      title = "VariatedResource%s" % resource.getId(),
    )
    resource.setQuantityUnit('unit/piece')
    resource.setAggregatedPortalTypeList('Item')
    resource.setRequiredAggregatedPortalTypeList('Item')

    # Add size variation
    size_variation_count = 3
    for i in range(size_variation_count):
      variation_portal_type = 'Product Individual Variation'
      variation = resource.newContent(portal_type = variation_portal_type)
      variation.edit(
        title = 'SizeVariation%s' % str(i)
      )

    return resource
Jérome Perrin's avatar
Jérome Perrin committed
116

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
  def createPackingList(self,resource=None,organisation=None):
    portal = self.getPortal()
    packing_list_module = portal.getDefaultModule(portal_type='Purchase Packing List')
    pac_list = packing_list_module.newContent(portal_type='Purchase Packing List')
    pac_list.edit(
      title = "PPL%s" % pac_list.getId(),
      start_date = self.datetime + 10,
      stop_date = self.datetime + 20,
    )
    if organisation is not None:
      pac_list.edit(source_value=organisation,
                 source_section_value=organisation,
                 destination_value=organisation,
                 destination_section_value=organisation,
                 # Added for test Packing List Copy
                 source_decision_value=organisation,
                 destination_decision_value=organisation,
                 source_administration_value=organisation,
                 destination_administration_value=organisation,
                 )
    return pac_list
Jérome Perrin's avatar
Jérome Perrin committed
138

139 140 141 142 143 144
  def createPackingListLine(self,packing_list=None,resource=None):
    packing_list_line = packing_list.newContent(portal_type='Purchase Packing List Line')
    packing_list_line.edit(
      title = "Packing List Line"
    )
    packing_list_line.setResourceValue(resource)
Jérome Perrin's avatar
Jérome Perrin committed
145 146
    return packing_list_line

147 148 149 150
  def stepCreateItemList(self, sequence=None, sequence_list=None, **kw):
    """ Create some items """
    item_module = self.getPortal().item_module
    resource = sequence.get('resource')
151
    item = item_module.newContent(portal_type=self.item_portal_type)
152 153

    item.setResourceValue(resource)
Jérome Perrin's avatar
Jérome Perrin committed
154
    sequence.edit(item_list=[item])
155 156 157

  def stepOrderLineSetAggregationList(self, sequence=None,
                                          sequence_list=None, **kw):
158
    """  Aggregate Items """
159 160
    order_line = sequence.get('order_line')
    item_list = sequence.get('item_list')
Jérome Perrin's avatar
Jérome Perrin committed
161
    order_line.setAggregateValueList(item_list)
162

Jérome Perrin's avatar
Jérome Perrin committed
163
  def stepCheckOrderLineAggregate(self, sequence=None,
164 165 166
                                          sequence_list=None, **kw):
    """ Check items """
    order_line = sequence.get('order_line')
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
    self.checkAggregate(line=order_line, sequence=sequence)

  def stepCheckSimulationAggregate(self, sequence=None,
                                          sequence_list=None, **kw):
    """ Check items """
    order_line = sequence.get('order_line')
    simulation_movement = order_line.getOrderRelatedValue()
    self.checkAggregate(line=simulation_movement, sequence=sequence)

  def stepCheckPackingListLineAggregate(self, sequence=None,
                                          sequence_list=None, **kw):
    """ Check items """
    packing_list_line = sequence.get('packing_list_line')
    self.checkAggregate(line=packing_list_line, sequence=sequence)

  def stepCheckInvoiceLineAggregate(self, sequence=None,
                                          sequence_list=None, **kw):
    """ Check items """
    invoice = sequence.get('invoice')
    invoice_line_list = invoice.contentValues(
                         portal_type=self.invoice_line_portal_type)
    self.checkAggregate(line=invoice_line_list[0], sequence=sequence)
189

190 191 192 193
  def checkAggregate(self, line=None, sequence=None):
    """ Check items """
    item_list = sequence.get('item_list')
    self.assertEquals(len(line.getAggregateList()),1)
Jérome Perrin's avatar
Jérome Perrin committed
194
    self.failUnless(item_list[0] in line.getAggregateValueList())
195
    
196

Jérome Perrin's avatar
Jérome Perrin committed
197
class TestItem(TestItemMixin, ERP5TypeTestCase):
198 199 200 201 202 203 204 205 206 207 208

  run_all_test = 1
  quiet = 0

  def test_01_ItemSimpleTest(self, quiet=quiet, run=run_all_test):
    """
    """
    if not run: return
    sequence_list = SequenceList()

    # Test with a simply order without cell
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
    sequence_string = 'stepCreateOrganisation1 \
                       stepCreateOrganisation2 \
                       stepCreateOrganisation3 \
                       stepCreateItemList \
                       stepCreateOrder \
                       stepSetOrderProfile \
                       stepCreateNotVariatedResource \
                       stepTic \
                       stepCreateOrderLine \
                       stepSetOrderLineResource \
                       stepSetOrderLineDefaultValues \
                       stepOrderLineSetAggregationList \
                       stepConfirmOrder \
                       stepTic \
                       stepCheckOrderLineAggregate \
                       stepCheckOrderSimulation \
                       stepCheckSimulationAggregate \
                       stepCheckDeliveryBuilding \
                       stepCheckPackingListLineAggregate \
                       stepCheckPackingListIsNotDivergent '
229 230

    sequence_list.addSequenceString(sequence_string)
231 232 233 234 235 236 237 238
    sequence_list.play(self, quiet=quiet)


  def test_02_ItemWithInvoice(self, quiet=quiet, run=run_all_test):
    """
    """
    if not run: return
    sequence_list = SequenceList()
239

240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
    sequence_string = 'stepCreateEntities \
                       stepCreateCurrency \
                       stepCreateItemList \
                       stepCreateSaleInvoiceTransactionRule \
                       stepCreateOrder \
                       stepSetOrderProfile \
                       stepSetOrderPriceCurrency \
                       stepCreateNotVariatedResource \
                       stepTic \
                       stepCreateOrderLine \
                       stepSetOrderLineResource \
                       stepSetOrderLineDefaultValues \
                       stepOrderLineSetAggregationList \
                       stepConfirmOrder \
                       stepTic \
                       stepCheckOrderRule \
                       stepCheckOrderLineAggregate \
                       stepCheckOrderSimulation \
                       stepCheckSimulationAggregate \
                       stepCheckDeliveryBuilding \
                       stepCheckPackingListLineAggregate \
                       stepAddPackingListContainer \
                       stepAddPackingListContainerLine \
                       stepSetContainerLineFullQuantity \
                       stepTic \
                       stepCheckPackingListIsPacked \
                       stepSetReadyPackingList \
                       stepTic \
                       stepStartPackingList \
                       stepCheckInvoicingRule \
                       stepTic \
                       stepCheckInvoiceBuilding \
                       stepRebuildAndCheckNothingIsCreated \
                       stepCheckInvoicesConsistency \
                       stepCheckInvoiceLineAggregate \
                      ' 

    sequence_list.addSequenceString(sequence_string)
278
    sequence_list.play(self, quiet=quiet)
279 280 281 282 283 284 285
    
  
  def test_03_CreateItemsFromPackingListLine(self,sequence=None,title=None,quiet=quiet, run=run_all_test):
    """
    """
    if not run: return
    organisation = self.createOrganisation(title='Organisation I')
Jérome Perrin's avatar
Jérome Perrin committed
286
    transaction.commit()
287 288
    self.tic()
    resource = self.createVariatedResource()
289 290 291
    # XXX this tests depends on the relative url of the resource
    self.assertEquals('product_module/1', resource.getRelativeUrl())

Jérome Perrin's avatar
Jérome Perrin committed
292
    transaction.commit()
293 294 295
    self.tic()
    packing_list = self.createPackingList(resource=resource,organisation=organisation)
    packing_list_line= self.createPackingListLine(packing_list=packing_list,resource=resource)
Jérome Perrin's avatar
Jérome Perrin committed
296
    transaction.commit()
297
    self.tic()
298 299 300 301
    
    # make sure we can render the dialog
    packing_list_line.DeliveryLine_viewItemCreationDialog()

302 303 304 305 306
    # create a listbox 
    listbox = ({ 'listbox_key': '000',
              'title': 'Lot A',
              'reference': '20_05_09_LA',
              'quantity': 20.0,
307
              'line_variation_category_list': 'size/product_module/1/3',
308 309 310 311 312
              },
              { 'listbox_key': '001',
              'title': 'Lot B',
              'reference': '20_05_09_LB',
              'quantity': 10.0,
313
              'line_variation_category_list': 'size/product_module/1/2',
314
              },
Jérome Perrin's avatar
Jérome Perrin committed
315
              { 'listbox_key': '002',
316 317 318
              'title': 'Lot C',
              'reference': '20_05_09_LC',
              'quantity': 15.0,
319
              'line_variation_category_list': 'size/product_module/1/1',
320 321
              },
              )
322 323

    self.portal.REQUEST.set('type', 'Item')
324
    packing_list_line.DeliveryLine_createItemList(listbox=listbox)
Jérome Perrin's avatar
Jérome Perrin committed
325
    transaction.commit()
326 327 328 329 330 331 332
    self.tic()
    self.assertEquals(
           len([x.getObject() for x in self.portal.portal_catalog(portal_type='Item',title='Lot A')]),1)
    self.assertEquals(
           len([x.getObject() for x in self.portal.portal_catalog(portal_type='Item',title='Lot B')]),1)
    self.assertEquals(
           len([x.getObject() for x in self.portal.portal_catalog(portal_type='Item',title='Lot C')]),1)
333 334 335 336 337 338 339 340

    self.assertEquals(packing_list_line.getTotalQuantity(), 45.0)
    self.assertEquals(sorted(packing_list_line.getVariationCategoryList()),
                      sorted(['size/product_module/1/3',
                              'size/product_module/1/2',
                              'size/product_module/1/1']))
    self.assertEquals(packing_list_line.getAggregateTitleList(), [])

341 342
    movement_cell_list = packing_list_line.contentValues(
                                    portal_type='Purchase Packing List Cell')
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
    self.assertEquals(3, len(movement_cell_list))

    cell = packing_list_line.getCell(base_id='movement',
                                     *('size/product_module/1/3', ))
    self.assertEquals(cell.getQuantity(), 20)
    self.assertEquals(['Lot A'], cell.getAggregateTitleList())

    cell = packing_list_line.getCell(base_id='movement',
                                     *('size/product_module/1/2', ))
    self.assertEquals(cell.getQuantity(), 10)
    self.assertEquals(['Lot B'], cell.getAggregateTitleList())

    cell = packing_list_line.getCell(base_id='movement',
                                     *('size/product_module/1/1', ))
    self.assertEquals(cell.getQuantity(), 15)
    self.assertEquals(['Lot C'], cell.getAggregateTitleList())
359
    
Jérome Perrin's avatar
Jérome Perrin committed
360
     
361
  def test_04_CreateItemsFromPackingListLineWithVariationDefined(
Jérome Perrin's avatar
Jérome Perrin committed
362
        self,sequence=None,title=None,quiet=quiet, run=run_all_test):
363 364 365 366
    """
    """
    if not run: return
    organisation = self.createOrganisation(title='Organisation II')
Jérome Perrin's avatar
Jérome Perrin committed
367
    transaction.commit()
368 369
    self.tic()
    resource = self.createVariatedResource()
370 371 372
    # XXX this tests depends on the relative url of the resource
    self.assertEquals('product_module/2', resource.getRelativeUrl())

Jérome Perrin's avatar
Jérome Perrin committed
373
    transaction.commit()
374 375 376 377
    self.tic()
    packing_list = self.createPackingList(resource=resource,organisation=organisation)
   
    packing_list_line= self.createPackingListLine(packing_list=packing_list,resource=resource)
Jérome Perrin's avatar
Jérome Perrin committed
378
    transaction.commit()
379 380 381 382 383 384
    self.tic()
    # create a listbox 
    listbox = ({ 'listbox_key': '000',
              'title': 'Lot A2',
              'reference': '25_05_09_LA2',
              'quantity': 20.0,
385
              'line_variation_category_list': 'size/product_module/2/3',
386 387
              },
              )
388
    self.portal.REQUEST.set('type', 'Item')
389
    packing_list_line.DeliveryLine_createItemList(listbox=listbox)
390 391 392 393
    self.assertEquals(packing_list_line.getVariationCategoryList(),
                      ['size/product_module/2/3'])
    self.assertEquals(packing_list_line.getTotalQuantity(), 20)

394 395 396 397 398
    # create listbox a second time
    listbox = ({ 'listbox_key': '000',
              'title': 'Lot B2',
              'reference': '25_05_09_LB2',
              'quantity': 20.0,
399
              'line_variation_category_list': 'size/product_module/2/1',
400
              },
Jérome Perrin's avatar
Jérome Perrin committed
401
              { 'listbox_key': '001',
402 403 404
              'title': 'Lot C2',
              'reference': '25_05_09_LC2',
              'quantity': 15.0,
405
              'line_variation_category_list': 'size/product_module/2/2',
406 407
              },
              )
408
    self.portal.REQUEST.set('type', 'Item')
409
    packing_list_line.DeliveryLine_createItemList(listbox=listbox)
Jérome Perrin's avatar
Jérome Perrin committed
410
    transaction.commit()
411
    self.tic()
412 413 414 415 416 417 418

    self.assertEquals(packing_list_line.getTotalQuantity(), 55.0)
    self.assertEquals(sorted(packing_list_line.getVariationCategoryList()),
                      sorted(['size/product_module/2/1',
                              'size/product_module/2/2',
                              'size/product_module/2/3']))

419 420
    movement_cell_list = packing_list_line.contentValues(
                                    portal_type='Purchase Packing List Cell')
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
    self.assertEquals(3, len(movement_cell_list))

    cell = packing_list_line.getCell(base_id='movement',
                                     *('size/product_module/2/3', ))
    self.assertEquals(cell.getQuantity(), 20)
    self.assertEquals(['Lot A2'], cell.getAggregateTitleList())

    cell = packing_list_line.getCell(base_id='movement',
                                     *('size/product_module/2/1', ))
    self.assertEquals(cell.getQuantity(), 20)
    self.assertEquals(['Lot B2'], cell.getAggregateTitleList())

    cell = packing_list_line.getCell(base_id='movement',
                                     *('size/product_module/2/2', ))
    self.assertEquals(cell.getQuantity(), 15)
    self.assertEquals(['Lot C2'], cell.getAggregateTitleList())
437
 
438

439
  def test_05_CreateItemsFromPackingListLineWithNotVariatedResource(
Jérome Perrin's avatar
Jérome Perrin committed
440
          self,sequence=None,title=None,quiet=quiet, run=run_all_test):
441 442 443 444
    """
    """
    if not run: return
    organisation = self.createOrganisation(title='Organisation III')
Jérome Perrin's avatar
Jérome Perrin committed
445
    transaction.commit()
446 447
    self.tic()
    resource = self.createNotVariatedResource()
Jérome Perrin's avatar
Jérome Perrin committed
448
    transaction.commit()
449 450 451 452
    self.tic()
    packing_list = self.createPackingList(resource=resource,organisation=organisation)
   
    packing_list_line= self.createPackingListLine(packing_list=packing_list,resource=resource)
453
    packing_list_line.setQuantity(32)
Jérome Perrin's avatar
Jérome Perrin committed
454
    transaction.commit()
455 456 457 458 459 460 461 462 463 464 465 466
    self.tic()
    # create a listbox 
    listbox = ({ 'listbox_key': '000',
              'title': 'Lot A3',
              'reference': '25_05_09_LA3',
              'quantity': 10.0,
              },
              { 'listbox_key': '001',
              'title': 'Lot B3',
              'reference': '25_05_09_LB3',
              'quantity': 5.0,
              },
Jérome Perrin's avatar
Jérome Perrin committed
467
              { 'listbox_key': '002',
468 469 470 471 472
              'title': 'Lot C3',
              'reference': '25_05_09_LC3',
              'quantity': 15.0,
              },
              )
473
    self.portal.REQUEST.set('type', 'Item')
474
    packing_list_line.DeliveryLine_createItemList(listbox=listbox)
Jérome Perrin's avatar
Jérome Perrin committed
475
    transaction.commit()
476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
    self.tic()
    self.assertEquals(
           len([x.getObject() for x in self.portal.portal_catalog(portal_type='Item',title='Lot A3')]),1)
    self.assertEquals(
           len([x.getObject() for x in self.portal.portal_catalog(portal_type='Item',title='Lot B3')]),1)
    self.assertEquals(
           len([x.getObject() for x in self.portal.portal_catalog(portal_type='Item',title='Lot C3')]),1)
    self.assertEquals(packing_list_line.getQuantity(),30.0)
    
    self.assertEquals(packing_list_line.getVariationCategoryList(),[])
    self.assertEquals(packing_list_line.getAggregateTitleList(),['Lot A3','Lot B3','Lot C3'])
    movement_cell_list = packing_list_line.contentValues(
                                    portal_type='Purchase Packing List Cell')
    self.assertEquals(movement_cell_list,[])
    
Jérome Perrin's avatar
Jérome Perrin committed
491

492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635
class TestItemScripts(ERP5TypeTestCase):
  """Test scripts from erp5_item.
  """
  def getBusinessTemplateList(self):
    return ('erp5_base', 'erp5_pdm', 'erp5_trade', 'erp5_item',)

  def afterSetUp(self):
    self.validateRules()
    size_category = self.portal.portal_categories.size
    if 'big' not in size_category.objectIds():
      size_category.newContent(portal_type='Category',
                               id='big',
                               title='Big')
    if 'small' not in size_category.objectIds():
      size_category.newContent(portal_type='Category',
                               id='small',
                               title='Small')

    self.node = self.portal.organisation_module.newContent(
                              portal_type='Organisation',
                              title='Node')
    self.section = self.portal.organisation_module.newContent(
                              portal_type='Organisation',
                              title='Section')
    self.mirror_node = self.portal.organisation_module.newContent(
                              portal_type='Organisation',
                              title='Mirror Node')
    self.mirror_section = self.portal.organisation_module.newContent(
                              portal_type='Organisation',
                              title='Mirror Section')
    self.product = self.portal.product_module.newContent(
                              portal_type='Product',
                              title='Product')
    self.variated_product = self.portal.product_module.newContent(
                              portal_type='Product',
                              title='Variated Product',
                              variation_base_category_list=('size',),
                              variation_category_list=('size/big',
                                                       'size/small'))
    self.item = self.portal.item_module.newContent(
                              portal_type='Item',
                              title='Item')
    transaction.commit()
    self.tic()
  
  def beforeTearDown(self):
    transaction.abort()
    for module in (self.portal.organisation_module,
                   self.portal.item_module,
                   self.portal.sale_packing_list_module,
                   self.portal.purchase_packing_list_module,
                   self.portal.product_module,
                   self.portal.portal_simulation,):
      module.manage_delObjects(list(module.objectIds()))
    transaction.commit()
    self.tic()

  @reindex
  def _makeSalePackingListLine(self):
    packing_list = self.portal.sale_packing_list_module.newContent(
                  portal_type='Sale Packing List',
                  source_value=self.mirror_node,
                  source_section_value=self.mirror_section,
                  destination_value=self.node,
                  destination_section_value=self.section,
                  start_date=DateTime() - 1,)
    line = packing_list.newContent(
                  portal_type='Sale Packing List Line',
                  quantity=1,
                  resource_value=self.product,
                  aggregate_value=self.item,)
    packing_list.confirm()
    packing_list.start()
    packing_list.deliver()
    return line

  # with line
  def test_Item_getResourceValue(self):
    self.assertEquals(None, self.item.Item_getResourceValue())
    line = self._makeSalePackingListLine()
    self.assertEquals(self.product, self.item.Item_getResourceValue())

  def test_Item_getResourceTitle(self):
    self.assertEquals(None, self.item.Item_getResourceTitle())
    line = self._makeSalePackingListLine()
    self.assertEquals('Product', self.item.Item_getResourceTitle())

  def test_Item_getCurrentOwnerValue(self):
    self.assertEquals(None, self.item.Item_getCurrentOwnerValue())
    line = self._makeSalePackingListLine()
    self.assertEquals(self.section, self.item.Item_getCurrentOwnerValue())

  def test_Item_getCurrentOwnerTitle(self):
    self.assertEquals(None, self.item.Item_getCurrentOwnerTitle())
    line = self._makeSalePackingListLine()
    self.assertEquals('Section', self.item.Item_getCurrentOwnerTitle())

  def test_Item_getCurrentSiteValue(self):
    self.assertEquals(None, self.item.Item_getCurrentSiteValue())
    line = self._makeSalePackingListLine()
    self.assertEquals(self.node, self.item.Item_getCurrentSiteValue())

  def test_Item_getCurrentSiteTitle(self):
    self.assertEquals(None, self.item.Item_getCurrentSiteTitle())
    line = self._makeSalePackingListLine()
    self.assertEquals('Node', self.item.Item_getCurrentSiteTitle())

  # with cells
  @reindex
  def _makeSalePackingListCellWithVariation(self):
    packing_list = self.portal.sale_packing_list_module.newContent(
                  portal_type='Sale Packing List',
                  source_value=self.mirror_node,
                  source_section_value=self.mirror_section,
                  destination_value=self.node,
                  destination_section_value=self.section,
                  start_date=DateTime() - 1,)
    line = packing_list.newContent(
                  portal_type='Sale Packing List Line',
                  resource_value=self.variated_product,)
    line.setVariationCategoryList(['size/small'])
    cell = line.newCell(portal_type='Sale Packing List Cell',
                 base_id='movement', *('size/small',))
    cell.edit(mapped_value_property_list=['price','quantity'],
              quantity=1,
              variation_category_list=['size/small'],
              aggregate_value=self.item)
    packing_list.confirm()
    packing_list.start()
    packing_list.deliver()
    return cell

  def test_Item_getVariationCategoryList(self):
    self.assertEquals([], self.item.Item_getVariationCategoryList())
    self._makeSalePackingListCellWithVariation()
    self.assertEquals(['size/small'], self.item.Item_getVariationCategoryList())

  def test_Item_getVariationRangeCategoryItemList(self):
    self.assertEquals([], self.item.Item_getVariationRangeCategoryItemList())
    self._makeSalePackingListCellWithVariation()
    self.assertEquals([['Big', 'size/big'],
                       ['Small', 'size/small']],
        self.item.Item_getVariationRangeCategoryItemList())

Jérome Perrin's avatar
Jérome Perrin committed
636
    
637 638 639
def test_suite():
  suite = unittest.TestSuite()
  suite.addTest(unittest.makeSuite(TestItem))
640
  suite.addTest(unittest.makeSuite(TestItemScripts))
641 642
  return suite