153 lines
4.5 KiB
Python
153 lines
4.5 KiB
Python
|
|
"""Tests for parsing which does not raise Exceptions normally"""
|
||
|
|
|
||
|
|
import logging
|
||
|
|
import io
|
||
|
|
import sys
|
||
|
|
import xml.dom
|
||
|
|
import socket
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
import cssutils
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.fixture(autouse=True)
|
||
|
|
def save_log(monkeypatch):
|
||
|
|
"""
|
||
|
|
Replace default log and ignore its output.
|
||
|
|
"""
|
||
|
|
monkeypatch.setattr(cssutils.log, 'raiseExceptions', False)
|
||
|
|
monkeypatch.setattr(
|
||
|
|
cssutils.log, '_log', logging.getLogger('IGNORED-CSSUTILS-TEST')
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
class TestErrorHandler:
|
||
|
|
def _setHandler(self):
|
||
|
|
"sets new handler and returns StringIO instance to getvalue"
|
||
|
|
s = io.StringIO()
|
||
|
|
h = logging.StreamHandler(s)
|
||
|
|
h.setFormatter(logging.Formatter('%(levelname)s %(message)s'))
|
||
|
|
# remove if present already
|
||
|
|
cssutils.log.removeHandler(h)
|
||
|
|
cssutils.log.addHandler(h)
|
||
|
|
return s
|
||
|
|
|
||
|
|
def test_calls(self):
|
||
|
|
"cssutils.log.*"
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.log.setLevel(logging.DEBUG)
|
||
|
|
cssutils.log.debug('msg', neverraise=True)
|
||
|
|
assert s.getvalue() == 'DEBUG msg\n'
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.log.setLevel(logging.INFO)
|
||
|
|
cssutils.log.info('msg', neverraise=True)
|
||
|
|
assert s.getvalue() == 'INFO msg\n'
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.log.setLevel(logging.WARNING)
|
||
|
|
cssutils.log.warn('msg', neverraise=True)
|
||
|
|
assert s.getvalue() == 'WARNING msg\n'
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.log.setLevel(logging.ERROR)
|
||
|
|
cssutils.log.error('msg', neverraise=True)
|
||
|
|
assert s.getvalue() == 'ERROR msg\n'
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.log.setLevel(logging.FATAL)
|
||
|
|
cssutils.log.fatal('msg', neverraise=True)
|
||
|
|
assert s.getvalue() == 'CRITICAL msg\n'
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.log.setLevel(logging.CRITICAL)
|
||
|
|
cssutils.log.critical('msg', neverraise=True)
|
||
|
|
assert s.getvalue() == 'CRITICAL msg\n'
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.log.setLevel(logging.CRITICAL)
|
||
|
|
cssutils.log.error('msg', neverraise=True)
|
||
|
|
assert s.getvalue() == ''
|
||
|
|
|
||
|
|
def test_linecol(self):
|
||
|
|
"cssutils.log line col"
|
||
|
|
o = cssutils.log.raiseExceptions
|
||
|
|
cssutils.log.raiseExceptions = True
|
||
|
|
|
||
|
|
s = cssutils.css.CSSStyleSheet()
|
||
|
|
try:
|
||
|
|
s.cssText = '@import x;'
|
||
|
|
except xml.dom.DOMException as e:
|
||
|
|
assert str(e) == 'CSSImportRule: Unexpected ident. [1:9: x]'
|
||
|
|
assert e.line == 1
|
||
|
|
assert e.col == 9
|
||
|
|
if sys.platform.startswith('java'):
|
||
|
|
assert e.msg == 'CSSImportRule: Unexpected ident. [1:9: x]'
|
||
|
|
else:
|
||
|
|
assert e.args == ('CSSImportRule: Unexpected ident. [1:9: x]',)
|
||
|
|
|
||
|
|
cssutils.log.raiseExceptions = o
|
||
|
|
|
||
|
|
def test_handlers(self):
|
||
|
|
"cssutils.log"
|
||
|
|
s = self._setHandler()
|
||
|
|
|
||
|
|
cssutils.log.setLevel(logging.FATAL)
|
||
|
|
assert cssutils.log.getEffectiveLevel() == logging.FATAL
|
||
|
|
|
||
|
|
cssutils.parseString('a { color: 1 }')
|
||
|
|
assert s.getvalue() == ''
|
||
|
|
|
||
|
|
cssutils.log.setLevel(logging.DEBUG)
|
||
|
|
cssutils.parseString('a { color: 1 }')
|
||
|
|
# TODO: Fix?
|
||
|
|
# self.assertEqual(
|
||
|
|
# s.getvalue(),
|
||
|
|
# u'ERROR Property: Invalid value for "CSS Color Module '
|
||
|
|
# 'Level 3/CSS Level 2.1" property: 1 [1:5: color]\n')
|
||
|
|
assert (
|
||
|
|
s.getvalue() == 'ERROR Property: Invalid value for "CSS Level 2.1" '
|
||
|
|
'property: 1 [1:5: color]\n'
|
||
|
|
)
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
|
||
|
|
try:
|
||
|
|
socket.getaddrinfo('example.com', 80)
|
||
|
|
except OSError:
|
||
|
|
# skip the test as the name can't resolve
|
||
|
|
return
|
||
|
|
|
||
|
|
cssutils.log.setLevel(logging.ERROR)
|
||
|
|
cssutils.parseUrl('http://example.com')
|
||
|
|
assert s.getvalue()[:38] == 'ERROR Expected "text/css" mime type'
|
||
|
|
|
||
|
|
def test_parsevalidation(self):
|
||
|
|
style = 'color: 1'
|
||
|
|
t = 'a { %s }' % style
|
||
|
|
|
||
|
|
cssutils.log.setLevel(logging.DEBUG)
|
||
|
|
|
||
|
|
# sheet
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.parseString(t)
|
||
|
|
assert len(s.getvalue()) != 0
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.parseString(t, validate=False)
|
||
|
|
assert s.getvalue() == ''
|
||
|
|
|
||
|
|
# style
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.parseStyle(style)
|
||
|
|
assert len(s.getvalue()) != 0
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.parseStyle(style, validate=True)
|
||
|
|
assert len(s.getvalue()) != 0
|
||
|
|
|
||
|
|
s = self._setHandler()
|
||
|
|
cssutils.parseStyle(style, validate=False)
|
||
|
|
assert s.getvalue() == ''
|