Пример #1
0
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')
Пример #2
0
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')