Skip to content

Commit 6f17d8e

Browse files
committed
Bug fix and added user model test
1 parent 9a64c52 commit 6f17d8e

File tree

6 files changed

+115
-10
lines changed

6 files changed

+115
-10
lines changed

.isort.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
line_length = 88
33
multi_line_output = 3
44
include_trailing_comma = True
5-
known_third_party = cryptography,flask,sqlalchemy
5+
known_third_party = cryptography,flask,pytest,sqlalchemy

ssh_manager_backend/app/models/user.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ def create(
9494
self.session.add(user)
9595
self.session.commit()
9696
except SQLAlchemyError:
97+
self.session.rollback()
9798
return False
9899

99100
return True
@@ -124,3 +125,23 @@ def get_user(self, username: str) -> Union[None, User]:
124125
"""
125126

126127
return self.session.query(User).filter(User.username == username).first()
128+
129+
def destroy_user(self, username: str) -> bool:
130+
"""
131+
Deletes a user.
132+
133+
:param username:
134+
:return: Boolean value indicating success/failure.
135+
"""
136+
137+
try:
138+
user: User = self.session.query(User).filter(
139+
User.username == username
140+
).first()
141+
self.session.delete(user)
142+
self.session.commit()
143+
except SQLAlchemyError:
144+
self.session.rollback()
145+
return False
146+
147+
return True

ssh_manager_backend/db/database.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sqlalchemy.orm import scoped_session, sessionmaker
44

55
DB_URI = "postgresql+psycopg2://postgres:ssh_manager@localhost/ssh_manager_dev"
6-
engine = create_engine(DB_URI, convert_unicode=True, echo=True)
6+
engine = create_engine(DB_URI, echo=True)
77
db_session = scoped_session(
88
sessionmaker(autocommit=False, autoflush=False, bind=engine)
99
)

ssh_manager_backend/db/schema.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlalchemy import ARRAY, Binary, Boolean, Column, ForeignKey, Integer, String
1+
from sqlalchemy import ARRAY, Boolean, Column, ForeignKey, Integer, LargeBinary, String
22
from sqlalchemy.orm import relationship
33

44
from ssh_manager_backend.db.database import Base
@@ -12,12 +12,12 @@ class User(Base):
1212
username = Column(String, unique=True)
1313
password = Column(String)
1414
admin = Column(Boolean)
15-
encrypted_dek = Column(Binary, unique=True)
16-
iv_for_dek = Column(Binary, unique=True)
17-
salt_for_dek = Column(Binary, unique=True)
18-
iv_for_kek = Column(Binary, unique=True)
19-
salt_for_kek = Column(Binary, unique=True)
20-
salt_for_password = Column(Binary, unique=True)
15+
encrypted_dek = Column(LargeBinary, unique=True)
16+
iv_for_dek = Column(LargeBinary, unique=True)
17+
salt_for_dek = Column(LargeBinary, unique=True)
18+
iv_for_kek = Column(LargeBinary, unique=True)
19+
salt_for_kek = Column(LargeBinary, unique=True)
20+
salt_for_password = Column(LargeBinary, unique=True)
2121
keys = relationship("Key", backref="users")
2222
access_control = relationship("AccessControl", backref="users")
2323

@@ -34,7 +34,7 @@ class Key(Base):
3434

3535
id = Column(Integer, primary_key=True)
3636
name = Column(String, unique=True)
37-
encrypted_key = Column(Binary, unique=True)
37+
encrypted_key = Column(LargeBinary, unique=True)
3838
key_hash = Column(String, unique=True)
3939
user_id = Column(Integer, ForeignKey("users.id"))
4040
user = relationship("User")

tests/models/acl_model_test.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import pytest
2+
3+
4+
class TestAccessControlModel:
5+
pass

tests/models/user_model_test.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
from ssh_manager_backend.app.models.user import UserModel
2+
from ssh_manager_backend.db import User
3+
4+
5+
class TestUserModel:
6+
def test_create(self):
7+
user = UserModel()
8+
name: str = "test_user"
9+
username: str = "test_username"
10+
password: str = "test_password"
11+
admin: bool = False
12+
encrypted_dek: bytes = b"test_encrypted_dek"
13+
iv_for_dek: bytes = b"test_iv_for_dek"
14+
salt_for_dek: bytes = b"test_salt_for_dek"
15+
iv_for_kek: bytes = b"test_iv_for_kek"
16+
salt_for_kek: bytes = b"test_salt_for_kek"
17+
salt_for_password: bytes = b"test_salt_for_password"
18+
19+
assert (
20+
user.create(
21+
name=name,
22+
username=username,
23+
password=password,
24+
admin=admin,
25+
encrypted_dek=encrypted_dek,
26+
iv_for_dek=iv_for_dek,
27+
salt_for_dek=salt_for_dek,
28+
iv_for_kek=iv_for_kek,
29+
salt_for_kek=salt_for_kek,
30+
salt_for_password=salt_for_password,
31+
)
32+
is True
33+
)
34+
35+
assert (
36+
user.create(
37+
name=name,
38+
username=username,
39+
password=password,
40+
admin=admin,
41+
encrypted_dek=encrypted_dek,
42+
iv_for_dek=iv_for_dek,
43+
salt_for_dek=salt_for_dek,
44+
iv_for_kek=iv_for_kek,
45+
salt_for_kek=salt_for_kek,
46+
salt_for_password=salt_for_password,
47+
)
48+
is False
49+
)
50+
51+
def test_admin_exist(self):
52+
user = UserModel()
53+
assert user.admin_exists() is False
54+
55+
def test_password_hash(self):
56+
user = UserModel()
57+
username: str = "test_username"
58+
password: str = "test_password"
59+
assert user.password_hash("non_existent_username") is None
60+
assert user.password_hash(username) == password
61+
62+
def test_exists(self):
63+
user = UserModel()
64+
username: str = "test_username"
65+
assert user.exists("non_existent_username") is False
66+
assert user.exists(username) is True
67+
68+
def test_get_user(self):
69+
user = UserModel()
70+
username: str = "test_username"
71+
assert user.get_user("non_existent_username") is None
72+
assert isinstance(user.get_user(username), User) is True
73+
print(User)
74+
75+
def test_destroy_user(self):
76+
user = UserModel()
77+
username: str = "test_username"
78+
assert user.destroy_user("non_existent_username") is False
79+
assert user.destroy_user(username) is True

0 commit comments

Comments
 (0)