Skip to content
This repository has been archived by the owner on Oct 13, 2024. It is now read-only.

Commit

Permalink
tests: add pytest (#101)
Browse files Browse the repository at this point in the history
  • Loading branch information
ReenigneArcher authored Feb 12, 2023
1 parent 9792761 commit 1cf8a8b
Show file tree
Hide file tree
Showing 6 changed files with 204 additions and 0 deletions.
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

# ignore directories
docs/
tests/

# ignore venv when building locally
venv/
37 changes: 37 additions & 0 deletions .github/workflows/python-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
name: Python Tests

on:
pull_request:
branches: [master, nightly]
types: [opened, synchronize, reopened]

jobs:
pytest:
strategy:
fail-fast: false
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]

runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v3

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '2.7'

- name: Install python dependencies
shell: bash
run: |
# requests is required to install python-plexapi
python -m pip --no-python-version-warning --disable-pip-version-check install --upgrade \
pip setuptools requests
python -m pip --no-python-version-warning --disable-pip-version-check install -r requirements-dev.txt
python -m pip --no-python-version-warning --disable-pip-version-check install -r requirements.txt
- name: Test with pytest
run: |
python -m pytest -v
22 changes: 22 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# standard imports
import os
import sys

# lib imports
from plexhints.agent_kit import Agent
import pytest

# add Contents directory to the system path
if os.path.isdir('Contents'):
sys.path.append('Contents')

# local imports
from Code import Themerr
else:
raise Exception('Contents directory not found')


@pytest.fixture
def agent():
# type: () -> Agent
return Themerr()
Empty file added tests/unit/__init__.py
Empty file.
118 changes: 118 additions & 0 deletions tests/unit/test_code.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# local imports
from Code import ValidatePrefs
from Code import default_prefs
from plexhints.agent_kit import Media
from plexhints.model_kit import Movie
from plexhints.object_kit import MessageContainer, SearchResult

# setup items to test
test_items = dict(
a=dict(
primary_agent='dev.lizardbyte.retroarcher-plex',
rating_key=1,
title='007 - GoldenEye (USA)',
year=1997,
id='{igdb-1638}',
category='games',
),
b=dict(
primary_agent='com.plexapp.agents.themoviedb',
rating_key=2,
title='GoldenEye',
year=1995,
id='710',
category='movies',
),
c=dict(
primary_agent='com.plexapp.agents.imdb',
rating_key=3,
title='GoldenEye',
year=1995,
id='tt0113189',
category='movies',
)
)


def test_validate_prefs():
result_container = ValidatePrefs()
assert isinstance(result_container, MessageContainer)
assert result_container.header == "Success"
assert "Provided preference values are ok" in result_container.message

# invalidate prefs, cannot do this due to:
# TypeError: '_PreferenceSet' object does not support item assignment
# Code.Prefs['int_plexapi_plexapi_timeout'] = 'not an integer'
# result_container = ValidatePrefs()
# assert isinstance(result_container, MessageContainer)
# assert result_container.header == "Error"
# assert "must be an integer" in result_container.message

# add a default pref and make sure it is not in DefaultPrefs.json
default_prefs['new_pref'] = 'new_value'
result_container = ValidatePrefs()
assert isinstance(result_container, MessageContainer)
assert result_container.header == "Error"
assert "missing from 'DefaultPrefs.json'" in result_container.message


def test_start():
# todo
pass


def test_main():
# todo
pass


def test_themerr_search(agent):
for key, item in test_items.items():
media = Media.Movie()
media.primary_metadata = Movie()

media.primary_agent = item['primary_agent']
media.primary_metadata.id = item['id']
media.primary_metadata.title = item['title']
media.primary_metadata.year = item['year']

database = None
item_id = item['id']
if item['category'] == 'games':
database = item['id'][1:-1].split('-')[0]
item_id = item['id'][1:-1].split('-')[-1]
elif item['category'] == 'movies':
database = item['primary_agent'].split('.')[-1]

results = agent.search(results=SearchResult(), media=media, lang='en', manual=False)

for result in results.__items__:
# print(result.__dict__)
assert result.name == item['title']
assert result.year == item['year']
assert result.id == "%s-%s-%s" % (item['category'], database, item_id)


def test_themerr_update(agent):
metadata = Movie()

for key, item in test_items.items():
media = Movie()

database = None
item_id = item['id']
if item['category'] == 'games':
database = item['id'][1:-1].split('-')[0]
item_id = item['id'][1:-1].split('-')[-1]
elif item['category'] == 'movies':
database = item['primary_agent'].split('.')[-1]

media.id = item['rating_key']
metadata.title = item['title']
metadata.year = item['year']
metadata.id = "%s-%s-%s" % (item['category'], database, item_id)

# this won't actually upload a theme since we're not working with a real Plex Server
metadata = agent.update(metadata=metadata, media=media, lang='en', force=True)

assert isinstance(metadata, Movie)
26 changes: 26 additions & 0 deletions tests/unit/test_youtube_dl_helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# lib imports
import pytest
from youtube_dl import DownloadError

# local imports
from Code import youtube_dl_helper


def test_process_youtube():
# test valid urls
valid_urls = [
'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
]
for url in valid_urls:
audio_url = youtube_dl_helper.process_youtube(url=url)
assert audio_url is not None
assert audio_url.startswith('https://')

# test invalid urls
invalid_urls = [
'https://www.youtube.com/watch?v=notavideoid',
'https://blahblahblah',
]
for url in invalid_urls:
with pytest.raises(DownloadError):
youtube_dl_helper.process_youtube(url=url)

0 comments on commit 1cf8a8b

Please sign in to comment.