def test_feed_and_article_deletion(self): ccontr = CategoryController(2) cat = ccontr.read().first() ccontr.delete(cat.id) self.assertEqual(0, ArticleController().read(category_id=cat.id).count()) self.assertEqual(0, FeedController().read(category_id=cat.id).count())
def post(): opml_file = request.files['opml_file'] try: subscriptions = opml.from_string(opml_file.read()) except Exception as error: raise UnprocessableEntity("Couldn't parse OPML file (%r)" % error) ccontr = CategoryController(current_identity.id) fcontr = FeedController(current_identity.id) counts = {'created': 0, 'existing': 0, 'failed': 0, 'exceptions': []} categories = {cat.name: cat.id for cat in ccontr.read()} for line in subscriptions: try: link = line.xmlUrl except Exception as error: counts['failed'] += 1 counts['exceptions'].append(str(error)) continue # don't import twice if fcontr.read(link=link).count(): counts['existing'] += 1 continue # handling categories cat_id = None category = getattr(line, 'category', '').lstrip('/') if category: if category not in categories: new_category = ccontr.create(name=category) categories[new_category.name] = new_category.id cat_id = categories[category] fcontr.create(title=getattr(line, 'text', None), category_id=cat_id, description=getattr(line, 'description', None), link=link, site_link=getattr(line, 'htmlUrl', None)) counts['created'] += 1 code = 200 if counts.get('created'): code = 201 elif counts.get('failed'): code = 400 return counts, code
class OPMLTest(JarrFlaskCommon): def setUp(self): super().setUp() login = '******' self.user = UserController().get(login=login) self.user2 = UserController().get(login='******') self.fctrl = FeedController(self.user.id) self.cctrl = CategoryController(self.user.id) self.uctrl = UserController() def test_opml_dump_and_restore(self): # downloading OPML export file resp = self.jarr_client('get', '/opml', user=self.user.login) self.assertStatusCode(200, resp) opml_dump = resp.data.decode() self.assertTrue( opml_dump.startswith('<?xml version="1.0" encoding="utf-8"')) self.assertTrue(opml_dump.endswith('</opml>')) # cleaning db actrl = ArticleController(self.user.id) for item in actrl.read(): actrl.delete(item.id) self.assertEqual(0, ClusterController(self.user.id).read().count()) self.assertEqual(0, ArticleController(self.user.id).read().count()) no_category_feed = [] existing_feeds = {} for feed in self.fctrl.read(): if feed.category: if feed.category.name in existing_feeds: existing_feeds[feed.category.name].append(feed.title) else: existing_feeds[feed.category.name] = [feed.title] else: no_category_feed.append(feed.title) self.fctrl.delete(feed.id) for category in self.cctrl.read(): self.cctrl.delete(category.id) # re-importing OPML import_resp = self.jarr_client( 'post', 'opml', to_json=False, data={'opml_file': (BytesIO(resp.data), 'opml.xml')}, headers=None, user=self.user.login) self.assertStatusCode(201, import_resp) self.assertEqual(0, import_resp.json['existing']) self.assertEqual(0, import_resp.json['failed']) self._check_opml_imported(existing_feeds, no_category_feed) import_resp = self.jarr_client( 'post', 'opml', to_json=False, data={'opml_file': (BytesIO(resp.data), 'opml.xml')}, headers=None, user=self.user.login) self.assertStatusCode(200, import_resp) self.assertEqual(0, import_resp.json['created']) self.assertEqual(0, import_resp.json['failed']) def _check_opml_imported(self, existing_feeds, no_category_feed): self.assertEqual( sum(map(len, existing_feeds.values())) + len(no_category_feed), self.fctrl.read().count()) self.assertEqual(len(existing_feeds), self.cctrl.read().count()) for feed in self.fctrl.read(): if feed.category: self.assertIn(feed.category.name, existing_feeds) self.assertIn(feed.title, existing_feeds[feed.category.name]) else: self.assertIn(feed.title, no_category_feed)