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)