Skip to content

Commit 2d0efbd

Browse files
committed
feat: TT-418 crud and tests added
1 parent d39c376 commit 2d0efbd

File tree

20 files changed

+493
-84
lines changed

20 files changed

+493
-84
lines changed

V2/serverless.yml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ functions:
121121
x-azure-settings:
122122
methods:
123123
- POST
124-
route: customer/
124+
route: customers/
125125
authLevel: anonymous
126126

127127
get_customers:
@@ -134,6 +134,16 @@ functions:
134134
route: customers/{id:?}
135135
authLevel: anonymous
136136

137+
update_customer:
138+
handler: time_tracker/customers/interface.update_customer
139+
events:
140+
- http: true
141+
x-azure-settings:
142+
methods:
143+
- PUT
144+
route: customers/{id}
145+
authLevel: anonymous
146+
137147
delete_customer:
138148
handler: time_tracker/customers/interface.delete_customer
139149
events:
@@ -146,4 +156,5 @@ functions:
146156

147157
#endregion Fin Customer
148158

149-
#endregion Fin Funciones
159+
#endregion Fin Funciones
160+

V2/tests/api/azure/customer_azure_endpoints_test.py

Lines changed: 116 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
1-
import pytest
21
import json
32
from faker import Faker
43

54
import azure.functions as func
65

76
import time_tracker.customers._application._customers as azure_customers
8-
from time_tracker._infrastructure import DB
9-
from time_tracker.customers import _domain as domain_customers
10-
from time_tracker.customers import _infrastructure as infrastructure_customers
11-
127

138
CUSTOMER_URL = "/api/customers/"
149

1510

16-
def test__customer_azure_endpoint__creates_a_customer__when_customer_has_all_necesary_attributes(
11+
def test__create_customer_azure_endpoint__creates_a_customer__when_customer_has_all_necesary_attributes(
1712
customer_factory
1813
):
1914
customer_body = customer_factory().__dict__
@@ -33,7 +28,7 @@ def test__customer_azure_endpoint__creates_a_customer__when_customer_has_all_nec
3328
assert customer_json_data == customer_body
3429

3530

36-
def test__customer_azure_endpoint__returns_a_status_400__when_dont_recieve_all_necessary_attributes():
31+
def test__create_customer_azure_endpoint__returns_a_status_400__when_dont_recieve_all_necessary_attributes():
3732
customer_to_insert = {
3833
"id": None,
3934
"name": Faker().user_name(),
@@ -52,3 +47,117 @@ def test__customer_azure_endpoint__returns_a_status_400__when_dont_recieve_all_n
5247

5348
assert response.status_code == 400
5449
assert response.get_body() == b'Invalid format or structure of the attributes of the customer'
50+
51+
52+
def test__delete_customer_azure_endpoint__returns_a_customer_with_true_deleted__when_its_id_is_found(
53+
test_db, customer_factory, insert_customer
54+
):
55+
customer_preinsert = customer_factory()
56+
inserted_customer = insert_customer(customer_preinsert, test_db).__dict__
57+
58+
req = func.HttpRequest(
59+
method='DELETE',
60+
body=None,
61+
url=CUSTOMER_URL,
62+
route_params={"id": inserted_customer["id"]},
63+
)
64+
65+
response = azure_customers._delete_customer.delete_customer(req)
66+
customer_json_data = json.loads(response.get_body().decode("utf-8"))
67+
68+
assert response.status_code == 200
69+
assert customer_json_data['deleted'] is True
70+
71+
72+
def test__update_customer_azure_endpoint__returns_an_updated_customer__when_customer_has_all_necesary_attributes(
73+
test_db, customer_factory, insert_customer
74+
):
75+
existent_customer = customer_factory()
76+
inserted_customer = insert_customer(existent_customer, test_db).__dict__
77+
78+
inserted_customer["description"] = Faker().sentence()
79+
80+
body = json.dumps(inserted_customer).encode("utf-8")
81+
req = func.HttpRequest(
82+
method='PUT',
83+
body=body,
84+
url=CUSTOMER_URL,
85+
route_params={"id": inserted_customer["id"]},
86+
)
87+
88+
response = azure_customers._update_customer.update_customer(req)
89+
customer_json_data = json.loads(response.get_body())
90+
91+
assert response.status_code == 200
92+
assert customer_json_data == inserted_customer
93+
94+
95+
def test__update_customer_azure_endpoint__returns_update_a_customer__when_customer_has_all_necesary_attributes(
96+
customer_factory
97+
):
98+
existent_customer = customer_factory().__dict__
99+
100+
body = json.dumps(existent_customer).encode("utf-8")
101+
req = func.HttpRequest(
102+
method='PUT',
103+
body=body,
104+
url=CUSTOMER_URL,
105+
route_params={"id": Faker().pyint()},
106+
)
107+
108+
response = azure_customers._update_customer.update_customer(req)
109+
110+
assert response.status_code == 409
111+
assert response.get_body() == b'This customer does not exist'
112+
113+
114+
def test__delete_customers_azure_endpoint__returns_a_status_code_400__when_customer_recive_invalid_id(
115+
):
116+
req = func.HttpRequest(
117+
method="DELETE",
118+
body=None,
119+
url=CUSTOMER_URL,
120+
route_params={"id": "invalid id"},
121+
)
122+
123+
response = azure_customers._delete_customer.delete_customer(req)
124+
125+
assert response.status_code == 400
126+
assert response.get_body() == b'Invalid Format ID'
127+
128+
129+
def test__customers_azure_endpoint__returns_all_customers(
130+
test_db, customer_factory, insert_customer
131+
):
132+
customer_to_insert = customer_factory()
133+
134+
inserted_customer = insert_customer(customer_to_insert, test_db).__dict__
135+
136+
req = func.HttpRequest(method='GET', body=None, url=CUSTOMER_URL)
137+
response = azure_customers._get_customers.get_customers(req)
138+
customers_json_data = response.get_body().decode("utf-8")
139+
customer_list = json.loads(customers_json_data)
140+
141+
assert response.status_code == 200
142+
assert customers_json_data <= json.dumps(inserted_customer)
143+
assert customer_list.pop() == inserted_customer
144+
145+
146+
def test__customer_azure_endpoint__returns_a_customer__when_customer_matches_its_id(
147+
test_db, customer_factory, insert_customer
148+
):
149+
existent_customer = customer_factory()
150+
inserted_customer = insert_customer(existent_customer, test_db).__dict__
151+
152+
req = func.HttpRequest(
153+
method='GET',
154+
body=None,
155+
url=CUSTOMER_URL,
156+
route_params={"id": inserted_customer["id"]},
157+
)
158+
159+
response = azure_customers._get_customers.get_customers(req)
160+
customer_json_data = response.get_body().decode("utf-8")
161+
162+
assert response.status_code == 200
163+
assert customer_json_data == json.dumps(inserted_customer)

V2/tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# flake8: noqa
22
from fixtures import _activity_factory, _test_db, _insert_activity
33
from fixtures import _time_entry_factory
4-
from fixtures import _customer_factory
4+
from fixtures import _customer_factory, _insert_customer

V2/tests/fixtures.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import time_tracker.time_entries._domain as time_entries_domain
66
import time_tracker.customers._domain as customers_domain
77
import time_tracker.activities._infrastructure as activities_infrastructure
8+
import time_tracker.customers._infrastructure as customer_infrastructure
89
from time_tracker._infrastructure import DB
910

1011

@@ -94,3 +95,12 @@ def _make_customer(
9495
return customer
9596

9697
return _make_customer
98+
99+
100+
@pytest.fixture(name='insert_customer')
101+
def _insert_customer() -> dict:
102+
def _new_customer(customer: customers_domain.Customer, database: DB):
103+
dao = customer_infrastructure.CustomersSQLDao(database)
104+
new_customer = dao.create(customer)
105+
return new_customer
106+
return _new_customer

V2/tests/integration/daos/customers_dao_test.py

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import pytest
2+
import typing
3+
from faker import Faker
24

35
import time_tracker.customers._domain as domain
46
import time_tracker.customers._infrastructure as infrastructure
@@ -22,7 +24,7 @@ def _clean_database():
2224
dao.db.get_session().execute(query)
2325

2426

25-
def test__customer_dao__returns_a_customer_dto__when_saves_correctly_with_sql_database(
27+
def test__create_customer_dao__returns_a_customer_dto__when_saves_correctly_with_sql_database(
2628
test_db, customer_factory, create_fake_dao
2729
):
2830
dao = create_fake_dao(test_db)
@@ -33,3 +35,104 @@ def test__customer_dao__returns_a_customer_dto__when_saves_correctly_with_sql_da
3335

3436
assert isinstance(inserted_customer, domain.Customer)
3537
assert inserted_customer == customer_to_insert
38+
39+
40+
def test__get_all__returns_a_list_of_customer_dto_objects__when_one_or_more_customers_are_found_with_sql_database(
41+
test_db, create_fake_dao, customer_factory, insert_customer
42+
):
43+
dao = create_fake_dao(test_db)
44+
customer_to_insert = customer_factory()
45+
inserted_customer = [dao.create(customer_to_insert)]
46+
47+
customers = dao.get_all()
48+
49+
assert isinstance(customers, typing.List)
50+
assert customers == inserted_customer
51+
52+
53+
def test_get_by_id__returns_a_customer_dto__when_found_one_customer_that_matches_its_id_with_sql_database(
54+
test_db, create_fake_dao, customer_factory, insert_customer
55+
):
56+
dao = create_fake_dao(test_db)
57+
existent_customer = customer_factory()
58+
inserted_customer = insert_customer(existent_customer, dao.db)
59+
60+
customer = dao.get_by_id(inserted_customer.id)
61+
62+
assert isinstance(customer, domain.Customer)
63+
assert customer.id == inserted_customer.id
64+
assert customer == inserted_customer
65+
66+
67+
def test__get_by_id__returns_none__when_no_customer_matches_its_id_with_sql_database(
68+
test_db, create_fake_dao, customer_factory
69+
):
70+
dao = create_fake_dao(test_db)
71+
existent_customer = customer_factory()
72+
73+
customer = dao.get_by_id(existent_customer.id)
74+
75+
assert customer is None
76+
77+
78+
def test_get_all__returns_an_empty_list__when_doesnt_found_any_customers_with_sql_database(
79+
test_db, create_fake_dao
80+
):
81+
customers = create_fake_dao(test_db).get_all()
82+
83+
assert isinstance(customers, typing.List)
84+
assert customers == []
85+
86+
87+
def test_delete__returns_a_customer_with_inactive_status__when_a_customer_matching_its_id_is_found_with_sql_database(
88+
test_db, create_fake_dao, customer_factory, insert_customer
89+
):
90+
dao = create_fake_dao(test_db)
91+
existent_customer = customer_factory()
92+
inserted_customer = insert_customer(existent_customer, dao.db)
93+
94+
customer = dao.delete(inserted_customer.id)
95+
96+
assert isinstance(customer, domain.Customer)
97+
assert customer.id == inserted_customer.id
98+
assert customer.status == 1
99+
assert customer.deleted is True
100+
101+
102+
def test_delete__returns_none__when_no_customer_matching_its_id_is_found_with_sql_database(
103+
test_db, create_fake_dao, customer_factory
104+
):
105+
dao = create_fake_dao(test_db)
106+
existent_customer = customer_factory()
107+
108+
results = dao.delete(existent_customer.id)
109+
110+
assert results is None
111+
112+
113+
def test__update_customer_dao__returns_an_updated_customer_dto__when_updates_correctly_with_sql_database(
114+
test_db, customer_factory, create_fake_dao, insert_customer
115+
):
116+
dao = create_fake_dao(test_db)
117+
118+
existent_customer = customer_factory()
119+
inserted_customer = insert_customer(existent_customer, dao.db).__dict__
120+
121+
inserted_customer["description"] = Faker().sentence()
122+
123+
updated_customer = dao.update(inserted_customer["id"], domain.Customer(**inserted_customer))
124+
125+
assert isinstance(updated_customer, domain.Customer)
126+
assert updated_customer.description == inserted_customer["description"]
127+
assert updated_customer.__dict__ == inserted_customer
128+
129+
130+
def test__update_customer_dao__returns_None__when_an_incorrect_id_is_passed(
131+
test_db, customer_factory, create_fake_dao, insert_customer
132+
):
133+
dao = create_fake_dao(test_db)
134+
existent_customer = customer_factory()
135+
136+
updated_customer = dao.update(Faker().pyint(), existent_customer)
137+
138+
assert updated_customer is None

V2/tests/unit/services/customer_service_test.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from faker import Faker
2+
13
from time_tracker.customers._domain import CustomerService
24

35

@@ -12,3 +14,57 @@ def test__create_customer__uses_the_customer_dao__to_create_a_customer(mocker, c
1214

1315
assert customer_dao.create.called
1416
assert expected_customer == new_customer
17+
18+
19+
def test__delete_customer__uses_the_customer_dao__to_delete_customer_selected(
20+
mocker,
21+
):
22+
expected_customer = mocker.Mock()
23+
customer_dao = mocker.Mock(
24+
delete=mocker.Mock(return_value=expected_customer)
25+
)
26+
27+
customer_service = CustomerService(customer_dao)
28+
deleted_customer = customer_service.delete(Faker().pyint())
29+
30+
assert customer_dao.delete.called
31+
assert expected_customer == deleted_customer
32+
33+
34+
def test__get_all__uses_the_customer_dao__to_retrieve_customers(mocker):
35+
expected_customers = mocker.Mock()
36+
customer_dao = mocker.Mock(
37+
get_all=mocker.Mock(return_value=expected_customers)
38+
)
39+
customer_service = CustomerService(customer_dao)
40+
41+
actual_customers = customer_service.get_all()
42+
43+
assert customer_dao.get_all.called
44+
assert expected_customers == actual_customers
45+
46+
47+
def test__get_by_id__uses_the_customer_dao__to_retrieve_one_customer(mocker):
48+
expected_customer = mocker.Mock()
49+
customer_dao = mocker.Mock(
50+
get_by_id=mocker.Mock(return_value=expected_customer)
51+
)
52+
customer_service = CustomerService(customer_dao)
53+
54+
actual_customer = customer_service.get_by_id(Faker().pyint())
55+
56+
assert customer_dao.get_by_id.called
57+
assert expected_customer == actual_customer
58+
59+
60+
def test__update_customer__uses_the_customer_dao__to_update_a_customer(mocker, customer_factory):
61+
expected_customer = mocker.Mock()
62+
customer_dao = mocker.Mock(
63+
update=mocker.Mock(return_value=expected_customer)
64+
)
65+
customer_service = CustomerService(customer_dao)
66+
67+
updated_customer = customer_service.update(Faker().pyint(), customer_factory())
68+
69+
assert customer_dao.update.called
70+
assert expected_customer == updated_customer

0 commit comments

Comments
 (0)