def test_get_providers_fail(self):
     success = True
     try:
         ShipmentHelper.get_providers('some data')
     except AttributeError:
         success = False
     self.assertFalse(success)
     self.assertRaises(AttributeError)
Ejemplo n.º 2
0
    def append_discount(query, data, ignore, discount_limit):
        """ Appends discount to the data set.
        :param query:
        :param data:
        :param ignore:
        :param discount_limit:
        :return: list:
        """
        accumulated_discounts = {}
        accumulation = False
        accumulation_applied = False
        discount_left = 0
        result = []
        for item in query:
            if ignore not in item:
                month = datetime.datetime.strptime(item[0], '%Y-%m-%d').month
                size = item[1]
                provider = item[2]
                price = float(item[3])

                original_price = ShipmentHelper.get_price(provider, size, data)
                if price < original_price:
                    reduction = (original_price - price)
                    if month in accumulated_discounts:
                        if accumulated_discounts[
                                month] + reduction < discount_limit:
                            accumulated_discounts[month] += reduction
                        else:
                            accumulation = True
                            discount_left = round(
                                discount_limit - accumulated_discounts[month],
                                2)
                            accumulated_discounts[month] = discount_limit
                    else:
                        if reduction > discount_limit:
                            accumulated_discounts[month] = discount_limit
                        else:
                            accumulated_discounts[month] = reduction
                if not accumulation:
                    difference = original_price - price
                    discount = '-' if difference <= 0 else "%.2f" % difference
                    item.append(discount)
                elif not accumulation_applied:
                    actual_price = ShipmentHelper.get_price(
                        provider, size, data)
                    item[3] = ("%.2f" % (actual_price - discount_left))
                    left = '-' if discount_left <= 0 else "%.2f" % discount_left
                    item.append(left)
                    accumulation = False
            result.append(item)
        return result
 def test_get_package_sizes(self):
     sizes = ShipmentHelper.get_package_sizes(DATA)
     all_sizes = True
     for size in sizes:
         if size not in ALLOWED_SIZES:
             all_sizes = False
     self.assertEqual(len(sizes), 3)
     self.assertTrue(all_sizes)
Ejemplo n.º 4
0
    def process_data(cls, content, data, small, large, ignore, free_provider,
                     free_shipment, discount_limit):
        """Processes all data set and applies necessary logic.
        :param content:
        :param data:
        :param small:
        :param large:
        :param ignore:
        :param free_provider:
        :param free_shipment:
        :param discount_limit:
        :return:list:
        """
        result = []
        l_discount = {}
        for item in content:
            item = item.split()
            if not ShipmentValidator.validate_line_format(item, data):
                item.append(ignore)
            if small in item and ignore not in item:
                item.append(ShipmentHelper.get_lowest_price(data))

            result.append(item)

        for item in result:
            if large in item and free_provider in item:
                month = datetime.datetime.strptime(item[0], '%Y-%m-%d').month
                try:
                    l_discount[month].append(item[0])
                except KeyError:
                    l_discount[month] = [item[0]]
                    l_discount['discount_{}'.format(month)] = False

                if len(l_discount[month]
                       ) == 3 and not l_discount['discount_{}'.format(month)]:
                    item.append(free_shipment)
                    l_discount['discount_{}'.format(month)] = True
                else:
                    for size in ShipmentHelper.get_package_sizes(data):
                        if size in item:
                            for provider in ShipmentHelper.get_providers(data):
                                if provider in item:
                                    price = ShipmentHelper.get_price(
                                        provider, size, data)
                                    item.append(price)
            else:
                for size in ShipmentHelper.get_package_sizes(data):
                    if size != small and size in item:
                        for provider in ShipmentHelper.get_providers(data):
                            if provider in item:
                                item.append(
                                    ShipmentHelper.get_price(
                                        provider, size, data))

        result = cls.append_discount(result, data, ignore, discount_limit)

        return result
Ejemplo n.º 5
0
 def __init__(self, data, path):
     self.data = data
     self.content = ShipmentHelper.read_file(path)
 def test_process_data(self):
     content = ShipmentProcessor.order_data_asc(ShipmentHelper.read_file(MOCK))
     data = ShipmentProcessor.process_data(content, DATA, 'S', 'L', 'Ignore', 'LP', '0.00', 10)
     self.assertEqual(len(content), len(data))
 def test_output_data(self):
     output = ShipmentProcessor.output_data(ShipmentHelper.read_file(MOCK))
     ordered_output = ShipmentProcessor.order_data_asc(ShipmentHelper.read_file(MOCK))
     self.assertTrue(output)
     self.assertTrue(ordered_output)
 def test_order_data_asc(self):
     original = ShipmentHelper.read_file(MOCK)
     data = ShipmentProcessor.order_data_asc(ShipmentHelper.read_file(MOCK))
     self.assertEqual(len(original), len(data))
     self.assertNotEqual(original, data)
 def test_read_file(self):
     price = ShipmentHelper.read_file(MOCK)
     self.assertGreater(len(price), 1)
 def test_get_price(self):
     price = ShipmentHelper.get_price("LP", "L", DATA)
     self.assertEqual("6.90", price)
     self.assertNotEqual("4.90", price)
 def test_get_lowest_price(self):
     price = ShipmentHelper.get_lowest_price(DATA)
     self.assertEqual(LOWEST_PRICE, price)
     self.assertNotEqual(LOWEST_PRICE, "0.00")
 def test_get_providers(self):
     providers = ShipmentHelper.get_providers(DATA)
     self.assertEqual(len(providers), PROVIDERS_COUNT)