Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@ lib
.Python
tests/
.envrc
__pycache__
__pycache__
htmlcov/
.coverage

502 changes: 502 additions & 0 deletions .venv/Scripts/Activate.ps1

Large diffs are not rendered by default.

70 changes: 70 additions & 0 deletions .venv/Scripts/activate
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# This file must be used with "source bin/activate" *from bash*
# You cannot run it directly

deactivate () {
# reset old environment variables
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
PATH="${_OLD_VIRTUAL_PATH:-}"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
export PYTHONHOME
unset _OLD_VIRTUAL_PYTHONHOME
fi

# Call hash to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
hash -r 2> /dev/null

if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
PS1="${_OLD_VIRTUAL_PS1:-}"
export PS1
unset _OLD_VIRTUAL_PS1
fi

unset VIRTUAL_ENV
unset VIRTUAL_ENV_PROMPT
if [ ! "${1:-}" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}

# unset irrelevant variables
deactivate nondestructive

# on Windows, a path can contain colons and backslashes and has to be converted:
if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then
# transform D:\path\to\venv to /d/path/to/venv on MSYS
# and to /cygdrive/d/path/to/venv on Cygwin
export VIRTUAL_ENV=$(cygpath "C:\Users\Lénovo P70\Desktop\projet 11\Python_Testing\.venv")
else
# use the path as-is
export VIRTUAL_ENV="C:\Users\Lénovo P70\Desktop\projet 11\Python_Testing\.venv"
fi

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/Scripts:$PATH"
export PATH

# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "${PYTHONHOME:-}" ] ; then
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
unset PYTHONHOME
fi

if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
_OLD_VIRTUAL_PS1="${PS1:-}"
PS1="(.venv) ${PS1:-}"
export PS1
VIRTUAL_ENV_PROMPT="(.venv) "
export VIRTUAL_ENV_PROMPT
fi

# Call hash to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
hash -r 2> /dev/null
34 changes: 34 additions & 0 deletions .venv/Scripts/activate.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
@echo off

rem This file is UTF-8 encoded, so we need to update the current code page while executing it
for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do (
set _OLD_CODEPAGE=%%a
)
if defined _OLD_CODEPAGE (
"%SystemRoot%\System32\chcp.com" 65001 > nul
)

set VIRTUAL_ENV=C:\Users\Lénovo P70\Desktop\projet 11\Python_Testing\.venv

if not defined PROMPT set PROMPT=$P$G

if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT%
if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%

set _OLD_VIRTUAL_PROMPT=%PROMPT%
set PROMPT=(.venv) %PROMPT%

if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
set PYTHONHOME=

if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH%

set PATH=%VIRTUAL_ENV%\Scripts;%PATH%
set VIRTUAL_ENV_PROMPT=(.venv)

:END
if defined _OLD_CODEPAGE (
"%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul
set _OLD_CODEPAGE=
)
Binary file added .venv/Scripts/coverage-3.12.exe
Binary file not shown.
Binary file added .venv/Scripts/coverage.exe
Binary file not shown.
Binary file added .venv/Scripts/coverage3.exe
Binary file not shown.
22 changes: 22 additions & 0 deletions .venv/Scripts/deactivate.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
@echo off

if defined _OLD_VIRTUAL_PROMPT (
set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
)
set _OLD_VIRTUAL_PROMPT=

if defined _OLD_VIRTUAL_PYTHONHOME (
set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
set _OLD_VIRTUAL_PYTHONHOME=
)

if defined _OLD_VIRTUAL_PATH (
set "PATH=%_OLD_VIRTUAL_PATH%"
)

set _OLD_VIRTUAL_PATH=

set VIRTUAL_ENV=
set VIRTUAL_ENV_PROMPT=

:END
Binary file added .venv/Scripts/flask.exe
Binary file not shown.
Binary file added .venv/Scripts/pip.exe
Binary file not shown.
Binary file added .venv/Scripts/pip3.12.exe
Binary file not shown.
Binary file added .venv/Scripts/pip3.exe
Binary file not shown.
Binary file added .venv/Scripts/py.test.exe
Binary file not shown.
Binary file added .venv/Scripts/pygmentize.exe
Binary file not shown.
Binary file added .venv/Scripts/pytest.exe
Binary file not shown.
Binary file added .venv/Scripts/python.exe
Binary file not shown.
Binary file added .venv/Scripts/pythonw.exe
Binary file not shown.
5 changes: 5 additions & 0 deletions .venv/pyvenv.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
home = C:\Users\Lénovo P70\AppData\Local\Programs\Python\Python312
include-system-site-packages = false
version = 3.12.6
executable = C:\Users\Lénovo P70\AppData\Local\Programs\Python\Python312\python.exe
command = C:\Users\Lénovo P70\AppData\Local\Programs\Python\Python312\python.exe -m venv C:\Users\Lénovo P70\Desktop\projet 11\Python_Testing\.venv
16 changes: 13 additions & 3 deletions server.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,15 @@ def index():

@app.route('/showSummary',methods=['POST'])
def showSummary():
club = [club for club in clubs if club['email'] == request.form['email']][0]
return render_template('welcome.html',club=club,competitions=competitions)
# Correction bug1 "email"
email = request.form.get('email')
club = next((club for club in clubs if club['email'] == email), None)

if club:
return render_template('welcome.html', club=club, competitions=competitions)
else:
flash("Sorry, that email wasn't found.")
return redirect(url_for('index'))


@app.route('/book/<competition>/<club>')
Expand All @@ -51,7 +58,10 @@ def purchasePlaces():
return render_template('welcome.html', club=club, competitions=competitions)


# TODO: Add route for points display
# FONCTIONNALITÉ 2: Tableau d'affichage des points
@app.route('/pointsDisplay')
def pointsDisplay():
return render_template('points_display.html', clubs=clubs)


@app.route('/logout')
Expand Down
16 changes: 13 additions & 3 deletions templates/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,19 @@
<body>
<h1>Welcome to the GUDLFT Registration Portal!</h1>
Please enter your secretary email to continue:
<form action="showSummary" method="post">
<label for="email">Email:</label>
<input type="email" name="email" id=""/>

{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li style="color:red;">{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<form action="{{ url_for('showSummary') }}" method="post">
<label>Email:</label>
<input type="email" name="email" id="email" required />
<button type="submit">Enter</button>
</form>
</body>
Expand Down
27 changes: 27 additions & 0 deletions templates/points_display.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Clubs Points | GUDLFT</title>
</head>
<body>
<h1>Clubs Points</h1>
<a href="{{url_for('index')}}">Back to login</a>
<table>
<thead>
<tr>
<th>Club</th>
<th>Points</th>
</tr>
</thead>
<tbody>
{% for club in clubs %}
<tr>
<td>{{ club['name'] }}</td>
<td>{{ club['points'] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
74 changes: 74 additions & 0 deletions tests/integration/test_points_display_flow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
import pytest
from server import app, clubs

@pytest.fixture
def client():
app.config['TESTING'] = True
with app.test_client() as client:
yield client

def test_points_display_public_access(client):
"""Test complet d'accès public au tableau des points sans login"""

# 1. ACCÈS DIRECT SANS AUTHENTIFICATION
response = client.get('/pointsDisplay')
assert response.status_code == 200
print("✓ Page accessible sans authentification")

# 2. VÉRIFICATION TITRE ET STRUCTURE
assert b"Clubs Points" in response.data
assert b"<table>" in response.data
assert b"<th>Club</th>" in response.data
assert b"<th>Points</th>" in response.data
print("✓ Structure HTML correcte")

# 3. VÉRIFICATION DE TOUS LES CLUBS
expected_clubs = ["Simply Lift", "Iron Temple", "She Lifts"]
expected_points = ["13", "4", "12"]

for club_name, points in zip(expected_clubs, expected_points):
assert club_name.encode() in response.data, f"Club {club_name} non trouvé"
assert points.encode() in response.data, f"Points {points} pour {club_name} non trouvés"
print("✓ Tous les clubs et points affichés")

# 4. VÉRIFICATION FORMAT DES DONNÉES
# Vérifier que les données sont dans un tableau structuré
assert b"<td>Simply Lift</td>" in response.data
assert b"<td>13</td>" in response.data
assert b"<td>Iron Temple</td>" in response.data
assert b"<td>4</td>" in response.data
assert b"<td>She Lifts</td>" in response.data
assert b"<td>12</td>" in response.data
print("✓ Formatage des données correct")

# 5. VÉRIFICATION LIEN DE RETOUR
assert b'Back to login' in response.data or b'href="/"' in response.data
print("✓ Lien de navigation présent")

# 6. VÉRIFICATION ABSENCE D'ÉLÉMENTS PRIVÉS
# La page ne doit pas contenir d'éléments nécessitant une connexion
private_elements = [
b"Book Places",
b"Purchase",
b"Logout",
b"Welcome,"
]

for private_element in private_elements:
assert private_element not in response.data, f"Élément privé {private_element} trouvé"
print("✓ Aucun élément privé affiché")

# 7. VÉRIFICATION PERFORMANCE (optionnel)
import time
start_time = time.time()
response = client.get('/pointsDisplay')
end_time = time.time()

response_time = end_time - start_time
assert response_time < 2.0, f"Temps de réponse trop long: {response_time:.2f}s"
print(f"✓ Temps de réponse acceptable: {response_time:.2f}s")

print("✅ Test d'intégration tableau des points - COMPLET")
25 changes: 25 additions & 0 deletions tests/unit/test_email_login.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import pytest
from server import app

@pytest.fixture
def client():
app.config['TESTING'] = True
with app.test_client() as client:
yield client

def test_login_with_valid_email(client):
response = client.post('/showSummary',
data={'email': 'simplylift@club.com'},
follow_redirects=True)
assert response.status_code == 200
assert b'Welcome' in response.data

def test_login_with_invalid_email(client):
response = client.post('/showSummary',
data={'email': 'wrong@email.com'},
follow_redirects=True)
assert response.status_code == 200
assert b"Sorry, that email wasn&#39;t found." in response.data
36 changes: 36 additions & 0 deletions tests/unit/test_points_display.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
import pytest
from server import app, clubs

@pytest.fixture
def client():
app.config['TESTING'] = True
with app.test_client() as client:
yield client

def test_points_display_route(client):
"""Test que la route /pointsDisplay renvoie le bon template avec les données"""
response = client.get('/pointsDisplay')
assert response.status_code == 200
assert b"Clubs Points" in response.data

# Vérifier que tous les clubs sont affichés
for club in clubs:
assert club['name'].encode() in response.data
assert club['points'].encode() in response.data

def test_points_display_content(client):
"""Test le contenu spécifique du tableau des points"""
response = client.get('/pointsDisplay')

# Vérifier le format du tableau
assert b"<table>" in response.data
assert b"<th>Club</th>" in response.data
assert b"<th>Points</th>" in response.data

# Vérifier un club spécifique
test_club = clubs[0]
assert f"<td>{test_club['name']}</td>".encode() in response.data
assert f"<td>{test_club['points']}</td>".encode() in response.data