mirror of
https://github.com/cookiecutter/cookiecutter-django.git
synced 2025-08-05 04:30:16 +03:00
Added hitch testing framework and stub test.
This commit is contained in:
parent
7d1bfef20b
commit
7c719c5624
4
{{cookiecutter.repo_name}}/tests/base.yml
Normal file
4
{{cookiecutter.repo_name}}/tests/base.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
{% for python_version in python_versions %}
|
||||
{% block test scoped %}
|
||||
{% endblock %}
|
||||
{% endfor %}
|
164
{{cookiecutter.repo_name}}/tests/engine.py
Normal file
164
{{cookiecutter.repo_name}}/tests/engine.py
Normal file
|
@ -0,0 +1,164 @@
|
|||
from hitchserve import ServiceBundle
|
||||
from os import path, system, chdir
|
||||
from subprocess import call, PIPE
|
||||
import hitchpostgres
|
||||
import hitchselenium
|
||||
import hitchpython
|
||||
import hitchredis
|
||||
import hitchtest
|
||||
import hitchsmtp
|
||||
import hitchcron
|
||||
import IPython
|
||||
import sys
|
||||
|
||||
# Get directory above this file
|
||||
PROJECT_DIRECTORY = path.abspath(path.join(path.dirname(__file__), '..'))
|
||||
|
||||
class ExecutionEngine(hitchtest.ExecutionEngine):
|
||||
"""Engine for orchestating and interacting with the app."""
|
||||
def set_up(self):
|
||||
"""Ensure virtualenv present, then run all services."""
|
||||
python_package = hitchpython.PythonPackage(
|
||||
python_version=self.preconditions['python_version']
|
||||
)
|
||||
python_package.build()
|
||||
python_package.verify()
|
||||
|
||||
call([
|
||||
python_package.pip, "install", "-r",
|
||||
path.join(PROJECT_DIRECTORY, "requirements/local.txt")
|
||||
])
|
||||
|
||||
postgres_package = hitchpostgres.PostgresPackage(
|
||||
version=self.settings["postgres_version"],
|
||||
)
|
||||
postgres_package.build()
|
||||
postgres_package.verify()
|
||||
|
||||
{% if cookiecutter.celery_support == "y" %}
|
||||
redis_package = hitchredis.RedisPackage(version="2.8.4")
|
||||
redis_package.build()
|
||||
redis_package.verify()
|
||||
{% endif %}
|
||||
|
||||
self.services = ServiceBundle(
|
||||
project_directory=PROJECT_DIRECTORY,
|
||||
startup_timeout=float(self.settings["startup_timeout"]),
|
||||
shutdown_timeout=5.0,
|
||||
)
|
||||
|
||||
postgres_user = hitchpostgres.PostgresUser("trackfeatures", "password")
|
||||
|
||||
self.services['Postgres'] = hitchpostgres.PostgresService(
|
||||
postgres_package=postgres_package,
|
||||
users=[postgres_user, ],
|
||||
databases=[hitchpostgres.PostgresDatabase("trackfeatures", postgres_user), ]
|
||||
)
|
||||
|
||||
self.services['HitchSMTP'] = hitchsmtp.HitchSMTPService(port=1025)
|
||||
|
||||
self.services['Django'] = hitchpython.DjangoService(
|
||||
python=python_package.python,
|
||||
port=8000,
|
||||
version=str(self.settings.get("django_version")),
|
||||
settings="config.settings.local",
|
||||
needs=[self.services['Postgres'], ],
|
||||
env_vars=self.settings['environment_variables'],
|
||||
)
|
||||
|
||||
{% if cookiecutter.celery_support == "y" %}
|
||||
self.services['Redis'] = hitchredis.RedisService(
|
||||
redis_package=redis_package,
|
||||
port=16379,
|
||||
)
|
||||
|
||||
self.services['Celery'] = hitchpython.CeleryService(
|
||||
python=python_package.python,
|
||||
version="3.1.18",
|
||||
app="trackfeatures.taskapp", loglevel="INFO",
|
||||
needs=[
|
||||
self.services['Redis'], self.services['Django'],
|
||||
],
|
||||
env_vars=self.settings['environment_variables'],
|
||||
)
|
||||
{% endif %}
|
||||
|
||||
self.services['Firefox'] = hitchselenium.SeleniumService(
|
||||
xvfb=self.settings.get("quiet", False)
|
||||
)
|
||||
|
||||
#self.services['Cron'] = hitchcron.CronService(
|
||||
#run=self.services['Django'].manage("trigger").command,
|
||||
#every=1,
|
||||
#needs=[ self.services['Django'], ],
|
||||
#)
|
||||
|
||||
self.services.startup(interactive=False)
|
||||
|
||||
# Configure selenium driver
|
||||
self.driver = self.services['Firefox'].driver
|
||||
self.driver.set_window_size(self.settings['window_size']['height'], self.settings['window_size']['width'])
|
||||
self.driver.set_window_position(0, 0)
|
||||
self.driver.implicitly_wait(2.0)
|
||||
self.driver.accept_next_alert = True
|
||||
|
||||
def pause(self, message=None):
|
||||
"""Stop. IPython time."""
|
||||
if hasattr(self, 'services'):
|
||||
self.services.start_interactive_mode()
|
||||
self.ipython(message)
|
||||
if hasattr(self, 'services'):
|
||||
self.services.stop_interactive_mode()
|
||||
|
||||
def load_website(self):
|
||||
"""Navigate to website in Firefox."""
|
||||
self.driver.get(self.services['Django'].url())
|
||||
|
||||
def click(self, on):
|
||||
"""Click on HTML id."""
|
||||
self.driver.find_element_by_id(on).click()
|
||||
|
||||
def fill_form(self, **kwargs):
|
||||
"""Fill in a form with id=value."""
|
||||
for element, text in kwargs.items():
|
||||
self.driver.find_element_by_id(element).send_keys(text)
|
||||
|
||||
def click_submit(self):
|
||||
"""Click on a submit button if it exists."""
|
||||
self.driver.find_element_by_css_selector("button[type=\"submit\"]").click()
|
||||
|
||||
def confirm_emails_sent(self, number):
|
||||
"""Count number of emails sent by app."""
|
||||
assert len(self.services['HitchSMTP'].logs.json()) == int(number)
|
||||
|
||||
def wait_for_email(self, containing=None):
|
||||
"""Wait for, and return email."""
|
||||
self.services['HitchSMTP'].logs.out.tail.until_json(
|
||||
lambda email: containing in email['payload'] or containing in email['subject'],
|
||||
timeout=15,
|
||||
lines_back=1,
|
||||
)
|
||||
|
||||
def time_travel(self, days=""):
|
||||
"""Make all services think that time has skipped forward."""
|
||||
self.services.time_travel(days=int(days))
|
||||
|
||||
def on_failure(self):
|
||||
"""Stop and IPython."""
|
||||
if not self.settings['quiet']:
|
||||
if call(["which", "kaching"], stdout=PIPE, stderr=PIPE) == 0:
|
||||
call(["kaching", "fail"]) # sudo pip install kaching for sad sound
|
||||
if self.settings.get("pause_on_failure", False):
|
||||
self.pause(message=self.stacktrace.to_template())
|
||||
|
||||
def on_success(self):
|
||||
"""Ka-ching!"""
|
||||
if not self.settings['quiet'] and call(["which", "kaching"], stdout=PIPE, stderr=PIPE) == 0:
|
||||
call(["kaching", "pass"]) # sudo pip install kaching for happy sound
|
||||
if self.settings.get("pause_on_success", False):
|
||||
self.pause(message="SUCCESS")
|
||||
|
||||
def tear_down(self):
|
||||
"""Commit genocide on the services required to run your test."""
|
||||
if hasattr(self, 'services'):
|
||||
self.services.shutdown()
|
26
{{cookiecutter.repo_name}}/tests/hitchreqs.txt
Normal file
26
{{cookiecutter.repo_name}}/tests/hitchreqs.txt
Normal file
|
@ -0,0 +1,26 @@
|
|||
click==4.0
|
||||
colorama==0.3.3
|
||||
faketime==0.9.6.3
|
||||
hitchcron==0.2
|
||||
hitchpostgres==0.6.1
|
||||
hitchpython==0.2
|
||||
hitchredis==0.4.1
|
||||
hitchselenium==0.3.1
|
||||
hitchserve==0.4.1
|
||||
hitchsmtp==0.2.1
|
||||
hitchtest==0.6.8
|
||||
humanize==0.5.1
|
||||
ipython==3.1.0
|
||||
Jinja2==2.7.3
|
||||
MarkupSafe==0.23
|
||||
patool==1.7
|
||||
psutil==3.0.0
|
||||
python-build==0.2.1
|
||||
pyuv==1.0.2
|
||||
PyYAML==3.11
|
||||
requests==2.7.0
|
||||
selenium==2.46.0
|
||||
six==1.9.0
|
||||
tblib==1.0.1
|
||||
tornado==4.2
|
||||
xeger==0.3
|
33
{{cookiecutter.repo_name}}/tests/settings.yml
Normal file
33
{{cookiecutter.repo_name}}/tests/settings.yml
Normal file
|
@ -0,0 +1,33 @@
|
|||
postgres_version: 9.3.9
|
||||
redis_version: 2.8.4
|
||||
django_version: 1.8.3
|
||||
celery_version: 3.1.18
|
||||
pause_on_success: false
|
||||
pause_on_failure: true
|
||||
startup_timeout: 45
|
||||
environment_variables:
|
||||
DATABASE_URL: postgres://trackfeatures:password@127.0.0.1:15432/trackfeatures
|
||||
SECRET_KEY: cj5^uos4tfCdfghjku5hq$9$(@-7-^e9&x_3vyfkigvspm6c=+
|
||||
CELERY_BROKER_URL: redis://localhost:16379
|
||||
window_size:
|
||||
width: 450
|
||||
height: 450
|
||||
python_versions:
|
||||
- 2.7.10
|
||||
environment:
|
||||
- approved_platforms:
|
||||
- linux
|
||||
- darwin
|
||||
- freeports:
|
||||
- 1025
|
||||
- 8000
|
||||
- 15432
|
||||
- 16379
|
||||
- brew:
|
||||
- libtool
|
||||
- automake
|
||||
- node
|
||||
- debs:
|
||||
- firefox
|
||||
- automake
|
||||
- libtool
|
10
{{cookiecutter.repo_name}}/tests/stub.test
Normal file
10
{{cookiecutter.repo_name}}/tests/stub.test
Normal file
|
@ -0,0 +1,10 @@
|
|||
{% extends "base.yml" %}
|
||||
{% block test %}
|
||||
- engine: engine.py:ExecutionEngine
|
||||
name: Stub {{ python_version }}
|
||||
preconditions:
|
||||
python_version: "{{ python_version }}"
|
||||
scenario:
|
||||
- Load website
|
||||
- Pause
|
||||
{% endblock %}
|
Loading…
Reference in New Issue
Block a user