Add comprehensive test suite to reach 31% code coverage
Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,177 @@
|
||||
"""Targeted tests to cover specific branches and reach 30% coverage."""
|
||||
import pytest
|
||||
from musicround.models import db, User, SystemSetting
|
||||
|
||||
|
||||
def _login(app, client, username='branch_user', email='branch@example.com'):
|
||||
"""Helper: create and log in a user."""
|
||||
with app.app_context():
|
||||
existing = User.query.filter_by(username=username).first()
|
||||
if not existing:
|
||||
user = User(username=username, email=email)
|
||||
user.password = 'BranchPass123!'
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
client.post('/users/login', data={'username': username, 'password': 'BranchPass123!'})
|
||||
|
||||
|
||||
class TestRegisterValidation:
|
||||
"""Tests for register route validation branches."""
|
||||
|
||||
def test_register_signups_disabled(self, app, client):
|
||||
"""Test that registration fails when signups are disabled."""
|
||||
with app.app_context():
|
||||
SystemSetting.set('allow_signups', 'false')
|
||||
|
||||
try:
|
||||
response = client.post('/users/register', data={
|
||||
'username': 'newuser_disabled',
|
||||
'email': 'disabled@example.com',
|
||||
'password': 'SecurePass123!',
|
||||
'confirm_password': 'SecurePass123!',
|
||||
}, follow_redirects=True)
|
||||
assert response.status_code == 200
|
||||
finally:
|
||||
with app.app_context():
|
||||
SystemSetting.set('allow_signups', 'true')
|
||||
|
||||
def test_register_password_mismatch(self, client):
|
||||
"""Test that registration fails when passwords don't match."""
|
||||
response = client.post('/users/register', data={
|
||||
'username': 'testmismatch',
|
||||
'email': 'mismatch@example.com',
|
||||
'password': 'SecurePass123!',
|
||||
'confirm_password': 'DifferentPass456!',
|
||||
})
|
||||
assert response.status_code == 200
|
||||
|
||||
def test_register_duplicate_username(self, app, client):
|
||||
"""Test that registration fails when username already exists."""
|
||||
with app.app_context():
|
||||
user = User(username='existing_user', email='existing@example.com')
|
||||
user.password = 'ExistingPass123!'
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
|
||||
response = client.post('/users/register', data={
|
||||
'username': 'existing_user',
|
||||
'email': 'newmail@example.com',
|
||||
'password': 'AnyPass123!',
|
||||
'confirm_password': 'AnyPass123!',
|
||||
})
|
||||
assert response.status_code == 200
|
||||
|
||||
def test_register_duplicate_email(self, app, client):
|
||||
"""Test that registration fails when email already exists."""
|
||||
with app.app_context():
|
||||
user = User(username='uniqueusername', email='dup@example.com')
|
||||
user.password = 'UniquePass123!'
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
|
||||
response = client.post('/users/register', data={
|
||||
'username': 'brandnewuser',
|
||||
'email': 'dup@example.com',
|
||||
'password': 'AnyPass123!',
|
||||
'confirm_password': 'AnyPass123!',
|
||||
})
|
||||
assert response.status_code == 200
|
||||
|
||||
def test_register_successful_creation(self, app, client):
|
||||
"""Test that successful registration redirects to login."""
|
||||
response = client.post('/users/register', data={
|
||||
'username': 'success_user',
|
||||
'email': 'success@example.com',
|
||||
'password': 'SuccessPass123!',
|
||||
'confirm_password': 'SuccessPass123!',
|
||||
}, follow_redirects=False)
|
||||
# Should redirect to login after success
|
||||
assert response.status_code == 302
|
||||
|
||||
|
||||
class TestLogout:
|
||||
"""Tests for the logout route (requires authenticated user)."""
|
||||
|
||||
def test_logout_while_authenticated(self, app, client):
|
||||
"""Test that logout works while authenticated."""
|
||||
_login(app, client)
|
||||
response = client.get('/users/logout', follow_redirects=False)
|
||||
assert response.status_code == 302
|
||||
assert 'login' in response.headers['Location'].lower()
|
||||
|
||||
def test_logout_clears_session(self, app, client):
|
||||
"""Test that logout clears the session and redirects to login."""
|
||||
_login(app, client)
|
||||
# Verify we're logged in
|
||||
profile_response = client.get('/users/profile')
|
||||
assert profile_response.status_code == 200
|
||||
# Now logout
|
||||
client.get('/users/logout')
|
||||
# Now accessing profile should redirect to login
|
||||
profile_after = client.get('/users/profile')
|
||||
assert profile_after.status_code == 302
|
||||
|
||||
|
||||
class TestLoginBranches:
|
||||
"""Tests for login route edge cases."""
|
||||
|
||||
def test_login_via_email(self, app, client):
|
||||
"""Test that login via email works."""
|
||||
with app.app_context():
|
||||
user = User(username='emailloginuser', email='emaillogin@example.com')
|
||||
user.password = 'EmailPass123!'
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
|
||||
response = client.post('/users/login', data={
|
||||
'username': 'emaillogin@example.com',
|
||||
'password': 'EmailPass123!',
|
||||
}, follow_redirects=True)
|
||||
assert response.status_code == 200
|
||||
|
||||
def test_login_already_authenticated_redirects(self, app, client):
|
||||
"""Test that logged-in user accessing /login is redirected."""
|
||||
_login(app, client)
|
||||
response = client.get('/users/login')
|
||||
# Should redirect to home since already authenticated
|
||||
assert response.status_code == 302
|
||||
|
||||
def test_register_already_authenticated_redirects(self, app, client):
|
||||
"""Test that logged-in user accessing /register is redirected."""
|
||||
_login(app, client)
|
||||
response = client.get('/users/register')
|
||||
assert response.status_code == 302
|
||||
|
||||
|
||||
class TestRoundsExtended:
|
||||
"""Additional rounds coverage tests."""
|
||||
|
||||
def _create_user_and_login(self, app, client, username='roundext', email='roundext@example.com'):
|
||||
with app.app_context():
|
||||
existing = User.query.filter_by(username=username).first()
|
||||
if not existing:
|
||||
user = User(username=username, email=email)
|
||||
user.password = 'RoundExtPass123!'
|
||||
db.session.add(user)
|
||||
db.session.commit()
|
||||
client.post('/users/login', data={'username': username, 'password': 'RoundExtPass123!'})
|
||||
|
||||
def test_update_songs_empty_order(self, app, client):
|
||||
"""Test update-songs with no song_order provided."""
|
||||
from musicround.models import Song, Round
|
||||
self._create_user_and_login(app, client)
|
||||
with app.app_context():
|
||||
song = Song(title='Empty Order Song', artist='A', genre='Rock')
|
||||
db.session.add(song)
|
||||
db.session.commit()
|
||||
round_ = Round(round_type='genre', round_criteria_used='Rock', songs=str(song.id))
|
||||
db.session.add(round_)
|
||||
db.session.commit()
|
||||
round_id = round_.id
|
||||
|
||||
response = client.post(
|
||||
f'/rounds/{round_id}/update-songs',
|
||||
data={}, # No song_order
|
||||
follow_redirects=True,
|
||||
)
|
||||
assert response.status_code == 200
|
||||
Reference in New Issue
Block a user