diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index 6730c3a..fe921c6 100644 Binary files a/__pycache__/app.cpython-313.pyc and b/__pycache__/app.cpython-313.pyc differ diff --git a/app.py b/app.py index cb9e6a1..80506be 100644 --- a/app.py +++ b/app.py @@ -18,7 +18,6 @@ app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = 'supersecretkey' - # Initialize the database object only once migrate = Migrate(app, db) db.init_app(app) @@ -31,13 +30,11 @@ def load_user(user_id): return User.query.get(int(user_id)) - # Home Page (Landing Page) @app.route('/') def home(): return render_template('index.html') - # Register Page @app.route('/register', methods=['GET', 'POST']) def register(): @@ -57,12 +54,11 @@ def register(): db.session.add(new_user) db.session.commit() - flash("Registration successful! Please log in.", "success") + flash("Registration Successful!", "success") return redirect(url_for('login')) return render_template('register.html') - # Login Page @app.route('/login', methods=['GET', 'POST']) def login(): @@ -75,21 +71,17 @@ def login(): if user and user.check_password(password): # Log the user in using Flask-Login login_user(user) # This will manage the session automatically - - flash("Login successful!", "success") + flash(f"Welcome back, {user.username}!", "success") return redirect(url_for('dashboard')) # Redirect to the dashboard else: flash("Invalid credentials! Try again.", "danger") return render_template('login.html') - - @app.route('/config-check') def config_check(): return f"Testing Mode: {app.config['TESTING']}" - @app.route('/user-check') def user_check(): if current_user.is_authenticated: @@ -97,7 +89,6 @@ def user_check(): else: return "No user is currently logged in." - # Dashboard Page @app.route('/dashboard') @login_required @@ -105,12 +96,15 @@ def dashboard(): print(f"[DEBUG] Logged in user: {current_user.username}") return render_template('dashboard.html', username=current_user.username) - - @app.route('/guess', methods=['POST']) @login_required def guess(): - guess = int(request.form['guess']) + try: + guess = int(request.form['guess']) + except ValueError: + flash("Invalid guess! Please enter a valid number.", "danger") + return redirect(url_for('play_game', level=session.get('level', 'easy'))) + number_to_guess = session.get('number_to_guess') if guess == number_to_guess: @@ -122,7 +116,6 @@ def guess(): else: return jsonify({'result': 'Too high!'}) - # Game Page (Handles Easy, Medium, Hard) @app.route('/play/', methods=['GET', 'POST']) @login_required # This ensures the user is logged in @@ -141,6 +134,7 @@ def play_game(level): session['random_number'] = random.randint(1, levels[level]) session['attempts'] = 5 # Total number of attempts session['game_status'] = None # Track the game status (win/loss) + session['level'] = level # Store the current level # Game variables correct_number = session['random_number'] @@ -194,19 +188,16 @@ def play_game(level): correct_number=correct_number, game_status=game_status) - # Leaderboard @app.route('/leaderboard') def leaderboard(): - leaderboard_data = User.query.order_by(User.score.desc()).all() leaderboard = [{"username": user.username, "score": user.score} for user in leaderboard_data] return render_template('leaderboard.html', leaderboard=leaderboard) - #return render_template('leaderboard.html', leaderboard=leaderboard) @app.route('/reset') def reset_game(): - session.pop('number', None) + session.pop('random_number', None) session.pop('attempts', None) level = session.get('level', 'easy') # fallback level return redirect(url_for('play_game', level=level)) @@ -219,7 +210,6 @@ def logout(): flash("You have been logged out successfully.", "info") return redirect(url_for('home')) - # Run the application if __name__ == "__main__": with app.app_context(): diff --git a/login.html b/login.html index 3bdf498..36bca02 100644 --- a/login.html +++ b/login.html @@ -4,24 +4,37 @@ Login - - + + -
-

Login

+
+

Login

-
- - - -
-

New here? Register

+ + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + + {% endif %} + {% endwith %} +
+ + + + + +
+

New here? Register

- diff --git a/register.html b/register.html index 1d7ca56..8f8b84c 100644 --- a/register.html +++ b/register.html @@ -4,32 +4,39 @@ Register - - + + -
- -

Register

-
- - +
+

Register

- - + + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} + + {% endif %} + {% endwith %} - - - - - - -

Already have an account? Login

+
+ + + + + + + +
+

Already have an account? Login

- - diff --git a/test/__pycache__/test_example.cpython-313-pytest-8.3.5.pyc b/test/__pycache__/test_example.cpython-313-pytest-8.3.5.pyc index 9eb2eb4..8478931 100644 Binary files a/test/__pycache__/test_example.cpython-313-pytest-8.3.5.pyc and b/test/__pycache__/test_example.cpython-313-pytest-8.3.5.pyc differ diff --git a/test/test_example.py b/test/test_example.py index b172903..0549c3e 100644 --- a/test/test_example.py +++ b/test/test_example.py @@ -1,42 +1,152 @@ -import unittest -from flask import Flask, session -from app import app, db, User # adjust based on your app structure +import pytest +from app import app, db, User +from flask import flash -class NumberGuessingGameTestCase(unittest.TestCase): +from models import User # Replace with the correct path to the User model - def setUp(self): - self.app = app.test_client() - app.config['TESTING'] = True - app.config['WTF_CSRF_ENABLED'] = False - app.config['LOGIN_DISABLED'] = False # important for Flask-Login +# Fixture to create a test client +# Fixture to create a test client +@pytest.fixture +def client(): + app.config['TESTING'] = True + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:' # Use in-memory DB for tests + app.config['SECRET_KEY'] = 'your_secret_key' # Needed for flash messages + with app.test_client() as client: with app.app_context(): - db.create_all() - test_user = User(username='testuser') - test_user.set_password('testpass') - db.session.add(test_user) - db.session.commit() - - - def login_session(client, number=7): - with client: - existing_user = User.query.filter_by(username='testuser').first() - if existing_user: - db.session.delete(existing_user) - db.session.commit() - - password = 'password' - hashed_password = bcrypt.generate_password_hash(password).decode('utf-8') - user = User(username='testuser', password_hash=hashed_password, score=0, attempts=5) - db.session.add(user) - db.session.commit() - - client.post('/login', data=dict(username='testuser', password=password), follow_redirects=True) - - with client.session_transaction() as sess: - sess['number_to_guess'] = number - - - def test_correct_guess(self): - self.login_session(self.app, number=7) - response = self.app.post('/guess', data={'guess': '7'}) - self.assertEqual(response.status_code, 200) + db.create_all() # Initialize the database schema + yield client + with app.app_context(): + db.drop_all() # Clean up after tests + +# Helper function to create a user with password hashing +def create_user(username="defaultuser", password="defaultpassword"): + with app.app_context(): + user = User(username=username) + user.set_password(password) # Ensure password is hashed + db.session.add(user) + db.session.commit() + +# Test: Home Page +def test_home_page(client): + response = client.get('/') + assert response.status_code == 200 + assert b"Hello" in response.data or b"