diff --git a/development.txt b/development.txt new file mode 100644 index 0000000..6ecbe87 --- /dev/null +++ b/development.txt @@ -0,0 +1,5 @@ +-r requirements.txt +coverage>=4.1 +mock>=2.0.0 +nose>=1.3.7 +rednose>=1.1.1 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..a8f2b6c --- /dev/null +++ b/setup.cfg @@ -0,0 +1,5 @@ +[nosetests] +stop=1 +verbosity=2 +with-coverage=1 +cover-package=CTFd \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/helpers.py b/tests/helpers.py new file mode 100644 index 0000000..03cfe42 --- /dev/null +++ b/tests/helpers.py @@ -0,0 +1,61 @@ +from CTFd import create_app +from sqlalchemy_utils import database_exists, create_database, drop_database +from sqlalchemy.engine.url import make_url + +def create_ctfd(ctf_name="CTFd", name="admin", email="admin@ctfd.io", password="password"): + app = create_app() + app.config['PRESERVE_CONTEXT_ON_EXCEPTION'] = False + app.config['TESTING'] = True + app.config['DEBUG'] = True + + url = make_url(app.config['SQLALCHEMY_DATABASE_URI']) + if url.drivername == 'postgres': + url.drivername = 'postgresql' + + if database_exists(url): + drop_database(url) + create_database(url) + app.db.create_all() + + with app.app_context(): + with app.test_client() as client: + data = {} + r = client.get('/setup') # Populate session with nonce + with client.session_transaction() as sess: + data = { + "ctf_name": ctf_name, + "name": name, + "email": email, + "password": password, + "nonce": sess.get('nonce') + } + client.post('/setup', data=data) + return app + + +def register_user(app, name="user", email="user@ctfd.io", password="password"): + with app.app_context(): + with app.test_client() as client: + r = client.get('/register') + with client.session_transaction() as sess: + data = { + "name": name, + "email": email, + "password": password, + "nonce": sess.get('nonce') + } + client.post('/register', data=data) + + +def login_as_user(app, name="user", password="password"): + with app.app_context(): + with app.test_client() as client: + r = client.get('/login') + with client.session_transaction() as sess: + data = { + "name": name, + "password": password, + "nonce": sess.get('nonce') + } + client.post('/login', data=data) + return client \ No newline at end of file diff --git a/tests/test_ctfd.py b/tests/test_ctfd.py new file mode 100644 index 0000000..bb8f3c2 --- /dev/null +++ b/tests/test_ctfd.py @@ -0,0 +1,28 @@ +from helpers import create_ctfd, register_user, login_as_user +from CTFd.models import Teams + + +def test_index(): + app = create_ctfd() + with app.app_context(): + with app.test_client() as client: + r = client.get('/') + assert r.status_code == 200 + + +def test_register_user(): + app = create_ctfd() + with app.app_context(): + register_user(app) + team_count = app.db.session.query(app.db.func.count(Teams.id)).first()[0] + assert team_count == 2 # There's the admin user and the created user + + +def test_user_isnt_admin(): + app = create_ctfd() + with app.app_context(): + register_user(app) + client = login_as_user(app) + r = client.get('/admin/graphs') + assert r.location == "http://localhost/login" + assert r.status_code == 302