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())
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)
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})
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)
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})
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)
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, }
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)
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")
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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])
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')
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)