changeset 22:25cc6207b03e

Add tests for models
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 02 Jun 2013 13:05:50 +0200
parents 5a036517a96b
children 31e8db90d569
files alembic/versions/delete.me server/api.py server/helpers.py server/models.py tests/__init__.py tests/fixtures.py tests/test_models.py
diffstat 5 files changed, 78 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/server/api.py	Sun Jun 02 12:08:22 2013 +0200
+++ b/server/api.py	Sun Jun 02 13:05:50 2013 +0200
@@ -2,6 +2,7 @@
 from flask.ext.classy import FlaskView
 
 from . import app
+from . import models
 
 
 def register(*args, **kwargs):
@@ -17,7 +18,9 @@
 class UsersView(FlaskView):
     def index(self):
         return flask.jsonify({
-            'users': [],
+            'users': [{
+                'email': user.email,
+            } for user in models.User.query.all()],
         })
 
     def get(self, email):
--- a/server/helpers.py	Sun Jun 02 12:08:22 2013 +0200
+++ b/server/helpers.py	Sun Jun 02 13:05:50 2013 +0200
@@ -1,9 +1,9 @@
-from random import randint
+# -*- coding: utf-8 -*-
 
-chars = 'abcdefghijklmnoprstuwqxyzABCDEFGHIJKLMNOPRSTUWXYZ0123456789'
+import random
+
+CHARS = 'abcdefghijklmnoprstuwqxyzABCDEFGHIJKLMNOPRSTUWXYZ0123456789'
 
 def gen_filename(chars=12):
-    ret = []
-    for i in range(chars):
-        ret.append(chars[randint(0, len(chars)-1)])
-    return ''.join(ret)
+    return ''.join(random.sample(CHARS, chars))
+
--- a/server/models.py	Sun Jun 02 12:08:22 2013 +0200
+++ b/server/models.py	Sun Jun 02 13:05:50 2013 +0200
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
 from sqlalchemy import (
     Boolean,
     Column,
@@ -70,7 +72,7 @@
         self.locale = 'pl'
 
     def __repr__(self):
-        return '<User %r, %r>' % (self.email, self.admin)
+        return '<User %r>' % (self.email)
 
     def set_pass(self, password):
         self.password = sha256(
@@ -102,16 +104,25 @@
     number = Column(String(20), primary_key=True)
     owner_id = Column(Integer, ForeignKey('users.id'))
     owner = relationship("User",
-            backref=backref('numbers', order_by=id))
+            backref=backref('numbers'))
+
+    def __init__(self, number, owner):
+        super(PhoneNumber, self).__init__()
+        self.number = number
+        self.owner = owner
 
 
 class Mac(Boilerplate, db.Model):
     __tablename__ = 'macs'
     mac = Column(String(16), primary_key=True)
-    owner = ForeignKey(User)
     owner_id = Column(Integer, ForeignKey('users.id'))
     owner = relationship("User",
-            backref=backref('mac_numbers', order_by=id))
+            backref=backref('mac_numbers'))
+
+    def __init__(self, mac, owner):
+        super(Mac, self).__init__()
+        self.mac = mac
+        self.owner = owner
 
 
 class PanicContact(Boilerplate, db.Model):
@@ -122,7 +133,7 @@
     comment = Column(String())
     owner_id = Column(Integer, ForeignKey('users.id'))
     owner = relationship("User",
-            backref=backref('panic_contacts', order_by=id))
+            backref=backref('panic_contacts'))
 
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/fixtures.py	Sun Jun 02 13:05:50 2013 +0200
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+
+import os
+
+import pytest
+
+os.environ['PARTYBUDDY_SETTINGS'] = 'configs/testing.py'
+
+from server import models
+from server import db
+
+
+@pytest.fixture
+def database():
+    db.create_all()
+    return db
+
+@pytest.fixture
+def users():
+    return create_users()
+
+
+def create_users():
+    users = [
+        ('foo1@bar.baz', 'foobar', 'deadbeefcafe', '+48123456789'),
+        ('foo2@bar.baz', 'barfoo', 'beefcafedead', '+48987654321'),
+        ('foo3@bar.baz', 'bazfoo', 'cafebeefdead', '+48123454321'),
+    ]
+    for email, password, mac, phone in users:
+        user = models.User(email, password)
+        db.session.add(user)
+        db.session.add(models.Mac(mac, user))
+        db.session.add(models.PhoneNumber(phone, user))
+    db.session.commit()
+    return users
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test_models.py	Sun Jun 02 13:05:50 2013 +0200
@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+
+from .fixtures import database, users
+
+from server import models
+
+
+class TestModels(object):
+    def test_users(self, database, users):
+        for email, password, mac, phone in users:
+            user = models.User.query.filter_by(email=email).one()
+            assert user.check_pass(password), user
+            assert [m.mac for m in user.mac_numbers] == [mac], user
+            assert [p.number for p in user.numbers] == [phone], user
+