class ProductSearcher(object):
    MAX_RESULTS = 10

    def __init__(self, config):
        self.api = AmazonAPIManger(config).get_api()

    def search(self, product_group, keyword, browse_node=None):
        """
        :param product_group: search_index(string)
        :param keyword: free keyword (string)
        :return: list of Products instance
        """
        product_items = self.api.item_search(product_group, Keywords=keyword, BrowseNode=browse_node)
        products = []
        index = -1
        for item in product_items:
            index += 1
            if index == self.MAX_RESULTS:
                break

            browse_nodes = self.api.item_lookup(ItemId=item.ASIN, ResponseGroup='OfferListings,\
                                                                                      BrowseNodes,\
                                                                                      OfferSummary,\
                                                                                      Offers,\
                                                                                      Images')
            product = Product(item, browse_nodes)
            if (product.get_img_url('SmallImage') == 'null') or \
                    (product.get_img_url('MediumImage') == 'null' and product.get_img_url('LargeImage') == 'null'):
                index -= 1
                continue

            if product.get_rating() == 'null' or product.get_review() == 'null' or product.get_price() == 'null':
                index -= 1
                continue

            if float(product.get_rating()) < 4.0:
                index -= 1
                continue

            products.append(product)

        return products
class ProductSearcherTests(unittest.TestCase):
    MAX_RESULTS = 13
    def setUp(self):
        self.api = AmazonAPIManger(CONFIG).get_api()
        self.product_group = 'Shoes'
        self.keyword = 'Boots'
        self.seach = ProductSearcher(CONFIG)

    def test_search_sanity(self):
        our_products = []
        products = self.seach.search(self.product_group, self.keyword)
        our_products_item = self.api.item_search(self.product_group, Keywords=self.keyword)
        for index, item in enumerate(our_products_item):
            if index == self.MAX_RESULTS:
                break

            browse_nodes = self.api.item_lookup(ItemId=item.ASIN, ResponseGroup='OfferListings,\
                                                                                BrowseNodes,\
                                                                                OfferSummary,\
                                                                                Offers,\
                                                                                Images')
            product = Product(item, browse_nodes)
            if (product.get_img_url('SmallImage') == 'null') or \
                    (product.get_img_url('MediumImage') == 'null' and product.get_img_url('LargeImage') == 'null'):
                index -= 1
                continue

            if product.get_rating() == 'null' or \
                            product.get_review() == 'null' or product.get_price() == 'null':
                index -= 1
                continue

            our_products.append(product)

        products_ASIN = [product.ASIN for product in products]
        our_products_ASIN = [product.ASIN for product in our_products]
        self.assertItemsEqual(products_ASIN,our_products_ASIN)
 def setUp(self):
     self.api = AmazonAPIManger(CONFIG).get_api()
     self.product_group = 'Shoes'
     self.keyword = 'Boots'
     self.seach = ProductSearcher(CONFIG)
 def __init__(self, config):
     self.api = AmazonAPIManger(config).get_api()