62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import pytest
|
|
from flask import request
|
|
from sqlalchemy.exc import IntegrityError
|
|
|
|
from CTFd.exceptions.challenges import ChallengeSolveException
|
|
from CTFd.models import Solves
|
|
from CTFd.plugins.challenges import BaseChallenge
|
|
from tests.helpers import (
|
|
create_ctfd,
|
|
destroy_ctfd,
|
|
gen_challenge,
|
|
gen_solve,
|
|
gen_team,
|
|
gen_user,
|
|
)
|
|
|
|
|
|
def test_base_challenge_solve_creates_solve_when_missing():
|
|
"""Test that BaseChallenge.solve() creates a solve if it doesn't exist"""
|
|
app = create_ctfd()
|
|
with app.app_context():
|
|
challenge = gen_challenge(app.db)
|
|
user = gen_user(app.db, name="solver", email="solver@example.com")
|
|
|
|
assert Solves.query.count() == 0
|
|
|
|
with app.test_request_context(
|
|
json={"submission": "flag"},
|
|
environ_base={"REMOTE_ADDR": "127.0.0.1"},
|
|
):
|
|
BaseChallenge.solve(user, None, challenge, request)
|
|
|
|
assert Solves.query.count() == 1
|
|
destroy_ctfd(app)
|
|
|
|
|
|
def test_base_challenge_solve_raises_on_duplicate_solve():
|
|
"""Test that BaseChallenge.solve() raises ChallengeSolveException on duplicate solve"""
|
|
app = create_ctfd(user_mode="teams")
|
|
with app.app_context():
|
|
challenge = gen_challenge(app.db)
|
|
team = gen_team(app.db, member_count=1)
|
|
user = team.members[0]
|
|
|
|
gen_solve(app.db, user_id=user.id, team_id=team.id, challenge_id=challenge.id)
|
|
assert Solves.query.count() == 1
|
|
|
|
with app.test_request_context(
|
|
json={"submission": "flag"},
|
|
environ_base={"REMOTE_ADDR": "127.0.0.1"},
|
|
):
|
|
with pytest.raises(ChallengeSolveException) as exc:
|
|
BaseChallenge.solve(user, team, challenge, request)
|
|
|
|
assert isinstance(exc.value.__cause__, IntegrityError)
|
|
|
|
assert Solves.query.count() == 1
|
|
destroy_ctfd(app)
|