old_contents: import logging
  from datetime import timedelta
  from os import remove
  
  import pytest
  from bs4 import BeautifulSoup
  
  from tsstats.log import _parse_details
  from tsstats.template import render_template
  from tsstats.utils import seconds_to_text
  
  output_path = 'tsstats/tests/res/output.html'
  clients = _parse_details('tsstats/tests/res/test.log')
  
  logger = logging.getLogger('tsstats')
  
  
  @pytest.fixture
  def output(request):
      def clean():
          remove(output_path)
      request.addfinalizer(clean)
  
  
  @pytest.fixture
  def soup(output):
      render_template(clients, output_path)
      return BeautifulSoup(open(output_path), 'html.parser')
  
  
  def test_debug(output):
      logger.setLevel(logging.DEBUG)
      render_template(clients, 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()))
  
new_contents: import logging
  from datetime import timedelta
  from os import remove
  
  import pytest
  from bs4 import BeautifulSoup
  
  from tsstats.log import _parse_details
  from tsstats.template import render_template
  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)
  
  logger = logging.getLogger('tsstats')
  
  
  @pytest.fixture
  def output(request):
      def clean():
          remove(output_path)
      request.addfinalizer(clean)
  
  
  @pytest.fixture
  def soup(output):
      render_template(clients, output_path)
      return BeautifulSoup(open(output_path), 'html.parser')
  
  
  def test_debug(output):
      logger.setLevel(logging.DEBUG)
      render_template(clients, 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
  
subject: Add testcase for tsstats.utils.filter_threshold