Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ def update(self):
self.updateMoves()

def reset(self):
_moves = None
self._moves = None

@property
def moved(self):
Expand Down
2 changes: 1 addition & 1 deletion src/handlers/v2/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def get(self):
try:
token = request.user.get_verification()
except Exception as e:
raise APIException(e.message)
raise APIException(str(e))
data = {
'username': request.user.username,
'url': urljoin(config.SITE_URL, config.VERIFY_URL),
Expand Down
2 changes: 1 addition & 1 deletion src/handlers/v2/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,6 @@ def urls(self, urls):
self.rest(*url)

def addChild(self, name, import_name, url_prefix):
name = '{}.{}'.format(self.name, name)
name = '{}_{}'.format(self.name, name)
url_prefix = '{}{}'.format(self.url_prefix, url_prefix)
return BlueprintBase(name, import_name, url_prefix=url_prefix)
23 changes: 22 additions & 1 deletion src/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,26 @@ def get_prefix(game_type, game_limit=None):
return '{}-{}'.format(game_type, game_limit if game_limit is not None else '*')


def _get_request_json(request):
"""
Try to read JSON data without raising BadRequest if payload is invalid.
Flask's `request.json` property raises in that scenario, so prefer the
`get_json(silent=True)` helper when available, but fall back to the legacy
attribute for test doubles.
"""
get_json = getattr(request, 'get_json', None)
if callable(get_json):
try:
return get_json(silent=True)
except TypeError:
# Older Flask versions might not accept the silent kwarg.
try:
return get_json()
except TypeError:
return None
return getattr(request, 'json', None)


def get_request_arg(request, name):
return request.form.get(name) or (request.json or {}).get(name)
json_payload = _get_request_json(request) or {}
return request.form.get(name) or json_payload.get(name)
26 changes: 25 additions & 1 deletion tests/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,31 @@
from fakeredis import FakeStrictRedis
from flask import Flask
from peewee import SqliteDatabase, Model
from playhouse.test_utils import test_database
try:
from playhouse.test_utils import test_database
except (ImportError, AttributeError):
from contextlib import contextmanager

@contextmanager
def test_database(database, models, create_tables=True, fail_silently=False):
"""
Lightweight replacement for the Peewee helper that was removed in newer
releases. It temporarily binds the provided models to the supplied
database, creates their tables, and tears everything down afterwards.
"""
originals = {model: model._meta.database for model in models}
database.bind(models, bind_refs=False, bind_backrefs=False)
if create_tables:
database.connect(reuse_if_open=True)
database.create_tables(models)
try:
yield
finally:
if create_tables:
database.drop_tables(models)
database.close()
for model, original in originals.items():
model._meta.database = original

from app import app
import cache
Expand Down
14 changes: 14 additions & 0 deletions tests/helpers_t.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,17 @@ class _Request():
# from form
request.form['arg1'] = 'fsuccess'
self.assertEqual(get_request_arg(request, 'arg1'), 'fsuccess')
# via get_json helper (ensures silent parsing)
class _JsonMethodRequest():
form = {}

def __init__(self):
self._payload = {'arg1': 'msuccess'}

def get_json(self, silent=False):
if not silent:
raise ValueError('get_json must be called in silent mode')
return self._payload

request_method = _JsonMethodRequest()
self.assertEqual(get_request_arg(request_method, 'arg1'), 'msuccess')