Skip to content
Snippets Groups Projects
Commit d1d832ba authored by Steven Loria's avatar Steven Loria
Browse files

Add Factory Boy support

parent 73281860
No related branches found
No related tags found
No related merge requests found
...@@ -13,7 +13,7 @@ Features ...@@ -13,7 +13,7 @@ Features
- Flask-WTForms with login and registration forms - Flask-WTForms with login and registration forms
- Flask-Login for authentication - Flask-Login for authentication
- Procfile for deploying to a PaaS (e.g. Heroku) - Procfile for deploying to a PaaS (e.g. Heroku)
- Flask-Testing and nose for testing - Flask-Testing, nose, and Factory-Boy for testing
- A simple ``manage.py`` script. - A simple ``manage.py`` script.
- CSS and JS minification using Flask-Assets - CSS and JS minification using Flask-Assets
- Utilizes best practices: `Blueprints <http://flask.pocoo.org/docs/blueprints/>`_ and `Application Factory <http://flask.pocoo.org/docs/patterns/appfactories/>`_ patterns - Utilizes best practices: `Blueprints <http://flask.pocoo.org/docs/blueprints/>`_ and `Application Factory <http://flask.pocoo.org/docs/patterns/appfactories/>`_ patterns
...@@ -69,6 +69,7 @@ Changelog ...@@ -69,6 +69,7 @@ Changelog
- Use Flask-Bcrypt for password hashing. - Use Flask-Bcrypt for password hashing.
- Flask-Testing support. - Flask-Testing support.
- Flask-Login for authentication. - Flask-Login for authentication.
- Use Factory-Boy for test factories.
0.2.0 (09/21/2013) 0.2.0 (09/21/2013)
****************** ******************
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
# Testing # Testing
nose nose
Flask-Testing Flask-Testing
factory-boy>=2.2.1
# Management script # Management script
Flask-Script Flask-Script
...@@ -3,7 +3,7 @@ from flask import Flask ...@@ -3,7 +3,7 @@ from flask import Flask
from flask.ext.assets import Environment from flask.ext.assets import Environment
from webassets.loaders import PythonLoader from webassets.loaders import PythonLoader
from {{ cookiecutter.repo_name }}.settings import ProdConfig from {{cookiecutter.repo_name}}.settings import ProdConfig
from {{cookiecutter.repo_name}}.assets import assets from {{cookiecutter.repo_name}}.assets import assets
from {{cookiecutter.repo_name}}.extensions import login_manager from {{cookiecutter.repo_name}}.extensions import login_manager
from {{cookiecutter.repo_name}}.database import db from {{cookiecutter.repo_name}}.database import db
......
...@@ -5,6 +5,7 @@ class Config(object): ...@@ -5,6 +5,7 @@ class Config(object):
SECRET_KEY = 'shhhh' SECRET_KEY = 'shhhh'
APP_DIR = os.path.abspath(os.path.dirname(__file__)) # This directory APP_DIR = os.path.abspath(os.path.dirname(__file__)) # This directory
PROJECT_ROOT = os.path.abspath(os.path.join(APP_DIR, os.pardir)) PROJECT_ROOT = os.path.abspath(os.path.join(APP_DIR, os.pardir))
BCRYPT_LEVEL = 13
class ProdConfig(Config): class ProdConfig(Config):
ENV = 'prod' ENV = 'prod'
......
# -*- coding: utf-8 -*-
from factory import Sequence, PostGenerationMethodCall
from factory.alchemy import SQLAlchemyModelFactory
from {{cookiecutter.repo_name}}.user.models import User
from {{cookiecutter.repo_name}}.database import db
class UserFactory(SQLAlchemyModelFactory):
FACTORY_SESSION = db.session
FACTORY_FOR = User
username = Sequence(lambda n: "user{0}".format(n))
email = Sequence(lambda n: "user{0}@example.com".format(n))
password = PostGenerationMethodCall("set_password", 'example')
...@@ -6,6 +6,7 @@ from flask.ext.testing import TestCase ...@@ -6,6 +6,7 @@ from flask.ext.testing import TestCase
from {{ cookiecutter.repo_name }}.app import create_app from {{ cookiecutter.repo_name }}.app import create_app
from {{ cookiecutter.repo_name }}.database import db from {{ cookiecutter.repo_name }}.database import db
from {{ cookiecutter.repo_name }}.user.models import User from {{ cookiecutter.repo_name }}.user.models import User
from .factories import UserFactory
class TestUser(TestCase): class TestUser(TestCase):
...@@ -23,6 +24,15 @@ class TestUser(TestCase): ...@@ -23,6 +24,15 @@ class TestUser(TestCase):
db.session.remove() db.session.remove()
db.drop_all() db.drop_all()
def test_factory(self):
user = UserFactory(password="myprecious")
assert_true(user.username)
assert_true(user.email)
assert_true(user.created_at)
assert_false(user.is_admin)
assert_false(user.active)
assert_true(user.check_password("myprecious"))
def test_check_password(self): def test_check_password(self):
user = User(username="foo", email="foo@bar.com", user = User(username="foo", email="foo@bar.com",
password="foobarbaz123") password="foobarbaz123")
......
...@@ -12,24 +12,26 @@ class User(UserMixin, CRUDMixin, db.Model): ...@@ -12,24 +12,26 @@ class User(UserMixin, CRUDMixin, db.Model):
__tablename__ = 'users' __tablename__ = 'users'
username = db.Column(db.String(80), unique=True, nullable=False) username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String, nullable=False) password = db.Column(db.String, nullable=False) # The hashed password
created_at = db.Column(db.DateTime(), nullable=False) created_at = db.Column(db.DateTime(), nullable=False)
active = db.Column(db.Boolean()) active = db.Column(db.Boolean())
is_admin = db.Column(db.Boolean()) is_admin = db.Column(db.Boolean())
def __init__(self, username, email, password, active=False, is_admin=False): def __init__(self, username=None, email=None, password=None,
active=False, is_admin=False):
self.username = username self.username = username
self.email = email self.email = email
self.set_password(password) if password:
self.set_password(password)
self.active = active self.active = active
self.is_admin = is_admin self.is_admin = is_admin
self.created_at = dt.datetime.utcnow() self.created_at = dt.datetime.utcnow()
def set_password(self, password): def set_password(self, password):
self.password_hash = bcrypt.generate_password_hash(password) self.password = bcrypt.generate_password_hash(password)
def check_password(self, password): def check_password(self, password):
return bcrypt.check_password_hash(self.password_hash, password) return bcrypt.check_password_hash(self.password, password)
def __repr__(self): def __repr__(self):
return '<User "{username}">'.format(username=self.username) return '<User "{username}">'.format(username=self.username)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment