TeamspeakStats/tsstats/tests/test_template.py

72 lines
2.4 KiB
Python

import logging
from datetime import timedelta
from os import remove
import pytest
from bs4 import BeautifulSoup
from tsstats.log import _parse_details, Server
from tsstats.template import render_servers
from tsstats.utils import filter_threshold, seconds_to_text, sort_clients
output_path = 'tsstats/tests/res/output.html'
clients = _parse_details('tsstats/tests/res/test.log', online_dc=False)
servers = [Server(1, clients)]
logger = logging.getLogger('tsstats')
@pytest.fixture
def output(request):
def clean():
remove(output_path)
request.addfinalizer(clean)
@pytest.fixture
def soup(output):
render_servers(servers, output_path)
return BeautifulSoup(open(output_path), 'html.parser')
def test_debug(output):
logger.setLevel(logging.DEBUG)
render_servers(servers, output_path)
logger.setLevel(logging.INFO)
soup = BeautifulSoup(open(output_path), 'html.parser')
# check debug-label presence
assert soup.find_all(class_='alert alert-danger')
for client_item in soup.find_all('li'):
nick = client_item.find('span').text
# check for right identifier
nick, encl_identifier = nick.split()
identifier = encl_identifier.replace('(', '').replace(')', '')
assert clients[identifier].nick == nick
def test_onlinetime(soup):
# move this into a (parameterized) fixture or function
items = soup.find('ul', id='onlinetime').find_all('li')
nick_data = {}
for item in items:
nick, data = item.find_all('span')
nick_data[nick.text] = data.text
# seperate between uuid and id-clients or merge them some way
# => assert len(items) == len(clients.id)
assert len(items) == 2
for client in clients:
if client.nick in nick_data and client.onlinetime > timedelta(0):
# remove this clause after splitting cients
# (uuid-clients will never have a online-time, because
# they're only used for bans and kicks)
assert nick_data[client.nick] == \
seconds_to_text(int(client.onlinetime.total_seconds()))
def test_filter_threshold():
sorted_clients = sort_clients(
clients, lambda c: c.onlinetime.total_seconds())
assert len(filter_threshold(sorted_clients, -1)) == len(sorted_clients)
assert len(filter_threshold(sorted_clients, 20)) == 1
assert len(filter_threshold(sorted_clients, 500)) == 0