Files
CTFd/tests/challenges/test_base_challenge.py
gkr 2e06f92c64
Some checks are pending
Linting / Linting (3.11) (push) Waiting to run
Mirror core-theme / mirror (push) Waiting to run
init CTFd source
2025-12-25 09:39:21 +08:00

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)