phuochungus commited on
Commit
58ef5d2
2 Parent(s): 5dad19d fe7f31a

Merge branch 'main' of https://github.com/HunyyDev/SE113.O12_KCPM

Browse files
app/__init__.py CHANGED
@@ -34,7 +34,7 @@ if not firebase_admin._apps:
34
  )
35
  )
36
  else:
37
- firebase_app = firebase_admin._apps
38
  db = firestore.client()
39
 
40
  # LOAD NEO4J DB
 
34
  )
35
  )
36
  else:
37
+ firebase_app = firebase_admin.get_app()
38
  db = firestore.client()
39
 
40
  # LOAD NEO4J DB
app/constants.py CHANGED
@@ -167,4 +167,4 @@ classNames = [
167
  "toothbrush",
168
  ]
169
 
170
- test_uid = "VAbtgG1IrWSOqoJgxe7u2yEqpIg2"
 
167
  "toothbrush",
168
  ]
169
 
170
+ deviceId = 'dvg7OhkORV6mYFlUuNKNaE:APA91bHp-SGj4uLyyI9zpEFGrQDrklonQff0bJjtQWhGrJ-tyd_1u5NZSenxEkJzDZ-lyYsZCvmIrZnwNeu9CetsuJNGAU0lkNePNngR-76ytR8ZLvqTOMyf5RHWexsxaPa9Rop05WMi'
app/custom_mmcv/test_custom_mmcv.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from app.custom_mmcv.color import color_val
2
+ from app.custom_mmcv.main import imshow_det_bboxes
3
+ from app.constants import classNames
4
+ import mmcv
5
+ import cv2
6
+ import numpy as np
7
+ import pytest
8
+ class TestCustomMMCV():
9
+ def test_color_var(self):
10
+ assert color_val("black") == (0, 0, 0)
11
+ with pytest.raises(KeyError):
12
+ color_val("purple")
13
+ with pytest.raises(AssertionError):
14
+ color_val(300)
15
+ assert color_val(255) == (255,255,255)
16
+ with pytest.raises(AssertionError):
17
+ color_val(300)
18
+ assert color_val(np.array([20,255,40])) == (20,255,40)
19
+ with pytest.raises(AssertionError):
20
+ color_val(np.array([20,350,40]))
21
+ with pytest.raises(AssertionError):
22
+ color_val(np.array([0,200,40,40]))
23
+ with pytest.raises(AssertionError):
24
+ color_val(np.array([-30,0,40,40]))
25
+ with pytest.raises(AssertionError):
26
+ color_val(np.zeros((1,3)))
27
+ with pytest.raises(TypeError):
28
+ color_val(30.5)
29
+ def test_imshow_det_bboxes(self):
30
+ image = mmcv.imread('demo.jpg')
31
+ bboxes = np.ones((1,5))
32
+ labels = np.zeros(1, dtype=np.int32)
33
+ result = imshow_det_bboxes(image, bboxes, labels, class_names=classNames, bbox_color="red", text_color='red', show=False)
34
+ assert (result[1,1,:] == (0,0,255)).all()
35
+ with pytest.raises(AssertionError):
36
+ bboxes = np.ones((1,3))
37
+ labels = np.zeros(1, dtype=np.int32)
38
+ result = imshow_det_bboxes(image, bboxes, labels, class_names=classNames, bbox_color="red",text_color="red", show=False)
39
+ with pytest.raises(AssertionError):
40
+ bboxes = np.ones((1,7))
41
+ labels = np.zeros(1, dtype=np.int32)
42
+ result = imshow_det_bboxes(image, bboxes, labels, class_names=classNames, bbox_color="red",text_color="red", show=False)
43
+ with pytest.raises(AssertionError):
44
+ bboxes = np.ones((1,5))
45
+ labels = np.zeros(4, dtype=np.int32)
46
+ result = imshow_det_bboxes(image, bboxes, labels, class_names=classNames, bbox_color="red",text_color="red", show=False)
47
+ with pytest.raises(AssertionError):
48
+ bboxes = np.ones((2,5))
49
+ labels = np.zeros(1, dtype=np.int32)
50
+ result = imshow_det_bboxes(image, bboxes, labels, class_names=classNames, bbox_color="red",text_color="red", show=False)
51
+
app/routers/image.py CHANGED
@@ -58,22 +58,3 @@ def inferenceImage(img, threshold: float, isRaw: bool = False):
58
  score_thr=threshold,
59
  )
60
 
61
-
62
- @router.websocket("/")
63
- async def websocketEndpoint(websocket: WebSocket, threshold: float = 0.3):
64
- await websocket.accept()
65
- try:
66
- while True:
67
- data = await websocket.receive_bytes()
68
- try:
69
- img = imfrombytes(data, cv2.IMREAD_COLOR)
70
- bboxes, labels = inferenceImage(img, threshold, True)
71
- except Exception as e:
72
- logger.error(e)
73
- bboxes, labels = [], []
74
-
75
- await websocket.send_json(
76
- {"bboxes": bboxes.tolist(), "labels": labels.tolist()}
77
- )
78
- except WebSocketDisconnect:
79
- pass
 
58
  score_thr=threshold,
59
  )
60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/routers/test_friend_request.py CHANGED
@@ -1,8 +1,45 @@
 
1
  import pytest
2
  import json
 
 
 
3
  import requests
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  @pytest.fixture
5
- def token_inviter():
 
 
 
 
6
  url = "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=AIzaSyArSoK9Wx9Hpe1R9ZywuLEIMVjCtHjO8Os"
7
 
8
  payload = json.dumps({
@@ -14,10 +51,22 @@ def token_inviter():
14
  'Content-Type': 'application/json'
15
  }
16
  response = requests.request("POST", url, headers=headers, data=payload)
17
- token = response.json()["idToken"]
18
- yield token
 
 
 
 
 
 
 
 
 
 
 
 
19
  @pytest.fixture()
20
- def token_invitee():
21
  url = "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=AIzaSyArSoK9Wx9Hpe1R9ZywuLEIMVjCtHjO8Os"
22
 
23
  payload = json.dumps({
@@ -29,5 +78,86 @@ def token_invitee():
29
  'Content-Type': 'application/json'
30
  }
31
  response = requests.request("POST", url, headers=headers, data=payload)
32
- token = response.json()["idToken"]
33
- yield token
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
  import pytest
3
  import json
4
+ import cv2
5
+ import mmcv
6
+ import firebase_admin
7
  import requests
8
+ from fastapi.testclient import TestClient
9
+ from firebase_admin import credentials
10
+ from app.main import app
11
+ from app.constants import deviceId
12
+ from fastapi.routing import APIRoute
13
+ from firebase_admin import firestore
14
+ from google.cloud.firestore_v1.base_query import FieldFilter
15
+ def endpoints():
16
+ endpoints = []
17
+ for route in app.routes:
18
+ if isinstance(route, APIRoute):
19
+ endpoints.append(route.path)
20
+ return endpoints
21
+ def read_qr_code(filename):
22
+ """Read an image and read the QR code.
23
+
24
+ Args:
25
+ filename (string): Path to file
26
+
27
+ Returns:
28
+ qr (string): Value from QR code
29
+ """
30
+ try:
31
+ img = cv2.imread(filename)
32
+ detect = cv2.QRCodeDetector()
33
+ value, points, straight_qrcode = detect.detectAndDecode(img)
34
+ return value
35
+ except:
36
+ return
37
  @pytest.fixture
38
+ def client():
39
+ client = TestClient(app)
40
+ yield client
41
+ @pytest.fixture
42
+ def inviter():
43
  url = "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=AIzaSyArSoK9Wx9Hpe1R9ZywuLEIMVjCtHjO8Os"
44
 
45
  payload = json.dumps({
 
51
  'Content-Type': 'application/json'
52
  }
53
  response = requests.request("POST", url, headers=headers, data=payload)
54
+ data = response.json()
55
+ inviter = {"id": data['localId'], "token": data["idToken"]}
56
+ yield inviter
57
+ @pytest.fixture()
58
+ def firebase_app():
59
+ if "test" in firebase_admin._apps:
60
+ firebase_app = firebase_admin.get_app('test')
61
+ yield firebase_app
62
+ else:
63
+ firebase_app = firebase_admin.initialize_app( credential= credentials.Certificate(
64
+ json.loads(os.environ.get("FIREBASE_CREDENTIALS"))
65
+ ),name='test')
66
+ yield firebase_app
67
+
68
  @pytest.fixture()
69
+ def invitee():
70
  url = "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=AIzaSyArSoK9Wx9Hpe1R9ZywuLEIMVjCtHjO8Os"
71
 
72
  payload = json.dumps({
 
78
  'Content-Type': 'application/json'
79
  }
80
  response = requests.request("POST", url, headers=headers, data=payload)
81
+ data = response.json()
82
+ invitee = {"id": data['localId'], "token": data["idToken"]}
83
+ yield invitee
84
+ class TestFriendRequest():
85
+ @pytest.mark.skipif("/friend_request" not in endpoints(),reason="Route not defined")
86
+ def test_post_friend(self, firebase_app, client, inviter, invitee):
87
+ # Call the firebase database
88
+ db = firestore.client(app=firebase_app)
89
+ friend_request_ref = db.collection('friend_request')
90
+ # Remove all the friend_request use for testing in the past
91
+ query = friend_request_ref.where(filter=FieldFilter("inviter", "==", inviter['id']))
92
+ docs = query.stream()
93
+ for doc in docs:
94
+ doc.reference.delete()
95
+ # Delete the user for safety-check
96
+ user_ref = db.collection("user")
97
+ user_ref.document(inviter['id']).delete()
98
+ # Send request with no token
99
+ payload = ''
100
+ headers = {
101
+ 'Content-Type': 'application/json',
102
+ }
103
+ response = client.request("POST", 'friend_request', headers=headers, data=payload)
104
+ assert response.status_code == 403
105
+ # Send request with false token
106
+ payload = ''
107
+ headers = {
108
+ 'Content-Type': 'application/json',
109
+ 'Authorization': 'Bearer amksckmasckmafvqnwfniqoniofv'
110
+ }
111
+ response = client.request("POST", 'friend_request', headers=headers, data=payload)
112
+ assert response.status_code == 401
113
+ # Send request with unknown user
114
+ payload = ''
115
+ headers = {
116
+ 'Content-Type': 'application/json',
117
+ 'Authorization': 'Bearer ' + inviter['token']
118
+ }
119
+ response = client.request("POST", 'friend_request', headers=headers, data=payload)
120
+ assert response.status_code == 500
121
+ # Create request and re-send
122
+ user_ref.document(inviter['id']).set({"deviceId": deviceId})
123
+ payload = ''
124
+ headers = {
125
+ 'Content-Type': 'application/json',
126
+ 'Authorization': 'Bearer ' + inviter['token']
127
+ }
128
+ response = client.request("POST", 'friend_request', headers=headers, data=payload)
129
+ # Check response status code
130
+ assert response.status_code == 200
131
+ result = mmcv.imfrombytes(response.read())
132
+ # Check returned QR image
133
+ assert result.shape[2] == 3
134
+ # Write image for later read
135
+ mmcv.imwrite(result, "qrcode.jpg")
136
+ # Now test for the invitee aka the one that scan QR code
137
+ # Delete invitee user (if existed)
138
+ user_ref.document(invitee['id']).delete()
139
+ # Test when the invitee is unknow user (no user entity in database)
140
+ request_id = read_qr_code("qrcode.jpg")
141
+ payload = ''
142
+ headers = {
143
+ 'Content-Type': 'application/json',
144
+ 'Authorization': 'Bearer ' + invitee['token']
145
+ }
146
+ response = client.request("PATCH", 'friend_request/' + request_id, headers=headers, data=payload)
147
+ assert response.status_code == 500
148
+
149
+ # Create invitee user
150
+ user_ref.document(invitee['id']).set({"deviceId": deviceId})
151
+ # Send request
152
+ request_id = read_qr_code("qrcode.jpg")
153
+ payload = ''
154
+ headers = {
155
+ 'Content-Type': 'application/json',
156
+ 'Authorization': 'Bearer ' + invitee['token']
157
+ }
158
+ response = client.request("PATCH", 'friend_request/' + request_id, headers=headers, data=payload)
159
+ assert response.status_code == 200
160
+ # Delete entity for next time test
161
+ user_ref.document(inviter['id']).delete()
162
+ user_ref.document(invitee['id']).delete()
163
+
app/test_main.py CHANGED
@@ -7,85 +7,9 @@ import os
7
  import site
8
  import shutil
9
  from fastapi.routing import APIRoute
 
10
  from app import firebase_app
 
11
  import requests
12
-
13
-
14
- def get_site_packages():
15
- # Get the list of directories
16
- site_packages_dirs = site.getsitepackages()
17
-
18
- # Find the "site-packages" directory in the list
19
- for dir in site_packages_dirs:
20
- if dir.endswith("site-packages"):
21
- target_dir = dir
22
- break
23
- else:
24
- target_dir = None
25
- return target_dir
26
-
27
-
28
- def endpoints():
29
- endpoints = []
30
- for route in app.routes:
31
- if isinstance(route, APIRoute):
32
- endpoints.append(route.path)
33
- return endpoints
34
-
35
-
36
- @pytest.fixture
37
- def client():
38
- client = TestClient(app, "http://0.0.0.0:3000")
39
- yield client
40
-
41
-
42
- @pytest.fixture
43
- def token():
44
- url = "https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=AIzaSyArSoK9Wx9Hpe1R9ZywuLEIMVjCtHjO8Os"
45
-
46
- payload = json.dumps(
47
- {"email": "test@gmail.com", "password": "testing", "returnSecureToken": True}
48
- )
49
- headers = {"Content-Type": "application/json"}
50
- response = requests.request("POST", url, headers=headers, data=payload)
51
- token = response.json()["idToken"]
52
- yield token
53
-
54
-
55
- class TestFireBaseAPI:
56
- def test_get_me(self, client, token):
57
- if "/me" not in endpoints():
58
- pytest.skip("This route isn't defined")
59
- else:
60
- if token != "":
61
- payload = ""
62
- headers = {
63
- "accept": "application/json",
64
- "Authorization": "Bearer " + token,
65
- }
66
- response = client.request("get", "me", headers=headers, data=payload)
67
- assert response.status_code == 200
68
- payload = ""
69
- headers = {
70
- "accept": "application/json",
71
- "Content-Type": "application/json",
72
- }
73
- response = client.request("get", "me", headers=headers, data=payload)
74
- assert response.status_code == 403
75
-
76
- def test_invitation(self, client, token):
77
- if "/invitation" not in endpoints():
78
- pytest.skip("This route isn't defined")
79
- else:
80
- payload = ""
81
- headers = {
82
- "accept": "application/json",
83
- "Content-Type": "application/json",
84
- "Authorization": "Bearer " + token,
85
- }
86
- response = client.request(
87
- "post", "invitation", headers=headers, data=payload
88
- )
89
- assert response.status_code == 200
90
- result = mmcv.imfrombytes(response.read())
91
- assert result.shape[0] == 3
 
7
  import site
8
  import shutil
9
  from fastapi.routing import APIRoute
10
+ import firebase_admin
11
  from app import firebase_app
12
+ from app.constants import deviceId
13
  import requests
14
+ from firebase_admin import firestore
15
+ from firebase_admin import credentials