Skip to content

Commit

Permalink
Merge pull request #20 from erayerdin/development
Browse files Browse the repository at this point in the history
v0.1.1a1
  • Loading branch information
erayerdin committed May 23, 2019
2 parents b8e4af5 + 574e5d4 commit 007b02d
Show file tree
Hide file tree
Showing 25 changed files with 350 additions and 261 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [v0.1.1a1] - 2019-05-24
### Added
- `TelegramHandler` now validates bot on initialization

## [v0.1.0b5] - 2019-05-21
### Added
- Added `uuid` to `TelegramFormatter` and `request`
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# tglogger

[![PyPI](https://img.shields.io/pypi/v/tglogger.svg?style=flat-square&logo=python&logoColor=white)][pypi_url] [![PyPI](https://img.shields.io/pypi/status/tglogger.svg?style=flat-square&logo=python&logoColor=white)][pypi_url] [![PyPI](https://img.shields.io/pypi/dm/tglogger.svg?style=flat-square&logo=python&logoColor=white)][pypi_url] [![PyPI](https://img.shields.io/pypi/pyversions/tglogger.svg?style=flat-square&logo=python&logoColor=white)][pypi_url] [![PyPI - Django Version](https://img.shields.io/pypi/djversions/tglogger.svg?style=flat-square)][pypi_url] [![PyPI](https://img.shields.io/pypi/l/tglogger.svg?style=flat-square)][pypi_url] [![](https://img.shields.io/readthedocs/tglogger.svg?style=flat-square)](https://tglogger.readthedocs.io/en/latest/) [![Telegram](https://img.shields.io/badge/telegram-%40erayerdin-%2332afed.svg?style=flat-square&logo=telegram&logoColor=white)](https://t.me/erayerdin) [![Code Style](https://img.shields.io/badge/style-black-000000.svg?style=flat-square)](https://github.com/ambv/black)
[![PyPI](https://img.shields.io/pypi/v/tglogger.svg?style=flat-square&logo=python&logoColor=white)][pypi_url] [![PyPI](https://img.shields.io/pypi/dm/tglogger.svg?style=flat-square&logo=python&logoColor=white)][pypi_url] [![PyPI](https://img.shields.io/pypi/pyversions/tglogger.svg?style=flat-square&logo=python&logoColor=white)][pypi_url] [![PyPI - Django Version](https://img.shields.io/pypi/djversions/tglogger.svg?style=flat-square)][pypi_url] [![PyPI](https://img.shields.io/pypi/l/tglogger.svg?style=flat-square)][pypi_url] [![](https://img.shields.io/readthedocs/tglogger.svg?style=flat-square)](https://tglogger.readthedocs.io/en/latest/) [![Telegram](https://img.shields.io/badge/telegram-%40erayerdin-%2332afed.svg?style=flat-square&logo=telegram&logoColor=white)](https://t.me/erayerdin) [![Code Style](https://img.shields.io/badge/style-black-000000.svg?style=flat-square)](https://github.com/ambv/black)

![](resources/recording.gif)

Expand Down
10 changes: 9 additions & 1 deletion conftest.py
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
pytest_plugins = ("tests.fixtures",)
pytest_plugins = (
# Generic
"tests.fixtures.internal",
"tests.fixtures.logging",
"tests.fixtures.resource",
#
"tests.test_request.fixtures", # request fixtures
"tests.test_formatter.fixtures", # formatter fixtures
)
4 changes: 2 additions & 2 deletions docs/django.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@ LOGGING = {
"formatters": {
# ...
"telegram_formatter": {
"()", "tglogger.formatter.TelegramFormatter"
"()": "tglogger.formatter.TelegramFormatter"
},
# ...
},
# ...
"handlers": {
# ...
"telegram_handler": {
"class": "tglogger.formatter.TelegramHandler",
"class": "tglogger.handler.TelegramHandler",
"formatter": "telegram_formatter",
"bot_token": "BOT_TOKEN", # replace it with your token
"receiver": "CHAT_ID", # chat id to send message to
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
include_package_data=True,
keywords="telegram messaging communication logging",
classifiers=[
"Development Status :: 4 - Beta",
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"Intended Audience :: System Administrators",
"License :: OSI Approved :: Apache Software License",
Expand Down
Empty file added tests/fixtures/__init__.py
Empty file.
29 changes: 29 additions & 0 deletions tests/fixtures/internal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import logging
import re

import pytest

import tglogger.formatter
import tglogger.handler
import tglogger.request


@pytest.fixture
def telegram_formatter() -> tglogger.formatter.TelegramFormatter:
return tglogger.formatter.TelegramFormatter()


@pytest.fixture
def telegram_handler(telegram_formatter) -> tglogger.handler.TelegramHandler:
handler = tglogger.handler.TelegramHandler(
bot_token="1", receiver="2", bypass_auth=True
)
handler.setFormatter(telegram_formatter)
return handler


@pytest.fixture
def telegram_logger(telegram_handler, telegram_formatter) -> logging.Logger:
logger = logging.getLogger("test logger")
logger.addHandler(telegram_handler)
return logger
44 changes: 12 additions & 32 deletions tests/fixtures.py → tests/fixtures/logging.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,7 @@
import json
import logging
import typing

import pytest
import requests_mock

import tglogger.formatter
import tglogger.handler
import tglogger.request


@pytest.fixture
def read_test_resource(request):
def factory(file_name: str, mode="r"):
file = open("tests/resources/{}".format(file_name), mode)
request.addfinalizer(lambda: file.close())
return file

return factory


@pytest.fixture(scope="module")
Expand Down Expand Up @@ -47,19 +31,15 @@ def factory(**kwargs) -> logging.LogRecord:


@pytest.fixture(scope="module")
def telegram_formatter() -> tglogger.formatter.TelegramFormatter:
return tglogger.formatter.TelegramFormatter()


@pytest.fixture(scope="module")
def telegram_handler(telegram_formatter) -> tglogger.handler.TelegramHandler:
handler = tglogger.handler.TelegramHandler(bot_token="1", receiver="2")
handler.setFormatter(telegram_formatter)
return handler


@pytest.fixture(scope="module")
def telegram_logger(telegram_handler, telegram_formatter) -> logging.Logger:
logger = logging.getLogger("test logger")
logger.addHandler(telegram_handler)
return logger
def exception_log_record(log_record_factory):
from collections import namedtuple

return log_record_factory(
exc_info=(
Exception,
Exception("foo"),
namedtuple(
"fake_tb", ("tb_frame", "tb_lasti", "tb_lineno", "tb_next")
), # ref: https://stackoverflow.com/a/49561567/2926992
)
)
11 changes: 11 additions & 0 deletions tests/fixtures/resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import pytest


@pytest.fixture
def read_test_resource(request):
def factory(file_name: str, mode="r"):
file = open("tests/resources/{}".format(file_name), mode)
request.addfinalizer(lambda: file.close())
return file

return factory
9 changes: 9 additions & 0 deletions tests/resources/me.response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"ok": true,
"result": {
"first_name": "Foo",
"id": 1,
"is_bot": true,
"username": "foobot"
}
}
45 changes: 23 additions & 22 deletions tests/test_django.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,30 +24,31 @@ def factory(USE_TZ=True, TIME_ZONE="Europe/Istanbul"):
return factory


class TestTelegramFormatterDjango:
def test_system_date_use_tz(self, formatter_message_factory, settings):
assert (
re.search(
r"\*System Date:\* .* \(Europe/Istanbul\)\n",
formatter_message_factory(),
)
is not None
def test_system_date_use_tz(formatter_message_factory, settings):
assert (
re.search(
r"\*System Date:\* .* \(Europe/Istanbul\)\n",
formatter_message_factory(),
)
is not None
)

def test_system_date_not_use_tz(self, formatter_message_factory, settings):
assert (
re.search(
r"\*System Date:\* .* \(No Timezone\)\n",
formatter_message_factory(USE_TZ=False),
)
is not None

def test_system_date_not_use_tz(formatter_message_factory, settings):
assert (
re.search(
r"\*System Date:\* .* \(No Timezone\)\n",
formatter_message_factory(USE_TZ=False),
)
is not None
)


def test_system_date_time_zone(self, formatter_message_factory, settings):
assert (
re.search(
r"\*System Date:\* .* \(UTC\)\n",
formatter_message_factory(TIME_ZONE="UTC"),
)
is not None
def test_system_date_time_zone(formatter_message_factory, settings):
assert (
re.search(
r"\*System Date:\* .* \(UTC\)\n",
formatter_message_factory(TIME_ZONE="UTC"),
)
is not None
)
60 changes: 0 additions & 60 deletions tests/test_formatter.py

This file was deleted.

Empty file.
7 changes: 7 additions & 0 deletions tests/test_formatter/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import pytest


@pytest.fixture
def formatter_message(log_record_factory, telegram_formatter):
log_record = log_record_factory()
return telegram_formatter.format(log_record)
13 changes: 13 additions & 0 deletions tests/test_formatter/test_reformat_markdown_safe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from tglogger import formatter


def test_reformat_markdown_safe_underscore():
example = "foo_bar_baz"
reformatted = formatter.reformat_markdown_safe(example)
assert reformatted == "foo\_bar\_baz"


def test_reformat_markdown_safe_asterisk():
example = "foo*bar*baz"
reformatted = formatter.reformat_markdown_safe(example)
assert reformatted == "foo\*bar\*baz"
45 changes: 45 additions & 0 deletions tests/test_formatter/test_telegram_formatter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import re


def test_message_banner_hashtag(formatter_message):
assert "#tglogger" in formatter_message


def test_message_uuid(formatter_message):
assert re.search("#[a-z0-9]{32}\n", formatter_message)


def test_message_logger_name(formatter_message):
assert "*Logger Name:* example.logger" in formatter_message


def test_message_system_date(formatter_message):
assert re.search(r"\*System Date:\* .*\n", formatter_message)


def test_message_level(formatter_message):
assert "*Level:* #error" in formatter_message


def test_message_path_and_line(formatter_message):
assert "*Path and Line:* _/foo/bar/baz.py_:1" in formatter_message


def test_message_function_or_method(formatter_message):
assert "*Function/Method:* _foo\_bar\_baz_" in formatter_message


def test_message_thread(formatter_message):
assert re.search(
"\*Thread ID and Name:\* \\\[[0-9]+\] .*\n", formatter_message
)


def test_message_process(formatter_message):
assert re.search(
"\*Process ID and Name:\* \\\[[0-9]+\] .*\n", formatter_message
)


def test_message_message(formatter_message):
assert "*Message*\n" in formatter_message
24 changes: 16 additions & 8 deletions tests/test_handler.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import os
import uuid

import pytest
Expand All @@ -10,12 +9,21 @@ def test_log_record_uuid(log_record_factory):
assert isinstance(log_record.uuid, uuid.UUID)


class TestTelegramHandler:
def test_emit_return_type(self, telegram_handler, log_record_factory):
log_record = log_record_factory()
# Telegram Handler Tests
def test_handler_emit_return_type(telegram_handler, log_record_factory):
log_record = log_record_factory()

responses = telegram_handler.emit(log_record)
assert isinstance(responses, dict)

for value in responses.values():
assert isinstance(value, requests.Response) or value is None


responses = telegram_handler.emit(log_record)
assert isinstance(responses, dict)
def test_invalid_bot_exception():
from tglogger.handler import TelegramHandler, InvalidBotError

for value in responses.values():
assert isinstance(value, requests.Response) or value is None
with pytest.raises(InvalidBotError):
handler = TelegramHandler(
bot_token="foo", receiver="bar"
) # no such bot

0 comments on commit 007b02d

Please sign in to comment.