Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion V2/serverless.yml
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,16 @@ functions:

authLevel: anonymous

get_latest_projects:
handler: time_tracker/projects/interface.get_latest_projects
events:
- http: true
x-azure-settings:
methods:
- GET
route: projects/latest
authLevel: anonymous

#endregion End Functions Projects

#endregion End Functions
#endregion End Functions
58 changes: 39 additions & 19 deletions V2/tests/api/azure/project_azure_endpoints_test.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,14 @@
import json
from http import HTTPStatus

import pytest
from faker import Faker
import azure.functions as func

from time_tracker.projects._application import _projects as azure_projects
from time_tracker.projects import _domain as domain
from time_tracker.projects import _infrastructure as infrastructure

PROJECT_URL = '/api/projects/'


@pytest.fixture(name='insert_project')
def _insert_project(test_db, insert_customer, project_factory, customer_factory) -> domain.Project:
inserted_customer = insert_customer(customer_factory(), test_db)

def _new_project():
project_to_insert = project_factory(customer_id=inserted_customer.id)
dao = infrastructure.ProjectsSQLDao(test_db)
inserted_project = dao.create(project_to_insert)
return inserted_project
return _new_project


def test__project_azure_endpoint__returns_all_projects(
insert_project
):
Expand Down Expand Up @@ -146,19 +131,17 @@ def test__update_project_azure_endpoint__returns_a_project__when_found_a_project


def test__update_projects_azure_endpoint__returns_a_status_code_404__when_no_found_a_project_to_update(
project_factory
):
project_body = project_factory().__dict__
project_body = {"description": Faker().sentence()}

req = func.HttpRequest(
method="PUT",
body=json.dumps(project_body).encode("utf-8"),
url=PROJECT_URL,
route_params={"id": project_body["id"]},
route_params={"id": Faker().pyint()},
)

response = azure_projects._update_project.update_project(req)

assert response.status_code == HTTPStatus.NOT_FOUND
assert response.get_body() == b"Not found"

Expand Down Expand Up @@ -249,3 +232,40 @@ def test__project_azure_endpoint__returns_a_status_code_500__when_project_receiv

assert response.status_code == HTTPStatus.INTERNAL_SERVER_ERROR
assert response.get_body() == b"could not be created"


def test__get_latest_projects_azure_endpoint__returns_a_list_of_latest_projects__when_an_owner_id_match(
insert_time_entry
):
inserted_time_entry = insert_time_entry().__dict__

req = func.HttpRequest(
method='GET',
body=None,
url=PROJECT_URL+"latest/",
params={"owner_id": inserted_time_entry["owner_id"]},
)

response = azure_projects._get_latest_projects.get_latest_projects(req)
projects_json_data = json.loads(response.get_body().decode("utf-8"))

assert response.status_code == HTTPStatus.OK
assert inserted_time_entry["project_id"] == projects_json_data[0]["id"]


def test__get_latest_projects_azure_endpoint__returns_an_empty_list__when_an_owner_id_not_match(
insert_time_entry
):
insert_time_entry().__dict__

req = func.HttpRequest(
method='GET',
body=None,
url=PROJECT_URL+"latest/",
)

response = azure_projects._get_latest_projects.get_latest_projects(req)
projects_json_data = json.loads(response.get_body().decode("utf-8"))

assert response.status_code == HTTPStatus.OK
assert projects_json_data == []
96 changes: 60 additions & 36 deletions V2/tests/api/azure/time_entry_azure_endpoints_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,11 @@ def test__time_entry_azure_endpoint__creates_an_time_entry__when_time_entry_has_


def test__delete_time_entries_azure_endpoint__returns_an_time_entry_with_true_deleted__when_its_id_is_found(
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory,
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory, insert_project
):
inserted_project = insert_project()
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"])
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], project_id=inserted_project.id)
inserted_time_entry = insert_time_entry(time_entry_body, test_db)

req = func.HttpRequest(
Expand Down Expand Up @@ -82,10 +83,11 @@ def test__delete_time_entries_azure_endpoint__returns_a_status_code_400__when_ti


def test__time_entry_azure_endpoint__returns_all_time_entries(
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity, insert_project
):
inserted_project = insert_project()
inserted_activity = insert_activity(activity_factory(), test_db)
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id)
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
inserted_time_entries = insert_time_entry(time_entries_to_insert, test_db).__dict__

req = func.HttpRequest(method="GET", body=None, url=TIME_ENTRY_URL)
Expand All @@ -99,10 +101,11 @@ def test__time_entry_azure_endpoint__returns_all_time_entries(


def test__time_entry_azure_endpoint__returns_an_time_entry__when_time_entry_matches_its_id(
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity, insert_project
):
inserted_project = insert_project()
inserted_activity = insert_activity(activity_factory(), test_db)
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id)
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
inserted_time_entries = insert_time_entry(time_entries_to_insert, test_db).__dict__

req = func.HttpRequest(
Expand All @@ -120,10 +123,11 @@ def test__time_entry_azure_endpoint__returns_an_time_entry__when_time_entry_matc


def test__get_time_entries_azure_endpoint__returns_a_status_code_400__when_time_entry_recive_invalid_id(
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity, insert_project
):
inserted_project = insert_project()
inserted_activity = insert_activity(activity_factory(), test_db)
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id)
time_entries_to_insert = time_entry_factory(activity_id=inserted_activity.id, project_id=inserted_project.id)
insert_time_entry(time_entries_to_insert, test_db).__dict__

req = func.HttpRequest(
Expand All @@ -139,28 +143,69 @@ def test__get_time_entries_azure_endpoint__returns_a_status_code_400__when_time_
assert response.get_body() == b'Invalid Format ID'


def test__get_latest_entries_azure_endpoint__returns_a_list_of_latest_time_entries__when_an_owner_id_match(
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory, insert_project
):
inserted_project = insert_project()
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], project_id=inserted_project.id)
inserted_time_entry = insert_time_entry(time_entry_body, test_db).__dict__

req = func.HttpRequest(
method='GET',
body=None,
url=TIME_ENTRY_URL+"latest/",
params={"owner_id": inserted_time_entry["owner_id"]},
)

response = azure_time_entries._get_latest_entries.get_latest_entries(req)
time_entry_json_data = json.loads(response.get_body().decode("utf-8"))

assert response.status_code == 200
assert time_entry_json_data == [inserted_time_entry]


def test__get_latest_entries_azure_endpoint__returns_no_time_entries_found__when_recieve_an_invalid_owner_id(
test_db, insert_activity, activity_factory,
):
insert_activity(activity_factory(), test_db)

req = func.HttpRequest(
method='GET',
body=None,
url=TIME_ENTRY_URL+"latest/",
params={"owner_id": Faker().pyint()},
)

response = azure_time_entries._get_latest_entries.get_latest_entries(req)

assert response.status_code == 404
assert response.get_body() == b'Not found'


def test__update_time_entry_azure_endpoint__returns_an_time_entry__when_found_an_time_entry_to_update(
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity
test_db, time_entry_factory, insert_time_entry, activity_factory, insert_activity, insert_project
):
inserted_activity = insert_activity(activity_factory(), test_db)
existent_time_entries = time_entry_factory(activity_id=inserted_activity.id)
inserted_time_entries = insert_time_entry(existent_time_entries, test_db).__dict__
inserted_project = insert_project()
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], project_id=inserted_project.id)
inserted_time_entry = insert_time_entry(time_entry_body, test_db).__dict__

time_entry_body = {"description": Faker().sentence()}

req = func.HttpRequest(
method='PUT',
body=json.dumps(time_entry_body).encode("utf-8"),
url=TIME_ENTRY_URL,
route_params={"id": inserted_time_entries["id"]},
route_params={"id": inserted_time_entry["id"]},
)

response = azure_time_entries._update_time_entry.update_time_entry(req)
activitiy_json_data = response.get_body().decode("utf-8")
inserted_time_entries.update(time_entry_body)
inserted_time_entry.update(time_entry_body)

assert response.status_code == 200
assert activitiy_json_data == json.dumps(inserted_time_entries)
assert activitiy_json_data == json.dumps(inserted_time_entry)


def test__update_time_entries_azure_endpoint__returns_a_status_code_400__when_time_entry_recive_invalid_format_id():
Expand Down Expand Up @@ -211,27 +256,6 @@ def test__update_time_entries_azure_endpoint__returns_a_status_code_400__when_ti
assert response.get_body() == b'Incorrect time entry body'


def test__get_latest_entries_azure_endpoint__returns_a_list_of_latest_time_entries__when_an_owner_id_match(
test_db, time_entry_factory, insert_time_entry, insert_activity, activity_factory,
):
inserted_activity = insert_activity(activity_factory(), test_db).__dict__
time_entry_body = time_entry_factory(activity_id=inserted_activity["id"], technologies="[jira,sql]")
inserted_time_entry = insert_time_entry(time_entry_body, test_db).__dict__

req = func.HttpRequest(
method='GET',
body=None,
url=TIME_ENTRY_URL+"latest/",
params={"owner_id": inserted_time_entry["owner_id"]},
)

response = azure_time_entries._get_latest_entries.get_latest_entries(req)
time_entry_json_data = json.loads(response.get_body().decode("utf-8"))

assert response.status_code == HTTPStatus.OK
assert time_entry_json_data == [inserted_time_entry]


def test__get_latest_entries_azure_endpoint__returns_not_found__when_recieve_an_invalid_owner_id(
test_db, insert_activity, activity_factory,
):
Expand Down
4 changes: 2 additions & 2 deletions V2/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# flake8: noqa
from fixtures import _activity_factory, _test_db, _insert_activity
from fixtures import _time_entry_factory
from fixtures import _time_entry_factory, _insert_time_entry
from fixtures import _customer_factory, _insert_customer
from fixtures import _project_factory
from fixtures import _project_factory, _insert_project
39 changes: 37 additions & 2 deletions V2/tests/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@

import time_tracker.activities._domain as activities_domain
import time_tracker.time_entries._domain as time_entries_domain
import time_tracker.time_entries._infrastructure as time_entries_infrastructure
import time_tracker.customers._domain as customers_domain
import time_tracker.activities._infrastructure as activities_infrastructure
import time_tracker.customers._infrastructure as customers_infrastructure
import time_tracker.projects._domain as projects_domain
import time_tracker.projects._infrastructure as projects_infrastructure
from time_tracker._infrastructure import DB


Expand Down Expand Up @@ -108,7 +110,8 @@ def _make_project(
customer_id=Faker().pyint(),
status=Faker().pyint(),
deleted=False,
technologies=str(Faker().pylist())
technologies=str(Faker().pylist()),
customer=None
):
project = projects_domain.Project(
id=id,
Expand All @@ -118,7 +121,8 @@ def _make_project(
customer_id=customer_id,
status=status,
deleted=deleted,
technologies=technologies
technologies=technologies,
customer=customer
)
return project
return _make_project
Expand All @@ -131,3 +135,34 @@ def _new_customer(customer: customers_domain.Customer, database: DB):
new_customer = dao.create(customer)
return new_customer
return _new_customer


@pytest.fixture(name='insert_project')
def _insert_project(test_db, insert_customer, project_factory, customer_factory) -> projects_domain.Project:
inserted_customer = insert_customer(customer_factory(), test_db)

def _new_project():
project_to_insert = project_factory(id=None, customer_id=inserted_customer.id, deleted=False)
dao = projects_infrastructure.ProjectsSQLDao(test_db)
inserted_project = dao.create(project_to_insert)
return inserted_project
return _new_project


@pytest.fixture(name='insert_time_entry')
def _insert_time_entry(
test_db, insert_project, activity_factory, insert_activity, time_entry_factory
) -> time_entries_domain.TimeEntry:

inserted_project = insert_project()
inserted_activity = insert_activity(activity_factory(), test_db)

def _new_time_entry(owner_id: int = Faker().pyint()):
dao = time_entries_infrastructure.TimeEntriesSQLDao(test_db)
time_entries_to_insert = time_entry_factory(
activity_id=inserted_activity.id, project_id=inserted_project.id, owner_id=owner_id
)

inserted_time_entries = dao.create(time_entries_to_insert)
return inserted_time_entries
return _new_time_entry
Loading