class TableBuilderTests(unittest.TestCase):
    TITLE = 'title'
    TABLE_PATH = r'article.csv'
    OUR_TABLE_PATH = r'articles\{0}\article2.csv'
    IMG_FORMAT = '<a target="_blank" rel="nofollow" href="http://amzn.to/1F9ASJc"><img src={0} /></a>'

    def setUp(self):
        self.product_group = 'Shoes'
        self.keyword = 'Boots'
        self.seach = ProductSearcher(CONFIG)
        self.table_builder = TableBuilder(self.TITLE, URL, USER_NAME, PASSWORD)
        self.article_dir = self.table_builder.article_dir

    def test_build_sanity(self):
        products = self.seach.search(self.product_group, self.keyword)
        fieldnames = {}
        self.table_builder.build(products)
        our_table_path = self.OUR_TABLE_PATH.format(self.TITLE)
        with open(our_table_path, 'wb') as f:
            writer = csv.DictWriter(f, fieldnames=self.table_builder.fieldnames_list)
            writer.writeheader()
            for product in products:
                fieldnames['Picture'] = self.IMG_FORMAT.format(product.get_img_url('SmallImage'))
                fieldnames['Name'] = product.title
                fieldnames['Rating'] = product.get_rating()
                fieldnames['Price'] = product.get_price()
                writer.writerow(fieldnames)

        with open(path.join(self.article_dir, self.TABLE_PATH)) as f:
            content = f.read()

        with open(our_table_path) as f:
            out_content = f.read()

        self.assertTrue(content == out_content)
class ArticleBuilderTests(unittest.TestCase):
    def setUp(self):
        self.keyword = 'boots'
        self.product_searcher = ProductSearcher(config.CONFIG)
        self.products = self.product_searcher.search(config.PRODUCT_GROUP, self.keyword)
        self.article_builder = ArticleBuilder(self.keyword, self.products)

    def test_title_sanity(self):
        our_title = "The Best {0}".format(self.keyword.title())
        title = self.article_builder.get_title()
        self.assertTrue(title == our_title)

    def test_get_tags_sanity(self):
        our_tags = []
        for product in self.products:
            if product.manufacturer != 'null':
                our_tags.append(product.manufacturer)

        tags = self.article_builder.get_tags()
        self.assertTrue(tags == list(set(our_tags)))

    def test_build_sanity(self):
        table_id = 5
        article = self.article_builder.build(table_id)
        our_article = TABLE_FORMAT.format(table_id)

        for index, product in enumerate(self.products):
            shorten_url = common.get_short_url(product.page_url)
            alignment = CLASS_FORMAT.format('alignleft' if index % 2 == 0 else 'alignright')
            title = TITLE_FORMAT.format(shorten_url, product.title)
            img = IMG_FORMAT.format(shorten_url, alignment, product.get_img_url('LargeImage'), product.title)
            review = REVIEW_FORMAT.format(product.get_review())
            our_article += PRODUCT_FORMAT.format(title, img, review)

        self.assertTrue(our_article == article)
class Manager(object):
    MIN_PRODUCTS = 5

    def __init__(self):
        self.product_searcher = ProductSearcher(config.CONFIG)

    def _upload_article(self, keyword):
        """
        Get a keyword and uploads an article.
        :param keyword:
        """
        keyword, browse_node = re.findall('(.*)(?:\?bn=(\d+)?)', keyword)[0]
        products = self.product_searcher.search(config.PRODUCT_GROUP, keyword, browse_node=browse_node)
        if len(products) < self.MIN_PRODUCTS:
            return

        article_builder = ArticleBuilder(keyword, products)
        title = article_builder.get_title()
        table_builder = TableBuilder(title, config.URL, config.USER_NAME,
                                     config.PASSWORD)

        table_id = table_builder.build(products)
        wordpress_uploader = WordPressUploader(title, config.URL,
                                               config.USER_NAME, config.PASSWORD)

        content = article_builder.build(table_id)
        # Chose The size of the main image
        main_image_url = products[0].get_img_url('LargeImage')
        main_image_url = main_image_url if main_image_url != 'null' else products[0].get_img_url()
        categories = products[0].get_categories()
        wordpress_uploader.upload_article(content, main_image_url,
                                          article_builder.get_tags(), categories)

    def run(self):
        """
        Loops through the keywords, and uploads an article for each.
        """
        keywords = KeywordExtractor.extract(config.KEYWORDS_FILE_PATH)
        for keyword in keywords:
            self._upload_article(keyword)
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 __init__(self):
     self.product_searcher = ProductSearcher(config.CONFIG)
 def setUp(self):
     self.product_group = 'Shoes'
     self.keyword = 'Boots'
     self.seach = ProductSearcher(CONFIG)
     self.table_builder = TableBuilder(self.TITLE, URL, USER_NAME, PASSWORD)
     self.article_dir = self.table_builder.article_dir
 def setUp(self):
     self.api = AmazonAPIManger(CONFIG).get_api()
     self.product_group = 'Shoes'
     self.keyword = 'Boots'
     self.seach = ProductSearcher(CONFIG)
 def setUp(self):
     self.keyword = 'boots'
     self.product_searcher = ProductSearcher(config.CONFIG)
     self.products = self.product_searcher.search(config.PRODUCT_GROUP, self.keyword)
     self.article_builder = ArticleBuilder(self.keyword, self.products)