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