from unittest.mock import patch, MagicMock

from gatox.caching.cache_manager import CacheManager
from gatox.models.repository import Repository
from gatox.models.workflow import Workflow

def test_init_cache():
    """
    """
    cache = CacheManager()
    assert cache.workflow_cache == {}


def test_set_workflow():
    """Test setting and retrieving a workflow from the cache.
    """
    cache = CacheManager()
    
    mock_wf = MagicMock()

    cache.set_workflow('testOrg/testRepo1', 'test.yml', mock_wf)

    assert cache.get_workflow('testOrg/testRepo1', 'test.yml') == mock_wf


def test_set_double_workflow():
    """Test setting a workflow twice - this should return the most recent workflow.
    """
    cache = CacheManager()
    
    mock_wf = MagicMock()
    mock_wf2 = MagicMock()

    cache.set_workflow('testOrg/testRepo2', 'test.yml', mock_wf)
    cache.set_workflow('testOrg/testRepo2', 'test.yml', mock_wf2)

    assert cache.get_workflow('testOrg/testRepo2', 'test.yml') == mock_wf2

def test_set_empty_and_cached():
    """Test if setting the repo 
    """
    CacheManager().set_empty('testOrg/testRepoEmpty')

    assert CacheManager().is_repo_cached('testOrg/testRepoEmpty') == True

def test_get_workflows():
    """Test getting all workflows for a repository.
    """

    cache = CacheManager()
    
    mock_wf = MagicMock()
    mock_wf2 = MagicMock()

    cache.set_workflow('testOrg/testRepo3', 'test.yml', mock_wf)
    cache.set_workflow('testOrg/testRepo3', 'test2.yml', mock_wf2)
    wf_set = cache.get_workflows('testOrg/testRepo3')

    assert mock_wf in wf_set
    assert mock_wf2 in wf_set

def test_get_workflows_fail():
    """Test getting all workflows for a repository.
    """

    cache = CacheManager()
    
    mock_wf = MagicMock()
    mock_wf2 = MagicMock()

    cache.set_workflow('testOrg/testRepo3', 'test.yml', mock_wf)
    cache.set_workflow('testOrg/testRepo3', 'test2.yml', mock_wf2)
    assert cache.get_workflows('testOrg/testRepoNone') == set()

def test_set_get_repository():
    """Test setting and getting a repository to the cache.
    """
    cache = CacheManager()
    
    mock_repo = MagicMock()
    mock_repo.name = "testOrg/testRepo"

    cache.set_repository(mock_repo)

    assert cache.get_repository("testOrg/testRepo") == mock_repo

def test_get_set_repository_fail():
    """Test failure case when repository does not exist
    """
    cache = CacheManager()
    
    mock_repo = MagicMock()
    mock_repo.name = "testOrg/testRepo"

    cache.set_repository(mock_repo)

    assert cache.get_repository("badOrg/BadRepo") == None

def test_set_get_action():
    """Test setting and getting a reusable action.
    """
    cache = CacheManager()
    
    mock_action = "someActionContentsHere"

    cache.set_action("testOrg/testRepo", ".github/actions/action.yml", "main", mock_action)

    assert cache.get_action("testOrg/testRepo", ".github/actions/action.yml", "main") == mock_action

