from pathlib import Path

from app.db import set_setting
from app.services.lock_service import WorkerLock
from app.services.worker_service import WorkerService


def test_worker_lock(tmp_path):
    path = tmp_path / 'worker.lock'
    a = WorkerLock(path, stale_seconds=600)
    b = WorkerLock(path, stale_seconds=600)
    assert a.acquire() is True
    assert b.acquire() is False
    a.release()
    assert b.acquire() is True
    b.release()


def test_worker_without_instagram_network(monkeypatch):
    class Client:
        user_id = 42
    service = WorkerService()
    monkeypatch.setattr(service.instagram, 'load_client', lambda: Client())
    monkeypatch.setattr(service.instagram, 'recent_media', lambda client, amount: [])
    monkeypatch.setattr(service.instagram, 'fetch_direct_messages', lambda client, thread_limit, message_limit=10: [])
    set_setting('bot_enabled','1')
    result = service.run()
    assert result['ok'] is True
    assert result['result'] == 'success'


def test_follow_state_and_cache():
    from app.services.follow_service import FollowService

    class Relationship:
        followed_by = True

    class Client:
        def __init__(self):
            self.calls = 0

        def user_friendship_v1(self, user_id):
            self.calls += 1
            return Relationship()

    client = Client()
    service = FollowService()
    assert service.check(client, 'follow-user-1', 'sample') == 'followed'
    assert service.check(client, 'follow-user-1', 'sample') == 'followed'
    assert client.calls == 1


def test_follow_unknown_on_error():
    from app.services.follow_service import FollowService

    class Client:
        def user_friendship_v1(self, user_id):
            raise RuntimeError('temporary follow lookup error')

    assert FollowService().check(Client(), 'follow-user-error', 'sample') == 'unknown'
