示例#1
0
 def test_verbose_status_received_percentage(self):
     self.shipment.date_received = now()
     self.shipment.status = Shipment.STATUS_RECEIVED
     self.shipment.save()
     self.assertEqual(self.shipment.status, Shipment.STATUS_RECEIVED)
     shipment = ShipmentDBView.objects.get(pk=self.shipment.pk)
     # No packages: should not show any percent (they're all "received")
     self.assertEqual(0, shipment.num_packages)
     self.assertEqual('Received', shipment.get_verbose_status())
     # Add one, unreceived package
     PackageFactory(shipment=self.shipment, status=Shipment.STATUS_IN_TRANSIT)
     shipment = ShipmentDBView.objects.get(pk=self.shipment.pk)
     # Should still show 0%
     self.assertEqual(1, shipment.num_packages)
     self.assertEqual('Received (0%)', shipment.get_verbose_status())
     # Add a second package, this one received
     PackageFactory(shipment=self.shipment, status=Shipment.STATUS_RECEIVED)
     shipment = ShipmentDBView.objects.get(pk=self.shipment.pk)
     # Now should show 50%
     self.assertEqual(2, shipment.num_packages)
     self.assertEqual('Received (50%)', shipment.get_verbose_status())
     # Set all packages to received
     self.shipment.packages.update(status=Shipment.STATUS_RECEIVED)
     shipment = ShipmentDBView.objects.get(pk=self.shipment.pk)
     # Now should show no percentage, just the status
     self.assertEqual(2, shipment.num_packages)
     self.assertEqual('Received', shipment.get_verbose_status())
示例#2
0
 def test_shipment_db_view_two_packages_no_items(self):
     # 2 packages, no items
     PackageFactory(shipment=self.shipment)
     PackageFactory(shipment=self.shipment)
     shipment = ShipmentDBView.objects.get(pk=self.shipment.pk)
     self.assertEqual(2, shipment.packages.count())
     self.assertEqual(2, shipment.num_packages)
     self.assertEqual(0, shipment.num_items)
     self.assertEqual(0, shipment.num_received_items)
     self.assertEqual(Decimal('0'), shipment.price_usd)
     self.assertEqual(Decimal('0'), shipment.price_local)
示例#3
0
 def setUp(self):
     super(ShipmentPackageMapViewTest, self).setUp()
     self.package = PackageFactory(shipment=self.shipment, code=QR_CODE)
     form_data = PackageScanFormSubmission(json.loads(PACKAGE_DATA))
     FormSubmission.from_ona_form_data(form_data)
     self.url = reverse('shipments_package_map',
                        kwargs={'pk': self.package.pk})
示例#4
0
 def test_finalize(self):
     shipment = ShipmentFactory()
     pkg2 = PackageFactory(shipment=shipment, name='pkg2')
     pkg1 = PackageFactory(shipment=shipment, name='pkg1')
     self.assertEqual(pkg1.status, Shipment.STATUS_IN_PROGRESS)
     shipment.finalize()
     pkg1 = Package.objects.get(pk=pkg1.pk)
     pkg2 = Package.objects.get(pk=pkg2.pk)
     self.assertEqual(pkg1.status, Shipment.STATUS_READY)
     self.assertEqual(pkg2.number_in_shipment, 1)  # in order of creation
     self.assertEqual(pkg1.number_in_shipment, 2)
     shipment = Shipment.objects.get(pk=shipment.pk)
     self.assertEqual(shipment.status, Shipment.STATUS_READY)
     shipment.reopen()
     pkg1 = Package.objects.get(pk=pkg1.pk)
     self.assertEqual(pkg1.status, Shipment.STATUS_IN_PROGRESS)
示例#5
0
 def setUp(self):
     super(PackageDeleteViewTestCase, self).setUp()
     self.package = PackageFactory(shipment=self.shipment)
     self.package_items = [
         PackageItemFactory(package=self.package),
         PackageItemFactory(package=self.package),
     ]
     self.url = reverse('package_delete', kwargs={'pk': self.package.pk})
示例#6
0
 def test_record_package_location_no_package(self, mock_logging):
     """No matching package with the supplied QR code is found"""
     PackageFactory(code='not-found')
     self.assertFalse(PackageScan.objects.all())
     form_data = PackageScanFormSubmission(json.loads(PACKAGE_DATA))
     FormSubmission.from_ona_form_data(form_data)
     self.assertFalse(PackageScan.objects.all())
     self.assertTrue(mock_logging.exception.called)
示例#7
0
 def setUp(self):
     super(TestPackageItemCreateView, self).setUp()
     self.package = PackageFactory()
     self.catalog_item = CatalogItemFactory()
     self.data = {
         'catalog_item_0': self.catalog_item.description,
         'catalog_item_1': self.catalog_item.pk,
         'quantity': 5,
     }
示例#8
0
 def test_record_package_location_invalid_status(self, mock_logging):
     """Invalid current_location ingested"""
     PackageFactory(code=QR_CODE)
     self.assertFalse(PackageScan.objects.all())
     data = json.loads(PACKAGE_DATA)
     data["current_location"] = "FOOBAR-Zero_Point"
     form_data = PackageScanFormSubmission(data)
     FormSubmission.from_ona_form_data(form_data)
     self.assertTrue(mock_logging.error.called)
示例#9
0
    def test_combinations(self):
        # Test that shipment.verbose_status returns the expected strings

        # Shortcut names for statuses
        PROG = Shipment.STATUS_IN_PROGRESS
        READ = Shipment.STATUS_READY
        TRAN = Shipment.STATUS_IN_TRANSIT
        RCVD = Shipment.STATUS_RECEIVED
        ODUE = Shipment.STATUS_OVERDUE

        # test data is a 3-tuple:
        # * shipment status
        # * list of package statuses, one per package for that shipment (can be empty)
        # * expected status string.

        test_data = [
            (PROG, [], "In progress"),
            (PROG, [PROG], "In progress"),
            # This next one can't happen - setting pkg status sets shipment status ahead
            # (PROG, [TRAN], "In progress"),
            (READ, [], "Ready for pickup"),
            (READ, [PROG], "Ready for pickup"),
            (READ, [READ], "Ready for pickup"),
            (TRAN, [], "In transit"),
            (TRAN, [TRAN, PROG], "In transit (50%)"),
            (TRAN, [TRAN, TRAN], "In transit"),
            (TRAN, [TRAN, RCVD], "In transit (50%)"),
            (RCVD, [], "Received"),
            (RCVD, [TRAN, RCVD], "Received (50%)"),
            (RCVD, [RCVD, RCVD], "Received"),
            (ODUE, [], "Overdue"),
        ]

        # We'll run all the tests without stopping, but set `failed` if any fail
        # and then fail the test at the end.  That'll give us more fine-grained
        # results without having to write N separate tests.
        failed = False
        for shipment_status, package_statuses, expected_status in test_data:
            shipment = ShipmentFactory(status=shipment_status)
            for pkg_status in package_statuses:
                PackageFactory(shipment=shipment, status=pkg_status)
            shipment_from_view = ShipmentDBView.objects.get(pk=shipment.pk)
            shipment_status_str = status_as_string(shipment_status)
            got_status = shipment_from_view.get_verbose_status()
            package_statuses = ','.join(
                [status_as_string(stat) for stat in package_statuses])
            errmsg = "Test failed: with shipment status %s and package statuses %s, expected %s " \
                     "but got %s" % (shipment_status_str, package_statuses, expected_status,
                                     got_status)
            if not expected_status == got_status:
                failed = True
                print(errmsg)
            shipment.packages.all().delete()
            shipment.delete()
        if failed:
            self.fail("Test failed; see previous messages for details")
示例#10
0
    def setUpClass(cls):
        super(ReportTestMixin, cls).setUpClass()
        bootstrap_permissions()

        cls.partner1 = PartnerFactory()
        cls.partner2 = PartnerFactory()
        cls.partner3 = PartnerFactory()

        cls.donor1 = DonorFactory()
        cls.donor2 = DonorFactory()
        cls.donor3 = DonorFactory()

        cls.category1 = ItemCategoryFactory()
        cls.category2 = ItemCategoryFactory()
        cls.category3 = ItemCategoryFactory()

        cls.shipment1 = ShipmentFactory(partner=cls.partner1,
                                        shipment_date=cls.day_before,
                                        status=Shipment.STATUS_IN_TRANSIT)

        cls.package1 = PackageFactory(shipment=cls.shipment1,
                                      status=Shipment.STATUS_IN_TRANSIT)
        cls.item1 = PackageItemFactory(package=cls.package1,
                                       donor=cls.donor1,
                                       item_category=cls.category1)

        cls.shipment2 = ShipmentFactory(partner=cls.partner2,
                                        shipment_date=cls.important_date,
                                        status=Shipment.STATUS_RECEIVED)
        cls.package2 = PackageFactory(shipment=cls.shipment2,
                                      status=Shipment.STATUS_RECEIVED)
        cls.item2 = PackageItemFactory(package=cls.package2,
                                       donor=cls.donor2,
                                       item_category=cls.category2)

        cls.shipment3 = ShipmentFactory(partner=cls.partner3,
                                        shipment_date=cls.day_after,
                                        status=Shipment.STATUS_CANCELED)
        cls.package3 = PackageFactory(shipment=cls.shipment3,
                                      status=Shipment.STATUS_CANCELED)
        cls.item3 = PackageItemFactory(package=cls.package3,
                                       donor=cls.donor3,
                                       item_category=cls.category3)
示例#11
0
 def test_prices_and_num_items(self):
     pkg = PackageFactory()
     PackageItemFactory(package=pkg,
                        quantity=2, price_usd=Decimal("3.0"), price_local=Decimal("4.0"))
     PackageItemFactory(package=pkg,
                        quantity=3, price_usd=Decimal("1.0"), price_local=Decimal("0.3"))
     pkg = PackageDBView.objects.get(pk=pkg.pk)
     self.assertEqual(Decimal("9.0"), pkg.price_usd)
     self.assertEqual(Decimal("8.9"), pkg.price_local)
     self.assertEqual(5, pkg.num_items)
示例#12
0
 def test_record_package_location_malformed_uuid(self, mock_logging):
     """Bad UUID"""
     PackageFactory(code=QR_CODE)
     self.assertFalse(PackageScan.objects.all())
     data = json.loads(PACKAGE_DATA)
     data['_uuid'] = 'foobar'
     form_data = PackageScanFormSubmission(data)
     FormSubmission.from_ona_form_data(form_data)
     self.assertFalse(PackageScan.objects.all())
     self.assertTrue(mock_logging.exception.called)
示例#13
0
 def test_shipment_price(self):
     shipment = ShipmentFactory()
     package1 = PackageFactory(shipment=shipment)
     PackageItemFactory(package=package1,
                        price_usd=Decimal('1.23'),
                        quantity=2)
     PackageItemFactory(package=package1,
                        price_usd=Decimal('9.11'),
                        quantity=3)
     package2 = PackageFactory(shipment=shipment)
     PackageItemFactory(package=package2,
                        price_usd=Decimal('3.14'),
                        quantity=13)
     pkgs = PackageDBView.objects.filter(pk__in=[package1.pk, package2.pk])
     price_sum = sum([pkg.price_usd for pkg in pkgs])
     expected_price = quantize_usd(price_sum)
     ship = ShipmentDBView.objects.get(pk=shipment.pk)
     price = ship.price_usd
     self.assertEqual(expected_price, price)
示例#14
0
 def test_shipment_db_view_two_packages_with_items(self):
     # 2 packages, with items, one of them received
     self.shipment.date_received = now()
     self.shipment.status = Shipment.STATUS_RECEIVED
     self.shipment.save()
     package1 = PackageFactory(shipment=self.shipment)
     package2 = PackageFactory(shipment=self.shipment, status=Shipment.STATUS_RECEIVED)
     PackageItemFactory(package=package1, quantity=1,
                        price_usd=Decimal('1.00'), price_local=Decimal('0.001'))
     PackageItemFactory(package=package2, quantity=2,
                        price_usd=Decimal('2.00'), price_local=Decimal('0.002'))
     PackageItemFactory(package=package2, quantity=3,
                        price_usd=Decimal('3.00'), price_local=Decimal('0.003'))
     shipment = ShipmentDBView.objects.get(pk=self.shipment.pk)
     self.assertEqual(2, shipment.packages.count())
     self.assertEqual(2, shipment.num_packages)
     self.assertEqual(6, shipment.num_items)
     self.assertEqual(5, shipment.num_received_items)
     self.assertEqual(Decimal('14.0'), shipment.price_usd)
     self.assertEqual(Decimal('0.014'), shipment.price_local)
示例#15
0
 def test_pkg_edit_no_shipment(self):
     # Provide a package to edit that has a shipment
     package = PackageFactory()
     data = {
         'name': package.name,
         'description': 'New description',
     }
     form = PackageEditForm(instance=package, data=data)
     self.assertTrue(form.is_valid(), msg=form.errors)
     pkg = form.save()
     self.assertEqual(data['description'], pkg.description)
示例#16
0
 def test_record_package_scan_no_gps(self):
     # A scan with no GPS data still updates the package status
     pkg = PackageFactory(code=QR_CODE, status=Shipment.STATUS_IN_PROGRESS)
     self.assertFalse(PackageScan.objects.all())
     data = json.loads(PACKAGE_DATA)
     data.pop('gps')
     form_data = PackageScanFormSubmission(data)
     FormSubmission.from_ona_form_data(form_data)
     # Yes, we have a scan
     self.assertTrue(PackageScan.objects.all())
     self.assertEqual(Shipment.STATUS_IN_TRANSIT,
                      PackageDBView.objects.get(pk=pkg.pk).status)
示例#17
0
 def test_it(self):
     self.packages = [
         PackageFactory(shipment=self.shipment) for i in range(5)
     ]
     for pkg in self.packages:
         for i in range(5):
             PackageItemFactory(package=pkg)
     url = reverse('summary_manifests', kwargs={'pk': self.shipment.pk})
     rsp = self.client.get(url)
     self.assertEqual(200, rsp.status_code)
     # Summary manifest doesn't change shipment status
     shipment = Shipment.objects.get(pk=self.shipment.pk)
     self.assertEqual(Shipment.STATUS_IN_PROGRESS, shipment.status)
示例#18
0
 def test_package_price(self):
     shipment = ShipmentFactory()
     package = PackageFactory(shipment=shipment)
     item1 = PackageItemFactory(package=package,
                                price_usd=Decimal('1.23'),
                                quantity=2)
     item2 = PackageItemFactory(package=package,
                                price_usd=Decimal('9.11'),
                                quantity=3)
     expected_price = quantize_usd(Decimal(item1.quantity * item1.price_usd
                                           + item2.quantity * item2.price_usd))
     pkg = PackageDBView.objects.get(pk=package.pk)
     price = pkg.price_usd
     self.assertEqual(expected_price, price)
示例#19
0
 def test_shipment_db_view_one_package_with_items(self):
     # 1 package, with items
     package = PackageFactory(shipment=self.shipment)
     PackageItemFactory(package=package, quantity=1,
                        price_usd=Decimal('1.00'), price_local=Decimal('0.001'))
     PackageItemFactory(package=package, quantity=2,
                        price_usd=Decimal('2.00'), price_local=Decimal('0.002'))
     shipment = ShipmentDBView.objects.get(pk=self.shipment.pk)
     self.assertEqual(1, shipment.packages.count())
     self.assertEqual(1, shipment.num_packages)
     self.assertEqual(3, shipment.num_items)
     self.assertEqual(0, shipment.num_received_items)
     self.assertEqual(Decimal('5.0'), shipment.price_usd)
     self.assertEqual(Decimal('0.005'), shipment.price_local)
示例#20
0
    def test_get(self):
        # Pass package item pks in a header
        # get back a modal with a form
        pkg = PackageFactory(shipment=self.shipment)
        pkg_items = [PackageItemFactory(package=pkg) for i in range(10)]
        items_to_edit = pkg_items[:5]
        pks_to_edit = [item.pk for item in items_to_edit]

        rsp = self.client.get(self.url,
                              HTTP_SELECTED_ITEMS=','.join(
                                  [str(pk) for pk in pks_to_edit]))
        self.assertEqual(200, rsp.status_code)
        form = rsp.context['form']
        self.assertIn('supplier', form.fields)
        self.assertNotIn('weight', form.fields)
示例#21
0
 def test_record_package_location_valid_status_picked_up(
         self, mock_logging):
     """Valid current_location ingested"""
     PackageFactory(code=QR_CODE)
     self.assertFalse(PackageScan.objects.all())
     data = json.loads(PACKAGE_DATA)
     data['current_location'] = "STATUS_PICKED_UP-something"
     form_data = PackageScanFormSubmission(data)
     FormSubmission.from_ona_form_data(form_data)
     self.assertFalse(mock_logging.error.called)
     scan = PackageScan.objects.all()[0]
     self.assertEqual(scan.package.status, Shipment.STATUS_PICKED_UP)
     self.assertEqual(scan.package.shipment.status,
                      Shipment.STATUS_PICKED_UP)
     self.assertEqual(scan.package.date_picked_up,
                      form_data._submission_time)
     self.assertEqual(scan.package.date_in_transit, None)
     self.assertEqual(scan.package.date_received, None)
示例#22
0
 def test_record_package_location_valid_status_in_transit(
         self, mock_logging):
     """Valid current_location ingested"""
     date_picked_up = now()
     PackageFactory(code=QR_CODE, date_picked_up=date_picked_up)
     self.assertFalse(PackageScan.objects.all())
     data = json.loads(PACKAGE_DATA)
     form_data = PackageScanFormSubmission(data)
     FormSubmission.from_ona_form_data(form_data)
     self.assertFalse(mock_logging.error.called)
     scan = PackageScan.objects.all()[0]
     self.assertEqual(scan.package.status, Shipment.STATUS_IN_TRANSIT)
     self.assertEqual(scan.package.shipment.status,
                      Shipment.STATUS_IN_TRANSIT)
     self.assertEqual(scan.package.date_picked_up, date_picked_up)
     self.assertEqual(scan.package.date_in_transit,
                      form_data._submission_time)
     self.assertEqual(scan.package.date_received, None)
示例#23
0
 def test_it(self):
     self.packages = [
         PackageFactory(shipment=self.shipment) for i in range(5)
     ]
     for pkg in self.packages:
         for i in range(5):
             PackageItemFactory(package=pkg)
     url = reverse('full_manifests',
                   kwargs={
                       'pk': self.shipment.pk,
                       'size': 6
                   })
     rsp = self.client.get(url)
     self.assertEqual(200, rsp.status_code)
     # Printing barcodes updates status from inprogress to ready for pickup
     shipment = Shipment.objects.get(pk=self.shipment.pk)
     self.assertEqual(Shipment.STATUS_READY, shipment.status)
     for pkg in self.packages:
         pkg = Package.objects.get(pk=pkg.pk)
         self.assertEqual(Shipment.STATUS_READY, pkg.status)
示例#24
0
    def test_post_extra_comma(self):
        # sometimes we get an extra comma in the list of pks
        pkg = PackageFactory(shipment=self.shipment)
        pkg_items = [PackageItemFactory(package=pkg) for i in range(3)]
        items_to_edit = pkg_items[:2]
        pks_to_edit = [item.pk for item in items_to_edit]

        data = {
            'donor': '',
            'donor_t1': '',
            'supplier': '',
            'item_category': '',
            'selected_items': ','.join([str(pk) for pk in pks_to_edit]),
        }
        # Append the extra comma that was breaking us
        data['selected_items'] += ','
        rsp = self.client.post(
            self.url,
            data=data,
        )
        self.assertEqual(200, rsp.status_code)
示例#25
0
    def test_status(self):
        """
        Shipment "status" from get_status() is complicated.
        """
        shipment = ShipmentFactory(
            date_expected=now().date() - timedelta(days=2),
        )
        package = PackageFactory.build(
            shipment=shipment,
            status=Shipment.STATUS_IN_PROGRESS,
            date_received=now().date() - timedelta(days=1),
            date_in_transit=now().date(),
            date_picked_up=now().date(),
        )
        # These three are just returned as-is
        for st in (Shipment.STATUS_CANCELED, Shipment.STATUS_LOST,
                   Shipment.STATUS_IN_PROGRESS):
            package.status = st
            self.assertEqual(package.get_status(), st)
        # Any other status is ignored and it looks at the dates
        package.status = -99
        # We have a date received, so shipment is received
        self.assertEqual(package.get_status(), Shipment.STATUS_RECEIVED)
        package.date_received = None
        # No date received, and date_expected is in the past
        self.assertEqual(package.get_status(), Shipment.STATUS_OVERDUE)

        package.shipment.date_expected = now().date() + timedelta(days=1)
        package.shipment.save()
        # No date received, date-expected in future
        self.assertEqual(package.get_status(), Shipment.STATUS_IN_TRANSIT)
        package.date_in_transit = None
        # Not in transit yet
        self.assertEqual(package.get_status(), Shipment.STATUS_PICKED_UP)
        package.date_picked_up = None
        # Not picked up yet (no idea what the difference is)
        self.assertEqual(package.get_status(), Shipment.STATUS_READY)
示例#26
0
    def test_post(self):
        # Pass changes and package item pks in a form
        # Selected package items ought to be updated
        donor1 = DonorFactory()
        donor2 = DonorFactory()
        supplier1 = SupplierFactory()
        supplier2 = SupplierFactory()
        pkg = PackageFactory(shipment=self.shipment)
        pkg_items = [
            PackageItemFactory(package=pkg, supplier=supplier1, donor=donor1)
            for i in range(10)
        ]
        items_to_edit = pkg_items[:5]
        pks_to_edit = [item.pk for item in items_to_edit]

        data = {
            'donor': donor2.pk,
            'donor_t1': '',
            'supplier': supplier2.pk,
            'item_category': '',
            'selected_items': ','.join([str(pk) for pk in pks_to_edit]),
        }
        rsp = self.client.post(
            self.url,
            data=data,
        )
        self.assertEqual(200, rsp.status_code)
        # refresh package item objects from database
        pkg_items = [PackageItem.objects.get(pk=item.pk) for item in pkg_items]
        # check that the right changes were made
        for item in pkg_items:
            if item.pk in pks_to_edit:
                self.assertEqual(item.supplier, supplier2)
                self.assertEqual(item.donor, donor2)
            else:
                self.assertEqual(item.supplier, supplier1)
                self.assertEqual(item.donor, donor1)
示例#27
0
 def test_update_package_multiple_locations(self, mock_ona_form_def,
                                            mock_ona_form_submissions):
     PackageFactory(code=QR_CODE)
     self.assertFalse(FormSubmission.objects.all())
     # The test DATA fixture already contains the form def json
     submission = json.loads(PACKAGE_DATA)
     other_submission = deepcopy(submission)
     other_submission.update(
         _uuid="2a11435f-8eaf-44f9-bd75-00a4bac8fbce",
         current_location="STATUS_RECEIVED",
         _submission_time="2014-07-25T17:19:16",
     )
     mock_ona_form_def.return_value = submission['form_definition']
     mock_ona_form_submissions.return_value = [submission, other_submission]
     process_new_scans.run()
     self.assertEqual(2, FormSubmission.objects.count())
     loc = PackageScan.objects.all().order_by('when')[0]
     self.assertEqual(loc.status_label, 'English Zero_Point')
     self.assertEqual(loc.package.status, Shipment.STATUS_RECEIVED)
     self.assertEqual(loc.package.shipment.status, Shipment.STATUS_RECEIVED)
     loc = PackageScan.objects.all().order_by('when')[1]
     self.assertEqual(loc.status_label, 'English Received')
     self.assertEqual(loc.package.status, Shipment.STATUS_RECEIVED)
     self.assertEqual(loc.package.shipment.status, Shipment.STATUS_RECEIVED)
示例#28
0
 def setUp(self):
     super(PackageItemEditModalViewTest, self).setUp()
     self.package = PackageFactory(shipment=self.shipment)
     self.item = PackageItemFactory(package=self.package)
     self.url = reverse('package_item_edit', args=[self.item.pk])
示例#29
0
 def setUp(self):
     super(ShipmentDashboardViewTest, self).setUp()
     self.package = PackageFactory(shipment=self.shipment, code=QR_CODE)
     form_data = PackageScanFormSubmission(json.loads(PACKAGE_DATA))
     FormSubmission.from_ona_form_data(form_data)
     self.url = reverse('shipments_dashboard')
示例#30
0
 def setUp(self):
     super(ShipmentPackagesViewTest, self).setUp()
     self.url = reverse('shipment_packages', args=(self.shipment.pk, ))
     self.package = PackageFactory(shipment=self.shipment, code=QR_CODE)