app factory now outside tests dir, other minor changes

This commit is contained in:
Andrew Bryant 2024-05-02 19:08:54 -04:00
parent d487e40c1e
commit 970f1fa0c8
8 changed files with 120 additions and 63 deletions

View File

@ -5,6 +5,38 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
1. Models subpackage:
- User class:
* get_dogs() method
2. App factory now in app_factory.py
3. Development and testing now have different configurations.
- development_config.py
- tests/testing_config.py
### Changed
1. Fixed typo in CHANGELOG.md
2. Models subpackage:
- User class:
* get_bookings() method renamed to get_visits()
* get_bookings_history() method renamed to get_visit_history()
* removed redundent import from get_visit_history() method
3. Tests package:
- conftest.py:
* Updated to use new app_factory.py
* client() fixture renamed to http_client()
- test_user_model.py:
* Updated to use new app_factory.py
* Variables updated to reflect methods in User model
4. Views package:
- Users dashboard route:
* Update User model object usage to reflect renamed methods
* Renamed variable user_dogs to user_pets
## [0.0.6] - 2024-04-28
### Added
@ -25,11 +57,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
+ created_at column
+ status column
+ updated_at column
- User subpackage:
* User class:
+ created_at column
+ name column
+ updated_at column
- User class:
* created_at column
* name column
* updated_at column
- Visit subpackage:
* VisitType class
* Visit class:

View File

@ -20,13 +20,16 @@ class User(db.Model):
def __repr__(self):
return f'{self.username}'
# Get all dogs currently set
def get_dogs(self):
return [dog for dog in self.dogs]
# Retrieve all booked visits
def get_bookings(self):
def get_visits(self):
return [visit for visit in self.visits]
# Retrieve past booked visits
def get_bookings_history(self):
from datetime import datetime
def get_visit_history(self):
current_time = datetime.now()
return [visit for visit in self.visits if visit.date_time < current_time]

View File

@ -18,12 +18,7 @@ def user_dashboard(username):
# Retrieve user data
user = db.session.execute(db.select(User).filter_by(username=username)).scalar_one()
# Gather names of dogs for this client
dogs = list()
for dog in user.dogs:
dogs.append(dog.name)
return render_template('users/dashboard/base.html', user=user, user_dogs=dogs, user_book_history=user.get_bookings())
return render_template('users/dashboard/base.html', user=user, user_pets=user.get_dogs(), user_book_history=user.get_visits())
@accounts.route('/users/<username>', methods=['POST'])
def user(username):

View File

@ -9,7 +9,7 @@ from flask_sqlalchemy import SQLAlchemy
from accounts import accounts
# Import db
from accounts.models import db
from accounts.models import db as _db
# Import db models
from accounts.models.dog import Dog
@ -18,29 +18,19 @@ from accounts.models.user import User
from accounts.models.visit import Visit
from accounts.models.visit.visit_type import VisitType
def create_app():
# Initialize flask app
accounts_app = Flask(__name__, template_folder='templates')
def create_app(config_class='development_config.py'):
accounts_app = Flask(__name__, template_folder='tests/templates')
accounts_app.register_blueprint(accounts)
accounts_app.config.from_pyfile('config.py')
# Initialize db with flask app
db.init_app(accounts_app)
with accounts_app.app_context():
# Create db tables
db.create_all()
# Add test data to db session
add_test_data(db)
# Commit test data to db
db.session.commit()
accounts_app.config.from_pyfile(config_class)
return accounts_app
def add_test_data(db):
# Create test users
add_test_users(db)
add_test_dogs(db)
add_test_visits(db)
def add_test_users(db):
man_man = User(name='Man Man',
username='mamanman',
email='man_man@email.com',
@ -53,14 +43,17 @@ def add_test_data(db):
address='113 Park St. City, AA 13433',
password='realpassword')
# Add test users to db session
db.session.add(man_man)
db.session.add(real_person)
# Commit test users to db
db.session.commit()
# Create test dogs
def add_test_dogs(db):
man_man = db.session.execute(
db.select(User).where(User.name == 'Man Man')).scalar_one()
real_person = db.session.execute(
db.select(User).where(User.name == 'Real Person')).scalar_one()
lassey = Dog(name='Lassey',
breed_size=BreedSize.LARGE,
owner_id=man_man.id)
@ -72,15 +65,26 @@ def add_test_data(db):
air_bud = Dog(name='Air Bud',
owner_id=real_person.id)
# Add test dogs to db session
db.session.add(lassey)
db.session.add(rufus)
db.session.add(air_bud)
# Commit test dogs to db
db.session.commit()
# Create test visits
def add_test_visits(db):
# User objects
man_man = db.session.execute(
db.select(User).where(User.name == 'Man Man')).scalar_one()
real_person = db.session.execute(
db.select(User).where(User.name == 'Real Person')).scalar_one()
# Dog objects
lassey = db.session.execute(
db.select(Dog).where(Dog.name == 'Lassey')).scalar_one()
rufus = db.session.execute(
db.select(Dog).where(Dog.name == 'Rufus')).scalar_one()
air_bud = db.session.execute(
db.select(Dog).where(Dog.name == 'Air Bud')).scalar_one()
# Visit with the date in the past
test_visit1 = Visit(date_time=datetime(2023,12,5,10,30),
@ -99,15 +103,23 @@ def add_test_data(db):
dog_id=air_bud.id)
# Visit with more than one dog
#test_visit3 = Visit(date_time=datetime(2034,12,5,10,30),
#test_visit4 = Visit(date_time=datetime(2034,12,5,10,30),
# owner_id=man_man.id,
# dog_id=[lassey.id, rufus.id])
# Add test visits to db session
db.session.add(test_visit1)
db.session.add(test_visit2)
db.session.add(test_visit3)
# Commit test visits to db
db.session.commit()
if __name__ == '__main__':
app = create_app()
_db.init_app(app)
with app.app_context():
_db.create_all()
add_test_data(_db)
app.run()

View File

@ -1,19 +1,40 @@
# Library imports
import pytest
# Import testing flask app factory function
from tests.testing_app import create_app
# Import flask app factory function
from app_factory import add_test_data
from app_factory import create_app
# Import db
from accounts.models import db as _db
####
# Global fixtures
####
# App client for testing
@pytest.fixture(scope='module')
def app():
app = create_app(config_class='tests/testing_config.py')
with app.app_context():
yield app
# HTTP client for testing app requests
@pytest.fixture(scope="module")
def client():
app = create_app()
# DB for testing
@pytest.fixture(scope='module')
def db(app):
_db.init_app(app)
_db.create_all()
add_test_data(_db)
yield _db
_db.session.remove()
_db.drop_all()
# HTTP client for testing app routes
@pytest.fixture(scope='module')
def http_client():
app = create_app(config_class='testing_config.py')
return app.test_client()

View File

@ -10,19 +10,12 @@ from accounts.models.dog.breed_size import BreedSize
from accounts.models.user import User
from accounts.models.visit.visit_type import VisitType
# Import flask app factory function
from tests.testing_app import create_app
from tests.testing_app import create_app
def test_user_model(app, db):
man_man = db.session.execute(db.select(User).where(User.name == 'Man Man')).scalar_one()
man_man_visits = man_man.get_visits()
def test_db():
app = create_app()
with app.app_context():
man_man = db.session.execute(db.select(User).where(User.name == 'Man Man')).scalar_one()
man_man_bookings = man_man.get_bookings()
real_person = db.session.execute(db.select(User).where(User.name == 'Real Person')).scalar_one()
real_person_bookings = real_person.get_bookings()
real_person = db.session.execute(db.select(User).where(User.name == 'Real Person')).scalar_one()
real_person_visits = real_person.get_visits()
# Assert something
assert man_man.id == 1
@ -31,7 +24,7 @@ def test_db():
assert man_man.email == 'man_man@email.com'
assert man_man.address == '123 Home Ln. City, AA 11223'
assert man_man.password == 'manword'
assert len(man_man_bookings) == 2
assert len(man_man_visits) == 2
assert real_person.id == 2
assert real_person.name == 'Real Person'
@ -39,5 +32,5 @@ def test_db():
assert real_person.email == 'real_person@email.com'
assert real_person.address == '113 Park St. City, AA 13433'
assert real_person.password == 'realpassword'
assert len(real_person_bookings) == 1
assert len(real_person_visits) == 1

2
tests/testing_config.py Normal file
View File

@ -0,0 +1,2 @@
TESTING = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'