mirror of
https://github.com/Anrab35/SAE410_TP2.git
synced 2024-10-21 21:26:09 +02:00
First commit 🎉
This commit is contained in:
commit
6833cba08b
27 changed files with 788 additions and 0 deletions
BIN
Barnabe_DUPONT_TP1_R410.zip
Normal file
BIN
Barnabe_DUPONT_TP1_R410.zip
Normal file
Binary file not shown.
0
README.md
Normal file
0
README.md
Normal file
BIN
__pycache__/APItest.cpython-310-pytest-6.2.5.pyc
Normal file
BIN
__pycache__/APItest.cpython-310-pytest-6.2.5.pyc
Normal file
Binary file not shown.
BIN
app/__pycache__/medals.cpython-310.pyc
Normal file
BIN
app/__pycache__/medals.cpython-310.pyc
Normal file
Binary file not shown.
84
app/athletes.py
Normal file
84
app/athletes.py
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
from flask import Flask, request, jsonify
|
||||||
|
|
||||||
|
file = 'data/'+os.path.splitext(os.path.basename(__file__))[0]+'.json'
|
||||||
|
|
||||||
|
|
||||||
|
with open(file, 'r') as f:
|
||||||
|
j = json.load(f)
|
||||||
|
|
||||||
|
def save_json(new_json):
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(json.dumps(new_json, indent=4))
|
||||||
|
with open(file, 'r') as f:
|
||||||
|
j = json.load(f)
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route('/healthcheck', methods=['GET'])
|
||||||
|
def ping():
|
||||||
|
return jsonify({"conatiner_status": "healthy"})
|
||||||
|
|
||||||
|
@app.route('/athletes', methods=['GET'])
|
||||||
|
def list_athletes():
|
||||||
|
return jsonify({"status": "success", "data": j})
|
||||||
|
|
||||||
|
@app.route('/athletes', methods=['POST'])
|
||||||
|
def add_athlete():
|
||||||
|
try:
|
||||||
|
new = json.loads(request.data)
|
||||||
|
next_id = j[-1]['id']+1
|
||||||
|
j.append({
|
||||||
|
"id": next_id,
|
||||||
|
"name": new['name'],
|
||||||
|
"surname": new['surname'],
|
||||||
|
"email": new['email'],
|
||||||
|
"country": new['country'],
|
||||||
|
"isDisabled": new['isDisabled']
|
||||||
|
})
|
||||||
|
save_json(j)
|
||||||
|
return jsonify({"status": "success", "id": next_id})
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
return jsonify({"status": "error", "message": "Please provide a valid JSON"}), 500
|
||||||
|
|
||||||
|
@app.route('/athletes/<id>', methods=['GET'])
|
||||||
|
def get_athlete(id):
|
||||||
|
for a in j:
|
||||||
|
print(a['id'])
|
||||||
|
if a['id'] == int(id):
|
||||||
|
return jsonify({"status": "success", "data": a})
|
||||||
|
return jsonify({"status": "error", "message": "Id not found"}), 404
|
||||||
|
|
||||||
|
@app.route('/athletes/<id>', methods=['PATCH'])
|
||||||
|
def edit_athlete(id):
|
||||||
|
try:
|
||||||
|
update = json.loads(request.data)
|
||||||
|
entries = ['name', 'surname', 'email', 'country', 'isDisabled']
|
||||||
|
for i, a in enumerate(j):
|
||||||
|
if a['id'] == int(id):
|
||||||
|
for e in entries:
|
||||||
|
if update.get(e) is not None:
|
||||||
|
j[i][e] = update[e]
|
||||||
|
save_json(j)
|
||||||
|
return jsonify({"status": "success"})
|
||||||
|
return jsonify({"status": "error", "message": "Id not found"}), 404
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
return jsonify({"status": "error", "message": "Please provide a valid JSON"}), 500
|
||||||
|
|
||||||
|
@app.route('/athletes/<id>', methods=['DELETE'])
|
||||||
|
def rm_athlete(id):
|
||||||
|
for i, a in enumerate(j):
|
||||||
|
print(a['id'])
|
||||||
|
if a['id'] == int(id):
|
||||||
|
j.pop(i)
|
||||||
|
save_json(j)
|
||||||
|
return jsonify({"status": "success"})
|
||||||
|
return jsonify({"status": "error", "message": "Id not found"}), 404
|
||||||
|
|
||||||
|
|
||||||
|
app.run(host="0.0.0.0", debug=False)
|
5
app/data/athletes.json
Normal file
5
app/data/athletes.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0
|
||||||
|
}
|
||||||
|
]
|
5
app/data/medals.json
Normal file
5
app/data/medals.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0
|
||||||
|
}
|
||||||
|
]
|
5
app/data/sports.json
Normal file
5
app/data/sports.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0
|
||||||
|
}
|
||||||
|
]
|
25
app/docs.py
Normal file
25
app/docs.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
from flask import Flask, send_file
|
||||||
|
from flask_swagger_ui import get_swaggerui_blueprint
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
SWAGGER_URL = '/docs' # URL for exposing Swagger UI (without trailing '/')
|
||||||
|
API_URL = '/docs/api/swagger.yml' # Our API url (can of course be a local resource)
|
||||||
|
|
||||||
|
@app.route(API_URL, methods=['GET'])
|
||||||
|
def swagger_yml():
|
||||||
|
# Read before use: http://flask.pocoo.org/docs/0.12/api/#flask.send_file
|
||||||
|
return send_file('/app/swagger.yml')
|
||||||
|
|
||||||
|
# Call factory function to create our blueprint
|
||||||
|
swaggerui_blueprint = get_swaggerui_blueprint(
|
||||||
|
SWAGGER_URL, # Swagger UI static files will be mapped to '{SWAGGER_URL}/dist/'
|
||||||
|
API_URL,
|
||||||
|
config={ # Swagger UI config overrides
|
||||||
|
'app_name': "JO"
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
app.register_blueprint(swaggerui_blueprint)
|
||||||
|
|
||||||
|
app.run(host="0.0.0.0", debug=False)
|
88
app/medals.py
Normal file
88
app/medals.py
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
from flask import Flask, request, jsonify
|
||||||
|
|
||||||
|
file = 'data/'+os.path.splitext(os.path.basename(__file__))[0]+'.json'
|
||||||
|
|
||||||
|
with open(file, 'r') as f:
|
||||||
|
j = json.load(f)
|
||||||
|
|
||||||
|
def save_json(new_json):
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(json.dumps(new_json, indent=4))
|
||||||
|
with open(file, 'r') as f:
|
||||||
|
j = json.load(f)
|
||||||
|
|
||||||
|
valid_ranks = ['gold', 'silver', 'bronze']
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route('/healthcheck', methods=['GET'])
|
||||||
|
def ping():
|
||||||
|
return jsonify({"conatiner_status": "healthy"})
|
||||||
|
|
||||||
|
@app.route('/medals', methods=['GET'])
|
||||||
|
def list_medals():
|
||||||
|
return jsonify({"status": "success", "data": j})
|
||||||
|
|
||||||
|
@app.route('/medals', methods=['POST'])
|
||||||
|
def add_medal():
|
||||||
|
try:
|
||||||
|
new = json.loads(request.data)
|
||||||
|
if new['rank'] not in valid_ranks:
|
||||||
|
return jsonify({"status": "error", "message": "The valid ranks are gold, silver and bronze"}), 400
|
||||||
|
next_id = j[-1]['id']+1
|
||||||
|
j.append({
|
||||||
|
"id": next_id,
|
||||||
|
"rank": new['rank'],
|
||||||
|
"sportID": new['sportID'],
|
||||||
|
"athleteID": new['athleteID']
|
||||||
|
})
|
||||||
|
save_json(j)
|
||||||
|
return jsonify({"status": "success", "id": next_id})
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
return jsonify({"status": "error", "message": "Please provide a valid JSON"}), 500
|
||||||
|
|
||||||
|
@app.route('/medals/<id>', methods=['GET'])
|
||||||
|
def get_medal(id):
|
||||||
|
for m in j:
|
||||||
|
print(m['id'])
|
||||||
|
if m['id'] == int(id):
|
||||||
|
return jsonify({"status": "success", "data": m})
|
||||||
|
return jsonify({"status": "error", "message": "Id not found"}), 404
|
||||||
|
|
||||||
|
@app.route('/medals/<id>', methods=['PATCH'])
|
||||||
|
def edit_medal(id):
|
||||||
|
try:
|
||||||
|
update = json.loads(request.data)
|
||||||
|
entries = ['rank', 'sportID', 'athleteID']
|
||||||
|
for i, m in enumerate(j):
|
||||||
|
if m['id'] == int(id):
|
||||||
|
for e in entries:
|
||||||
|
if update.get(e) is not None:
|
||||||
|
if e == "rank":
|
||||||
|
if update[e] not in valid_ranks:
|
||||||
|
return jsonify({"status": "error", "message": "The valid ranks are gold, silver and bronze"}), 400
|
||||||
|
j[i][e] = update[e]
|
||||||
|
save_json(j)
|
||||||
|
return jsonify({"status": "success"})
|
||||||
|
return jsonify({"status": "error", "message": "Id not found"}), 404
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
return jsonify({"status": "error", "message": "Please provide a valid JSON"}), 500
|
||||||
|
|
||||||
|
@app.route('/medals/<id>', methods=['DELETE'])
|
||||||
|
def rm_medal(id):
|
||||||
|
for i, m in enumerate(j):
|
||||||
|
print(m['id'])
|
||||||
|
if m['id'] == int(id):
|
||||||
|
j.pop(i)
|
||||||
|
save_json(j)
|
||||||
|
return jsonify({"status": "success"})
|
||||||
|
return jsonify({"status": "error", "message": "Id not found"}), 404
|
||||||
|
|
||||||
|
|
||||||
|
app.run(host="0.0.0.0", debug=False)
|
80
app/sports.py
Normal file
80
app/sports.py
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# encoding: utf-8
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
from flask import Flask, request, jsonify
|
||||||
|
|
||||||
|
file = 'data/'+os.path.splitext(os.path.basename(__file__))[0]+'.json'
|
||||||
|
|
||||||
|
|
||||||
|
with open(file, 'r') as f:
|
||||||
|
j = json.load(f)
|
||||||
|
|
||||||
|
def save_json(new_json):
|
||||||
|
with open(file, 'w') as f:
|
||||||
|
f.write(json.dumps(new_json, indent=4))
|
||||||
|
with open(file, 'r') as f:
|
||||||
|
j = json.load(f)
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
@app.route('/healthcheck', methods=['GET'])
|
||||||
|
def ping():
|
||||||
|
return jsonify({"conatiner_status": "healthy"})
|
||||||
|
|
||||||
|
@app.route('/sports', methods=['GET'])
|
||||||
|
def list_sports():
|
||||||
|
return jsonify({"status": "success", "data": j})
|
||||||
|
|
||||||
|
@app.route('/sports', methods=['POST'])
|
||||||
|
def add_sport():
|
||||||
|
try:
|
||||||
|
new = json.loads(request.data)
|
||||||
|
next_id = j[-1]['id']+1
|
||||||
|
j.append({
|
||||||
|
"id": next_id,
|
||||||
|
"name": new['name'],
|
||||||
|
"place": new['place'],
|
||||||
|
"category": new['category'],
|
||||||
|
})
|
||||||
|
save_json(j)
|
||||||
|
return jsonify({"status": "success", "id": next_id})
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
return jsonify({"status": "error", "message": "Please provide a valid JSON"}), 500
|
||||||
|
|
||||||
|
@app.route('/sports/<id>', methods=['GET'])
|
||||||
|
def get_sport(id):
|
||||||
|
for s in j:
|
||||||
|
if s['id'] == int(id):
|
||||||
|
return jsonify({"status": "success", "data": s})
|
||||||
|
return jsonify({"status": "error", "message": "Id not found"}), 404
|
||||||
|
|
||||||
|
@app.route('/sports/<id>', methods=['PATCH'])
|
||||||
|
def edit_sport(id):
|
||||||
|
try:
|
||||||
|
update = json.loads(request.data)
|
||||||
|
entries = ['name', 'place', 'category']
|
||||||
|
for i, s in enumerate(j):
|
||||||
|
if s['id'] == int(id):
|
||||||
|
for e in entries:
|
||||||
|
if update.get(e) is not None:
|
||||||
|
j[i][e] = update[e]
|
||||||
|
save_json(j)
|
||||||
|
return jsonify({"status": "success"})
|
||||||
|
return jsonify({"status": "error", "message": "Id not found"}), 404
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
return jsonify({"status": "error", "message": "Please provide a valid JSON"}), 500
|
||||||
|
|
||||||
|
@app.route('/sports/<id>', methods=['DELETE'])
|
||||||
|
def rm_sport(id):
|
||||||
|
for i, s in enumerate(j):
|
||||||
|
if s['id'] == int(id):
|
||||||
|
j.pop(i)
|
||||||
|
save_json(j)
|
||||||
|
return jsonify({"status": "success"})
|
||||||
|
return jsonify({"status": "error", "message": "Id not found"}), 404
|
||||||
|
|
||||||
|
|
||||||
|
app.run(host="0.0.0.0", debug=False)
|
71
docker-compose.yml
Normal file
71
docker-compose.yml
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
version: "3.3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
traefik:
|
||||||
|
image: "traefik:v2.11"
|
||||||
|
container_name: "traefik"
|
||||||
|
command:
|
||||||
|
- "--log.level=DEBUG"
|
||||||
|
- "--api.insecure=true"
|
||||||
|
- "--providers.docker=true"
|
||||||
|
- "--providers.docker.exposedbydefault=false"
|
||||||
|
- "--entrypoints.web.address=:80"
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
- "8080:8080"
|
||||||
|
volumes:
|
||||||
|
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
|
||||||
|
docs:
|
||||||
|
image: "git.gnous.eu/anrab35/sae410_docs:latest"
|
||||||
|
container_name: "JO_docs"
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.docs.rule=PathPrefix(`/docs`)"
|
||||||
|
|
||||||
|
athletes:
|
||||||
|
image: "git.gnous.eu/anrab35/sae410_athletes:latest"
|
||||||
|
container_name: "JO_athletes"
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
volumes:
|
||||||
|
- "JO_athletes_data:/app/data:rw"
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.athletes.rule=PathPrefix(`/athletes`)"
|
||||||
|
|
||||||
|
medals:
|
||||||
|
image: "git.gnous.eu/anrab35/sae410_medals:latest"
|
||||||
|
container_name: "JO_medals"
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
volumes:
|
||||||
|
- "JO_medals_data:/app/data:rw"
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.medals.rule=PathPrefix(`/medals`)"
|
||||||
|
|
||||||
|
sports:
|
||||||
|
image: "git.gnous.eu/anrab35/sae410_sports:latest"
|
||||||
|
container_name: "JO_sports"
|
||||||
|
networks:
|
||||||
|
- backend
|
||||||
|
volumes:
|
||||||
|
- "JO_sports_data:/app/data:rw"
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.sports.rule=PathPrefix(`/sports`)"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
backend:
|
||||||
|
name: backend
|
||||||
|
external: false
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
JO_athletes_data:
|
||||||
|
JO_medals_data:
|
||||||
|
JO_sports_data:
|
29
docker/athletes/Dockerfile
Normal file
29
docker/athletes/Dockerfile
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
FROM python:3-alpine
|
||||||
|
|
||||||
|
MAINTAINER Barnabé Dupont <contact@bdupont.tech>
|
||||||
|
|
||||||
|
LABEL version="1.0.0"
|
||||||
|
|
||||||
|
RUN apk add curl
|
||||||
|
|
||||||
|
RUN adduser -D worker
|
||||||
|
|
||||||
|
USER worker
|
||||||
|
|
||||||
|
WORKDIR /home/worker
|
||||||
|
|
||||||
|
COPY --chown=worker:worker docker/requirements.txt /home/worker
|
||||||
|
|
||||||
|
RUN pip install --user -r requirements.txt
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --chown=worker:worker app/athletes.py /app/
|
||||||
|
|
||||||
|
COPY --chown=worker:worker app/data/athletes.json /app/data/
|
||||||
|
|
||||||
|
EXPOSE 5000
|
||||||
|
|
||||||
|
HEALTHCHECK --interval=15s --timeout=30s --start-period=10s --retries=3 CMD curl --fail http://localhost:5000/healthcheck || exit 1
|
||||||
|
|
||||||
|
CMD ["python3", "athletes.py"]
|
26
docker/docs/Dockerfile
Normal file
26
docker/docs/Dockerfile
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
FROM python:3-alpine
|
||||||
|
|
||||||
|
MAINTAINER Barnabé Dupont <contact@bdupont.tech>
|
||||||
|
|
||||||
|
LABEL version="1.0.0"
|
||||||
|
|
||||||
|
RUN adduser -D worker
|
||||||
|
|
||||||
|
USER worker
|
||||||
|
|
||||||
|
WORKDIR /home/worker
|
||||||
|
|
||||||
|
COPY --chown=worker:worker docker/docs/requirements.txt /home/worker
|
||||||
|
|
||||||
|
RUN pip install --user -r requirements.txt
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --chown=worker:worker app/docs.py /app/
|
||||||
|
|
||||||
|
COPY --chown=worker:worker swagger.yml /app/
|
||||||
|
|
||||||
|
EXPOSE 5000
|
||||||
|
|
||||||
|
|
||||||
|
CMD ["python3", "docs.py"]
|
2
docker/docs/requirements.txt
Normal file
2
docker/docs/requirements.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
flask==3.0.0
|
||||||
|
flask-swagger-ui==4.11.1
|
29
docker/medals/Dockerfile
Normal file
29
docker/medals/Dockerfile
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
FROM python:3-alpine
|
||||||
|
|
||||||
|
MAINTAINER Barnabé Dupont <contact@bdupont.tech>
|
||||||
|
|
||||||
|
LABEL version="1.0.0"
|
||||||
|
|
||||||
|
RUN apk add curl
|
||||||
|
|
||||||
|
RUN adduser -D worker
|
||||||
|
|
||||||
|
USER worker
|
||||||
|
|
||||||
|
WORKDIR /home/worker
|
||||||
|
|
||||||
|
COPY --chown=worker:worker docker/requirements.txt /home/worker
|
||||||
|
|
||||||
|
RUN pip install --user -r requirements.txt
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --chown=worker:worker app/medals.py /app/
|
||||||
|
|
||||||
|
COPY --chown=worker:worker app/data/medals.json /app/data/
|
||||||
|
|
||||||
|
EXPOSE 5000
|
||||||
|
|
||||||
|
HEALTHCHECK --interval=15s --timeout=30s --start-period=10s --retries=3 CMD curl --fail http://localhost:5000/healthcheck || exit 1
|
||||||
|
|
||||||
|
CMD ["python3", "medals.py"]
|
1
docker/requirements.txt
Normal file
1
docker/requirements.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
flask==3.0.0
|
29
docker/sports/Dockerfile
Normal file
29
docker/sports/Dockerfile
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
FROM python:3-alpine
|
||||||
|
|
||||||
|
MAINTAINER Barnabé Dupont <contact@bdupont.tech>
|
||||||
|
|
||||||
|
LABEL version="1.0.0"
|
||||||
|
|
||||||
|
RUN apk add curl
|
||||||
|
|
||||||
|
RUN adduser -D worker
|
||||||
|
|
||||||
|
USER worker
|
||||||
|
|
||||||
|
WORKDIR /home/worker
|
||||||
|
|
||||||
|
COPY --chown=worker:worker docker/requirements.txt /home/worker
|
||||||
|
|
||||||
|
RUN pip install --user -r requirements.txt
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
COPY --chown=worker:worker app/sports.py /app/
|
||||||
|
|
||||||
|
COPY --chown=worker:worker app/data/sports.json /app/data/
|
||||||
|
|
||||||
|
EXPOSE 5000
|
||||||
|
|
||||||
|
HEALTHCHECK --interval=15s --timeout=30s --start-period=10s --retries=3 CMD curl --fail http://localhost:5000/healthcheck || exit 1
|
||||||
|
|
||||||
|
CMD ["python3", "sports.py"]
|
BIN
pytest/__pycache__/APItest.cpython-310-pytest-6.2.5.pyc
Normal file
BIN
pytest/__pycache__/APItest.cpython-310-pytest-6.2.5.pyc
Normal file
Binary file not shown.
BIN
pytest/__pycache__/conftest.cpython-310-pytest-6.2.5.pyc
Normal file
BIN
pytest/__pycache__/conftest.cpython-310-pytest-6.2.5.pyc
Normal file
Binary file not shown.
BIN
pytest/__pycache__/test_athletes.cpython-310-pytest-6.2.5.pyc
Normal file
BIN
pytest/__pycache__/test_athletes.cpython-310-pytest-6.2.5.pyc
Normal file
Binary file not shown.
BIN
pytest/__pycache__/test_medals.cpython-310-pytest-6.2.5.pyc
Normal file
BIN
pytest/__pycache__/test_medals.cpython-310-pytest-6.2.5.pyc
Normal file
Binary file not shown.
BIN
pytest/__pycache__/test_sports.cpython-310-pytest-6.2.5.pyc
Normal file
BIN
pytest/__pycache__/test_sports.cpython-310-pytest-6.2.5.pyc
Normal file
Binary file not shown.
27
pytest/test_athletes.py
Normal file
27
pytest/test_athletes.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import requests
|
||||||
|
import random
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
def pytest_namespace():
|
||||||
|
return {'current_id': 0}
|
||||||
|
|
||||||
|
def test_add_new_athlete():
|
||||||
|
test_id = str(random.randint(1000,9999))
|
||||||
|
x = requests.post('http://localhost/athletes', json={"name": "TEST", "surname": test_id, "email": "test@test.org", "country": "Listenbourg", "isDisabled": True})
|
||||||
|
pytest.current_id = x.json()['id']
|
||||||
|
assert x.status_code == 200
|
||||||
|
def test_get_athlete():
|
||||||
|
assert requests.get("http://localhost/athletes/"+str(pytest.current_id)).status_code == 200
|
||||||
|
def test_edit_athlete():
|
||||||
|
assert requests.patch("http://localhost/athletes/"+str(pytest.current_id), json={"name": "HELLO", "isDisabled": False}).status_code == 200
|
||||||
|
def test_get_modified_athlete():
|
||||||
|
x = requests.get("http://localhost/athletes/"+str(pytest.current_id))
|
||||||
|
json = x.json()['data']
|
||||||
|
assert x.status_code == 200 and json['name'] == "HELLO" and json['isDisabled'] == False
|
||||||
|
def test_delete_athlete():
|
||||||
|
assert requests.delete("http://localhost/athletes/"+str(pytest.current_id)).status_code == 200
|
||||||
|
def test_deleted_athlete():
|
||||||
|
assert requests.get("http://localhost/athletes/"+str(pytest.current_id)).status_code == 404
|
||||||
|
def test_add_fake_athlete():
|
||||||
|
requests.post('http://localhost/athletes', json={"PEBCAK": True}).status_code == 400
|
27
pytest/test_medals.py
Normal file
27
pytest/test_medals.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import requests
|
||||||
|
import random
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
def pytest_namespace():
|
||||||
|
return {'current_id': 0}
|
||||||
|
|
||||||
|
def test_add_new_medal():
|
||||||
|
test_id = random.randint(1000,9999)
|
||||||
|
x = requests.post('http://localhost/medals', json={"rank": "gold", "sportID": test_id, "athleteID": 1})
|
||||||
|
pytest.current_id = x.json()['id']
|
||||||
|
assert x.status_code == 200
|
||||||
|
def test_get_medal():
|
||||||
|
assert requests.get("http://localhost/medals/"+str(pytest.current_id)).status_code == 200
|
||||||
|
def test_edit_medal():
|
||||||
|
assert requests.patch("http://localhost/medals/"+str(pytest.current_id), json={"athleteID": 88}).status_code == 200
|
||||||
|
def test_get_modified_medal():
|
||||||
|
x = requests.get("http://localhost/medals/"+str(pytest.current_id))
|
||||||
|
json = x.json()['data']
|
||||||
|
assert x.status_code == 200 and json['rank'] == "gold" and json['athleteID'] == 88
|
||||||
|
def test_delete_medal():
|
||||||
|
assert requests.delete("http://localhost/medals/"+str(pytest.current_id)).status_code == 200
|
||||||
|
def test_deleted_medal():
|
||||||
|
assert requests.get("http://localhost/medals/"+str(pytest.current_id)).status_code == 404
|
||||||
|
def test_add_fake_medal():
|
||||||
|
requests.post('http://localhost/medals', json={"rank": "Loris"}).status_code == 400
|
28
pytest/test_sports.py
Normal file
28
pytest/test_sports.py
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import requests
|
||||||
|
import random
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
|
def pytest_namespace():
|
||||||
|
return {'current_id': 0}
|
||||||
|
|
||||||
|
def test_add_new_sport():
|
||||||
|
test_id = str(random.randint(1000,9999))
|
||||||
|
x = requests.post('http://localhost/sports', json={"name": "TEST", "place": test_id, "category": "Multiplayer"})
|
||||||
|
pytest.current_id = x.json()['id']
|
||||||
|
assert x.status_code == 200
|
||||||
|
def test_get_sport():
|
||||||
|
print("http://localhost/sports/"+str(pytest.current_id))
|
||||||
|
assert requests.get("http://localhost/sports/"+str(pytest.current_id)).status_code == 200
|
||||||
|
def test_edit_sport():
|
||||||
|
assert requests.patch("http://localhost/sports/"+str(pytest.current_id), json={"category": "Aquatic"}).status_code == 200
|
||||||
|
def test_get_modified_sport():
|
||||||
|
x = requests.get("http://localhost/sports/"+str(pytest.current_id))
|
||||||
|
json = x.json()['data']
|
||||||
|
assert x.status_code == 200 and json['category'] == "Aquatic"
|
||||||
|
def test_delete_sport():
|
||||||
|
assert requests.delete("http://localhost/sports/"+str(pytest.current_id)).status_code == 200
|
||||||
|
def test_deleted_sport():
|
||||||
|
assert requests.get("http://localhost/sports/"+str(pytest.current_id)).status_code == 404
|
||||||
|
def test_add_fake_sport():
|
||||||
|
requests.post('http://localhost/sports', json={"rank": "gold", "sportID": 666, "athleteID": 1}).status_code == 400
|
227
swagger.yml
Normal file
227
swagger.yml
Normal file
|
@ -0,0 +1,227 @@
|
||||||
|
openapi: '3.0.2'
|
||||||
|
info:
|
||||||
|
title: API Jo
|
||||||
|
version: '1.0'
|
||||||
|
servers:
|
||||||
|
- url: http://localhost/
|
||||||
|
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
Athlete:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
surname:
|
||||||
|
type: string
|
||||||
|
email:
|
||||||
|
type: string
|
||||||
|
country:
|
||||||
|
type: string
|
||||||
|
isDisabled:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
Sport:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
place:
|
||||||
|
type: string
|
||||||
|
category:
|
||||||
|
type: string
|
||||||
|
Medal:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
rank:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- gold
|
||||||
|
- silver
|
||||||
|
- bronze
|
||||||
|
sportID:
|
||||||
|
type: integer
|
||||||
|
athleteID:
|
||||||
|
type: integer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
paths:
|
||||||
|
/athletes:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- Athletes
|
||||||
|
summary: Display athletes list
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- Athletes
|
||||||
|
summary: Add a new athlete
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Athlete'
|
||||||
|
|
||||||
|
/athletes/{id}:
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
example: 1
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- Athletes
|
||||||
|
summary: Display one athlete using the ID
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'OK'
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Athlete'
|
||||||
|
'404':
|
||||||
|
description: 'Not found'
|
||||||
|
patch:
|
||||||
|
tags:
|
||||||
|
- Athletes
|
||||||
|
summary: Modify a athlete using the ID
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'OK'
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- Athletes
|
||||||
|
summary: Delete an athlete using the ID
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'OK'
|
||||||
|
'404':
|
||||||
|
description: 'Athete not found'
|
||||||
|
/sports:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- Sports
|
||||||
|
summary: List all available sports
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- Sports
|
||||||
|
summary: Add a sport
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Sport'
|
||||||
|
/sports/{id}:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- Sports
|
||||||
|
summary: Display a specific sport using the ID
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'OK'
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Sport'
|
||||||
|
'404':
|
||||||
|
description: 'Not found'
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
example: 1
|
||||||
|
patch:
|
||||||
|
tags:
|
||||||
|
- Sports
|
||||||
|
summary: Edit a specific sport using the ID
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'OK'
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- Sports
|
||||||
|
summary: Delete a specific sport using the ID
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'OK'
|
||||||
|
'404':
|
||||||
|
description: 'Sport not found'
|
||||||
|
/medal:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- Medal
|
||||||
|
summary: Display medals list
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- Medal
|
||||||
|
summary: Add a new medal
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Medal'
|
||||||
|
/medals/{id}:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- Medal
|
||||||
|
summary: Display a medal
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'OK'
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Medal'
|
||||||
|
'404':
|
||||||
|
description: 'Not found'
|
||||||
|
parameters:
|
||||||
|
- name: id
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
example: 1
|
||||||
|
patch:
|
||||||
|
tags:
|
||||||
|
- Medal
|
||||||
|
summary: Modify element from medal
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'OK'
|
||||||
|
'404':
|
||||||
|
description: 'Medal not found'
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- Medal
|
||||||
|
summary: Delete medal from Id
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: 'OK'
|
||||||
|
'404':
|
||||||
|
description: 'Medal not found'
|
Loading…
Reference in a new issue