Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
CosmoV committed Dec 15, 2023
1 parent 09f72f3 commit a679a1a
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 80 deletions.
81 changes: 1 addition & 80 deletions tests/test_api/test_api_sqla_with_includes.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@
from collections import defaultdict
from itertools import chain, zip_longest
from json import dumps
from typing import Any, Dict, List
from unittest.mock import Mock
from typing import Dict, List
from uuid import UUID, uuid4

from fastapi import FastAPI, status
Expand All @@ -15,8 +14,6 @@
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from fastapi_jsonapi.data_layers.filtering.sqlalchemy import Node
from fastapi_jsonapi.exceptions.json_api import InvalidType
from fastapi_jsonapi.views.view_base import ViewBase
from tests.common import is_postgres_tests
from tests.fixtures.app import build_app_custom
Expand Down Expand Up @@ -2353,80 +2350,4 @@ async def test_sort(
}


# TODO: move to it's own test module
class TestSQLAFilteringModule:
def test_user_type_cast_success(self):
class UserType:
def __init__(self, *args, **kwargs):
self.value = "success"

class ModelSchema(BaseModel):
user_type: UserType

class Config:
arbitrary_types_allowed = True

node = Node(
model=Mock(),
filter_={
"name": "user_type",
"op": "eq",
"val": Any,
},
schema=ModelSchema,
)

model_column_mock = Mock()
model_column_mock.eq = lambda clear_value: clear_value

clear_value = node.create_filter(
schema_field=ModelSchema.__fields__["user_type"],
model_column=model_column_mock,
operator=Mock(),
value=Any,
)
assert isinstance(clear_value, UserType)
assert clear_value.value == "success"

def test_user_type_cast_fail(self):
class UserType:
def __init__(self, *args, **kwargs):
msg = "Cast failed"
raise ValueError(msg)

class ModelSchema(BaseModel):
user_type: UserType

class Config:
arbitrary_types_allowed = True

node = Node(
model=Mock(),
filter_=Mock(),
schema=ModelSchema,
)

with raises(InvalidType) as exc_info:
node.create_filter(
schema_field=ModelSchema.__fields__["user_type"],
model_column=Mock(),
operator=Mock(),
value=Any,
)

assert exc_info.value.as_dict == {
"detail": "Can't cast filter value `typing.Any` to arbitrary type.",
"meta": [
{
"detail": "Cast failed",
"source": {"pointer": ""},
"status_code": status.HTTP_409_CONFLICT,
"title": "Conflict",
},
],
"status_code": status.HTTP_409_CONFLICT,
"title": "Invalid type.",
}


# todo: test errors
Empty file.
Empty file.
84 changes: 84 additions & 0 deletions tests/test_data_layers/test_filtering/test_sqlalchemy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
from typing import Any
from unittest.mock import Mock

from fastapi import status
from pydantic import BaseModel
from pytest import raises # noqa PT013

from fastapi_jsonapi.data_layers.filtering.sqlalchemy import Node
from fastapi_jsonapi.exceptions.json_api import InvalidType


class TestNode:
def test_user_type_cast_success(self):
class UserType:
def __init__(self, *args, **kwargs):
self.value = "success"

class ModelSchema(BaseModel):
user_type: UserType

class Config:
arbitrary_types_allowed = True

node = Node(
model=Mock(),
filter_={
"name": "user_type",
"op": "eq",
"val": Any,
},
schema=ModelSchema,
)

model_column_mock = Mock()
model_column_mock.eq = lambda clear_value: clear_value

clear_value = node.create_filter(
schema_field=ModelSchema.__fields__["user_type"],
model_column=model_column_mock,
operator=Mock(),
value=Any,
)
assert isinstance(clear_value, UserType)
assert clear_value.value == "success"

def test_user_type_cast_fail(self):
class UserType:
def __init__(self, *args, **kwargs):
msg = "Cast failed"
raise ValueError(msg)

class ModelSchema(BaseModel):
user_type: UserType

class Config:
arbitrary_types_allowed = True

node = Node(
model=Mock(),
filter_=Mock(),
schema=ModelSchema,
)

with raises(InvalidType) as exc_info:
node.create_filter(
schema_field=ModelSchema.__fields__["user_type"],
model_column=Mock(),
operator=Mock(),
value=Any,
)

assert exc_info.value.as_dict == {
"detail": "Can't cast filter value `typing.Any` to arbitrary type.",
"meta": [
{
"detail": "Cast failed",
"source": {"pointer": ""},
"status_code": status.HTTP_409_CONFLICT,
"title": "Conflict",
},
],
"status_code": status.HTTP_409_CONFLICT,
"title": "Invalid type.",
}

0 comments on commit a679a1a

Please sign in to comment.