Skip to content

Commit 3a99add

Browse files
ararcosdsgarcia8
andauthored
feat: TT-357 Create V2 Activities Azure DAO (#334)
* feat: TT-357 Change Json Implementation for SQL * fix: TT-357 Resolution of comments * fix: TT-357 Update requirements * Refactor: TT-357 correction of FlakeV8 * fix: TT-357 change of an environment variable to a constant * refactor: TT-357 Refactor update and create activity Co-authored-by: Daniela Garcia <[email protected]>
1 parent 80f4ed1 commit 3a99add

36 files changed

+617
-542
lines changed

V2/.flake8

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[flake8]
2-
exclude = .git,__pycache__,./node_modules,
2+
exclude = .git,__pycache__,./node_modules,.venv
33
max-complexity = 10
44
max_line_length = 120

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/create_activity/function.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"disabled": false,
3+
"bindings": [
4+
{
5+
"type": "httpTrigger",
6+
"direction": "in",
7+
"name": "req",
8+
"route": "activities/",
9+
"authLevel": "anonymous",
10+
"methods": [
11+
"POST"
12+
]
13+
},
14+
{
15+
"type": "http",
16+
"direction": "out",
17+
"name": "$return"
18+
}
19+
],
20+
"entryPoint": "create_activity",
21+
"scriptFile": "../time_tracker/activities/interface.py"
22+
}

V2/delete_activity/function.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"disabled": false,
3+
"bindings": [
4+
{
5+
"type": "httpTrigger",
6+
"direction": "in",
7+
"name": "req",
8+
"route": "activities/{id}",
9+
"authLevel": "anonymous",
10+
"methods": [
11+
"DELETE"
12+
]
13+
},
14+
{
15+
"type": "http",
16+
"direction": "out",
17+
"name": "$return"
18+
}
19+
],
20+
"entryPoint": "delete_activity",
21+
"scriptFile": "../time_tracker/activities/interface.py"
22+
}

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/get_activities/function.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"disabled": false,
3+
"bindings": [
4+
{
5+
"type": "httpTrigger",
6+
"direction": "in",
7+
"name": "req",
8+
"route": "activities/{id:?}",
9+
"authLevel": "anonymous",
10+
"methods": [
11+
"GET"
12+
]
13+
},
14+
{
15+
"type": "http",
16+
"direction": "out",
17+
"name": "$return"
18+
}
19+
],
20+
"entryPoint": "get_activities",
21+
"scriptFile": "../time_tracker/activities/interface.py"
22+
}

V2/requirements.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@ flake8==4.0.1
1010
pytest-mock
1111

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

V2/tests/api/api_fixtures.py

Lines changed: 0 additions & 41 deletions
This file was deleted.
Lines changed: 78 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,135 @@
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
66

7+
import time_tracker.activities._application._activities as azure_activities
8+
import time_tracker.activities._infrastructure as infrastructure
9+
from time_tracker._infrastructure import DB
10+
from time_tracker.activities import _domain
11+
12+
ACTIVITY_URL = '/api/activities/'
713

8-
ACTIVITY_URL = "/api/activities/"
14+
15+
@pytest.fixture(name='insert_activity')
16+
def _insert_activity() -> dict:
17+
def _new_activity(activity: _domain.Activity, database: DB):
18+
dao = infrastructure.ActivitiesSQLDao(database)
19+
new_activity = dao.create(activity)
20+
return new_activity.__dict__
21+
return _new_activity
922

1023

1124
def test__activity_azure_endpoint__returns_all_activities(
12-
create_temp_activities,
25+
create_fake_database, activity_factory, insert_activity
1326
):
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)
17-
18-
response = activities.get_activities(req)
27+
fake_database = create_fake_database
28+
existent_activities = [activity_factory(), activity_factory()]
29+
inserted_activities = [
30+
insert_activity(existent_activities[0], fake_database),
31+
insert_activity(existent_activities[1], fake_database)
32+
]
33+
34+
azure_activities._get_activities.DATABASE = fake_database
35+
req = func.HttpRequest(method='GET', body=None, url=ACTIVITY_URL)
36+
response = azure_activities._get_activities.get_activities(req)
1937
activities_json_data = response.get_body().decode("utf-8")
2038

2139
assert response.status_code == 200
22-
assert activities_json_data == json.dumps(activities_json)
40+
assert activities_json_data == json.dumps(inserted_activities)
2341

2442

2543
def test__activity_azure_endpoint__returns_an_activity__when_activity_matches_its_id(
26-
create_temp_activities,
44+
create_fake_database, activity_factory, insert_activity
2745
):
28-
activities_json, tmp_directory = create_temp_activities
29-
activities._get_activities.JSON_PATH = tmp_directory
46+
fake_database = create_fake_database
47+
existent_activity = activity_factory()
48+
inserted_activity = insert_activity(existent_activity, fake_database)
49+
50+
azure_activities._get_activities.DATABASE = fake_database
3051
req = func.HttpRequest(
31-
method="GET",
52+
method='GET',
3253
body=None,
3354
url=ACTIVITY_URL,
34-
route_params={"id": activities_json[0]["id"]},
55+
route_params={"id": inserted_activity["id"]},
3556
)
3657

37-
response = activities.get_activities(req)
58+
response = azure_activities._get_activities.get_activities(req)
3859
activitiy_json_data = response.get_body().decode("utf-8")
3960

4061
assert response.status_code == 200
41-
assert activitiy_json_data == json.dumps(activities_json[0])
62+
assert activitiy_json_data == json.dumps(inserted_activity)
4263

4364

4465
def test__activity_azure_endpoint__returns_an_activity_with_inactive_status__when_an_activity_matching_its_id_is_found(
45-
create_temp_activities,
66+
create_fake_database, activity_factory, insert_activity
4667
):
47-
activities_json, tmp_directory = create_temp_activities
48-
activities._delete_activity.JSON_PATH = tmp_directory
68+
fake_database = create_fake_database
69+
existent_activity = activity_factory()
70+
inserted_activity = insert_activity(existent_activity, fake_database)
71+
72+
azure_activities._delete_activity.DATABASE = fake_database
4973
req = func.HttpRequest(
50-
method="DELETE",
74+
method='DELETE',
5175
body=None,
5276
url=ACTIVITY_URL,
53-
route_params={"id": activities_json[0]["id"]},
77+
route_params={"id": inserted_activity["id"]},
5478
)
5579

56-
response = activities.delete_activity(req)
80+
response = azure_activities._delete_activity.delete_activity(req)
5781
activity_json_data = json.loads(response.get_body().decode("utf-8"))
5882

5983
assert response.status_code == 200
60-
assert activity_json_data["status"] == "inactive"
84+
assert activity_json_data['status'] == 0
85+
assert activity_json_data['deleted'] is True
6186

6287

6388
def test__update_activity_azure_endpoint__returns_an_activity__when_found_an_activity_to_update(
64-
create_temp_activities,
89+
create_fake_database, activity_factory, insert_activity
6590
):
66-
activities_json, tmp_directory = create_temp_activities
67-
activities._update_activity.JSON_PATH = tmp_directory
68-
activity_data = {"description": Faker().sentence()}
91+
fake_database = create_fake_database
92+
existent_activity = activity_factory()
93+
inserted_activity = insert_activity(existent_activity, fake_database)
94+
95+
azure_activities._update_activity.DATABASE = fake_database
96+
activity_body = {"description": Faker().sentence()}
6997
req = func.HttpRequest(
70-
method="PUT",
71-
body=json.dumps(activity_data).encode("utf-8"),
98+
method='PUT',
99+
body=json.dumps(activity_body).encode("utf-8"),
72100
url=ACTIVITY_URL,
73-
route_params={"id": activities_json[0]["id"]},
101+
route_params={"id": inserted_activity["id"]},
74102
)
75103

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

80108
assert response.status_code == 200
81-
assert activitiy_json_data == json.dumps(new_activity)
109+
assert activitiy_json_data == json.dumps(inserted_activity)
82110

83111

84112
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-
113+
create_fake_database,
114+
):
115+
azure_activities._create_activity.DATABASE = create_fake_database
90116
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(),
117+
'id': None,
118+
'name': Faker().user_name(),
119+
'description': Faker().sentence(),
120+
'deleted': False,
121+
'status': 1
97122
}
98123
body = json.dumps(activity_body).encode("utf-8")
99124
req = func.HttpRequest(
100-
method="POST",
101-
body=body,
102-
url=ACTIVITY_URL,
125+
method='POST',
126+
body=body,
127+
url=ACTIVITY_URL,
103128
)
104129

105-
response = activities.create_activity(req)
106-
activitiy_json_data = response.get_body()
130+
response = azure_activities._create_activity.create_activity(req)
131+
activitiy_json_data = json.loads(response.get_body())
132+
activity_body['id'] = activitiy_json_data['id']
133+
107134
assert response.status_code == 201
108-
assert activitiy_json_data == body
135+
assert activitiy_json_data == activity_body

V2/tests/conftest.py

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

0 commit comments

Comments
 (0)