зеркало из
				https://github.com/viginum-datalab/twscrape.git
				synced 2025-11-03 23:46:20 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			139 строки
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			139 строки
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from twscrape.accounts_pool import AccountsPool
 | 
						|
from twscrape.utils import utc
 | 
						|
 | 
						|
 | 
						|
async def test_add_accounts(pool_mock: AccountsPool):
 | 
						|
    # should add account
 | 
						|
    await pool_mock.add_account("user1", "pass1", "email1", "email_pass1")
 | 
						|
    acc = await pool_mock.get("user1")
 | 
						|
    assert acc.username == "user1"
 | 
						|
    assert acc.password == "pass1"
 | 
						|
    assert acc.email == "email1"
 | 
						|
    assert acc.email_password == "email_pass1"
 | 
						|
 | 
						|
    # should not add account with same username
 | 
						|
    await pool_mock.add_account("user1", "pass2", "email2", "email_pass2")
 | 
						|
    acc = await pool_mock.get("user1")
 | 
						|
    assert acc.username == "user1"
 | 
						|
    assert acc.password == "pass1"
 | 
						|
    assert acc.email == "email1"
 | 
						|
    assert acc.email_password == "email_pass1"
 | 
						|
 | 
						|
    # should not add account with different username case
 | 
						|
    await pool_mock.add_account("USER1", "pass2", "email2", "email_pass2")
 | 
						|
    acc = await pool_mock.get("user1")
 | 
						|
    assert acc.username == "user1"
 | 
						|
    assert acc.password == "pass1"
 | 
						|
    assert acc.email == "email1"
 | 
						|
    assert acc.email_password == "email_pass1"
 | 
						|
 | 
						|
    # should add account with different username
 | 
						|
    await pool_mock.add_account("user2", "pass2", "email2", "email_pass2")
 | 
						|
    acc = await pool_mock.get("user2")
 | 
						|
    assert acc.username == "user2"
 | 
						|
    assert acc.password == "pass2"
 | 
						|
    assert acc.email == "email2"
 | 
						|
    assert acc.email_password == "email_pass2"
 | 
						|
 | 
						|
 | 
						|
async def test_get_all(pool_mock: AccountsPool):
 | 
						|
    # should return empty list
 | 
						|
    accs = await pool_mock.get_all()
 | 
						|
    assert len(accs) == 0
 | 
						|
 | 
						|
    # should return all accounts
 | 
						|
    await pool_mock.add_account("user1", "pass1", "email1", "email_pass1")
 | 
						|
    await pool_mock.add_account("user2", "pass2", "email2", "email_pass2")
 | 
						|
    accs = await pool_mock.get_all()
 | 
						|
    assert len(accs) == 2
 | 
						|
    assert accs[0].username == "user1"
 | 
						|
    assert accs[1].username == "user2"
 | 
						|
 | 
						|
 | 
						|
async def test_save(pool_mock: AccountsPool):
 | 
						|
    # should save account
 | 
						|
    await pool_mock.add_account("user1", "pass1", "email1", "email_pass1")
 | 
						|
    acc = await pool_mock.get("user1")
 | 
						|
    acc.password = "pass2"
 | 
						|
    await pool_mock.save(acc)
 | 
						|
    acc = await pool_mock.get("user1")
 | 
						|
    assert acc.password == "pass2"
 | 
						|
 | 
						|
    # should not save account
 | 
						|
    acc = await pool_mock.get("user1")
 | 
						|
    acc.username = "user2"
 | 
						|
    await pool_mock.save(acc)
 | 
						|
    acc = await pool_mock.get("user1")
 | 
						|
    assert acc.username == "user1"
 | 
						|
 | 
						|
 | 
						|
async def test_get_for_queue(pool_mock: AccountsPool):
 | 
						|
    Q = "test_queue"
 | 
						|
 | 
						|
    # should return account
 | 
						|
    await pool_mock.add_account("user1", "pass1", "email1", "email_pass1")
 | 
						|
    await pool_mock.set_active("user1", True)
 | 
						|
    acc = await pool_mock.get_for_queue(Q)
 | 
						|
    assert acc is not None
 | 
						|
    assert acc.username == "user1"
 | 
						|
    assert acc.active is True
 | 
						|
    assert acc.locks is not None
 | 
						|
    assert Q in acc.locks
 | 
						|
    assert acc.locks[Q] is not None
 | 
						|
 | 
						|
    # should return None
 | 
						|
    acc = await pool_mock.get_for_queue(Q)
 | 
						|
    assert acc is None
 | 
						|
 | 
						|
 | 
						|
async def test_account_unlock(pool_mock: AccountsPool):
 | 
						|
    Q = "test_queue"
 | 
						|
 | 
						|
    await pool_mock.add_account("user1", "pass1", "email1", "email_pass1")
 | 
						|
    await pool_mock.set_active("user1", True)
 | 
						|
    acc = await pool_mock.get_for_queue(Q)
 | 
						|
    assert acc is not None
 | 
						|
    assert acc.locks[Q] is not None
 | 
						|
 | 
						|
    # should unlock account and make available for queue
 | 
						|
    await pool_mock.unlock(acc.username, Q)
 | 
						|
    acc = await pool_mock.get_for_queue(Q)
 | 
						|
    assert acc is not None
 | 
						|
    assert acc.locks[Q] is not None
 | 
						|
 | 
						|
    # should update lock time
 | 
						|
    end_time = utc.ts() + 60  # + 1 minute
 | 
						|
    await pool_mock.lock_until(acc.username, Q, end_time)
 | 
						|
 | 
						|
    acc = await pool_mock.get(acc.username)
 | 
						|
    assert int(acc.locks[Q].timestamp()) == end_time
 | 
						|
 | 
						|
 | 
						|
async def test_get_stats(pool_mock: AccountsPool):
 | 
						|
    Q = "SearchTimeline"
 | 
						|
 | 
						|
    # should return empty stats
 | 
						|
    stats = await pool_mock.stats()
 | 
						|
    for k, v in stats.items():
 | 
						|
        assert v == 0, f"{k} should be 0"
 | 
						|
 | 
						|
    # should increate total
 | 
						|
    await pool_mock.add_account("user1", "pass1", "email1", "email_pass1")
 | 
						|
    stats = await pool_mock.stats()
 | 
						|
    assert stats["total"] == 1
 | 
						|
    assert stats["active"] == 0
 | 
						|
 | 
						|
    # should increate active
 | 
						|
    await pool_mock.set_active("user1", True)
 | 
						|
    stats = await pool_mock.stats()
 | 
						|
    assert stats["total"] == 1
 | 
						|
    assert stats["active"] == 1
 | 
						|
 | 
						|
    # should update queue stats
 | 
						|
    acc = await pool_mock.get_for_queue(Q)
 | 
						|
    assert acc is not None
 | 
						|
    stats = await pool_mock.stats()
 | 
						|
    assert stats["total"] == 1
 | 
						|
    assert stats["active"] == 1
 | 
						|
    assert stats[f"locked_{Q}"] == 1
 |