Skip to content

Commit de8ce8c

Browse files
committed
Setup and structure for testing
-Multiple databases that are switched using an environment variable so the db server is not needed during testing -Clean up some dev/prod setup for starting the server so gunicorn/docker are not needed in dev/testing
1 parent 6c6e168 commit de8ce8c

27 files changed

+208
-6
lines changed

api/.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
API_MODE=dev
2+
DB=relational

api/config/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55

66
class Config:
7-
"""Configuration class for MOJ api server, stores current configuration state of flask api"""
7+
"""Configuration class for MOH api server, stores current configuration state of flask api"""
88

99
def __init__(self):
1010
self.API_MODE = os.getenv("API_MODE", "Can not find mode")

api/database/IQueue.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from abc import ABC, abstractmethod
2+
3+
4+
class IQueue(ABC):
5+
6+
@abstractmethod
7+
def enqueue_student(self, student):
8+
raise NotImplementedError()
9+
10+
@abstractmethod
11+
def dequeue_student(self):
12+
raise NotImplementedError()

api/database/IRatings.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
from abc import ABC, abstractmethod
3+
4+
class IRatings:
5+
6+
@abstractmethod
7+
def rate_student(self, student, rating, feedback):
8+
raise NotImplementedError()

api/database/db.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import os
2+
3+
from api.database.relational_db.RelationalDB import RelationalDB
4+
from api.database.testing_db.TestingDB import TestingDB
5+
from api.database.mock_db.MockDB import MockDB
6+
7+
8+
def create_db():
9+
db_type = os.getenv("DB")
10+
match db_type:
11+
case "relational":
12+
return RelationalDB()
13+
case "testing":
14+
return TestingDB()
15+
case "mock":
16+
return MockDB()
17+
case None:
18+
raise EnvironmentError("environment variable \"DB\" not set")
19+
case _:
20+
raise ModuleNotFoundError("Could not find database named " + db_type)
21+
22+
db = create_db()

api/database/interface.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from abc import ABC, abstractmethod
2+
3+
from IQueue import IQueue
4+
from IRatings import IRatings
5+
6+
class DBInterface(IQueue, IRatings, ABC):
7+
8+
# All database implements must extend this class
9+
10+
@abstractmethod
11+
def connect(self):
12+
pass

api/database/mock_db/MockDB.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from api.database.mock_db.MockDBQueue import MockDBQueue
2+
from api.database.mock_db.MockDBRatings import MockDBRatings
3+
4+
5+
class MockDB(MockDBQueue, MockDBRatings):
6+
7+
pass
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from api.database.IQueue import IQueue
2+
3+
4+
class MockDBQueue(IQueue):
5+
6+
def enqueue_student(self, student):
7+
pass
8+
# do database stuff
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from api.database.IRatings import IRatings
2+
3+
4+
class MockDBRatings(IRatings):
5+
6+
def rate_student(self, student, rating, feedback):
7+
pass
8+
# do database stuff
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from api.database.relational_db.RelationalDBQueue import RelationalDBQueue
2+
from api.database.relational_db.RelationalDBRatings import RelationalDBRatings
3+
4+
5+
class RelationalDB(RelationalDBQueue, RelationalDBRatings):
6+
7+
pass

0 commit comments

Comments
 (0)