From e3b98eeb8af1d36b1d61ffbb593863a9382fa312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A7=84=EC=84=9C?= <101982673+meem3443@users.noreply.github.com> Date: Mon, 2 Jun 2025 15:13:02 +0900 Subject: [PATCH 1/2] Add files via upload --- testing-python-week2-main/app/api/users.py | 50 +++++++++++ testing-python-week2-main/app/face/face_db.py | 25 ++++++ .../app/face/face_embedding.py | 8 ++ testing-python-week2-main/app/main.py | 12 +++ testing-python-week2-main/app/models/user.py | 8 ++ .../app/services/user_service.py | 49 ++++++++++ testing-python-week2-main/frontend.py | 85 ++++++++++++++++++ .../Aaron_Peirsol/Aaron_Peirsol_0001.jpg | Bin 0 -> 7877 bytes .../Aaron_Peirsol/Aaron_Peirsol_0002.jpg | Bin 0 -> 9700 bytes .../Aaron_Peirsol/Aaron_Peirsol_0003.jpg | Bin 0 -> 8421 bytes .../Aaron_Peirsol/Aaron_Peirsol_0004.jpg | Bin 0 -> 10404 bytes .../Natasha_McElhone_0001.jpg | Bin 0 -> 8903 bytes .../Natasha_McElhone_0002.jpg | Bin 0 -> 7517 bytes .../Natasha_McElhone_0003.jpg | Bin 0 -> 7827 bytes .../Olivia_Newton-John_0001.jpg | Bin 0 -> 8220 bytes .../Olivia_Newton-John_0002.jpg | Bin 0 -> 8232 bytes testing-python-week2-main/requirements.txt | 11 +++ testing-python-week2-main/tests/__init__.py | 0 testing-python-week2-main/tests/conftest.py | 20 +++++ .../tests/images/no_face.jpg | Bin 0 -> 1651 bytes .../tests/test_api_users.py | 48 ++++++++++ testing-python-week2-main/tests/test_face.py | 66 ++++++++++++++ .../tests/test_service_users.py | 54 +++++++++++ 23 files changed, 436 insertions(+) create mode 100644 testing-python-week2-main/app/api/users.py create mode 100644 testing-python-week2-main/app/face/face_db.py create mode 100644 testing-python-week2-main/app/face/face_embedding.py create mode 100644 testing-python-week2-main/app/main.py create mode 100644 testing-python-week2-main/app/models/user.py create mode 100644 testing-python-week2-main/app/services/user_service.py create mode 100644 testing-python-week2-main/frontend.py create mode 100644 testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg create mode 100644 testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0002.jpg create mode 100644 testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0003.jpg create mode 100644 testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0004.jpg create mode 100644 testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0001.jpg create mode 100644 testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0002.jpg create mode 100644 testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0003.jpg create mode 100644 testing-python-week2-main/images/Olivia_Newton-John/Olivia_Newton-John_0001.jpg create mode 100644 testing-python-week2-main/images/Olivia_Newton-John/Olivia_Newton-John_0002.jpg create mode 100644 testing-python-week2-main/requirements.txt create mode 100644 testing-python-week2-main/tests/__init__.py create mode 100644 testing-python-week2-main/tests/conftest.py create mode 100644 testing-python-week2-main/tests/images/no_face.jpg create mode 100644 testing-python-week2-main/tests/test_api_users.py create mode 100644 testing-python-week2-main/tests/test_face.py create mode 100644 testing-python-week2-main/tests/test_service_users.py diff --git a/testing-python-week2-main/app/api/users.py b/testing-python-week2-main/app/api/users.py new file mode 100644 index 0000000..6691f3d --- /dev/null +++ b/testing-python-week2-main/app/api/users.py @@ -0,0 +1,50 @@ +from fastapi import APIRouter, File, Form, UploadFile, HTTPException +from app.models.user import UserResponse +from app.services.user_service import * + +router = APIRouter() + + +@router.post("/users/register", response_model=UserResponse) +async def register(user_id: str = Form(...), image: UploadFile = File(...)): + """회원 등록 엔드포인트""" + image_data = await image.read() + registered_user = register_user(user_id, image_data) + + return UserResponse( + user_id=registered_user["user_id"], + registered_at=registered_user["registered_at"], + ) + +@router.post("/users/authenticate") +async def authenticate(image: UploadFile = File(...)): + """회원 인증 엔드포인트""" + image_data = await image.read() + user_id = authenticate_user(image_data) + + if user_id is None: + raise HTTPException(status_code=401, detail='인증 실패: 사용자 없음') + + return {'user_id': user_id} + + +@router.get("/users/{user_id}") +def get_user_info(user_id: str): + """회원 정보 조회 엔드포인트""" + user_info = get_user(user_id) + + if user_info is None: + raise HTTPException(status_code=404, detail='사용자가 존재하지 않습니다.') + + return user_info + + +@router.delete("/users/{user_id}") +def delete_user_info(user_id: str): + """회원 삭제 엔드포인트""" + result = delete_user(user_id) + + if not result: + raise HTTPException(status_code=404, detail='사용자가 존재하지 않습니다.') + + return {'message': '사용자가 성공적으로 삭제되었습니다.'} \ No newline at end of file diff --git a/testing-python-week2-main/app/face/face_db.py b/testing-python-week2-main/app/face/face_db.py new file mode 100644 index 0000000..eaf2b39 --- /dev/null +++ b/testing-python-week2-main/app/face/face_db.py @@ -0,0 +1,25 @@ +import json +import os +from datetime import datetime + +DB_PATH = "face_db.json" + + +def save_user(user_id, embedding): + """사용자 등록""" + db = load_db() + db[user_id] = {"embedding": embedding, "registered_at": str(datetime.now())} + with open(DB_PATH, "w") as f: + json.dump(db, f) + +def load_db(): + """데이터베이스 로드""" + if not os.path.exists(DB_PATH): + return {} + with open(DB_PATH, "r") as f: + return json.load(f) + +def save_db(db): + """데이터베이스 저장""" + with open(DB_PATH, "w") as f: + json.dump(db, f) \ No newline at end of file diff --git a/testing-python-week2-main/app/face/face_embedding.py b/testing-python-week2-main/app/face/face_embedding.py new file mode 100644 index 0000000..3acfb0c --- /dev/null +++ b/testing-python-week2-main/app/face/face_embedding.py @@ -0,0 +1,8 @@ +def extract_embedding(image): + """이미지에서 임베딩 추출""" + pass + + +def verify_embedding(embedding1, embedding2): + """두 임베딩이 같은 사람인지 검증""" + pass diff --git a/testing-python-week2-main/app/main.py b/testing-python-week2-main/app/main.py new file mode 100644 index 0000000..36e30a0 --- /dev/null +++ b/testing-python-week2-main/app/main.py @@ -0,0 +1,12 @@ +from fastapi import FastAPI + +from app.api import users + +app = FastAPI() + +app.include_router(users.router) + + +@app.get("/") +def read_root(): + return {"message": "얼굴 인식 기반 회원 관리 API"} diff --git a/testing-python-week2-main/app/models/user.py b/testing-python-week2-main/app/models/user.py new file mode 100644 index 0000000..3958dd5 --- /dev/null +++ b/testing-python-week2-main/app/models/user.py @@ -0,0 +1,8 @@ +from pydantic import BaseModel + + +class UserResponse(BaseModel): + """회원 응답 모델""" + + user_id: str + registered_at: str diff --git a/testing-python-week2-main/app/services/user_service.py b/testing-python-week2-main/app/services/user_service.py new file mode 100644 index 0000000..fa1ce6a --- /dev/null +++ b/testing-python-week2-main/app/services/user_service.py @@ -0,0 +1,49 @@ +import cv2 +import numpy as np +from datetime import datetime + +from app.face.face_embedding import * +from app.face.face_db import * + +def register_user(user_id: str, image_bytes: bytes) -> dict: + """이미지와 ID로 회원 등록""" + image_np = np.frombuffer(image_bytes, dtype=np.uint8) + image = cv2.imdecode(image_np, cv2.IMREAD_COLOR) + embedding = extract_embedding(image) + save_user(user_id, embedding) + return {'user_id': user_id, 'registered_at': str(datetime.now())} + +def authenticate_user(image_bytes: bytes): + """이미지로 회원 인증""" + image_np = np.frombuffer(image_bytes, dtype=np.uint8) + image = cv2.imdecode(image_np, cv2.IMREAD_COLOR) + db = load_db() + + embedding_to_check = extract_embedding(image) + + for user_id, data in db.items(): + if verify_embedding(data['embedding'], embedding_to_check): + return user_id + + return None + + +def get_user(user_id): + """user_id로 회원 정보 조회""" + db = load_db() + user_data = db.get(user_id) + + if user_data: + return {'user_id': user_id, 'registered_at': user_data['registered_at']} + else: + return None + + +def delete_user(user_id): + """user_id로 회원 삭제""" + db = load_db() + if user_id in db: + del db[user_id] + save_db(db) + return True + return False \ No newline at end of file diff --git a/testing-python-week2-main/frontend.py b/testing-python-week2-main/frontend.py new file mode 100644 index 0000000..70f1346 --- /dev/null +++ b/testing-python-week2-main/frontend.py @@ -0,0 +1,85 @@ +import requests +import streamlit as st + +API_URL = "http://localhost:8000" + +st.set_page_config(page_title="얼굴 인식 회원 관리 시스템") + +st.title("얼굴 인식 회원 관리 시스템 🚀") + +menu = st.sidebar.selectbox( + "기능 선택", ["회원 등록", "회원 인증", "회원 조회", "회원 삭제"] +) + +if menu == "회원 등록": + st.subheader("📝 회원 등록") + + user_id = st.text_input("사용자 ID") + image = st.file_uploader("얼굴 이미지 업로드", type=["jpg", "jpeg", "png"]) + + if st.button("등록하기"): + if user_id and image: + files = {"image": (image.name, image.getvalue(), image.type)} + data = {"user_id": user_id} + + res = requests.post(f"{API_URL}/users/register", data=data, files=files) + + if res.status_code == 200: + st.success(f"등록 성공: {res.json()}") + else: + st.error(f"등록 실패: {res.json().get('detail')}") + else: + st.warning("ID와 이미지를 모두 입력해주세요.") + +elif menu == "회원 인증": + st.subheader("🔑 회원 인증") + + image = st.file_uploader( + "인증할 얼굴 이미지 업로드", type=["jpg", "jpeg", "png"], key="auth" + ) + + if st.button("인증하기"): + if image: + files = {"image": (image.name, image.getvalue(), image.type)} + + res = requests.post(f"{API_URL}/users/authenticate", files=files) + + if res.status_code == 200: + st.success(f"인증 성공! 사용자 ID: {res.json()['user_id']}") + else: + st.error(f"인증 실패: {res.json().get('detail')}") + else: + st.warning("이미지를 업로드해주세요.") + +elif menu == "회원 조회": + st.subheader("🔍 회원 조회") + + user_id = st.text_input("조회할 사용자 ID") + + if st.button("조회하기"): + if user_id: + res = requests.get(f"{API_URL}/users/{user_id}") + + if res.status_code == 200: + user_info = res.json() + st.json(user_info) + else: + st.error(f"조회 실패: {res.json().get('detail')}") + else: + st.warning("사용자 ID를 입력해주세요.") + +elif menu == "회원 삭제": + st.subheader("🗑️ 회원 삭제") + + user_id = st.text_input("삭제할 사용자 ID") + + if st.button("삭제하기"): + if user_id: + res = requests.delete(f"{API_URL}/users/{user_id}") + + if res.status_code == 200: + st.success("성공적으로 삭제되었습니다.") + else: + st.error(f"삭제 실패: {res.json().get('detail')}") + else: + st.warning("사용자 ID를 입력해주세요.") diff --git a/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg b/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d43ff092f28ffce2aec5681158512872bed1dbcc GIT binary patch literal 7877 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 literal 0 HcmV?d00001 diff --git a/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0002.jpg b/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b94bbc8e06fe344374ac5a56f39854b0759179e GIT binary patch literal 9700 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 D&cB~# literal 0 HcmV?d00001 diff --git a/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0003.jpg b/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0003.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0962cd5a0ff518ebdea1c7527700975a5892fb1 GIT binary patch literal 8421 zcmbW5bx<3?+vkHj6bda++}+dSPOt(cK!Ue8ghCsFON$f>PSD`4!2<-SKyjDg(&8;v z!3tE4-}~O&&D>vi_v}2+KfANDpZV_YJkRrQ>ECC-9RrX)2tYsp01(^`z`s?17J!_T zl#G;woQ#Z&f`XiqnvsT@ii(34khuzKti0MffxTQ5n z@0vQ0@xU2nBGO98c{Q7RnZPsO`D7h^A}J{E-DhTD$7iF1oa=yrQzIx~8_J zwGG?e(TVHo``AA)I5a#mIy;A-UszmPUfJB*-r3#T|MKk!Yxh8pkYep0Kdy46G6_XnO4%=OTjA( z{?6p+GedcgPi~X{$A8fNi|qdnEb{-0?0|*pH4(wBctrF7HNf}va{qGW`N({8 zouC@yU7+JV#+<6Ay*y+IHBTNggwmTvDb9d~xr`BD3KA+NL@~DQfYRElN6r|jUF0br zrUtR$<5?WF~JEAvW5wGZzztt7tc}b} zc8e=*d~x&8_&Rb~E5;==X|pc&b>V1}3NM5VgD`oGKWYUHM!S>$0Erk?&7wTcs(iU~ z%9sS^^mjW-YC5S`5Ro)~*JQE$U2U>9)gH`Ds&%Fwuh_crv+E11(tj4 zv+{pE09R8O_?EPRBCloNKCnEHlBpZ|E`vVVj0qaTWO!Z4(C}adKJ|)zNbOCd^B^xcs(K0-TkkIWQA(IXy^Lh`lt{eGq;lB zeorcEN=*J5(w<#0;^!ObD?o4=nLO|FfV;;f!>z$Y!)C>sw;RbUeF9%;!q`0YpWCENpp@DS*=qeZkpFztl|`_5pW{5U=F@PI6k^B(wl5(WnI($@oJKc3lv}Gn z)VROFpNF+hF#2TbP2ML0ru*4oQNp-x1mxYi3*u28pWxUR^@EM`S9;=i>Q;-Sq$a6+ z8!|HP^{v&gukS=##&}RnZQ3-iPf^=hvEYbQL^83vZ9dU17AQ7vV2~BZ=PA(|`72#m zU+|g8!XvM5315Hc?TD2hD|IzhwO4pCDhQ>gO7{+uAm%3Iev*jQMpY`#u|hkN`ue5D zlExMBK9;m|2I!5yq?x>wzcvvAZbsewZ8*+D9pT7Aj}=~xb|^~s)% z;TLabP`dC-DU)@%vXJzJm;mJOM*<~s+0w_{gXf&HJ$r_N$skPyGW2C&;v-1yVXyL= zAuao`M)y9^D;D$6Awl-K_jGX`UE_kZRg??kO6H)oYbatERVSB;a1nL;Ms zV;>#u&n85CiQ$AfX&qaOv&)V)FpSTUsR(NmwkbCRgX6+#)=Zpa=gES9Op;OET7AIpb4L<*C#c94V; z+YcPqn}dDtdCor6t8lMA>9MKH(MR6RH11z`S5t2yeCI0K>B|_)XDGkbqmnu1Ty%SB z)|SQt7Sf=4OK}OH6_U?uD)>8!h1)&lrO85v7#-O^iZEY@V zzsNf9p>uTT@UJSPO^QuWnpI>n+`gA4BP7Tc>6>+DIGU0=*bI!CkFVpnE07?cTj5?l zDSyTU)@x`fbUhLc{=C@rE{OmfDUIAee@&-egL5QWBrH;UX|P|YIjHvz1Yf0wff)2< zVyH)>67v@lueIN~4U@Yl(;K&&5ywtFd2lnIm+s=zrf7&_3KtgJgU!7> zB5WqSRYdM}T-5F{CEmkUPc*WN!ZCkpVm>8jT=fmIU~m5k$s1ssS8N5RYgxXSZ-vK0 zWCn)YdfZtlsEWXNK*$;ZsERHY7nMq)>Hs|XFo|y9(U3dGaGA>!Q87kDKc8Boiy9p z0~vC#@~#Q*O7}kiY0?*#6mL&-IUCbN>B;1rUc2Qq(IAI1ZXn~?>m>bsNwB+z zoOo`805YIihnQnN*KafJrJi$d!}|$vm~avo5LKA~cH^as`2Cg1kl>d&I{S@N+s~O- z&vYjS{Qc*i4*~i6J$)W=V5@lGvKa+aEQ zojO}&xK>6cb$l3XY+$VZ?2PL+=PbQE&0#s;eEwj^vv;IZ@0}1-;Kc!{%_oYBO0M4G zuH%G8AI{Dj7Gz1*(+A*O`op6&hv+V!9al4`0_r{%0?*gSYR@x5saber+mQ{6B*sYv;*U2@Ch{@6z@V#%vSzA6tCQm zp<5j}GR-WWi6O&%)+oEkt6yw>avrBMhFNao24N&y9XcdFq_SVF?yOxI=7u|?lHO%j z37Bk)>H6gD5O8l3{D_=@{M8|W z-F{T1s_A|e(^OnHDC1HI&u#l`K0kfqT=U_i^vDE^&mq+*ra`anfeHnW<`|g#6U&fX z8ci&^sYQr+%6gsWg%1O!Fat0SpRMFKF$gXu0_s!l*aUKpmb!4wr-OnHpC}3OWf7vZ z)bq0H>vN2;tcq*_H5)Qe5mF(WJEQkM>wECr#X}QeKG=pT$&3NYB75u+G*SC`RfFhY zkFh3fmNWQGL*H(g&Cg+iuk=rqh#qV5(*^m4ip|kWc;y)WFkp`8}f@x(vj5{T1Wo^N87wDBKjk ztNO=e5|EBTm~c6yJeB@2Po;xt+GA43tZc?3%Ex!!xxE$m2Y{RZKF|VM#N!a-*Wh@H zS`I&XBb^v`3gJDw;U_=I>p!WX1M`qZ6e`BA&BJZ%hkq2ky@F`ZiD*AA4jt-%tt|+c zXH(;d-H^Nc4CA|5JWnh%9|h+Lmb`rY574(7BSXOSrSQ(1iu7UKPkTM>ByP_Fp3zEq zE-H&ZC=lQ&>2m|qb`L*{)+^mb?nq*jm|eKXlNAXjTn1`2e@5-dY?tsd ztu!?(%I-s(4=>Qj;j+EMZ&0Ie@>5LvtoDtkwM2_pe^Z+^eQ$osAeQ=FTJV{~+NU5V z{$|_bOJv!bR1n+(n528Ony%@i1Z9WUDj;}PU3Be*2NQB-3X;1%4a!bPn}aN-h!^?D~0c-|=bEbb^KZB~yfNyZ9yIAk@T*Z`NK@L~ZpJl<<^E@dN@sooGG%nI3 zHP$ z$j%}6!ObD9aQ@@QM>Yu->5QEpb{7eO*{shWDX0o?DV$=XE>8)+$c z^>}Sj&oJqDv_!cy; zX~h#U?bwQz)A6bm)tpILzD+z4KEc_}X~UkZtaeXFgo&eUe@)LW7qZy(v>(9j^Wd<6 z7@|lKdN*PmROh#jIm|$jawMOmDE2JJ$LZN4zg7GKrYJ_-V!;ODZWWyG*HGe{p!2+5 zgs!QM0+uE@+NoyE4}M%|L*eAHvl=7Wa~)+%m*RWHk9Tl3>cug$q0ii?*sK6_4z}3| z4Lx-s{#3b9&h&UlKocgwDKTc@@))2`RW3@eCe>SIGkTYq%}xHSA>9sSIKir4K{T$d zyoJ-7npjl8l+-X~w#hL@4PVa<8N|p!$aw1e4LqvQ4wXc##Rz0Rp5Y0x*!=xm?IdKB zpOiui6&V)h znU(xq2ai9jl>j|Bum4(kPf_37ClCnn3@_d}W6HYD@Z`|nD}$@d-lvK9Y6Dy|*o_ct zVLQH}fh}dy%M0fFHfSE&-qYiL#bT`R&CDh+8Iae3FlF_5J1e|0PWytEq3@YHPC~G>cUc0p((OE`?SD{Oi&Mq#tf}t%LPn5-y5#m9%FJ2on1O1ut^b zVkd^MwA8dY!~Aiy=V@WCEm!GMw5ycGs^$3hY=`eyhb(9+c^NUs-^_&hv=G_!uDQzQ znQ!+#lkmMH_-dQMG1&d-!PAeP)c!kBN{R1hJ1q@b8AwG-DTfEkak;_V16HO3(1Z#r zc9FO{c-L~dkLq#gVpN0~Rzv7eozYc(!r~J|@SAyxbwyK5kSd<}ZSA*g-Atoq%aWZG z1Ld@@(4Jai^M;2=&AVR>xa;~PVakm#h4AWBhIRGJ8fqI5)pv!hDthxl_NEvvf&-6- z6s*@KNH2r1tnZr{FZH$>^AbGX2R%Okg+TM4vZtp}vM?9wu~FhmSiHQUGScfK?6tPO zicI#2#}XBeRb=Rx6%P|w7XRJ!ccqOUO?5-zH(ckK9@G7WE+vpWr4288 zEsdd`e}@~^g29Q)cLJ`qsZ!<@W$r&rpx)`X`m0Ri3a&H zJRR|muuUh^fQSzfwu*N{%Gv7-Ehp}8eTC>6U^q2yqZXlXx!H}GJE5$p{8kk&PbplT zvD~`B4BgFDEp7Z+8H^OxG5TN&-byu#<{~ge`pXwn0=$I=)L65NCZ!;t_nV*bNpCDR;&E0A>oY5J*YC?2qjQr$A^m39WST{CQ z*rQCF&zZqC?No`ju&+yX-Lq7#4WBht;6Kw|PFT?1+2F2CBE z&DKd;NA0%#38x<5RyL3JC?v`iaN@T4Nqg+d-d74W!gtG}KVJhH@QR`7- zJ>6RIce81QYLgP=JCWvHJlr{{p&2bSvCia&FmD6r?#gs6XDMT0U%RZ8M`=xfjCxea z#Wuf0%F+5Gb4Tw1N*hha+sdyQ=g(W=R^Bp&b@~QblQTW$3_J(!|HQF&bH9*?(0IZ5 zBVXa7QEa~LVh-yW7uO#$0#Ts}))GpVnLwr4du%6xd{X;geL-Zgzsg*Wt{Pu64xVl4 zym_5R?4#moOxZj049|z9W8*JlA8Cl;@2gSfIA1g)ldn5d$PC;V7@jg{!h#lo=A(WUfX5z(2dH#K18Lv4gb z|6GNHE-tz~+e`n}L;p-}skC*A*tK=LchY-Rtb)DDyzbL;tY~5%iYQbdN!Iz0WovW# zZ=*EwU|AKuSrA!+e!^NKC_Yrf#gjmKm=AHOxxkrt5?XMNJhSDJnePT_K}j>Bz^gD~ zqZOZi;o)tUw&bl+2OhoHBjxZIEi%Sx4w9G@n)Eg1#YOJD?ecS>ah&wfF+^0hF6`>` zH94QL>uy3Gn8&=xhSRJ8UpBrn{i~Hyp$tn`qqcZg+L6(8{yu>{BtAqhRP2Z=nmsInlfD0DvvDla}Ft^EsK!IV2%wClxI1DC!A*RHR4 zXS_+%9k0ZxBr;%QkNE`=(Le0sW}Hml!$Y?dp&6c8h_(8b5l_+LT}uh5n)QW>SH0gK zudI_3d5l*R={^yB2sjw{exSY4dBr%58opfIpUpr`bk>l_uh56tYU8P&OUhHABg)IO zl2D!9(T2Ve1p0*Z(+GU*eUXjct^C3FFzb^Wc0^&f8=Y_i0)^8CJTkF9m%eLTE42N_ z?&Nvif~rf8+wLTlYl+dG%g;+M`|`qbYy89M?w3kM)^9n2-3U8zP$$op)pY}&6=%L+ z*Jd}ITTc5CiF{o)1Cu7LC=Y1t*^~6!maHm=$7P3)mNMWUp#D?O8Nl&vyN^+8;ij=@ z@-I(ku^vI^&Z`2gbY0~|i~7gna(TGC(h?xB7P0IPte}z|F{odVQI(lIT2?UuhF_1B zwa|~Ii#|1U4P(1^K%rI;^yhC`t7(^QN*0u}rqN|AJ&}IPrz^8^N^8}yy?j7Ibc^Ne zO^Ap85AZVr)NPUFve8|&azZ2J%8o);_kouw+7fPzWULs-$A){&1Ayaefp3?#Hr6C> zj6KOr@r^G&$qd7nbqx+HBJ;6n`Lz|z&9#Bpm|xFPg?SSQ#G0*L=;B?a^svC{3q+yE zXeTerK(P52O)6~!u3dXn_CxPq-*ta|iFcDp`IW-t%4c$65KAc2?-43Vn+E-l_r2 zIv3}SmI-|w=vPIw<*sW7A45HV136=QRGcpO(Z3@2N2S7j$)V^koMtx`J^udh9Pg>4 zWIrb>7X5vT7=ce}0eaK9lFn)K0sm72Y&tkCQP8KG@I1nW7EhygIs+3AjI=u*pxZ>{m{QE5%qW zy^y2KGKM*P&E4M7C0d@%JW`Vm3pFb|TP|Pe{H7o0H8HrIcvd?Tddl?=;7+%IK0aKi zoO3!oH?$mrWWFwth!&r!>UnfOt<;)p8^-mA#Ozl@HM#GLX3#SFbM%VhwlaEtjx5vh ze#GL(Pr#C_kj;s74_d!mPL3p^}}_*JEhWgQ$PXc^!!Q z2hao_du!kCP0`9ZKI4I=u zvhw|T*)N@7{8!KewzY|5LZll^-N;%yoy`d&XtF&ZlNOXou;a}+8Ie89%f^+zi&Ho& zFO>dMkTrBYt)^w&)e`Oi04O)lwo0n)+*3Pj{%etWGTL0U`!XcztEoP$g%$*J*=8>G z!-(;X<9w(4GoOdSaIKxO844Wp9fAhoekGYc@A4Qgvpu|L@;NYHR6Lh{ix=D2tgLQ$ zC$)pd;{~KsgKy3o$UYuWJPr>qib}(~RRp}_CVXJS829|?#>*bM&3flmf06#ht~~n@ zRf8cHwh11Nq8%v3mgEED)%vq+=|K>O_wiZXUolrZo*AY%h?*2x)Ku{2s+(hDDNUTY z4sWxYAm2~@L$H`onf!#pt7Eay_sR0NY{nuB=_R}CgciDs2 zX;n-Cu5_M7`hfvfHh%~`Ye3XG9owt_02q7tODgT`sBibh;NR?26Mp_;_}xexGr}2- zI3c?TriSmP?AiqiRm5c`D~F;#4ozfWg=O96l1ua(NgNFsLeQ6@Td$iN6#fCSynZJI SJ`I+I*6WWhc1x!HTmBz(0n&H? literal 0 HcmV?d00001 diff --git a/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0004.jpg b/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0004.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8a559e7f24ed8bc9d760e074bea30960455198c GIT binary patch literal 10404 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 literal 0 HcmV?d00001 diff --git a/testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0002.jpg b/testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46b04ead26c5ab7eba35fc97080cc811eb7192be GIT binary patch literal 7517 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 UcCM2;I)e4}k4ZALLT5Ao1-@+_FaQ7m literal 0 HcmV?d00001 diff --git a/testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0003.jpg b/testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0003.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fb067261e4f4089350d10c5b1d3bb810639554ff GIT binary patch literal 7827 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 Si^0ZlV*c_M|5YmeS^FOk{EjLB literal 0 HcmV?d00001 diff --git a/testing-python-week2-main/images/Olivia_Newton-John/Olivia_Newton-John_0001.jpg b/testing-python-week2-main/images/Olivia_Newton-John/Olivia_Newton-John_0001.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6acfeeafd929a85f526220f9e46bf4ffea4585d GIT binary patch literal 8220 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 literal 0 HcmV?d00001 diff --git a/testing-python-week2-main/tests/test_api_users.py b/testing-python-week2-main/tests/test_api_users.py new file mode 100644 index 0000000..c9ddd06 --- /dev/null +++ b/testing-python-week2-main/tests/test_api_users.py @@ -0,0 +1,48 @@ +def test_register_user_api(client): + image_path = 'images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg' + user_id = 'aaron_peirsol' + + with open(image_path, 'rb') as img_file: + response = client.post( + '/users/register', + data={'user_id': user_id}, + files={'image': ('user1.jpg', img_file, 'image/jpeg')}, + ) + + assert response.status_code == 200 + data = response.json() + assert data['user_id'] == user_id + assert data['registered_at'] is not None + +def test_authenticate_user_api(client, setup_user_db): + image_path = 'images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg' + + with open(image_path, 'rb') as img_file: + response = client.post( + '/users/authenticate', + files={'image': ('user1.jpg', img_file, 'image/jpeg')}, + ) + + assert response.status_code == 200 + data = response.json() + assert data['user_id'] == 'aaron_peirsol' + +def test_get_registered_user_api(client, setup_user_db): + user_id = 'aaron_peirsol' + + response = client.get(f'/users/{user_id}') + + assert response.status_code == 200 + data = response.json() + assert data['user_id'] == user_id + assert 'registered_at' in data + +def test_delete_registered_user_api(client, setup_user_db): + user_id = 'aaron_peirsol' + + response = client.delete(f'/users/{user_id}') + + assert response.status_code == 200 + + response = client.get(f'/users/{user_id}') + assert response.status_code == 404 \ No newline at end of file diff --git a/testing-python-week2-main/tests/test_face.py b/testing-python-week2-main/tests/test_face.py new file mode 100644 index 0000000..41b3148 --- /dev/null +++ b/testing-python-week2-main/tests/test_face.py @@ -0,0 +1,66 @@ +import pytest + + + + +from app.face.face_embedding import extract_embedding, verify_embedding + + + + +def test_extract_embedding(): + + image_path = "images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg" + + + + + embedding = extract_embedding(image_path) + + + + + assert embedding is not None + + assert len(embedding) > 0 + + + + +def test_no_face_exception(): + + image_path = "tests/images/no_face.jpg" + + + + + with pytest.raises(ValueError): + + extract_embedding(image_path) + + + + +def test_verify_embedding(): + + image_path1 = "images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg" + + image_path2 = "images/Aaron_Peirsol/Aaron_Peirsol_0002.jpg" + + image_path3 = "images/Olivia_Newton-John/Olivia_Newton-John_0001.jpg" + + + + + embedding1 = extract_embedding(image_path1) + + embedding2 = extract_embedding(image_path2) + + embedding3 = extract_embedding(image_path3) + + + + + assert verify_embedding(embedding1, embedding2) + + assert not verify_embedding(embedding1, embedding3) \ No newline at end of file diff --git a/testing-python-week2-main/tests/test_service_users.py b/testing-python-week2-main/tests/test_service_users.py new file mode 100644 index 0000000..93c5a13 --- /dev/null +++ b/testing-python-week2-main/tests/test_service_users.py @@ -0,0 +1,54 @@ +from app.services.user_service import * + +def test_register_user(): + image_path = 'images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg' + user_id = 'aaron_peirsol' + + with open(image_path, 'rb') as f: + image_data = f.read() + result = register_user(user_id, image_data) + + assert result['user_id'] == 'aaron_peirsol' + assert result['registered_at'] is not None + +def test_authenticate_registered_user(setup_user_db): + image_path = "images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg" + + with open(image_path, 'rb') as f: + image_data = f.read() + user_id = authenticate_user(image_data) + assert user_id == 'aaron_peirsol' + +def test_authenticate_unregistered_user(setup_user_db): + image_path = 'images/Natasha_McElhone/Natasha_McElhone_0001.jpg' + with open(image_path, 'rb') as f: + image_data = f.read() + + user_id = authenticate_user(image_data) + + assert user_id is None + +def test_get_registered_user(setup_user_db): + user_id = 'aaron_peirsol' + + user_info = get_user(user_id) + + assert user_info['user_id'] == user_id + assert 'registered_at' in user_info + +def test_delete_registered_user(setup_user_db): + user_id = 'aaron_peirsol' + + result = delete_user(user_id) + + assert result is True + + user_id = get_user(user_id) + assert user_id is None + +def test_non_authenticate_user(setup_user_db): + user_id = 'non_existent_user' + + user = get_user(user_id) + + assert user is None \ No newline at end of file From 43d8cd95d4cf240b3bfbb3f5ef64a5ef26822e2d Mon Sep 17 00:00:00 2001 From: meem3443 Date: Mon, 2 Jun 2025 15:42:14 +0900 Subject: [PATCH 2/2] finished --- .gitignore | 3 - .vscode/settings.json | 16 ---- app/api/users.py | 32 +++++-- app/face/face_db.py | 19 ++-- app/services/user_service.py | 41 +++++++-- testing-python-week2-main/app/api/users.py | 50 ----------- testing-python-week2-main/app/face/face_db.py | 25 ------ .../app/face/face_embedding.py | 8 -- testing-python-week2-main/app/main.py | 12 --- testing-python-week2-main/app/models/user.py | 8 -- .../app/services/user_service.py | 49 ---------- testing-python-week2-main/frontend.py | 85 ------------------ .../Aaron_Peirsol/Aaron_Peirsol_0001.jpg | Bin 7877 -> 0 bytes .../Aaron_Peirsol/Aaron_Peirsol_0002.jpg | Bin 9700 -> 0 bytes .../Aaron_Peirsol/Aaron_Peirsol_0003.jpg | Bin 8421 -> 0 bytes .../Aaron_Peirsol/Aaron_Peirsol_0004.jpg | Bin 10404 -> 0 bytes .../Natasha_McElhone_0001.jpg | Bin 8903 -> 0 bytes .../Natasha_McElhone_0002.jpg | Bin 7517 -> 0 bytes .../Natasha_McElhone_0003.jpg | Bin 7827 -> 0 bytes .../Olivia_Newton-John_0001.jpg | Bin 8220 -> 0 bytes .../Olivia_Newton-John_0002.jpg | Bin 8232 -> 0 bytes testing-python-week2-main/requirements.txt | 11 --- testing-python-week2-main/tests/__init__.py | 0 testing-python-week2-main/tests/conftest.py | 20 ----- .../tests/images/no_face.jpg | Bin 1651 -> 0 bytes .../tests/test_api_users.py | 48 ---------- testing-python-week2-main/tests/test_face.py | 66 -------------- .../tests/test_service_users.py | 54 ----------- tests/conftest.py | 20 +++++ tests/test_api_users.py | 48 ++++++++++ tests/test_face.py | 66 ++++++++++++++ tests/test_service_users.py | 54 +++++++++++ 32 files changed, 265 insertions(+), 470 deletions(-) delete mode 100644 .gitignore delete mode 100644 .vscode/settings.json delete mode 100644 testing-python-week2-main/app/api/users.py delete mode 100644 testing-python-week2-main/app/face/face_db.py delete mode 100644 testing-python-week2-main/app/face/face_embedding.py delete mode 100644 testing-python-week2-main/app/main.py delete mode 100644 testing-python-week2-main/app/models/user.py delete mode 100644 testing-python-week2-main/app/services/user_service.py delete mode 100644 testing-python-week2-main/frontend.py delete mode 100644 testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg delete mode 100644 testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0002.jpg delete mode 100644 testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0003.jpg delete mode 100644 testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0004.jpg delete mode 100644 testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0001.jpg delete mode 100644 testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0002.jpg delete mode 100644 testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0003.jpg delete mode 100644 testing-python-week2-main/images/Olivia_Newton-John/Olivia_Newton-John_0001.jpg delete mode 100644 testing-python-week2-main/images/Olivia_Newton-John/Olivia_Newton-John_0002.jpg delete mode 100644 testing-python-week2-main/requirements.txt delete mode 100644 testing-python-week2-main/tests/__init__.py delete mode 100644 testing-python-week2-main/tests/conftest.py delete mode 100644 testing-python-week2-main/tests/images/no_face.jpg delete mode 100644 testing-python-week2-main/tests/test_api_users.py delete mode 100644 testing-python-week2-main/tests/test_face.py delete mode 100644 testing-python-week2-main/tests/test_service_users.py diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 511720e..0000000 --- a/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.DS_Store -__pycache__/ -face_db.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index a52bb79..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "flake8.args":[ - "--max-line-length=200", - "--ignore=E203,W503,", - ], - "editor.formatOnSave": true, - "editor.defaultFormatter": "ms-python.black-formatter", - "[python]": { - "editor.defaultFormatter": "ms-python.black-formatter", - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.organizeImports": "explicit" - }, - }, - "isort.args":["--profile", "black"], -} \ No newline at end of file diff --git a/app/api/users.py b/app/api/users.py index 043dd98..6691f3d 100644 --- a/app/api/users.py +++ b/app/api/users.py @@ -1,5 +1,6 @@ -from fastapi import APIRouter, File, Form, UploadFile +from fastapi import APIRouter, File, Form, UploadFile, HTTPException from app.models.user import UserResponse +from app.services.user_service import * router = APIRouter() @@ -7,22 +8,43 @@ @router.post("/users/register", response_model=UserResponse) async def register(user_id: str = Form(...), image: UploadFile = File(...)): """회원 등록 엔드포인트""" - pass + image_data = await image.read() + registered_user = register_user(user_id, image_data) + return UserResponse( + user_id=registered_user["user_id"], + registered_at=registered_user["registered_at"], + ) @router.post("/users/authenticate") async def authenticate(image: UploadFile = File(...)): """회원 인증 엔드포인트""" - pass + image_data = await image.read() + user_id = authenticate_user(image_data) + + if user_id is None: + raise HTTPException(status_code=401, detail='인증 실패: 사용자 없음') + + return {'user_id': user_id} @router.get("/users/{user_id}") def get_user_info(user_id: str): """회원 정보 조회 엔드포인트""" - pass + user_info = get_user(user_id) + + if user_info is None: + raise HTTPException(status_code=404, detail='사용자가 존재하지 않습니다.') + + return user_info @router.delete("/users/{user_id}") def delete_user_info(user_id: str): """회원 삭제 엔드포인트""" - pass + result = delete_user(user_id) + + if not result: + raise HTTPException(status_code=404, detail='사용자가 존재하지 않습니다.') + + return {'message': '사용자가 성공적으로 삭제되었습니다.'} \ No newline at end of file diff --git a/app/face/face_db.py b/app/face/face_db.py index 380ae3a..eaf2b39 100644 --- a/app/face/face_db.py +++ b/app/face/face_db.py @@ -1,16 +1,25 @@ +import json +import os +from datetime import datetime + DB_PATH = "face_db.json" def save_user(user_id, embedding): """사용자 등록""" - pass - + db = load_db() + db[user_id] = {"embedding": embedding, "registered_at": str(datetime.now())} + with open(DB_PATH, "w") as f: + json.dump(db, f) def load_db(): """데이터베이스 로드""" - pass - + if not os.path.exists(DB_PATH): + return {} + with open(DB_PATH, "r") as f: + return json.load(f) def save_db(db): """데이터베이스 저장""" - pass + with open(DB_PATH, "w") as f: + json.dump(db, f) \ No newline at end of file diff --git a/app/services/user_service.py b/app/services/user_service.py index 410b807..fa1ce6a 100644 --- a/app/services/user_service.py +++ b/app/services/user_service.py @@ -1,18 +1,49 @@ +import cv2 +import numpy as np +from datetime import datetime + +from app.face.face_embedding import * +from app.face.face_db import * + def register_user(user_id: str, image_bytes: bytes) -> dict: """이미지와 ID로 회원 등록""" - pass - + image_np = np.frombuffer(image_bytes, dtype=np.uint8) + image = cv2.imdecode(image_np, cv2.IMREAD_COLOR) + embedding = extract_embedding(image) + save_user(user_id, embedding) + return {'user_id': user_id, 'registered_at': str(datetime.now())} def authenticate_user(image_bytes: bytes): """이미지로 회원 인증""" - pass + image_np = np.frombuffer(image_bytes, dtype=np.uint8) + image = cv2.imdecode(image_np, cv2.IMREAD_COLOR) + db = load_db() + + embedding_to_check = extract_embedding(image) + + for user_id, data in db.items(): + if verify_embedding(data['embedding'], embedding_to_check): + return user_id + + return None def get_user(user_id): """user_id로 회원 정보 조회""" - pass + db = load_db() + user_data = db.get(user_id) + + if user_data: + return {'user_id': user_id, 'registered_at': user_data['registered_at']} + else: + return None def delete_user(user_id): """user_id로 회원 삭제""" - pass + db = load_db() + if user_id in db: + del db[user_id] + save_db(db) + return True + return False \ No newline at end of file diff --git a/testing-python-week2-main/app/api/users.py b/testing-python-week2-main/app/api/users.py deleted file mode 100644 index 6691f3d..0000000 --- a/testing-python-week2-main/app/api/users.py +++ /dev/null @@ -1,50 +0,0 @@ -from fastapi import APIRouter, File, Form, UploadFile, HTTPException -from app.models.user import UserResponse -from app.services.user_service import * - -router = APIRouter() - - -@router.post("/users/register", response_model=UserResponse) -async def register(user_id: str = Form(...), image: UploadFile = File(...)): - """회원 등록 엔드포인트""" - image_data = await image.read() - registered_user = register_user(user_id, image_data) - - return UserResponse( - user_id=registered_user["user_id"], - registered_at=registered_user["registered_at"], - ) - -@router.post("/users/authenticate") -async def authenticate(image: UploadFile = File(...)): - """회원 인증 엔드포인트""" - image_data = await image.read() - user_id = authenticate_user(image_data) - - if user_id is None: - raise HTTPException(status_code=401, detail='인증 실패: 사용자 없음') - - return {'user_id': user_id} - - -@router.get("/users/{user_id}") -def get_user_info(user_id: str): - """회원 정보 조회 엔드포인트""" - user_info = get_user(user_id) - - if user_info is None: - raise HTTPException(status_code=404, detail='사용자가 존재하지 않습니다.') - - return user_info - - -@router.delete("/users/{user_id}") -def delete_user_info(user_id: str): - """회원 삭제 엔드포인트""" - result = delete_user(user_id) - - if not result: - raise HTTPException(status_code=404, detail='사용자가 존재하지 않습니다.') - - return {'message': '사용자가 성공적으로 삭제되었습니다.'} \ No newline at end of file diff --git a/testing-python-week2-main/app/face/face_db.py b/testing-python-week2-main/app/face/face_db.py deleted file mode 100644 index eaf2b39..0000000 --- a/testing-python-week2-main/app/face/face_db.py +++ /dev/null @@ -1,25 +0,0 @@ -import json -import os -from datetime import datetime - -DB_PATH = "face_db.json" - - -def save_user(user_id, embedding): - """사용자 등록""" - db = load_db() - db[user_id] = {"embedding": embedding, "registered_at": str(datetime.now())} - with open(DB_PATH, "w") as f: - json.dump(db, f) - -def load_db(): - """데이터베이스 로드""" - if not os.path.exists(DB_PATH): - return {} - with open(DB_PATH, "r") as f: - return json.load(f) - -def save_db(db): - """데이터베이스 저장""" - with open(DB_PATH, "w") as f: - json.dump(db, f) \ No newline at end of file diff --git a/testing-python-week2-main/app/face/face_embedding.py b/testing-python-week2-main/app/face/face_embedding.py deleted file mode 100644 index 3acfb0c..0000000 --- a/testing-python-week2-main/app/face/face_embedding.py +++ /dev/null @@ -1,8 +0,0 @@ -def extract_embedding(image): - """이미지에서 임베딩 추출""" - pass - - -def verify_embedding(embedding1, embedding2): - """두 임베딩이 같은 사람인지 검증""" - pass diff --git a/testing-python-week2-main/app/main.py b/testing-python-week2-main/app/main.py deleted file mode 100644 index 36e30a0..0000000 --- a/testing-python-week2-main/app/main.py +++ /dev/null @@ -1,12 +0,0 @@ -from fastapi import FastAPI - -from app.api import users - -app = FastAPI() - -app.include_router(users.router) - - -@app.get("/") -def read_root(): - return {"message": "얼굴 인식 기반 회원 관리 API"} diff --git a/testing-python-week2-main/app/models/user.py b/testing-python-week2-main/app/models/user.py deleted file mode 100644 index 3958dd5..0000000 --- a/testing-python-week2-main/app/models/user.py +++ /dev/null @@ -1,8 +0,0 @@ -from pydantic import BaseModel - - -class UserResponse(BaseModel): - """회원 응답 모델""" - - user_id: str - registered_at: str diff --git a/testing-python-week2-main/app/services/user_service.py b/testing-python-week2-main/app/services/user_service.py deleted file mode 100644 index fa1ce6a..0000000 --- a/testing-python-week2-main/app/services/user_service.py +++ /dev/null @@ -1,49 +0,0 @@ -import cv2 -import numpy as np -from datetime import datetime - -from app.face.face_embedding import * -from app.face.face_db import * - -def register_user(user_id: str, image_bytes: bytes) -> dict: - """이미지와 ID로 회원 등록""" - image_np = np.frombuffer(image_bytes, dtype=np.uint8) - image = cv2.imdecode(image_np, cv2.IMREAD_COLOR) - embedding = extract_embedding(image) - save_user(user_id, embedding) - return {'user_id': user_id, 'registered_at': str(datetime.now())} - -def authenticate_user(image_bytes: bytes): - """이미지로 회원 인증""" - image_np = np.frombuffer(image_bytes, dtype=np.uint8) - image = cv2.imdecode(image_np, cv2.IMREAD_COLOR) - db = load_db() - - embedding_to_check = extract_embedding(image) - - for user_id, data in db.items(): - if verify_embedding(data['embedding'], embedding_to_check): - return user_id - - return None - - -def get_user(user_id): - """user_id로 회원 정보 조회""" - db = load_db() - user_data = db.get(user_id) - - if user_data: - return {'user_id': user_id, 'registered_at': user_data['registered_at']} - else: - return None - - -def delete_user(user_id): - """user_id로 회원 삭제""" - db = load_db() - if user_id in db: - del db[user_id] - save_db(db) - return True - return False \ No newline at end of file diff --git a/testing-python-week2-main/frontend.py b/testing-python-week2-main/frontend.py deleted file mode 100644 index 70f1346..0000000 --- a/testing-python-week2-main/frontend.py +++ /dev/null @@ -1,85 +0,0 @@ -import requests -import streamlit as st - -API_URL = "http://localhost:8000" - -st.set_page_config(page_title="얼굴 인식 회원 관리 시스템") - -st.title("얼굴 인식 회원 관리 시스템 🚀") - -menu = st.sidebar.selectbox( - "기능 선택", ["회원 등록", "회원 인증", "회원 조회", "회원 삭제"] -) - -if menu == "회원 등록": - st.subheader("📝 회원 등록") - - user_id = st.text_input("사용자 ID") - image = st.file_uploader("얼굴 이미지 업로드", type=["jpg", "jpeg", "png"]) - - if st.button("등록하기"): - if user_id and image: - files = {"image": (image.name, image.getvalue(), image.type)} - data = {"user_id": user_id} - - res = requests.post(f"{API_URL}/users/register", data=data, files=files) - - if res.status_code == 200: - st.success(f"등록 성공: {res.json()}") - else: - st.error(f"등록 실패: {res.json().get('detail')}") - else: - st.warning("ID와 이미지를 모두 입력해주세요.") - -elif menu == "회원 인증": - st.subheader("🔑 회원 인증") - - image = st.file_uploader( - "인증할 얼굴 이미지 업로드", type=["jpg", "jpeg", "png"], key="auth" - ) - - if st.button("인증하기"): - if image: - files = {"image": (image.name, image.getvalue(), image.type)} - - res = requests.post(f"{API_URL}/users/authenticate", files=files) - - if res.status_code == 200: - st.success(f"인증 성공! 사용자 ID: {res.json()['user_id']}") - else: - st.error(f"인증 실패: {res.json().get('detail')}") - else: - st.warning("이미지를 업로드해주세요.") - -elif menu == "회원 조회": - st.subheader("🔍 회원 조회") - - user_id = st.text_input("조회할 사용자 ID") - - if st.button("조회하기"): - if user_id: - res = requests.get(f"{API_URL}/users/{user_id}") - - if res.status_code == 200: - user_info = res.json() - st.json(user_info) - else: - st.error(f"조회 실패: {res.json().get('detail')}") - else: - st.warning("사용자 ID를 입력해주세요.") - -elif menu == "회원 삭제": - st.subheader("🗑️ 회원 삭제") - - user_id = st.text_input("삭제할 사용자 ID") - - if st.button("삭제하기"): - if user_id: - res = requests.delete(f"{API_URL}/users/{user_id}") - - if res.status_code == 200: - st.success("성공적으로 삭제되었습니다.") - else: - st.error(f"삭제 실패: {res.json().get('detail')}") - else: - st.warning("사용자 ID를 입력해주세요.") diff --git a/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg b/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg deleted file mode 100644 index d43ff092f28ffce2aec5681158512872bed1dbcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7877 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 diff --git a/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0002.jpg b/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0002.jpg deleted file mode 100644 index 8b94bbc8e06fe344374ac5a56f39854b0759179e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9700 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 D&cB~# diff --git a/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0003.jpg b/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0003.jpg deleted file mode 100644 index a0962cd5a0ff518ebdea1c7527700975a5892fb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8421 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 SJ`I+I*6WWhc1x!HTmBz(0n&H? diff --git a/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0004.jpg b/testing-python-week2-main/images/Aaron_Peirsol/Aaron_Peirsol_0004.jpg deleted file mode 100644 index f8a559e7f24ed8bc9d760e074bea30960455198c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10404 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 diff --git a/testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0002.jpg b/testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0002.jpg deleted file mode 100644 index 46b04ead26c5ab7eba35fc97080cc811eb7192be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7517 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 UcCM2;I)e4}k4ZALLT5Ao1-@+_FaQ7m diff --git a/testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0003.jpg b/testing-python-week2-main/images/Natasha_McElhone/Natasha_McElhone_0003.jpg deleted file mode 100644 index fb067261e4f4089350d10c5b1d3bb810639554ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7827 zcmbW*Wl$VUw;T2p}0&s8u0Gz)A@Mi;{1|TFL z01@C5fiHL8VXugCU!PfCKeVBZc#oCPGK$<7Jg{~VKH$jDJgb7 zsDg}yyr`s<#J@MeAtE9oB_U-XBV&+w#PUeu|2h8j1E>fAKLI~+aX0}$DjZxYoIisA z_P^)E$N7%{{LjDv;^N^GfC!0*N&XhJQv!fExVS((Tzq^yyua1Y|E>e@sPL&DiK`IM z7(0SE185~;Gs_6MRGUA5P3FFGOF9L{5fRhTGcYpo@bd8s2ueYoNXtNF)zmdKwX}6~ zP0h?LEUjSH&MvNQ?jD|ALBS!RVc`*x@h@K`yiQC)WFfP2a`W;FP~{bsRn;}Mb?BDX zw)T$BuI`?JkAp+QBco&E^9zeh%PXsE>z{Y`_74uRUyhEyU0z+^+NC%`f7AX$_TPiW{eQ{+7wmt#)&ZorIDa1xmkOW+xciOZF9rS|Ss;Aw zs{CzZ@=K&d8OKu2TnK^Dz~)ZMN7~Ou*GT2k2g(@xa`4?x#NMHb73gj@NRt^xEF6DH z+B}Yk9a3KL8_1Jm7tjfY;>O&DFFK?5{{UVo1Sf*i3;ZX==PcRxOxhYE+aRYhBsq_>^E3O%m6ZMf%#AV33-57HRT_@x<)}mk z5d3KFEPmduz>L95F~&!<$n=4Rj}^y~;%2Scl#*ACAMT1QLl;OxYA4q&U{NZo`{iGk zD|pXNSgelvu1Y2#ZjXs4)grzd*HjOQl+1u<8T*b>{Q)OW-=q!e*)w$7ZHG*zA2s2R zVE6n17-)=P)+7(1h z!XC1MDL61p^wulo6%*;m!c;C;wQb-MRgVU%H}^QUPHGN0CS?^WReTp^#`~kBN3ak) z9Hh}Qs2C%rIWz!e%uc@ImgwI_vqk=Ot ziL;=kcz9yfdx$hnv*I6ThBmRiq~d1us;5<}`l1ilRd};NAKbdqGazcygbIbnCBrIE zb)`F@SBgJY1w!}=&H`zsXj7N-+5r*)Js{8mq|myOz=T3=xdpwW7l+`l=RURn1p<~v z?WN(H;J){O9@!o)s}CQ|L^|u9Euj@^=JULrs|W#EQ48WT)-em4^DhKm%#w*xRLN5r zY>fajsNg77)wDJwHChL)QBcSzH7An0n8ZLa-$SC!MI~7IkN5>*xT%dhiG@-wYDM2A z3vbdZ;#@;7-%CMj4T;UMROnp}IeVarGdqXG>@t-7+8>E3F}0F@OVYg#fbcWgUC@Q@ zQ|jwAwZ38;w{SeP#kD9$sRvNXGtE7+EjcaoV|~2^tTo7YKCzK@o`^N3nBJ|O@ChtU z^OUZ&nu6sAm{jhE)NQZxUu`Z08nMKLDC@C@$d;MkwNQY?@T#Bl^Hb<1_Zh~gW3&#a zJ*b#XN}+Y?Qa365rG&8X9n(;D-4v;zI^%ymw^X0hd)N z$4r_w(W4wO8((_osm6b1G<>kDsh}HgNYFj?>hTOPqg(1V=8;S(D9~ewW8dUT`H?hb zL>&-$MIQIc+y{4YsTGvNZa`S-Gg&ARR(E=a1Gf!2GO_-E9rY)lv!2yN@4O(YToa)8 z5dr(pll~;`eexp@o9S%7WT(Cggls)}cu`wC4|BU*WpwygX+!0?UCP9r`DGZE^@N^G zxC_{O@(iToKkhnAp)8n&srZOLuwf%= zt#mbK@={ia-_$pS+aH=yOPo1Gwi`iVd7cszoX<=KgE63vq=Rj&$2CS@Y2fnN1Q0ae z=K8f>;vlJPOzgm&CNdLCRrajPRR;hPeWla5exi!{#1l#3HPDs%kv2>IKGU$khmRmL z>426I1aVs-aDkCi7JDt`#(N4%2%?9bvt1ru_mL$Y!{>YvAa;q&AxAGl5v+@Gto8cy z6PvE2X=g4(Rih?ZKRm|Nlu-_4qsB4nSv95Pg-|tPnw@m#&GVG{IxbKQFU4PjeLtoP zNIRCaOh%f$Z3%V%^wV4`;Hgs;t+6$w_d4}*Gx8{XxyHH<4#Rva#-$Xz)YQ2%PycMy zUWbk(duAP{dDuohd~8og_kiAvVSZl-8t3|21@Dn?RuYj1c)Lc+$@{kdfcS~vD^Ii& z3)_wkv?h)Pr1(SYEis2(Ns2F)+j7NWj|9G_Gom||D>r+^?kxM%x;?i@5nH}z%Ir~f z_0}F1+2fzW=1cpsITKgj47Z7tulbZ|@qx)wITu^BGh38_^yeDE+idfDh$YtHBj#K_ zjBBO%s3TsWxLpXEHWru?U^RvsbiJN%bsL5-$_q4VdWWW3t4+=`9r+=)Y+pL`Qescc zsqs)d&lsV1o=P+ zV<0G(p+_+U=_+`mL2FU%ZoG5Pf1!cR4^MXkt%UusEc3J$L5k`EV{)*?pv;7~vVL+* zKwWH{nkdEbKe9Juyei$Vc$0i)5d-VuFO$M=>r!;-UxEcwu4}-%If=bcU*k|)mjGDR zeN0GuqefFg1IxjWDY7q~)N&SDat=5Uc8um^T{DU#EA zMKu((ylt~}R{;W7W-;G?V7Sk`xo)_1tBt#T)(oSYnGv`{UnGd2exA8xL?>@IwZrsp zTXLI8%XgTrMd+sG zT3CD;J+7kQMXVXUCv;(zcP!>zR>-Um_woT8OL#@*-pb#@7<2L#ce_W~Cvx@_Z|1$D zpWG-7*$(cD-2NW!p&Jp}^!@01DR*6?^$0JL$*4E;1*0qUC&EBxuSz2E5RYZiYRV?N z&OpOb6r^JIX7HMUE*m5IQ`(ermW(?o-=TXwyv7X)E!EVgtpszkRmAJqFc!v8sqrC% z=OW+y`THfdZ1h~dAgyfLeP^ka17AMn2{kwCPE8i?2Z%u-r^DxJ3y9oP-qcSDs<&X8 zZT<_Z;^4-Z8_k2(2`1YQ;|}k$w}(#=^IAYP#RO6BWCI6oy)rF-(Uy+E?ESeF@%QMlA;pc02Di zY6HISu^?VQs(4~$FkT*zMdp1rZT8jB7ZM$74^c4c*)0Ypszrb&df3;L6gw}#F1`nFKJ&2bVeO29I zQU$|tqRcSt=b2X{RW#1At)Dj(j=1(f?HZWy7@N9WCrRpJWlSGXOyqreCpF+B!^4rP zKC?nPG+pKOna8)7vq%=ixqKhgXP$6J`1oJ{FdVia^^>9EjamkR129c`hTV?a>1F7m z&!ml5ek9|rrOdLyBx_Q&=H7Y z^b&it)nw(6~eI8vJDeHoSwJ za@|}P45T&Jt#DCAX%RJSaE=lB;QJ{tm1r(xYq4pO4(aRcGN`|0lT8?{(SjldctIe4 z-h^u!3s<4$ZkO0DV(o@42++O_?!QUg{#-n24D=PbT(7KdIV-Kw6$In+cYUtAxnbAL zgT%DRvBw@eE!lE=;AOng^wBi zxyh2*jRL+6(YtSE?N9FFl?>vLl1N6!muYGbR%11qVX#r`a(T+jmJIAg04fWoP(E^z znkW{a*d9KtILg#o0u+_AsMLxrMttWZ%0MLJfex^#z)yDzFX6mtk=~bPs$Gs5M16M}WyuOKvjo&0B8&e%8WR*t$6uzvqOiiB>CwFsG@2y5~ zK5>?pWB3-#-6ZMDRSTgP)K+Yd{P;aDN-`5x)^b*O_f3c9hGe^&%!CVnBYwM=Pb1+< zpq~rRQe@YJL^wVL@um87(j~+cxURyfdny@R z$=qt2C%eH`I>Ib-WM%oC?fE>PqxE+KJx#Fy)SwZala)KI?PPNhhZUISTfOl^F7fJa zt1J8t+F#!v>xPaZ&czcu*!B4Xh~n(v1f3?wT3Lv?Xxe|MuZ+c222>8eUaNDJi#%+D z=Z5SNpjRnG_scLPLXH$^WGZOFlm$2o;$3rM6A_j+qp2Sk*c|ey+G&6fty;@;|v< z`=Ii`@y)_Xd{Eu#F)ek$9~c704;Q(mDB5R)UJo6Kh z5?QLTNW@xSuoiKzC4`*|0vydK@T+e@bRU1GmZdrMTecHQ%w(ldue zm1NxU7(=k1CxQq^A=1Ju z3t4nq>GWNg4#!^()f>g1u=G51w`J}-SOLAY+txC~9E^)nV~6(&ul4DNbci30Ijna_ z`IghCLl!-KG~YD$35b`K`{yNkSH`IbD_b(xRn(Hvg*}#GJ#kQ5j2?{}8!Qd1u3nMS z+nC-?$nqHcdK#lrTL}+Tsi%Ch|DjBXwjd+;o8KK#x91hJn;wZ1Lm1|!!;;k_ik75U z$Yaqp%7(>m>s=l+4X<*?r(eC|sOfa=FT0!W^=}T370sT?aLazg3z5-sG9PreS z3RC=;F?NodA)Cc^kLweypzj-{jZ)KBy%VB=AN?zGM4y0-N8g@TtUXqF=E!*skjj5{hmE~K8%t`$jLe;A(&95VPtSTQ25RiT zB;Q%Kdn#-@b`=-Jgl&H^HTWV7Gq!Q?;QeMXi6-7=Fo{7L*SiV5_AyTIV01E}uDE@^ zL(JRcSI^xkPNfUg=!AtZhOuFCJOXUKR*kr8$L`r0x99ii3FLYAw1gxg>d78r>g&Trz~_5uI1W*3x(1Kd7r}dfEldE!-ML$? zzF@uDSOwU$pIwxe(0&7BKCu1eP5x!qKtWKisymXCL{l=}`t}z|&mO?`3F-Ov|f>jiuG!17&m!Ae>uc*saPtwR!8^a5rH-z2hM|bI80j<) z{6Pw4@=`>aLt?J3CN8Rq?v|(PMs8xv(vQ|z;Us$nqV4n9J##n`AB42sF8fC1l1?|< zVHjk)Z)s`0T*}iuJvSF+jt*Ty3g)fm{@nG|{34(F^0?GApnLFXmLb@67bgjKy#Z$9 z^GPl}M~m&SS}*%mZxUjNP@ZF2$W+@_gI7V!8)Dl+lys0LerDYhg{Nh|Z=qMd&z(4m z%VH6|xy7z31f$FVoL9GOE37JvfD0Mz_YP*{E!ZlhA;FeZpm>gb1opx-%%Hp@o+m%+ z@gxyCt(RK{!&uI3ZlPD~-S}9Ih;yoat)op~ktv?1<+*1AKp7zQZ2;ja5-(L)i;NTB zE@-bCvdx`5<}YtR{_AV>ndqzL7eE0RJ?jYB%f*J!_U85DF! ze9Vh<(c6wk?4#NWR*0e!N4taFGfPTYENFiJv`s6hM-^=V(ti}9s(cp@GYX}I0r&9h z#yFKiyPB&81t_TS-8E(nKv#o`rL<1Z30P~kb1NoH1~oMr%sEUN7l{VhnOCsCiTxsI zHECxRk9Ef|5meAxrCAzLU?h!mT(XSUyX&~A#tt$+uzDc6pjJ0Bk9|X%Bu7Sn-xzf* zNlob8b&9{bh(}#MO>#k)-miQ(NLo=+MwQN%lR? zt^x)f-rZ7{>*`i~7Bk!8oOkfdqN;#N%^koO@3PrEukpcvwDx#Xy=nTosnA@Ddf%Er zs3Q`#94c5~$0(>>Xo)>aB^Yc>&l!NTdfy=Hkfu(h^N&A za$IkEyu0SVp#@%$rO0Q?Ke38L?+87{nggPWHkvK&UMuF{CEEJ+4|zOo=D|mXk9ff; zJE9wjPM3Pz^ld9c^KZ`%%RU@g?5Adq&46)S*i9`8$ViD9uwdSC0Bic^r$3g*DkRDO zHjNnhe|CJ`TMnhbJcK+oQnvw8OI1%5yImoD<_C zo6c9FJJMu#_3HPT@5Jv~EUOTGxB8P&yG8P)S@je05-#z(#3A^`lYz=GOfvFd6k`Re$ixUxTDg@3tijPB^2wf9<9lo5k%c-DhyQ zsV$oGU?FRuvUsZQO18yAd(Vj!r&^6dl>#Jdke#W1SHsgyOFoy-aag+UW?TLQKXjkP zQo&cB!^43Jk2q-}tO3eQ<5GlJ?h3SvC(n5;AM3I4omA8};qXRwy@3VyVJ$8dq#D3};vARbra%RYoCmbX4GyYgL)a%-gL zrG=iE)f9AO&Sx`dAIiE?80!tBwR`=fL|))snYG%KGaSMrgN$?-oCmJX4A-9q=rU=~ zObV&%7@G}mymrtHL$y0ueXKSlK*N_4#|mhTHGDXqh6)8R;>C9b3V9e#A>(OOaiE>MnDvgCR=1 zCz_zh2=wMV6D!-o@`9A2AaR=G)=Wk@gh9*2QyFxvni#K4WLIk>J`_URv&royv(Fvs zL#$BL3zC&SEAa$D4?9o}n`NvN;1B;i(@st-HHYrEy8NRX^rOPq15ev29VC|{5mU5p z63jbvMzy8JH>z@GF3K~*_Rf+-w6%6BbtN$6AOF+eR#O(ayHP0-3p%{pg{ws|!Fvhb zp?v17&o}2dHlz|?cO2qEkRn@c?gSxxZzpCh8<>P#HAL1#E1oE|?P%@=Q5Y!=XW6-u zL}!TOcKgKSHy{N2igd7U@yGL7p(70T{rjkfXT02R`rVs=rR5k6PE`bdHI9wH?irqL zJcE&v?jQyu{Y%}!^x;IX7fd$g{hHEBkesmxg%GJ@D#l_Y{s1n91^!8m$%&J4*D5O$ zZ~cB|u|J8V)D$sa`67}W`)Lc^!RiCOs9+hUrVYUVtJS85vOFLgy-S=p~?<8~eAJwXqI Si^0ZlV*c_M|5YmeS^FOk{EjLB diff --git a/testing-python-week2-main/images/Olivia_Newton-John/Olivia_Newton-John_0001.jpg b/testing-python-week2-main/images/Olivia_Newton-John/Olivia_Newton-John_0001.jpg deleted file mode 100644 index b6acfeeafd929a85f526220f9e46bf4ffea4585d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8220 zcmbW5WmFX0*XW1tlu%EXsBuF*%;{Q=;%3EZ!ocObKc?M=H%ky6}%_H%YRpZi%V2N?CyPO zIXSsIB1&qCGOG7vT}hL4L+=D#g}djKrdfFFP#WF-6mQWg?2 z7LvdHfIHXcq#*f^0RFd-kdl#8P*PFT(9&HSv@runNyx}Z$;l`v$jPs*qpsHhB3d*_!#nI5-yv5GJDI_c+Dkd%ml2=evQr6bd z)zddHGy+>gpfFZx@%}uYUZ? zMFJrEFRbhNzrg+VUIeagxgf z&{0+hFhikb{f1fS!?l)eIl1XQ*jKR}r!P^J=t@@QVQQenvQloa*dk!Bk^Kn>^n5~; zSOM3Ibb}Nd(3>L7db}!n>y!Ag^+!JL*;+dRRRpr(x&<)nk+6_4qgdqb$mawG67qvQ z{-(0U(&PdEmkhbH))dw}dAVM+%&;tJXs-DVx-=9^ttYmc+{h4D=}{~16~=4b;A2EO z;NFoQL93sxuOU9Ul-`5cY(oLplVM13gF(JiS67%IeHAia z%v14d|DWDg`Osr4J^M+k%B=4;`LTV#;P|#~c!9$6vBh z?PXIYuCu2Nz2))Tn3XZm3dp`^pgi*vY@*{v>$ScGzP<(&*u>rbRSP>WCz8XVCgfY4 zTY6R25f`M6_ffztWb22!u@=W3!Z`8h<51x$xaSDf5jsaPS(`Hrd0T^E>H}LJsqIET zfj6tQPOp{vun!_p;-u?k;jo52Y^>-F1i>T$d$}koFbB?Iy_=e*T-e@y_lP{# zodhf9Oq;t^pFPxQR0i+pq=Xe!CVjVf3Mvl7wLTLxVWFx8!}cfSM9Rc0Wd$*yb6{*p zIDaHvmJfrzRrVmj#XJa38s^X>0>ts^RQdh|_`Gzf(ay9qH??yMU_UaqBlhFVFtzrH zgDWR?owifx9WYOAe&4Uf`kXyMwE)wg`7=55kzo*~!-#3M2P9_8n9e@CKbPqjxzVr$RDM~ZrZe6kifI+xdtAjbY^D!1 z{3iQ~V;DD|Z%A{upIE3T&MMaY{U1x=b#cAfkgu|^SYs~Q_WS{jO}rX2ZtVUliKxV8nYy;kdF0Mkw3?Vq_WMRPW$W^FYg+H^&cX0mdhWt@3cIFhp*O!b z?+wRpm3>2KPv5rayy~S@B6fR(;!kKrr*r{C+NbXU!k+4lAD%t~aP@=qHn8Q*=Q;hkfboFLm$?7=c{)JI|dq6^8_ ztvQzoYT1x* z$rFcN5;kw~u)aa~DxW#n?%Z~Zn#uAI7PO%189=qxD!1pvFMDY?G@YBX`#>+ztQq!z z+OO(l&u%`1uL8=ogExZ+lPa-=`AtgCoHR)KUTA(mw4SzpkeA2g28%B#024gJ<+H{~ zfb|Tcz!6o5AV1NY{lp@*?v0O_lmOtvBbtY#ErdIGqmPCH%;KnbUrmK63_syrd>BgK z+D(^!2jzw?@+TjOG(nM~cmqkfP*vJUXr>ss*nk(ENTeS)-ah!IJ=WW>!`ASNFq7U#LhiLf?XR?5x4D1A(-J2Q2~g3Yy8#jlky4e~3=P}*`6WyU zds8geiB0f5QBw(%y&^#_NCdSz+T`t;>r|WFtF$S^WMtcK@wq$?#WItCUsBUuB9aW7 zw;6tlz3#Fmqej{E`}4KkgpO;mBns5yF&py?3-1)@EbMJ1S4UG6Ay?=opq@- zCSCu~2$D|OJ7#0t#HsatKi~n1?L(%lNQaT6tImf>2iP4cm)g%Z`13;kHdyHVkVjl_jegd^X;bpjEyUjcsks1g`rU;iBxW2qRuMTdR#D# zLoyBgxVN_+6XHY}xCdUIyoXuZjhy?O07Fv$NSjCM`PrtwPevsQgf&xXXhu2SPa&nQ=?rIu47mDQlY(~2ffcAv!c{H)leRy0FX!Jw{{bm?-_NP~C62UaX=tw^`# zHL`qo09r(~X*Qr+DHACZqZ|)Y5E((ulr{&crTcZecjA5nXd|oh=x&m zOOooV2l};}Y@%nI(u`aEhPe@tV`}f0RFsXjye2sY5DvTx!QBc9m0K;K7y*#PTInkq za5SZzyzrUo%uCgE2gil}LHR#opf@dJy9qQc6!f+ikQuB!R$9?-dva@1QZ8h%*EJLG z>V2@Ye>?X`n3BQngkgx;e%7EGd!InZHW()8(YX9hOqYev->!E1_|Z^|_ze8z!k~a= z4kcZ<5FqId|X*{nE`i;gZw-4&#|Mq zS73kRBFyR*ZLViaka!8Q+>^A?p`)0#RD$nQtw0enlZj7TJ5SPhU#*Pcv4rcnFAJuAnjA9VTRpZ?)hkPKdaQd!Ar{3A@qeqNB zD?u$X_6=WGqfy*j$N@)ow{;ftmVAXQ6xH}@$Ah@mxc58tSSi9t8(Z45hGe%tKvl$5 zv!U3Xd*Sm>-;8Q95QWxF0@BW|GcQB(Gl+~WBa(X}ga>S%|f#z^&5>8Db! zUID*J#5Zi(7vuCvm!Ez7yTfJ!jEGF5p%=aMI6=e6cBca;B$;dWe1nr)qe+y6xz9qS zu55|Dx8(T=SI)8XC!md){w-YpH|_(yO(Hu8s=m5fyKVUDdHupXD)Yk2MTHrjK&H^F z^P5J{CSanN1H6#!;MY&l2<+`8L+7#zkF2tQN(1`cplx4-Tr;9q5AK~jOKsY-q4IPQ zM%c9`DNfl9;Ta$;*TMea6-$hzE*s!lNrJ19(6nuPp22d;GR|DX6qVb-HY`)8ExzHe z#{yZ8U@~g({55?uCOnK2HChf0vYCEadT;Rjz}w^TySlC{y(2>rU4*u6s`d#oUeLEd^YJYn?;t#MSt!N?ej<%HrImhE}}0-h#;O4F5@*DA;anROq|tZ_Iy zl-xgnEfK44n>J|*URXj}uU1Cu8rEG)GEh(*?q@k1GOuH;r5^Q%4Y3XTyR`@4qK%pm z0lA_}lwuhQO2)&ZHz(XxtJwVYfbaLEw+#s%;3VhoGup)pRt|k@8(l*dmocs=P~IoVd<%Gy~xXJC~7Wxn{mh4 zBWzN?$%W!_ipg|7h(R$83~$|`6~)B-t9QxFCv>~ZYLPVbS%KQQX;wR2)4>zBxYPZp zRSeeeg$@%EZ%GfX)#BYlon(d9@2r6u@9L?fw0-y&gN$=KN<*P);a`3w z^J`HucwrV9jq5)&S5mQ7P(YmqYM5Q{H(@Z-Hz^7 zoESqp4%!>p3m+wK;_K~)Qv*r(5;g61B}xO}F`e$xw_ zSruk!aoFx5nNZBOL~kR2t8h`#7rnFK?KBv{QD$-R^$jzP^ zg+3XSb_ygc`OXSGJWjKzS~L=TUZKW-a1xr44s9ms<@T--4lSLHhKwgiNCTbPA~l(^ zvE!YCVYr4vd#>pfQ4G@MUw`tn@t@a-4ybtvh5;JokP*Q(xdRV`7|QzMGCKM!iAP+F zU3iJ@)1#7|IPWsr=W;~{tz3`^Cz2hm0C-O2?AmQMq0ej{6&+ba3RJmJkN8WN$akMS zc++46)OT8RHO}VArV_E`JmQLTU$=03ZhyPAa2ZJ?mMp@B-ahY;TW@8n_7<4)b6^|U znQr&%38f~O>%TEv*J6ZMzbs%a961=qtz`^Bj;!Wzb2C#qSFh$lZ!`UUkJGVxMd<-# zlv^9!SMS-4vU>@SO&=^g#5(YbGcqcIaGviA7@t-&`E9;}WT-#jxN$ec&5gtc|I739 zJ3s!YZVD|kNHTf!Q|+IOOHQuYiuxcx&4JKMyCCb1zd2*-IbT%{&oPcJgEoEFO` z>ZPnQ{4FeU*8&%|M8dw&t;lDP4b&gSbRF_Y&fKFKD+_c4jU`Ji{DGAGy#0n%4{{!J zG-R~hm|Yu?96&RsP>%ntab-~_k|P68?)tc-f-QDWcTl9h-Hi^^gYYChtFhPn!=anr zA?n2RexCk_zl1cLb5B*d>bp0Iy0n$71EHbENhXBBYCO9U9<{A!c2ryKILj?{chmKk zpbgJQPZanPZfrCg63bN*pEiphoKiaJhu=!Bg52qoKoc?tXYfNQM~)A6dw`QRk-JAK`r z)OTTcW0)JLx1fw&jC-mBTwL+r2+g-2P1c^`OzmdVewNH>?wjh)R)0=+$FJCr4#mg7 zXYr58Q|R}j_ukoL?7heRsEctnDG|FQ>}b73Pi~(te?t8QJTE)n7m6q_vg1jWrsP6S zba&j~b!T_pTdQe*1;aJ{(vG*%(cD~W%1=BAUKouC_T{>NLD`DOttl!z^Ag|rZp<}% z!0ADtGoaUfNyATIbuBd)DCzWsO6|{uiZs_a8^PV;~O}#w*Luu!JeT;Y~zp6RScFM zS4n<;a17(${L*1LwjcHbx(f-?RHC9VZ^A9fNx_y=FnUhNPYRp1-2Tfz1Ge<4XSnX-7<)072A(S&3OOFvjI3aN2xt% z8}{jrSX}#!;kA~YV#{`vj~q5HQ2xe^Zf={%ZBgSFp-9x{z$@{v7kKq;a6jp1rN!PEY#2Kn3m<@l53E8Rt@WLUpn-fl_&1X!NdeBO5XMbODt;d3pWf3*)ZifsVZ1sq;bJ+)l=9Ase>097?q-Zd*(* zJ&$>;d)ISETVwJ?-*!^9r}!`<`cz&b12enE zq%C|Zb)Sn>24No#nkx0+k9JSWtZN9#N-r8xoG`7b8GC>0dp?GkWL#r37Eoa(6KJ?$ z5DyzA85>;gt^52yXP@b^#Rf!igS0AOA7R()Yle;vL{E{x${eQA@;S#s9{x;`UOI?c;?=jO_Nq_*@CWfh^I$Es! zM1yllZAKfrJgyucC-DJiX-Bl3I{7u`WKLh^P`5e|9$XwQ(h;}E2)mC*?liQ4;-yxv zKcJYDz=g(5*t|XFjmcLsSI`Fu+)I<#W}3CPD32-styR5O(H9Je7FT_1OE$}qW!@90 zNVZ#|0(cNG_1Vhjz5lcV%P==wy2`CNllwl?p4DK6wu44@$@|SDhsnx9YQvWdiWiFtM77S zWAy$|iA%RuDnE+xo8g1Y$7pES z*)t&~2?Av+FDLcic&MJ}J&WSt*wqbJo6pHmx^954@jRl_G5Q(Ykk-v2?*9bwQD$lM zIj(TCi(vTYXB7OQMI3Qrv{gf@jvLPYjj-f1yjgeM?D6t2HKJn6`#c@Pe%|AKJYC5~ zqUy}{(fXEG~}C5U7pv)MM-TW4yIN*7whnQ`&1u?V7_x9Mkvn zhj`wfak%kDhR$b}@dwbj&3H@wKi&9{Dhe1MnV_}H{rK#8yzz9UdU%btE{Da9={obr z&A;BjjW&-V?tcMx67pZ*@87-py8XJn#aKMPjbO-V$yF7Mvd*Y5j`uh0?1O^3%yo!pBiH(a#r)OklWxvkJ#gvwnS5#J2*VHz* zw6?W(bmF_-_YVvX4UdeD&CJftFDx!CuWW7a?C$L!93CBi`Fio~^6LAKpTGX&0s=t) z&H6X~H|+m#(f@N15fg)m$^PR45(WP2AbMgF9x2k>8fIjVycu|Fj4}Ekw;{&gs4ABdn(W0{ zZcetVeDWe z|3u3_m?tWo?lsp;*liOvQ9N^0>wIcg#rQNWdD>rqBLFw0ox=(ORWa^9Afp&mj-K!t z?(Z^ih)ppy&-2nQ?);s{+ad97RZRCnqW)~l=N?=k%S2V0tj(6?RLa0^jZ&RO)*0iV zYsFaT_weJxi3IYOBHj;fYU%$1B$zKM!`$s$?mJbC5r2!REihQ}vDsO&^f^u~r;(&E z(-mgcu?`jH(mV|>f=5I2@}I2)a9w({D8)SN3a)CrC6R?!_!?0qQ7@JcErW=t9uhdl z$rI^;NeRYFZ{$*XEh{l3VvS%+TELww!RExW!mlOv)F4*(wT z$QtxzV~RoWTULpkM~*BUPKGEX-Lcu_?*g6(`Rw}*IpR?isZ{u6Yd)w zhPcY9rOzluhJRVW^$O+kP~=4h?j}+?x1a42cvj>sO7~%Fe*vPP4m2#8H(7o&V$QF$ z_nvg7n`?&GQHHT@94`ZdYcd@~+?&6|myhE!jaZITfIZWahAf~XQdxoL{sZxK4b@u4 zPAL7;By!=t8rC!a$b*?;s}d-c5l4+3a7Dz7lJfk*C=qSoIprg zYb4UvJ-kFPsdKwrcIDO(v22vnTxQhcS)zM-Pv?4>SY_Y8Q?-GSNEsZF#Eg|McbZMP zwV+@Tw?Pjj42xlKLb1RG} z)Ji{$=tgjuQ!(kZ)gxLM>%fhNkI$_|cFoIb89;>oZeXB z_W@X>i*bE2zvll$Q!T;AL8MssE9qLVbYspn?-QGYvK~{~Pn^8LTKak&E3C;ZX}sHk zHnfUigQ2h+g`^5{;uYSZ<2fV|n^-gtHV7!*Dy)!CwH@5+mF};j&#)P@mTgO5u#wTZ zK4OwOr14e4tlI60cQ=`TM4IC#$5DB2a@R){0N1l|ZLE+1LqS-)VCl7s=T>L^azSD) zW1P)xQ-gJ0+jpqYi)b?bg?{y~eT7~x#L%|64}CH)Yt8cqMgdOg+KnH9wXHOQep9`>B)H=`9@S(R!} zQn&*l;u-n3>ay<_)L@=Vc>A_~SCjgNbGwwitt@bTpYK$W;EW8sS^y!#X9BTBw~n1> z_*`AbVl+j`U|;Qdg~mNe5Gtu(Ol4 zIz<@)9ci?#bYFW98@#Ek`m`Xo$*>TwoRT@!gy7}TAG= zsdYioe2BWG!jpe5XrKqTLJ7i{5`_ znz2{iu{nP(D=Dm6qcW!X?Ub2g9V+&uza^OMP50%^=7~*cGs@8T#cOZ1GD>uUX7SC= zn=cjkcX+!vs2uli6p+5BZA7sb*J9g`Xc}eRttR+7C0eVPRF17g1x#12Su1;4{;r$B zeq3*D<_aP_DSG4JsY|IPM{ODOv&(XBL&S0K9)S~)H*rdfplVc*C4WgGOxy^1qm!-+ zE-7DS&r2oW3YNt*p8LJzn2G1r#N#d}e@Sb1l9TaUNoE%s@K$Z`v0Or?M?HBXEN|eA zd9rAk-EiUeH~Ux?51JUv8r zALIG7l`gt6WA9jkX@d@l^{!AcZ=!_Kfe#ni%>M$A&&;OgLvO?ZlO1j5c`}(s#_KW-9Q_Z*LdB@2K#zwxS4pv>!3CHt)-_)Z5i6@&2n6X4Ah8 ziVpDT+VVSq-nHrrqGxhYvLD~dNC+Mkc%RA4alFN&oJc^!Z>89Ycn2DhA!G|bxVKh zp=ESU!8*aU*&Y>IH|#hJK^*Nd^=wV-q5&!*9#WE7Ysr zYDIL{`2MmQ7rE*lrBGPz#o0<<$=09!&ZCed?^B_y><)*mPxy#Evxu^D_Zp(ROYn`< z+OITSueXy$v8U#?Ps#mr_qRhp*(xksERJg4% zb7iTFP?mvz*QBZ2b3FcKl}+Jk_F7<(6FF|2lZ<@U%#f~Y;CHV&sfEB(R@mu)=`;FW z-}3^|(fGVuZxh{8t;uYTHkrFlrD`!wtlo-f9_Wm9O>8_}KiwPPT5^aj3Voz4~ z1V7R0YxWn4q#+eQ@bp;rER^{zAleSrF( zQ0nnvP9a=AsQj*I`xXEY+?+P)oRWv}Ix^F{C$mw+IyT?-h<1>(1~CR?498bN;V=+K zA*vH9f@;%M_O>rfW4Qoj34s@e*%{4)CJn}1pjnBlJmPBM)}~w4)VSy&+b;B;wjnWn zgJRlSh_DBXwOkQuED+x&bqLD}8?l22Zs z;99~hNvCuzp8jRXEN)Lbx$#-sh~H;YpP?G9oLDh7<`_g(5}Jf4A!m=Nyz8^E@2i2x zU~uD)GkDd2)H*b^j3{(k)PrF>$Dp>IR%#`0Yl@AR4r>@xKKQke@&eYQG%QKy21#Dc z@}Rg3eYW0s=RJy&q6dGaf8yX+`>r$K+^RDPHr8q(b5~^C z6W6VTtSloV-@^InJl_mQ|B8(~!!|FIjmty*8qMjNHATQB4$*J%Hh(sL-0@D%h0P*} zc)Rs{$rDm^cU;E2uu^=y00?HIriSH`YJjP{?bZnK=2{&D%FsD~enb55LRRn5H$R(4 zeXQbP28R^VYkhZgSoZM*NXHr!_|qD_fsnI*{w4+`(u9$x+dmd%xUok~E_4^s5Zb5d zp1bwz7zGQZ>k1KH;jVR@GW01Q3t(Rae9aG73*Wu?2QG^TUI>bryAJdS& zb^^!Kgsx6`5N7 z)&(DXdAib6X+k^(oE*+p)D^*fLD?Ti=2((rx`dlW`2d?U!~`;oPYte&9nDNs#CnRj z=WBRNxteC!PsQ^6`6ht)-=l%*$Ukf2=pYf|q!Fttd&hNodkvI7kBa3lg4aL3-XH4Txd<&b`PP?0WE~;1*)ID{@X^_R9j@P- zR#EDm8=(s_Ytw82=21G{ePoz(Ke5O!k)|vo4QfLp6G~iSjnl65cG@y4O}XV}9pWF4 z1iCRZEzs2D`N(|KD-Ty-E=+@6Cys#@RGe_-cwCUMLRq4w<%L758_Khs*lf5^!jv%d3w ze#YVVLYt=Hiz_4Vg;xnR6UX$v)Jt1MKNsnD$TjU5QbN9o{rC&mHpku!4SK(nNrd$H z(01;(mtG2na)otZ0>~L_I|-a50r`jS{A_9LnB**XR{4!G#<<`bg<^7nr%lxqbqtbh zb@%#ebehK2&;`f_Eeq(f?5RMBlVvK+OyZoAx7E{(@l1dsX>*$13jJvZ#}348^}Ok- za_zl~Ugj^5xpwi8L813dQ--WgjY3;uay_bIHr{3^tlNG7+s@K=s^cfe@XWIB3_a$S zCfUyuI(8z?5e*((9V@d;lW};Po*+M(&oEQGaaVJ+b9Crjd9HFd_(>Ytv!y&&{DWPS zt>sJqkyY`%Wl7I5c@50Gq%-^6@r*FegoQQ?ULb23{|dUQ`yIu$X!vHiiwb))48an^ zN23}a=qc=DBH;daAzi{$LsEo$dQFKE8mig#0f`>#4@S$^dc(r}TRljq(kF0 zv_wDeV3H&a)hSLknx9tnbk4&8*V`OSL~VoklmH#Kd9=BV;poo5K6kK~nVX2Amb2?eAgB$pN%a^SGR-H=_sc9;@`K*ZQ4VY1LbM-3-w{X% zo=hCE3o1LehMc^vZFZla^TvF6#ylY~2Lo;~uwbjPMwJs<+%>#8C~aE}6{pp=%ds%k z^lr6RJ?7F-?4=V;G?xCkQHn*Dlq#J`2IYOW1(D z70|xwU(@+82A^XCX%ZB|fVw*t>-(kM-mQz1?4T3Wro9kd=@*j!WHd4PB|OC>?!(i8 z&+l9BI!Ukc0cX*%CJqg)eu@O27EAOZAnsns0xsJ$yNzVM<3p;#kvZat6L|_HLxJ-KF)HS+(BZpuUSZX) zYqp5>ffHhW5|89^8Y5R7gBMsP^v;ZE1xP4PRx%xuU|spY4MQ5i zL0VkHU=vk2>7~`L^FJi`JDeU+)8?{b8DoX}62i8rRui1SDjmDlGEzNnv$R|As)K$P z@DD!MMJdID(#m?9iXe$KjERQ3j(facf@ND22Vk9G8p_=_B#JM3!dm-Uo`pEWc4N20 zCu{!w5SHh#471&%8hka$uDAO3fs~cX!}_*@G@Hr0X_%28fuI6SyBb>kIzufHnHi1@ zKHBA4OizWj8M^r^o$SR&^yJ*Cym0wfX5ME0ZvM@~v!X2vM=HRa~N45X_WfYx7z>DUqDFIwFMa&`q)kQ zc{}@D4;gnD4GevoPE{A)>gt})s4|`ZH3TEB97%2V3hGW^qA%j}Hgn6?odmN$MA+nr zFAR%9Tp36CStr4>Kb&H^a1J4hW?L{d57tj+7S5%Ca)&hC!$O)twMs$mZDddm&)#2F zHO9GCoL)%zj$03T&bUYJUk)ty7&6P1oi+o%zs5|&+%0egC0}-ZiEX*Ct|8+)vJ_`j zaV5X5Y{5T%-KZ_y9L-nb4*zaz4M@8_*B922SN9@8RzYX=1HOkJ_(>s0% z)BZxv&0mH3PTFN?I1uc^t_X?u-U_;8cewh2-r=BMTcEc7-Ua@(@^Ppiv2EmqIDfhw zg6)nSQpDOgivxM_G-5U}LG#nov5qu;BK16uHWqNwY*{zsgj6w6M6jx;{-ve67tJGw zkJP{Mf_e0i!8va+8F`4NP{sq_4xSgt%u#`XGXBlNEIcs+Q6(3ou({wA{4T+T8NO>} zmKe?IB=+$ARp|;;n}ZT7F8IPEIPT}Ff@&}Jg*1qm`!9fA6`7y7T;X+XD>YY$QaZPg z7*A*DJ+g2#Zi-bwH$0;J&51~)RKidL_7hVoWaJf zBT_!dlWh9VK{v*ZEm9Ko+HAttE`&Nptb|7aFh_8g4XHN}!qcbU|HOEG!5X7-r+^N= zm)yFr*ko9!d?QM@s={|bUqV^I?{{i?ObV%UmKQT0%}y;mrj}?EgsO?h64kl?>V>%r zD6aX4-pu3OtU-ML$^ddGRz3CZGJPy6CURu z6t*1>yW~d5_M29wS@INbI=`;qqy3XveEu*5;8jsMtqztfW7hzI4O#{Kvv29LvhKG` z!da%w^bj)U(xE{{Gfq}5bS>g$z{ueYm~28+cbITw-x8>#X#7TQQ}6l65cvtTrqL0)dGn{uRLjj~_qi8R z`A8nO9jv?EY?qmp+yQmzx?7A}QNwqybUveP^!3ag1!XvVTsMEyWTyiXneY)!j3sIq z$pk zIl6vh!TAv2^mrA$3n18R{ zWydoDKFeSX=)X%U&-`HoW;Xvhq(i32_RVCMmlz8$J^;NQzqm+EZSfh^f-9 z=-cc&vOEp8{17tl+R-&9u*LpCCPi@*Ho zr9`=sH#bo_H9mVcDKp#WF90ysap0KobX)!2OLJ+l(M?i2-Hr*C=N}wCM*Euumf^05 zY?6ma(Q}__5{0IYwqJkf^^8T2E%?QN&X~r1g1KRbd$!Q2Fa~qU3S#}{&C|YK7n}Fr zInG>0FW+cxEtmR+)5?9vg(<2k;!cL?oKGD&^Cta2*>mr#VZPNo^)d9GGt)upndvYB z>DeDbB)3kC{YM5h@X-KQtONuxm#d+_ksYBfr}&_02zgU;tuV4z%c4GMurgBy&Ggh! zGcyxm(;#_U7fR)s9B6T5_v=|o8;S`yng8mCDcoZ~iYj10Pi>PI-vQ!xa>oC(EUfG* zn-{;&Hy8xtHninCeV z#)>lO7s1&WYGWz!okxneN`CYBEKXHX>4g28>7Uk0Ny*8mIjZ44Z~5+3^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<HEAm;@P_1sVSzVUP#9la&z+7@&ZWiJ66!jh%y&iyNq5 zs{jKNBQrA-3o|P#3ky(nEl{3;MUYiU(a@1iI53f2sZhkIapFP_Wv7h?MT0JWP%%y_ zYU1P)6PJ*bQdLve(9|+9H8Z!cv~qTFb#wRd^a>6M4GWKmj7m;PO-s+n%qlJ^Ei136 ztZHs)ZENr7?3y%r%G7DoXUv?nXz`Mz%a*TLxoXqqEnBy3-?4Mop~FXx9y@;G&P778mFHFAhJO8sPtb69C$qBOL$$ diff --git a/testing-python-week2-main/tests/test_api_users.py b/testing-python-week2-main/tests/test_api_users.py deleted file mode 100644 index c9ddd06..0000000 --- a/testing-python-week2-main/tests/test_api_users.py +++ /dev/null @@ -1,48 +0,0 @@ -def test_register_user_api(client): - image_path = 'images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg' - user_id = 'aaron_peirsol' - - with open(image_path, 'rb') as img_file: - response = client.post( - '/users/register', - data={'user_id': user_id}, - files={'image': ('user1.jpg', img_file, 'image/jpeg')}, - ) - - assert response.status_code == 200 - data = response.json() - assert data['user_id'] == user_id - assert data['registered_at'] is not None - -def test_authenticate_user_api(client, setup_user_db): - image_path = 'images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg' - - with open(image_path, 'rb') as img_file: - response = client.post( - '/users/authenticate', - files={'image': ('user1.jpg', img_file, 'image/jpeg')}, - ) - - assert response.status_code == 200 - data = response.json() - assert data['user_id'] == 'aaron_peirsol' - -def test_get_registered_user_api(client, setup_user_db): - user_id = 'aaron_peirsol' - - response = client.get(f'/users/{user_id}') - - assert response.status_code == 200 - data = response.json() - assert data['user_id'] == user_id - assert 'registered_at' in data - -def test_delete_registered_user_api(client, setup_user_db): - user_id = 'aaron_peirsol' - - response = client.delete(f'/users/{user_id}') - - assert response.status_code == 200 - - response = client.get(f'/users/{user_id}') - assert response.status_code == 404 \ No newline at end of file diff --git a/testing-python-week2-main/tests/test_face.py b/testing-python-week2-main/tests/test_face.py deleted file mode 100644 index 41b3148..0000000 --- a/testing-python-week2-main/tests/test_face.py +++ /dev/null @@ -1,66 +0,0 @@ -import pytest - - - - -from app.face.face_embedding import extract_embedding, verify_embedding - - - - -def test_extract_embedding(): - - image_path = "images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg" - - - - - embedding = extract_embedding(image_path) - - - - - assert embedding is not None - - assert len(embedding) > 0 - - - - -def test_no_face_exception(): - - image_path = "tests/images/no_face.jpg" - - - - - with pytest.raises(ValueError): - - extract_embedding(image_path) - - - - -def test_verify_embedding(): - - image_path1 = "images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg" - - image_path2 = "images/Aaron_Peirsol/Aaron_Peirsol_0002.jpg" - - image_path3 = "images/Olivia_Newton-John/Olivia_Newton-John_0001.jpg" - - - - - embedding1 = extract_embedding(image_path1) - - embedding2 = extract_embedding(image_path2) - - embedding3 = extract_embedding(image_path3) - - - - - assert verify_embedding(embedding1, embedding2) - - assert not verify_embedding(embedding1, embedding3) \ No newline at end of file diff --git a/testing-python-week2-main/tests/test_service_users.py b/testing-python-week2-main/tests/test_service_users.py deleted file mode 100644 index 93c5a13..0000000 --- a/testing-python-week2-main/tests/test_service_users.py +++ /dev/null @@ -1,54 +0,0 @@ -from app.services.user_service import * - -def test_register_user(): - image_path = 'images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg' - user_id = 'aaron_peirsol' - - with open(image_path, 'rb') as f: - image_data = f.read() - result = register_user(user_id, image_data) - - assert result['user_id'] == 'aaron_peirsol' - assert result['registered_at'] is not None - -def test_authenticate_registered_user(setup_user_db): - image_path = "images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg" - - with open(image_path, 'rb') as f: - image_data = f.read() - user_id = authenticate_user(image_data) - assert user_id == 'aaron_peirsol' - -def test_authenticate_unregistered_user(setup_user_db): - image_path = 'images/Natasha_McElhone/Natasha_McElhone_0001.jpg' - with open(image_path, 'rb') as f: - image_data = f.read() - - user_id = authenticate_user(image_data) - - assert user_id is None - -def test_get_registered_user(setup_user_db): - user_id = 'aaron_peirsol' - - user_info = get_user(user_id) - - assert user_info['user_id'] == user_id - assert 'registered_at' in user_info - -def test_delete_registered_user(setup_user_db): - user_id = 'aaron_peirsol' - - result = delete_user(user_id) - - assert result is True - - user_id = get_user(user_id) - assert user_id is None - -def test_non_authenticate_user(setup_user_db): - user_id = 'non_existent_user' - - user = get_user(user_id) - - assert user is None \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py index e69de29..48d7a1e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -0,0 +1,20 @@ +import pytest +from fastapi.testclient import TestClient + +from app.face.face_db import save_user +from app.face.face_embedding import extract_embedding +from app.main import app + +@pytest.fixture(scope='module') +def client(): + with TestClient(app) as c: + yield c + +@pytest.fixture(scope='module') +def setup_user_db(): + image_paths = ['images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg'] + user_ids = ['aaron_peirsol'] + for image_path, user_id in zip(image_paths, user_ids): + embedding = extract_embedding(image_path) + save_user(user_id, embedding) + yield diff --git a/tests/test_api_users.py b/tests/test_api_users.py index e69de29..c9ddd06 100644 --- a/tests/test_api_users.py +++ b/tests/test_api_users.py @@ -0,0 +1,48 @@ +def test_register_user_api(client): + image_path = 'images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg' + user_id = 'aaron_peirsol' + + with open(image_path, 'rb') as img_file: + response = client.post( + '/users/register', + data={'user_id': user_id}, + files={'image': ('user1.jpg', img_file, 'image/jpeg')}, + ) + + assert response.status_code == 200 + data = response.json() + assert data['user_id'] == user_id + assert data['registered_at'] is not None + +def test_authenticate_user_api(client, setup_user_db): + image_path = 'images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg' + + with open(image_path, 'rb') as img_file: + response = client.post( + '/users/authenticate', + files={'image': ('user1.jpg', img_file, 'image/jpeg')}, + ) + + assert response.status_code == 200 + data = response.json() + assert data['user_id'] == 'aaron_peirsol' + +def test_get_registered_user_api(client, setup_user_db): + user_id = 'aaron_peirsol' + + response = client.get(f'/users/{user_id}') + + assert response.status_code == 200 + data = response.json() + assert data['user_id'] == user_id + assert 'registered_at' in data + +def test_delete_registered_user_api(client, setup_user_db): + user_id = 'aaron_peirsol' + + response = client.delete(f'/users/{user_id}') + + assert response.status_code == 200 + + response = client.get(f'/users/{user_id}') + assert response.status_code == 404 \ No newline at end of file diff --git a/tests/test_face.py b/tests/test_face.py index e69de29..41b3148 100644 --- a/tests/test_face.py +++ b/tests/test_face.py @@ -0,0 +1,66 @@ +import pytest + + + + +from app.face.face_embedding import extract_embedding, verify_embedding + + + + +def test_extract_embedding(): + + image_path = "images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg" + + + + + embedding = extract_embedding(image_path) + + + + + assert embedding is not None + + assert len(embedding) > 0 + + + + +def test_no_face_exception(): + + image_path = "tests/images/no_face.jpg" + + + + + with pytest.raises(ValueError): + + extract_embedding(image_path) + + + + +def test_verify_embedding(): + + image_path1 = "images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg" + + image_path2 = "images/Aaron_Peirsol/Aaron_Peirsol_0002.jpg" + + image_path3 = "images/Olivia_Newton-John/Olivia_Newton-John_0001.jpg" + + + + + embedding1 = extract_embedding(image_path1) + + embedding2 = extract_embedding(image_path2) + + embedding3 = extract_embedding(image_path3) + + + + + assert verify_embedding(embedding1, embedding2) + + assert not verify_embedding(embedding1, embedding3) \ No newline at end of file diff --git a/tests/test_service_users.py b/tests/test_service_users.py index e69de29..93c5a13 100644 --- a/tests/test_service_users.py +++ b/tests/test_service_users.py @@ -0,0 +1,54 @@ +from app.services.user_service import * + +def test_register_user(): + image_path = 'images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg' + user_id = 'aaron_peirsol' + + with open(image_path, 'rb') as f: + image_data = f.read() + result = register_user(user_id, image_data) + + assert result['user_id'] == 'aaron_peirsol' + assert result['registered_at'] is not None + +def test_authenticate_registered_user(setup_user_db): + image_path = "images/Aaron_Peirsol/Aaron_Peirsol_0001.jpg" + + with open(image_path, 'rb') as f: + image_data = f.read() + user_id = authenticate_user(image_data) + assert user_id == 'aaron_peirsol' + +def test_authenticate_unregistered_user(setup_user_db): + image_path = 'images/Natasha_McElhone/Natasha_McElhone_0001.jpg' + with open(image_path, 'rb') as f: + image_data = f.read() + + user_id = authenticate_user(image_data) + + assert user_id is None + +def test_get_registered_user(setup_user_db): + user_id = 'aaron_peirsol' + + user_info = get_user(user_id) + + assert user_info['user_id'] == user_id + assert 'registered_at' in user_info + +def test_delete_registered_user(setup_user_db): + user_id = 'aaron_peirsol' + + result = delete_user(user_id) + + assert result is True + + user_id = get_user(user_id) + assert user_id is None + +def test_non_authenticate_user(setup_user_db): + user_id = 'non_existent_user' + + user = get_user(user_id) + + assert user is None \ No newline at end of file