Skip to content

Commit 713559a

Browse files
committed
feat: TT-357 Change Json Implementation for SQL
1 parent 73bb21a commit 713559a

34 files changed

+445
-512
lines changed

V2/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ install:
44
pip install --upgrade pip
55
pip install -r requirements.txt
66
@echo "Completed! "
7-
7+
start-local:
8+
docker compose up

V2/docker-compose.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
version: '3.9'
2+
services:
3+
database:
4+
image: postgres:14
5+
ports:
6+
- "5433:5432"
7+
environment:
8+
- POSTGRES_USER=${DB_USER}
9+
- POSTGRES_PASSWORD=${DB_PASS}
10+
- POSTGRES_DB=${DB_NAME}

V2/requirements.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@ azure-functions-worker
44

55
# Tests
66
pytest
7-
flake8==4.0.1
87

98
# Mocking
109
pytest-mock
1110

1211
# To create sample content in tests and API documentation
13-
Faker==4.0.2
12+
Faker==4.0.2
13+
14+
#SQL ALCHEMY
15+
SQLAlchemy==1.4.24
16+
psycopg2==2.9.1

V2/tests/api/api_fixtures.py

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,23 @@
1-
import json
21
import pytest
3-
import shutil
42

3+
import time_tracker.activities._domain as domain
4+
import time_tracker.activities._infrastructure as infrastructure
5+
from time_tracker._infrastructure import DB
56

6-
@pytest.fixture
7-
def create_temp_activities(tmpdir_factory):
8-
temporary_directory = tmpdir_factory.mktemp("tmp")
9-
json_file = temporary_directory.join("activities.json")
10-
activities = [
11-
{
12-
'id': 'c61a4a49-3364-49a3-a7f7-0c5f2d15072b',
13-
'name': 'Development',
14-
'description': 'Development',
15-
'deleted': 'b4327ba6-9f96-49ee-a9ac-3c1edf525172',
16-
'status': 'active',
17-
'tenant_id': 'cc925a5d-9644-4a4f-8d99-0bee49aadd05',
18-
},
19-
{
20-
'id': '94ec92e2-a500-4700-a9f6-e41eb7b5507c',
21-
'name': 'Management',
22-
'description': 'Description of management',
23-
'deleted': '7cf6efe5-a221-4fe4-b94f-8945127a489a',
24-
'status': 'active',
25-
'tenant_id': 'cc925a5d-9644-4a4f-8d99-0bee49aadd05',
26-
},
27-
{
28-
'id': 'd45c770a-b1a0-4bd8-a713-22c01a23e41b',
29-
'name': 'Operations',
30-
'description': 'Operation activities performed.',
31-
'deleted': '7cf6efe5-a221-4fe4-b94f-8945127a489a',
32-
'status': 'active',
33-
'tenant_id': 'cc925a5d-9644-4a4f-8d99-0bee49aadd05',
34-
},
35-
]
7+
@pytest.fixture(name='activity_factory')
8+
def _activity_factory() -> domain.Activity:
9+
def _make_activity(data: dict):
10+
activity = domain.Activity(**data)
11+
return activity
12+
return _make_activity
3613

37-
with open(json_file, 'w') as outfile:
38-
json.dump(activities, outfile)
14+
@pytest.fixture(name='create_fake_dao')
15+
def _create_fake_dao() -> domain.ActivitiesDao:
16+
db_fake = DB('sqlite:///:memory:')
17+
dao = infrastructure.ActivitiesSQLDao(db_fake)
18+
return dao
3919

40-
yield activities, json_file
41-
shutil.rmtree(temporary_directory)
20+
@pytest.fixture(name='create_fake_database')
21+
def _create_fake_database() -> domain.ActivitiesDao:
22+
db_fake = DB('sqlite:///:memory:')
23+
return db_fake
Lines changed: 98 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,144 @@
1-
from time_tracker.activities._application import _activities as activities
1+
import pytest
2+
import json
23
from faker import Faker
34

45
import azure.functions as func
5-
import json
6-
7-
8-
ACTIVITY_URL = "/api/activities/"
9-
6+
import sqlalchemy
7+
from sqlalchemy.sql.sqltypes import Integer
8+
9+
import time_tracker.activities._application._activities as azure_activities
10+
import time_tracker.activities._domain as domain
11+
import time_tracker.activities._infrastructure as infrastructure
12+
from time_tracker._infrastructure import DB
13+
14+
ACTIVITY_URL = '/api/activities/'
15+
16+
DEMO_DATA = [
17+
{
18+
'id': 1,
19+
'name': 'Activity Demo create',
20+
'description': 'test demo create an new activity',
21+
'deleted': None,
22+
'status': None,
23+
},
24+
{
25+
'id': 2,
26+
'name': 'Activity Demo create',
27+
'description': 'test demo create an new activity',
28+
'deleted': None,
29+
'status': None,
30+
},
31+
]
32+
33+
34+
@pytest.fixture(name='insert_activity')
35+
def _insert_activity() -> domain.Activity:
36+
def _new_activity(activity: dict, database: DB):
37+
dao = infrastructure.ActivitiesSQLDao(database)
38+
new_activity = dao.create(activity)
39+
return new_activity
40+
return _new_activity
1041

1142
def test__activity_azure_endpoint__returns_all_activities(
12-
create_temp_activities,
43+
create_fake_database, activity_factory, insert_activity
1344
):
14-
activities_json, tmp_directory = create_temp_activities
15-
activities._get_activities.JSON_PATH = tmp_directory
16-
req = func.HttpRequest(method="GET", body=None, url=ACTIVITY_URL)
45+
fake_database = create_fake_database
46+
existent_activities= [activity_factory(DEMO_DATA[0]), activity_factory(DEMO_DATA[1])]
47+
inserted_activities = [insert_activity(existent_activities[0].__dict__, fake_database).__dict__, insert_activity(existent_activities[1].__dict__, fake_database).__dict__]
1748

18-
response = activities.get_activities(req)
49+
azure_activities._get_activities.DATABASE = fake_database
50+
req = func.HttpRequest(method='GET', body=None, url=ACTIVITY_URL)
51+
response = azure_activities._get_activities.get_activities(req)
1952
activities_json_data = response.get_body().decode("utf-8")
20-
53+
2154
assert response.status_code == 200
22-
assert activities_json_data == json.dumps(activities_json)
55+
assert activities_json_data == json.dumps(inserted_activities)
2356

2457

2558
def test__activity_azure_endpoint__returns_an_activity__when_activity_matches_its_id(
26-
create_temp_activities,
59+
create_fake_database, activity_factory, insert_activity
2760
):
28-
activities_json, tmp_directory = create_temp_activities
29-
activities._get_activities.JSON_PATH = tmp_directory
61+
fake_database = create_fake_database
62+
existent_activity= activity_factory(DEMO_DATA[0])
63+
inserted_activity = insert_activity(existent_activity.__dict__, fake_database).__dict__
64+
65+
azure_activities._get_activities.DATABASE = fake_database
3066
req = func.HttpRequest(
31-
method="GET",
67+
method='GET',
3268
body=None,
3369
url=ACTIVITY_URL,
34-
route_params={"id": activities_json[0]["id"]},
70+
route_params={"id": inserted_activity["id"]},
3571
)
3672

37-
response = activities.get_activities(req)
73+
response = azure_activities._get_activities.get_activities(req)
3874
activitiy_json_data = response.get_body().decode("utf-8")
3975

4076
assert response.status_code == 200
41-
assert activitiy_json_data == json.dumps(activities_json[0])
77+
assert activitiy_json_data == json.dumps(inserted_activity)
4278

4379

4480
def test__activity_azure_endpoint__returns_an_activity_with_inactive_status__when_an_activity_matching_its_id_is_found(
45-
create_temp_activities,
46-
):
47-
activities_json, tmp_directory = create_temp_activities
48-
activities._delete_activity.JSON_PATH = tmp_directory
81+
create_fake_database,activity_factory, insert_activity
82+
):
83+
fake_database = create_fake_database
84+
existent_activity= activity_factory(DEMO_DATA[0])
85+
inserted_activity = insert_activity(existent_activity.__dict__, fake_database).__dict__
86+
87+
azure_activities._delete_activity.DATABASE = fake_database
4988
req = func.HttpRequest(
50-
method="DELETE",
89+
method='DELETE',
5190
body=None,
5291
url=ACTIVITY_URL,
53-
route_params={"id": activities_json[0]["id"]},
92+
route_params={"id": inserted_activity["id"]},
5493
)
5594

56-
response = activities.delete_activity(req)
95+
response = azure_activities._delete_activity.delete_activity(req)
5796
activity_json_data = json.loads(response.get_body().decode("utf-8"))
5897

5998
assert response.status_code == 200
60-
assert activity_json_data["status"] == "inactive"
99+
assert activity_json_data['status'] == 0
100+
assert activity_json_data['deleted'] == True
61101

62102

63103
def test__update_activity_azure_endpoint__returns_an_activity__when_found_an_activity_to_update(
64-
create_temp_activities,
104+
create_fake_database, activity_factory, insert_activity
65105
):
66-
activities_json, tmp_directory = create_temp_activities
67-
activities._update_activity.JSON_PATH = tmp_directory
68-
activity_data = {"description": Faker().sentence()}
106+
fake_database = create_fake_database
107+
existent_activity= activity_factory(DEMO_DATA[0])
108+
inserted_activity = insert_activity(existent_activity.__dict__, fake_database).__dict__
109+
110+
azure_activities._update_activity.DATABASE = fake_database
111+
activity_body = {"description": Faker().sentence()}
69112
req = func.HttpRequest(
70-
method="PUT",
71-
body=json.dumps(activity_data).encode("utf-8"),
113+
method='PUT',
114+
body=json.dumps(activity_body).encode("utf-8"),
72115
url=ACTIVITY_URL,
73-
route_params={"id": activities_json[0]["id"]},
116+
route_params={"id": inserted_activity["id"]},
74117
)
75118

76-
response = activities.update_activity(req)
119+
response = azure_activities._update_activity.update_activity(req)
77120
activitiy_json_data = response.get_body().decode("utf-8")
78-
new_activity = {**activities_json[0], **activity_data}
121+
inserted_activity.update(activity_body)
79122

80123
assert response.status_code == 200
81-
assert activitiy_json_data == json.dumps(new_activity)
124+
assert activitiy_json_data == json.dumps(inserted_activity)
82125

83126

84127
def test__activity_azure_endpoint__creates_an_activity__when_activity_has_all_attributes(
85-
create_temp_activities,
86-
):
87-
activities_json, tmp_directory = create_temp_activities
88-
activities._create_activity._JSON_PATH = tmp_directory
89-
90-
activity_body = {
91-
"id": None,
92-
"name": Faker().user_name(),
93-
"description": Faker().sentence(),
94-
"deleted": Faker().uuid4(),
95-
"status": "active",
96-
"tenant_id": Faker().uuid4(),
97-
}
98-
body = json.dumps(activity_body).encode("utf-8")
99-
req = func.HttpRequest(
100-
method="POST",
101-
body=body,
102-
url=ACTIVITY_URL,
103-
)
104-
105-
response = activities.create_activity(req)
106-
activitiy_json_data = response.get_body()
107-
assert response.status_code == 201
108-
assert activitiy_json_data == body
128+
create_fake_database,
129+
):
130+
azure_activities._create_activity.DATABASE = create_fake_database
131+
activity_body = {'id': None, 'name': Faker().user_name(), 'description': Faker().sentence(),'deleted': False ,'status': 1}
132+
body = json.dumps(activity_body).encode("utf-8")
133+
req = func.HttpRequest(
134+
method='POST',
135+
body= body,
136+
url=ACTIVITY_URL,
137+
)
138+
139+
response = azure_activities._create_activity.create_activity(req)
140+
activitiy_json_data = json.loads(response.get_body())
141+
activity_body['id'] = activitiy_json_data['id']
142+
143+
assert response.status_code == 201
144+
assert activitiy_json_data == activity_body

V2/tests/conftest.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
# flake8: noqa
2-
from tests.api.api_fixtures import create_temp_activities
1+
from tests.api.api_fixtures import _activity_factory, _create_fake_dao, _create_fake_database

0 commit comments

Comments
 (0)