class TestEndpoint(unittest.TestCase): def setUp(self): self.endpoint = Endpoint() self.default_data = {'url': match_url_template.format(matchid=1)} def test_identify_endpoint(self): e = Endpoint.identify_endpoint( summoner_url_template.format(name=fake_name)) self.assertTrue(e == 'lol/summoner/v3/summoners/by-name') e = Endpoint.identify_endpoint(match_url_template.format(matchid='3')) self.assertTrue(e == 'lol/match/v3/matches') e = Endpoint.identify_endpoint( match_url_template.format(matchid='324')) self.assertTrue(e == 'lol/match/v3/matches') e = Endpoint.identify_endpoint(static_champions_url) self.assertTrue(e == 'lol/static-data/v3/champions') def test_limits_defined(self): endpoint = Endpoint() self.assertFalse(endpoint.limits_defined) endpoint.handle_response_headers(headers) self.assertTrue(endpoint.limits_defined) endpoint.limits = {} self.assertFalse(endpoint.limits_defined) def test_add_data(self): self.assertRaises(Exception, self.endpoint.add_data, ({ 'other': 'thing' }, )) self.endpoint.add_data(self.default_data) self.assertEqual(self.endpoint.count, 1) # Endpoint should prevent adding data that doesn't match self.assertRaises(Exception, self.endpoint.add_data, ({ 'other': 'thing' }, )) self.assertRaises( Exception, self.endpoint.add_data, ({ 'url': summoner_url_template.format(name=fake_name) }, )) # Check order m2 = {'url': match_url_template.format(matchid=2)} m3 = {'url': match_url_template.format(matchid=3)} self.endpoint.add_data(m2) self.assertEqual(self.endpoint.count, 2) self.endpoint.add_data(m3) self.assertEqual(self.endpoint.count, 3) self.assertEqual(self.endpoint.get(), self.default_data) self.assertEqual(self.endpoint.get(), m2) self.assertEqual(self.endpoint.get(), m3) # Test adding data atFront self.assertEqual(self.endpoint.count, 0) self.endpoint.add_data(self.default_data, front=True) self.endpoint.add_data(m2, front=True) self.endpoint.add_data(m3, front=True) self.assertEqual(self.endpoint.get(), m3) self.assertEqual(self.endpoint.get(), m2) self.assertEqual(self.endpoint.get(), self.default_data) def test_available(self): self.assertFalse(self.endpoint.available()) for i in range(1, 4): self.endpoint.add_data( {'url': match_url_template.format(matchid=i)}) self.assertTrue(self.endpoint.available()) self.assertTrue(self.endpoint.available()) self.endpoint.get() self.assertTrue( self.endpoint.available()) # No limit set, still available self.endpoint.handle_response_headers(headers) self.endpoint.get() self.assertTrue(self.endpoint.available()) self.endpoint.get() self.assertFalse(self.endpoint.available()) self.assertFalse(self.endpoint.available()) def test_next_ready(self): self.assertEqual(rtime(self.endpoint.next_ready()), rtime()) self.endpoint.handle_response_headers(headers) self.endpoint.add_data(self.default_data) self.assertEqual(rtime(self.endpoint.next_ready()), rtime()) count, seconds = headers['X-Method-Rate-Limit'].split(':') new_headers = copy.copy(headers) new_headers['X-Method-Rate-Limit-Count'] = '%s:%s' % (count, seconds) self.endpoint.handle_response_headers(new_headers) self.assertTrue(len(self.endpoint.limits) > 0) self.assertFalse(self.endpoint.available()) self.assertEqual(rtime(self.endpoint.limits[seconds].start), rtime()) self.assertEqual(rtime(self.endpoint.next_ready()), rtime(time.time() + int(seconds))) def test_count(self): self.assertEqual(self.endpoint.count, 0) self.endpoint.add_data(self.default_data) self.assertEqual(self.endpoint.count, 1) self.endpoint.add_data(self.default_data) self.endpoint.add_data(self.default_data) self.endpoint.add_data(self.default_data) self.assertEqual(self.endpoint.count, 4) self.endpoint.get() self.assertEqual(self.endpoint.count, 3) def test_handle_delay(self): self.endpoint.add_data(self.default_data) self.assertTrue(self.endpoint.available()) self.endpoint._handle_delay(get_date_header()) self.assertFalse(self.endpoint.available()) time.sleep(self.endpoint.default_retry_after) self.assertTrue(self.endpoint.available()) delay = 1 new_headers = get_date_header() new_headers['X-Rate-Limit-Type'] = "Method" new_headers['X-Retry-After'] = '%s' % delay self.endpoint.add_data(self.default_data) self.endpoint.get() self.endpoint.handle_response_headers(new_headers) self.assertFalse(self.endpoint.available()) time.sleep(delay) self.assertTrue(self.endpoint.available()) def test_get_usage(self): self.assertEqual(self.endpoint.get_usage(), 'No limits defined') self.endpoint.handle_response_headers(headers) count, seconds = headers['X-Method-Rate-Limit'].split(':') used, seconds = headers['X-Method-Rate-Limit-Count'].split(':') used = int(used) self.assertEqual(self.endpoint.get_usage(), '%s:%s' % (used, count)) self.endpoint.add_data(self.default_data) self.endpoint.get() self.assertEqual(self.endpoint.get_usage(), '%s:%s' % (used + 1, count)) new_headers = copy.copy(headers) new_headers['X-Method-Rate-Limit-Count'] = '0:%s' % seconds self.endpoint.handle_response_headers(new_headers) self.assertEqual(self.endpoint.get_usage(), '%s:%s' % (used + 1, count)) # Limit assumes 0 is old data new_headers = copy.copy(headers) new_headers['X-Method-Rate-Limit'] = '10:1,100:5' new_headers['X-Method-Rate-Limit-Count'] = '1:1,5:5' self.endpoint.handle_response_headers(new_headers) self.assertEqual(self.endpoint.get_usage(), '1:10,5:100') self.endpoint.add_data({'url': match_url_template.format(matchid=1)}) self.endpoint.get() self.assertEqual(self.endpoint.get_usage(), '2:10,6:100')
def testEndpoint(): summoner_url = 'https://na1.api.riotgames.com/lol/summoner/v3/summoners/by-name/SomeSummonerName' endpoint_str = Endpoint.identify_endpoint(summoner_url) assert (endpoint_str == 'lol/summoner/v3/summoners/by-name') static_url = 'https://na1.api.riotgames.com/lol/static-data/v3/champions?locale=en_US&dataById=false' endpoint_str = Endpoint.identify_endpoint(static_url) assert (endpoint_str == 'lol/static-data/v3/champions') # There was an issue with id's 1 through 9 ending with a '/' match_example = 'https://na1.api.riotgames.com/lol/match/v3/matches/' for i in range(1, 50): url = '%s%s' % (match_example, i) assert (Endpoint.identify_endpoint(url) == 'lol/match/v3/matches') endpoint = Endpoint() assert (endpoint.limits_defined == False) assert (endpoint.count == 0) assert (endpoint.available() == False) # No urls assert (endpoint.name == '') endpoint.addURL(summoner_url) assert (endpoint.count == 1) assert (endpoint.available()) assert (endpoint.name == 'lol/summoner/v3/summoners/by-name') assert (endpoint.get() == summoner_url) assert (endpoint.count == 0) assert (endpoint.get() == None) assert_raises(endpoint.addURL, [static_url]) endpoint.addURL(summoner_url) endpoint.addURL(summoner_url) assert (endpoint.count == 2) assert (endpoint.available()) headers = { 'X-Method-Rate-Limit': '1:0.1,10:1', 'X-Method-Rate-Limit-Count': '0:0.1,9:1' } assert (endpoint.limits_defined == False) endpoint.setLimit(headers) assert (endpoint.available()) assert (endpoint.limits_defined) assert (endpoint.get() == summoner_url) assert (endpoint.get() == None) # Exceeded limit, returned nothing assert (endpoint.getResetTime() > time.time() + 0.01) time.sleep(0.1) assert (endpoint.getResetTime() < time.time()) endpoint.setCount(headers) assert (endpoint.available()) endpoint.addURL(summoner_url) assert (endpoint.get() == summoner_url) assert (endpoint.available() == False) assert (endpoint.get() == None) # Exceeded limit, returned nothing time.sleep(0.1) assert (endpoint.available() == False) time.sleep(0.9) assert (endpoint.available()) print('Endpoint tests pass')