def test_find_feeds_worker__raises(self): forager = Forager(raise_to_depth=0) with mock.patch.object(forager, '_fetch_and_parse', side_effect=requests.RequestException): with self.assertRaises(requests.RequestException): forager._find_feeds_worker('') with mock.patch.object( forager, '_fetch_and_parse', side_effect=forager_exceptions.HttpException(response=None)): with self.assertRaises(forager_exceptions.HttpException): forager._find_feeds_worker('') forager = Forager(raise_to_depth=5) with mock.patch.object(forager, '_fetch_and_parse', side_effect=requests.RequestException): with self.assertRaises(requests.RequestException): forager._find_feeds_worker('', curr_depth=5) with mock.patch.object( forager, '_fetch_and_parse', side_effect=forager_exceptions.HttpException(response=None)): with self.assertRaises(forager_exceptions.HttpException): forager._find_feeds_worker('', curr_depth=5)
def test_fetch_and_parse__unauthorized(self): from forager.exceptions import Unauthorized unauthorized_request_response = RequestResponse(text='', url='', status_code=401) with mock.patch('forager.requests.get', return_value=unauthorized_request_response): forager = Forager() with self.assertRaises(Unauthorized): forager._fetch_and_parse('a url')
def test_find_feeds__non_recursive(self): forager = Forager() with self.mocked_requests(forager): response = forager.find_feeds('http://site-a.com/') self.assertEqual(response, { 'http://site-a.com/feed/', 'http://site-a.com/comments/feed/' })
def test_find_feeds__depth_3(self): forager = Forager(max_depth=3) with self.mocked_requests(forager): response = forager.find_feeds('http://site-b.com/') self.assertEqual(response, { 'http://site-b.com/hidden_feed/', 'http://site-b.com/feed_like.xml', 'http://site-c.com/a_feed.xml' })
def test_requests_get(self): with mock.patch('forager.requests.get', return_value='some good stuff') as requests_get: forager = Forager() result = forager._requests_get('a url') self.assertEqual(result, 'some good stuff') requests_get.assert_called_once_with( 'a url', headers={'User-Agent': forager._user_agent}, timeout=forager._request_timeout, verify=False )
def test_find_feeds__fixed_urls(self): forager = Forager(max_depth=3) with self.mocked_requests(forager): response = forager.find_feeds('site-b.com') self.assertTrue(len(response) > 0)
def test_find_feeds__depth_1(self): forager = Forager(max_depth=1) with self.mocked_requests(forager): response = forager.find_feeds('http://site-b.com/') self.assertEqual(response, set())
def test_find_feeds_worker__no_exception(self): forager = Forager() with mock.patch.object(forager, '_fetch_and_parse', return_value=(None, '')): self.assertEqual(forager._find_feeds_worker(''), set())
def test_find_xmlrpc__direct(self): forager = Forager() with self.mocked_requests(forager): response = forager.find_xmlrpc('http://site-a.com/xmlrpc.php?rsd') self.assertEqual(response, {'http://site-a.com/xmlrpc.php'})
def test_find_xmlrpc__empty(self): forager = Forager() with self.mocked_requests(forager), \ mock.patch.object(forager, '_fetch_and_parse', return_value=FetchResult(soup=None, url='')): result = forager.find_xmlrpc('http://does-not-exist.com/') self.assertEqual(result, set())
def test_find_xmlrpc__raises(self): forager = Forager() with self.mocked_requests(forager): with self.assertRaises(requests.RequestException): forager.find_xmlrpc('http://does-not-exist.com/')
def test_find_auth_for_url__regex(self): forager = Forager(auths={r'^https?://(www\.)curata.com(/.*)$': 'waffles'}) self.assertEqual(forager._find_auth_for_url('http://www.curata.com/blog/'), 'waffles')
def test_find_auth_for_url__domain(self): forager = Forager(auths={'www.curata.com': 'waffles'}) self.assertEqual(forager._find_auth_for_url('http://www.curata.com/blog/'), 'waffles')
def test_find_feeds_worker__default_muted(self): forager = Forager() with mock.patch.object(forager, '_fetch_and_parse', side_effect=requests.RequestException): self.assertEqual(forager._find_feeds_worker(''), set())
import matplotlib.pyplot as plt import matplotlib.animation as an from forager import Forager from landscape import Landscape from foraging import foraging, display def update(_): global l, f if not f.is_dead: foraging(l, f) return display(l, f), l = Landscape(30, 30, 15) f = Forager(0, 0) fig = plt.figure(figsize=(6, 6)) ax = fig.add_axes([0, 0, 1, 1], frameon=False, aspect=1) animation = an.FuncAnimation(fig, update, interval=1, blit=True, frames=200) plt.show() print('Total move = %d' % f.total_move) print('Total eaten = %d' % f.total_eaten)
def test_find_xmlrpc__bad_content(self): forager = Forager() with self.mocked_requests(forager): response = forager.find_xmlrpc('http://site-a.com/index_with_bad_rsd_link.html') self.assertEqual(response, set())
from forager import Forager import pytest forager = Forager(0, 0) def test_is_dead(): forager.stock = 1 assert not forager.is_dead forager.stock = 0 assert forager.is_dead def test_quantity_which_can_be_eat(): forager.stock = Forager.STOCK_MAX - 2 assert forager.quantity_which_can_be_eaten == 2 forager.stock = Forager.STOCK_MAX - Forager.EAT_MAX_BY_DAY * 2 assert forager.quantity_which_can_be_eaten == Forager.EAT_MAX_BY_DAY def test_eat(): forager.stock = Forager.STOCK_MAX - 10 forager.total_eaten = 10 forager.eat(5) assert forager.stock == Forager.STOCK_MAX - 5 assert forager.total_eaten == 15 forager.stock = Forager.STOCK_MAX - 10 forager.total_eaten = 10 forager.eat(15) assert forager.stock == Forager.STOCK_MAX assert forager.total_eaten == 20
from forager import Forager from landscape import Landscape from foraging import eat, is_moving, move, foraging x = 2 y = 2 nb_patches = 0 x_forager = 0 y_forager = 0 landscape = Landscape(x, y, nb_patches) forager = Forager(x_forager, y_forager) def test_eat(): forager.stock = Forager.STOCK_MAX - Forager.EAT_MAX_BY_DAY + 2 landscape.land[x_forager, y_forager] = Forager.EAT_MAX_BY_DAY eat(landscape, forager) assert landscape.land[x_forager, y_forager] == 2 assert forager.stock == Forager.STOCK_MAX forager.stock = Forager.STOCK_MAX - Forager.EAT_MAX_BY_DAY - 2 landscape.land[x_forager, y_forager] = Forager.EAT_MAX_BY_DAY eat(landscape, forager) assert landscape.land[x_forager, y_forager] == 0 assert forager.stock == Forager.STOCK_MAX - 2 def test_is_moving(): landscape.land[x_forager, y_forager] = 0 assert is_moving(landscape, forager) landscape.land[x_forager, y_forager] = Forager.EAT_MAX_BY_DAY - 1 forager.stock = 0