Testing morepath-cookiecutter¶
This project provides a setup for testing morepath-cookiecutter, a Cookiecutter template for Morepath.
Getting started¶
Clone the repository and initialize all submodules:
$ git clone --recursive git@github.com:taschini/morepath-cookiecutter-tester.git
$ cd morepath-cookiecutter-tester
Create a new virtual environment and install the requirements:
$ virtualenv --no-site-packages env
$ ./env/bin/pip install -r requirements.txt
$ source ./env/bin/activate
To run the tests simply type:
$ make
The tests use the remaining sections of this document as a script, so that you can immediately see what is being tested.
If you want, you can also go through each step by hand. To do so you just need
to set the TESTDIR
variable to the project directory and switch to an empty
directory:
$ export TESTDIR=`pwd`
$ cd `mktemp -d testing.XXXXXX`
Create a new project¶
Set up a new project:
$ cookiecutter ${TESTDIR}/morepath-cookiecutter <<EOF
> helloworld
> A RESTful application to greet the world.
> 1
> John Doe
> john.doe@example.com
> EOF
package_name [helloworld]: description [A morepath helloworld application]: Select goal:
1 - A RESTful application
2 - A traditional web application
Choose from 1, 2 [1]: author []: author_email []: (no-eol)
These are the files that have been created:
$ tree helloworld
helloworld
|-- MANIFEST.in
|-- README.rst
|-- helloworld
| |-- __init__.py
| |-- __main__.py
| |-- app.py
| |-- model.py
| |-- path.py
| |-- tests
| | `-- test_app.py
| `-- view.py
|-- setup.cfg
`-- setup.py
2 directories, 11 files
This the generated readme file:
$ cat helloworld/README.rst
Helloworld
==========
A RESTful application to greet the world.
Testing the functionality of the project¶
Create a virtual environment and setup the project in there:
$ virtualenv -q --no-site-packages env
$ ./env/bin/pip install -qe './helloworld[test]'
Verify the project metadata:
$ cat helloworld/helloworld.egg-info/PKG-INFO
Metadata-Version: 1.1
Name: helloworld
Version: 0.0.0
Summary: A RESTful application to greet the world.
Home-page: UNKNOWN
Author: John Doe
Author-email: john.doe@example.com
License: UNKNOWN
Description: UNKNOWN
Platform: any
Classifier: Intended Audience :: Developers
Classifier: Environment :: Web Environment
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.4
Run the tests:
$ ./env/bin/py.test -q helloworld
.
1 passed in .* seconds (re)
Verify PEP8 compliance:
$ flake8 helloworld
Run the app, query the app, and close the app:
$ ( ./env/bin/run-app & server=${!};
> sleep 1;
> curl -sSw '\n' http://127.0.0.1:5000;
> kill $server )
127.0.0.1 - - \[[^]]+\] "GET / HTTP/1.1" 200 147 (re)
{"greetings": [{"@id": "http://127.0.0.1:5000/greeting/mundo", "name": "mundo"}, {"@id": "http://127.0.0.1:5000/greeting/world", "name": "world"}]}
Argument validation¶
Reject a package name that is not a valid name for a Python module:
$ cookiecutter ${TESTDIR}/morepath-cookiecutter <<EOF
> hello-world
> A RESTful application to greet the world.
> 1
> John Doe
> john.doe@example.com
> EOF
package_name [helloworld]: description [A morepath helloworld application]: Select goal:
1 - A RESTful application
2 - A traditional web application
Choose from 1, 2 [1]: author []: author_email []: ERROR: hello-world is not a valid Python module name!
ERROR: Stopping generation because pre_gen_project hook script didn't exit sucessfully
Hook script failed (exit status: 1)
[1]