def test_get_or_immediate_create_by_url(ctx): """ test that get_or_immediate_create_by_url retrieves existing feeds by url if they in fact exist, and creates them if they don't. """ from datetime import datetime, timedelta from eventlet import sleep from melkman.db.remotefeed import RemoteFeed, get_or_immediate_create_by_url feed_url = 'http://example.org/1' # make sure it doesn't exist yet feed = RemoteFeed.get_by_url(feed_url, ctx) assert feed is None # this should result in its immediate creation creationdt = datetime.utcnow() feed = get_or_immediate_create_by_url(feed_url, ctx) assert feed is not None assert feed.last_modification_date - creationdt < timedelta(seconds=1) sleep(1) # this should retrieve the existing feed, not create a new one now = datetime.utcnow() samefeed = get_or_immediate_create_by_url(feed_url, ctx) assert samefeed.id == feed.id assert samefeed.last_modification_date == feed.last_modification_date assert now - samefeed.last_modification_date >= timedelta(seconds=1)
def set_opml(self, id): composite = Composite.get(id, ctx) if composite is None: abort(404) opml_data = get_posted_data() try: feeds = set(feeds_in_opml(opml_data)) except: import traceback log.error(traceback.format_exc()) abort(400) result = defaultdict(list) oldfeeds = set(i.url for i in composite.subscriptions.itervalues()) remove = oldfeeds - feeds for url in remove: feed = RemoteFeed.get_by_url(url, ctx) if feed is not None: composite.unsubscribe(feed) result["unsubscribed"].append(url) log.debug('Unsubscribed composite "%s" from %s' % (id, url)) else: result["unsubscribe_failed"].append(url) log.error('Expected composite "%s" to have RemoteFeed for %s' % (id, url)) for url in feeds: if url not in oldfeeds: feed = get_or_immediate_create_by_url(url, ctx) if feed is None: result["subscribe_failed"].append(url) log.warn("Could not get or create feed for %s" % url) continue composite.subscribe(feed) result["subscribed"].append(url) log.debug('Subscribed composite "%s" to %s' % (id, url)) else: result["unchanged"].append(url) composite.save() log.debug('Composite "%s" saved' % id) return json_response(result)