def create_app(): # Set up framework and service classes app = Flask(__name__) app.config.SWAGGER_UI_DOC_EXPANSION = 'list' api = Api(app, title='My Banking API', description='A simple banking API for learning Test-Driven-Development') bank = Bank() # Custom API documentation add_money = api.model("Add", { 'name': fields.String, 'amount': fields.Integer }) @api.route('/accounts/<string:name>') class AccountResource(Resource): def post(self, name): """Create a new named Account""" try: return bank.create_account(name).to_dict() except Exception as e: abort(400, str(e)) def get(self, name): """Get an Account""" try: return bank.get_account(name).to_dict() except Exception: abort(404, 'Account not found') @api.route('/money') class MoneyResource(Resource): @api.expect(add_money) def post(self): """Add funds to an account""" parser = reqparse.RequestParser() parser.add_argument('name', type=str, help='Account name') parser.add_argument('amount', type=int, help='Transfer amount (pence)') args = parser.parse_args() return bank.add_funds(**args) return app
def bank() -> Bank: return Bank()
def test_get_account_raises_error_if_no_account_matches(bank: Bank): bank.create_account('Name 1') # This means: assert an exception is raised during the following block with pytest.raises(ValueError): bank.get_account('Name 2')
def test_can_create_and_get_account(bank: Bank): bank.create_account('Test') account = bank.get_account('Test') assert len(bank.accounts) == 1 assert account.name == 'Test'
def test_create_account_raises_error_if_name_blank(bank: Bank): # This means: assert an exception is raised during the following block with pytest.raises(Exception): bank.create_account('')
from dataclasses import asdict from flask import Flask from flask_restx import Api, Resource, reqparse, fields, abort from bank_api.bank import Bank # Set up framework and service classes app = Flask(__name__) api = Api( app, title='My Banking API', description='A simple banking API for learning Test-Driven-Development') bank = Bank() # Custom API documentation add_money = api.model("Add", {'name': fields.String, 'amount': fields.Integer}) @api.route('/accounts/<string:name>') class AccountResource(Resource): def post(self, name): """Create a new named Account""" try: return asdict(bank.create_account(name)) except Exception as e: abort(400, str(e)) def get(self, name): """Get an Account"""
def bank() -> Bank: bank = Bank() bank.create_account(account_name) return bank