Source code for fundamentals.utKit
#!/usr/bin/env python
# encoding: utf-8
"""
*A unit-testing kit to simplify my unit-tests*
Author
: David Young
"""
from builtins import object
import sys
import os
import logging
import logging.config
import yaml
try:
yaml.warnings({"YAMLLoadWarning": False})
except:
pass
[docs]
class utKit(object):
"""
*Default setup for fundamentals style unit-testing workflow (all tests base on nose module)*
**Key Arguments**
- ``moduleDirectory`` -- the directory to the unit-testing test file
**Usage**
To use this kit within any of your unit-test modules add the following code before your test methods:
```python
from fundamentals.utKit import utKit
# SETUP AND TEARDOWN FIXTURE FUNCTIONS FOR THE ENTIRE MODULE
moduleDirectory = os.path.dirname(__file__)
utKit = utKit(moduleDirectory)
log, dbConn, pathToInputDir, pathToOutputDir = utKit.setupModule()
utKit.tearDownModule()
```
"""
# Initialisation
def __init__(self, moduleDirectory):
self.moduleDirectory = moduleDirectory
# x-self-arg-tmpx
# SETUP PATHS TO COMMON DIRECTORIES FOR TEST DATA
self.pathToInputDir = moduleDirectory + "/input/"
self.pathToOutputDir = moduleDirectory + "/output/"
# SETUP LOGGING
self.loggerConfig = """
version: 1
formatters:
file_style:
format: '* %(asctime)s - %(name)s - %(levelname)s (%(pathname)s > %(funcName)s > %(lineno)d) - %(message)s '
datefmt: '%Y/%m/%d %H:%M:%S'
console_style:
format: '* %(asctime)s - %(levelname)s: %(pathname)s:%(funcName)s:%(lineno)d > %(message)s'
datefmt: '%H:%M:%S'
html_style:
format: '<div id="row" class="%(levelname)s"><span class="date">%(asctime)s</span> <span class="label">file:</span><span class="filename">%(filename)s</span> <span class="label">method:</span><span class="funcName">%(funcName)s</span> <span class="label">line#:</span><span class="lineno">%(lineno)d</span> <span class="pathname">%(pathname)s</span> <div class="right"><span class="message">%(message)s</span><span class="levelname">%(levelname)s</span></div></div>'
datefmt: '%Y-%m-%d <span class= "time">%H:%M <span class= "seconds">%Ss</span></span>'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: console_style
stream: ext://sys.stdout
root:
level: DEBUG
handlers: [console]"""
self.dbConfig = """
version: 1
db: unit_tests
host: localhost
user: utuser
password: utpass
"""
return
[docs]
def setupModule(self):
"""
*The setupModule method*
**Return**
- ``log`` -- a logger
- ``dbConn`` -- a database connection to a test database (details from yaml settings file)
- ``pathToInputDir`` -- path to modules own test input directory
- ``pathToOutputDir`` -- path to modules own test output directory
"""
## VARIABLES ##
logging.config.dictConfig(yaml.safe_load(self.loggerConfig))
log = logging.getLogger(__name__)
if self.dbConfig:
import pymysql as ms
connDict = yaml.safe_load(self.dbConfig)
dbConn = ms.connect(
host=connDict["host"],
user=connDict["user"],
passwd=connDict["password"],
db=connDict["db"],
use_unicode=True,
charset="utf8",
local_infile=1,
client_flag=ms.constants.CLIENT.MULTI_STATEMENTS,
connect_timeout=3600,
)
dbConn.autocommit(True)
else:
dbConn = False
return log, dbConn, self.pathToInputDir, self.pathToOutputDir
[docs]
def tearDownModule(self):
"""
*The tearDownModule method*
"""
return None
[docs]
def get_project_root(self):
"""
*Get the root of the `python` package - useful for getting files in the root directory of a project*
**Return**
- ``rootPath`` -- the root path of a project
"""
import os
rootPath = os.path.dirname(__file__)
return rootPath
[docs]
def refresh_database(self):
"""
*Refresh the unit test database*
"""
from fundamentals.mysql import directory_script_runner
from fundamentals import tools
packageDirectory = self.get_project_root()
su = tools(
arguments={"settingsFile": packageDirectory + "/test_settings.yaml"},
docString=__doc__,
logLevel="DEBUG",
options_first=False,
projectName=None,
defaultSettingsFile=False,
)
arguments, settings, log, dbConn = su.setup()
directory_script_runner(
log=log,
pathToScriptDirectory=packageDirectory + "/tests/input",
dbConn=dbConn,
successRule=None,
failureRule=None,
)
if __name__ == "__main__":
main()