Skip to content

Commit

Permalink
Merge pull request #1340 from bcgov/feat/daniel-add-fuel-code-filteri…
Browse files Browse the repository at this point in the history
…ng-1267

feat: Add sorting and filtering to Fuel Codes
  • Loading branch information
dhaselhan authored Dec 6, 2024
2 parents 768e71a + 7b5b5fb commit 8b900b3
Show file tree
Hide file tree
Showing 23 changed files with 401 additions and 713 deletions.
2 changes: 1 addition & 1 deletion backend/lcfs/db/models/fuel/FuelCode.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class FuelCode(BaseModel, Auditable, EffectiveDates):
fuel_code_prefix = relationship(
"FuelCodePrefix", back_populates="fuel_codes", lazy="joined"
)
fuel_code_type = relationship(
fuel_type = relationship(
"FuelType", back_populates="fuel_codes", lazy="joined"
)

Expand Down
2 changes: 1 addition & 1 deletion backend/lcfs/db/models/fuel/FuelType.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class FuelType(BaseModel, Auditable, DisplayOrder):
)

# Relationships
fuel_codes = relationship("FuelCode", back_populates="fuel_code_type")
fuel_codes = relationship("FuelCode", back_populates="fuel_type")
energy_density = relationship(
"EnergyDensity", back_populates="fuel_type", uselist=False
) # One energy density per fuel type
Expand Down
2 changes: 1 addition & 1 deletion backend/lcfs/tests/fuel_code/test_fuel_code_exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ async def test_export_success():
approval_date="2023-11-01",
effective_date="2023-12-01",
expiration_date="2024-01-01",
fuel_code_type=MagicMock(fuel_type="Diesel"),
fuel_type=MagicMock(fuel_type="Diesel"),
feedstock="Corn oil",
feedstock_location="Canada",
feedstock_misc=None,
Expand Down
10 changes: 5 additions & 5 deletions backend/lcfs/tests/fuel_code/test_fuel_code_repo.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import pytest
from unittest.mock import AsyncMock
from unittest.mock import AsyncMock, MagicMock
from lcfs.web.api.fuel_code.repo import FuelCodeRepository
from lcfs.db.models.fuel.TransportMode import TransportMode

Expand All @@ -23,10 +23,10 @@ async def test_get_transport_mode_by_name(fuel_code_repo, mock_db):
# Define the test transport mode
transport_mode_name = "Truck"
mock_transport_mode = TransportMode(transport_mode_id=1, transport_mode="Truck")

# Mock the database query result
mock_db.execute.return_value.scalar_one_or_none = AsyncMock()
mock_db.execute.return_value.scalar_one_or_none.return_value = mock_transport_mode
mock_db.execute.return_value.scalar_one = MagicMock()
mock_db.execute.return_value.scalar_one.return_value = mock_transport_mode

# Call the repository method
result = await fuel_code_repo.get_transport_mode_by_name(transport_mode_name)
Expand All @@ -35,4 +35,4 @@ async def test_get_transport_mode_by_name(fuel_code_repo, mock_db):
assert result == mock_transport_mode

# Ensure the database query was called
mock_db.execute.assert_called_once()
mock_db.execute.assert_called_once()
2 changes: 1 addition & 1 deletion backend/lcfs/tests/fuel_code/test_fuel_code_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ async def test_get_fuel_codes_success():
pagination = PaginationRequestSchema(page=1, size=10)

# Act
result = await service.get_fuel_codes(pagination)
result = await service.search_fuel_codes(pagination)

# Assert
assert isinstance(result.pagination, PaginationResponseSchema)
Expand Down
70 changes: 68 additions & 2 deletions backend/lcfs/tests/fuel_code/test_fuel_code_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,15 @@
from httpx import AsyncClient
from starlette import status

from fastapi import FastAPI

from lcfs.db.models.fuel.FuelCodeStatus import FuelCodeStatusEnum
from lcfs.db.models.user.Role import RoleEnum
from lcfs.web.api.fuel_code.schema import FuelCodeCreateUpdateSchema
from lcfs.web.api.fuel_code.schema import (
FuelCodeCreateUpdateSchema,
TransportModeSchema,
FuelCodeStatusSchema,
)
from lcfs.web.exception.exceptions import DataNotFoundException


Expand Down Expand Up @@ -232,7 +239,7 @@ async def test_get_fuel_codes_success(
pagination_request_schema,
):
with patch(
"lcfs.web.api.fuel_code.services.FuelCodeServices.get_fuel_codes"
"lcfs.web.api.fuel_code.services.FuelCodeServices.search_fuel_codes"
) as mock_get_fuel_codes:
set_user_role(RoleEnum.GOVERNMENT)

Expand Down Expand Up @@ -570,3 +577,62 @@ def test_valid_capacity_unit(valid_fuel_code_data):
valid_data["facility_nameplate_capacity_unit"] = "Gallons"
model = FuelCodeCreateUpdateSchema(**valid_data)
assert model.facility_nameplate_capacity == 100


@pytest.mark.anyio
async def test_get_fuel_code_statuses_success(
client: AsyncClient, fastapi_app: FastAPI
):
with patch(
"lcfs.web.api.fuel_code.services.FuelCodeServices.get_fuel_code_statuses"
) as mock_get_statuses:
# Mock the return value of the service
mock_get_statuses.return_value = [
FuelCodeStatusSchema(
fuel_code_status_id=1, status=FuelCodeStatusEnum.Draft
),
FuelCodeStatusSchema(
fuel_code_status_id=2, status=FuelCodeStatusEnum.Approved
),
]

# Send GET request to the endpoint
url = "/api/fuel-codes/statuses"
response = await client.get(url)

# Assertions
assert response.status_code == status.HTTP_200_OK
result = response.json()
assert isinstance(result, list)
assert len(result) == 2
print(result[0])
assert result[0]["fuelCodeStatusId"] == 1
assert result[0]["status"] == "Draft"
assert result[1]["fuelCodeStatusId"] == 2
assert result[1]["status"] == "Approved"


@pytest.mark.anyio
async def test_get_transport_modes_success(client: AsyncClient, fastapi_app: FastAPI):
with patch(
"lcfs.web.api.fuel_code.services.FuelCodeServices.get_transport_modes"
) as mock_get_modes:
# Mock the return value of the service
mock_get_modes.return_value = [
TransportModeSchema(transport_mode_id=1, transport_mode="Truck"),
TransportModeSchema(transport_mode_id=2, transport_mode="Ship"),
]

# Send GET request to the endpoint
url = "/api/fuel-codes/transport-modes"
response = await client.get(url)

# Assertions
assert response.status_code == status.HTTP_200_OK
result = response.json()
assert isinstance(result, list)
assert len(result) == 2
assert result[0]["transportModeId"] == 1
assert result[0]["transportMode"] == "Truck"
assert result[1]["transportModeId"] == 2
assert result[1]["transportMode"] == "Ship"
3 changes: 2 additions & 1 deletion backend/lcfs/tests/test_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ async def test_get_users_with_filter(
{
"filterType": "number",
"type": "equals",
"filter": "1",
"filter": 1,
"field": "user_profile_id",
}
],
Expand All @@ -120,6 +120,7 @@ async def test_get_users_with_filter(
# Check the status code
assert response.status_code == status.HTTP_200_OK
# check if pagination is working as expected.

content = UsersSchema(**response.json())
ids = [user.user_profile_id for user in content.users]
# check if only one user element exists with user_profile_id 1.
Expand Down
14 changes: 8 additions & 6 deletions backend/lcfs/web/api/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@ class BaseSchema(BaseModel):
from_attributes=True,
)


class ComplianceReportRequestSchema(BaseSchema):
compliance_report_id: int


def row_to_dict(row, schema):
d = {}
for field in schema.__fields__.values():
Expand Down Expand Up @@ -216,12 +218,12 @@ def apply_number_filter_conditions(field, filter_value, filter_option):
return and_(field >= filter_value[0], field <= filter_value[1])
else:
number_filter_mapping = {
"equals": field == int(filter_value),
"notEqual": field != int(filter_value),
"greaterThan": field > int(filter_value),
"greaterThanOrEqual": field >= int(filter_value),
"lessThan": field < int(filter_value),
"lessThanOrEqual": field <= int(filter_value),
"equals": field == filter_value,
"notEqual": field != filter_value,
"greaterThan": field > filter_value,
"greaterThanOrEqual": field >= filter_value,
"lessThan": field < filter_value,
"lessThanOrEqual": field <= filter_value,
}
return number_filter_mapping.get(filter_option)

Expand Down
2 changes: 1 addition & 1 deletion backend/lcfs/web/api/fuel_code/export.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ async def export(self, export_format) -> StreamingResponse:
fuel_code.approval_date,
fuel_code.effective_date,
fuel_code.expiration_date,
fuel_code.fuel_code_type.fuel_type,
fuel_code.fuel_type.fuel_type,
fuel_code.feedstock,
fuel_code.feedstock_location,
fuel_code.feedstock_misc,
Expand Down
Loading

0 comments on commit 8b900b3

Please sign in to comment.