File size: 2,507 Bytes
6d64ea5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import pytest
from datetime import datetime, timedelta
from unittest.mock import patch
import sys
import os

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from agent.restrict_usage import RateLimiter


@pytest.fixture
def limiter():
    """Create a RateLimiter instance for testing."""
    return RateLimiter(max_requests=5, window_minutes=60)


def test_first_request_allowed(limiter):
    """First request should always be allowed."""
    assert limiter.is_allowed("test_ip") is True


def test_requests_within_limit(limiter):
    """All requests within limit should be allowed."""
    for _ in range(5):
        assert limiter.is_allowed("test_ip") is True


def test_request_exceeds_limit(limiter):
    """Request exceeding limit should be blocked."""
    for _ in range(5):
        limiter.is_allowed("test_ip")
    assert limiter.is_allowed("test_ip") is False


def test_different_identifiers_separate(limiter):
    """Different identifiers should have separate limits."""
    for _ in range(5):
        limiter.is_allowed("ip1")
    assert limiter.is_allowed("ip1") is False
    assert limiter.is_allowed("ip2") is True


def test_get_remaining(limiter):
    """get_remaining should return correct count."""
    assert limiter.get_remaining("test_ip") == 5
    limiter.is_allowed("test_ip")
    assert limiter.get_remaining("test_ip") == 4
    for _ in range(4):
        limiter.is_allowed("test_ip")
    assert limiter.get_remaining("test_ip") == 0


def test_old_requests_cleaned(limiter):
    """Old requests outside window should be cleaned."""
    fixed_time = datetime(2024, 1, 1, 12, 0, 0)
    
    with patch('agent.restrict_usage.datetime') as mock_datetime:
        mock_datetime.now.return_value = fixed_time
        
        for _ in range(5):
            limiter.is_allowed("test_ip")
        
        assert limiter.is_allowed("test_ip") is False
        
        # Move time forward past the window
        mock_datetime.now.return_value = fixed_time + timedelta(minutes=61)
        
        assert limiter.is_allowed("test_ip") is True
        assert limiter.get_remaining("test_ip") == 4


def test_multiple_identifiers_tracking(limiter):
    """Multiple identifiers should be tracked independently."""
    limiter.is_allowed("user1")
    limiter.is_allowed("user1")
    limiter.is_allowed("user2")
    
    assert limiter.get_remaining("user1") == 3
    assert limiter.get_remaining("user2") == 4
    assert limiter.get_remaining("user3") == 5