80 lines
2 KiB
Python
80 lines
2 KiB
Python
import json
|
|
import uuid
|
|
from dataclasses import dataclass
|
|
from datetime import datetime
|
|
from importlib import resources
|
|
from typing import Dict, List
|
|
|
|
from ucast.service import youtube
|
|
|
|
DIR_TESTFILES = resources.path("ucast.tests", "_testfiles")
|
|
|
|
|
|
def get_video_details(video_id: str):
|
|
with open(DIR_TESTFILES / "object" / "videodetails.json") as f:
|
|
videodetails = json.load(f)
|
|
|
|
vd_raw = videodetails[video_id]
|
|
vd_raw["published"] = datetime.fromisoformat(vd_raw["published"])
|
|
|
|
return youtube.VideoDetails(**vd_raw)
|
|
|
|
|
|
def get_channel_metadata(channel_url: str):
|
|
with open(DIR_TESTFILES / "object" / "channelmeta.json") as f:
|
|
channelmeta = json.load(f)
|
|
|
|
return youtube.ChannelMetadata(**channelmeta[channel_url])
|
|
|
|
|
|
_global_mock_calls: Dict[str, List["_GlobalMockCall"]] = {}
|
|
|
|
|
|
@dataclass
|
|
class _GlobalMockCall:
|
|
args: list
|
|
kwargs: dict
|
|
|
|
|
|
class GlobalMock:
|
|
def __init__(self):
|
|
self.uuid = str(uuid.uuid4())
|
|
|
|
@property
|
|
def calls(self) -> List[_GlobalMockCall]:
|
|
global _global_mock_calls
|
|
|
|
if self.uuid not in _global_mock_calls:
|
|
_global_mock_calls[self.uuid] = []
|
|
|
|
return _global_mock_calls[self.uuid]
|
|
|
|
@property
|
|
def n_calls(self) -> int:
|
|
return len(self.calls)
|
|
|
|
def __call__(self, *args, **kwargs):
|
|
call = _GlobalMockCall(args, kwargs)
|
|
self.calls.append(call)
|
|
|
|
def assert_called(self):
|
|
if not self.calls:
|
|
raise AssertionError("Mock has never been called")
|
|
|
|
def assert_any_call(self, *args, **kwargs):
|
|
self.assert_called()
|
|
|
|
for call in self.calls:
|
|
if call.args == args and call.kwargs == kwargs:
|
|
return
|
|
|
|
raise AssertionError(
|
|
f"Call with args: {args}, kwargs: {kwargs} not found.\
|
|
Registered calls: {self.calls}"
|
|
)
|
|
|
|
def assert_called_with(self, *args, **kwargs):
|
|
self.assert_called()
|
|
|
|
call = self.calls[-1]
|
|
assert call.args == args and call.kwargs == kwargs
|