# -*- coding: utf-8 -*-
"""
  eventlogging unit tests
  ~~~~~~~~~~~~~~~~~~~~~~~

  This module contains tests for :class:`eventlogging.LogParser`.

"""

import unittest

import eventlogging.parse


class LogParserTestCase(unittest.TestCase):
    """Test case for LogParser."""

    maxDiff = None

    def test_parse_client_side_events(self):
        """Parser test: client-side events."""
        parser = eventlogging.parse.LogParser(
            '%q %{recvFrom}s %{seqId}d %t %h %{userAgent}i')
        raw = ('?%7B%22wiki%22%3A%22testwiki%22%2C%22schema%22%3A%22Generic'
               '%22%2C%22revision%22%3A13%2C%22event%22%3A%7B%22articleId%2'
               '2%3A1%2C%22articleTitle%22%3A%22H%C3%A9ctor%20Elizondo%22%7'
               'D%2C%22webHost%22%3A%22test.wikipedia.org%22%7D; cp3022.esa'
               'ms.wikimedia.org 132073 1358637398 86.149.229.149 '
               'Mozilla/5.0')
        parsed = {
            'uuid': '799341a01ba957c79b15dc4d2d950864',
            'recvFrom': 'cp3022.esams.wikimedia.org',
            'wiki': 'testwiki',
            'webHost': 'test.wikipedia.org',
            'seqId': 132073,
            'timestamp': 1358637398,
            'clientIp': '86.149.229.149',
            'schema': 'Generic',
            'revision': 13,
            'userAgent': 'Mozilla/5.0',
            'event': {
                'articleTitle': 'Héctor Elizondo',
                'articleId': 1
            }
        }
        self.assertEqual(parser.parse(raw), parsed)

    def test_parser_server_side_events(self):
        """Parser test: server-side events."""
        parser = eventlogging.parse.LogParser('%{seqId}d EventLogging %j')
        raw = ('99 EventLogging {"revision":123,"timestamp":1358627115,"sche'
               'ma":"FakeSchema","wiki":"enwiki","event":{"action":"save\\u0'
               '020page"},"recvFrom":"fenari"}')
        parsed = {
            'uuid': '67cc2c1afa5752ba80bbbd7c5fc41f28',
            'recvFrom': 'fenari',
            'timestamp': 1358627115,
            'wiki': 'enwiki',
            'seqId': 99,
            'schema': 'FakeSchema',
            'revision': 123,
            'event': {
                'action': 'save page'
            }
        }
        self.assertEqual(parser.parse(raw), parsed)

    def test_parse_failure(self):
        """Parse failure raises ValueError exception."""
        parser = eventlogging.parse.LogParser('%q %{recvFrom}s %t %h')
        with self.assertRaises(ValueError):
            parser.parse('Fails to parse.')

    def test_repr(self):
        """Calling 'repr' on LogParser returns canonical string
        representation."""
        parser = eventlogging.parse.LogParser('%q %{seqId}d %t %h')
        self.assertEqual(repr(parser), "<LogParser('%q %{seqId}d %t %h')>")
