Skip to content

Commit 1fd6cdb

Browse files
committed
tests folder moved to core, all imports changed to relative imports
1 parent 5b6229f commit 1fd6cdb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+142
-144
lines changed

README.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,12 @@ First, you may want to take a look at the project structure and understand what
427427
├── README.md # Project README providing information and instructions.
428428
├── docker-compose.yml # Docker Compose file for defining multi-container applications.
429429
430+
└── tests # Unit and integration tests for the application.
431+
│ ├── __init__.py
432+
│ ├── conftest.py # Configuration and fixtures for pytest.
433+
│ ├── helper.py # Helper functions for tests.
434+
│ └── test_user.py # Test cases for user-related functionality.
435+
430436
└── src # Source code directory.
431437
├── __init__.py # Initialization file for the src package.
432438
├── alembic.ini # Configuration file for Alembic (database migration tool).
@@ -517,16 +523,10 @@ First, you may want to take a look at the project structure and understand what
517523
│ └── versions # Individual migration scripts.
518524
│ └── README.MD
519525
520-
├── scripts # Utility scripts for the application.
521-
│ ├── __init__.py
522-
│ ├── create_first_superuser.py # Script to create the first superuser.
523-
│ └── create_first_tier.py # Script to create the first user tier.
524-
525-
└── tests # Unit and integration tests for the application.
526+
└── scripts # Utility scripts for the application.
526527
├── __init__.py
527-
├── conftest.py # Configuration and fixtures for pytest.
528-
├── helper.py # Helper functions for tests.
529-
└── test_user.py # Test cases for user-related functionality.
528+
├── create_first_superuser.py # Script to create the first superuser.
529+
└── create_first_tier.py # Script to create the first user tier.
530530
```
531531

532532
### 5.2 Database Model

docker-compose.yml

+6-6
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ services:
5050
expose:
5151
- "6379"
5252

53-
# #-------- uncomment to run with nginx --------
53+
#-------- uncomment to run with nginx --------
5454
# nginx:
5555
# image: nginx:latest
5656
# ports:
@@ -60,7 +60,7 @@ services:
6060
# depends_on:
6161
# - web
6262

63-
# #-------- uncomment to create first superuser --------
63+
#-------- uncomment to create first superuser --------
6464
# create_superuser:
6565
# build:
6666
# context: .
@@ -80,16 +80,16 @@ services:
8080
# context: .
8181
# dockerfile: Dockerfile
8282
# env_file:
83-
# - ./src/.env
83+
# - ./src/.env
8484
# depends_on:
8585
# - db
8686
# - create_superuser
8787
# - redis
88-
# command: python -m pytest
88+
# command: python -m pytest ./tests
8989
# volumes:
90-
# - ./src:/code/src
90+
# - .:/code
9191

92-
# #-------- uncomment to create first tier --------
92+
#-------- uncomment to create first tier --------
9393
# create_tier:
9494
# build:
9595
# context: .

src/app/api/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from fastapi import APIRouter
22

3-
from app.api.v1 import router as v1_router
3+
from ..api.v1 import router as v1_router
44

55
router = APIRouter(prefix="/api")
66
router.include_router(v1_router)

src/app/api/dependencies.py

+13-14
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
from typing import Annotated, Union, Any
22

3-
from app.core.security import SECRET_KEY, ALGORITHM, oauth2_scheme
4-
from app.core.config import settings
5-
63
from sqlalchemy.ext.asyncio import AsyncSession
74
from jose import JWTError, jwt
85
from fastapi import (
@@ -11,17 +8,19 @@
118
Request
129
)
1310

14-
from app.core.exceptions.http_exceptions import UnauthorizedException, ForbiddenException, RateLimitException
15-
from app.core.db.database import async_get_db
16-
from app.core.logger import logging
17-
from app.core.schemas import TokenData
18-
from app.core.utils.rate_limit import is_rate_limited
19-
from app.core.security import verify_token
20-
from app.crud.crud_rate_limit import crud_rate_limits
21-
from app.crud.crud_tier import crud_tiers
22-
from app.crud.crud_users import crud_users
23-
from app.models.user import User
24-
from app.schemas.rate_limit import sanitize_path
11+
from ..core.security import oauth2_scheme
12+
from ..core.config import settings
13+
from ..core.exceptions.http_exceptions import UnauthorizedException, ForbiddenException, RateLimitException
14+
from ..core.db.database import async_get_db
15+
from ..core.logger import logging
16+
from ..core.schemas import TokenData
17+
from ..core.utils.rate_limit import is_rate_limited
18+
from ..core.security import verify_token
19+
from ..crud.crud_rate_limit import crud_rate_limits
20+
from ..crud.crud_tier import crud_tiers
21+
from ..crud.crud_users import crud_users
22+
from ..models.user import User
23+
from ..schemas.rate_limit import sanitize_path
2524

2625
logger = logging.getLogger(__name__)
2726

src/app/api/v1/__init__.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from fastapi import APIRouter
22

3-
from app.api.v1.login import router as login_router
4-
from app.api.v1.logout import router as logout_router
5-
from app.api.v1.users import router as users_router
6-
from app.api.v1.posts import router as posts_router
7-
from app.api.v1.tasks import router as tasks_router
8-
from app.api.v1.tiers import router as tiers_router
9-
from app.api.v1.rate_limits import router as rate_limits_router
3+
from .login import router as login_router
4+
from .logout import router as logout_router
5+
from .users import router as users_router
6+
from .posts import router as posts_router
7+
from .tasks import router as tasks_router
8+
from .tiers import router as tiers_router
9+
from .rate_limits import router as rate_limits_router
1010

1111
router = APIRouter(prefix="/v1")
1212
router.include_router(login_router)

src/app/api/v1/login.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
from typing import Annotated, Dict
2-
from datetime import timedelta, datetime, timezone
2+
from datetime import timedelta
33

44
from fastapi import Response, Request, Depends
55
from fastapi.security import OAuth2PasswordRequestForm
66
from sqlalchemy.ext.asyncio import AsyncSession
77
import fastapi
88

9-
from app.core.config import settings
10-
from app.core.db.database import async_get_db
11-
from app.core.exceptions.http_exceptions import UnauthorizedException
12-
from app.core.schemas import Token
13-
from app.core.security import (
9+
from ...core.config import settings
10+
from ...core.db.database import async_get_db
11+
from ...core.exceptions.http_exceptions import UnauthorizedException
12+
from ...core.schemas import Token
13+
from ...core.security import (
1414
ACCESS_TOKEN_EXPIRE_MINUTES,
1515
create_access_token,
1616
authenticate_user,

src/app/api/v1/logout.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
from sqlalchemy.ext.asyncio import AsyncSession
55
from jose import JWTError
66

7-
from app.core.security import oauth2_scheme, blacklist_token
8-
from app.core.db.database import async_get_db
9-
from app.core.exceptions.http_exceptions import UnauthorizedException
7+
from ...core.security import oauth2_scheme, blacklist_token
8+
from ...core.db.database import async_get_db
9+
from ...core.exceptions.http_exceptions import UnauthorizedException
1010

1111
router = APIRouter(tags=["login"])
1212

src/app/api/v1/posts.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
from typing import Annotated, Union, Dict, Any
1+
from typing import Annotated, Dict
22

33
from fastapi import Request, Depends
44
from sqlalchemy.ext.asyncio import AsyncSession
55
import fastapi
66

7-
from app.schemas.post import PostCreate, PostUpdate, PostRead, PostCreateInternal
8-
from app.schemas.user import UserRead
9-
from app.api.dependencies import get_current_user, get_current_superuser
10-
from app.core.db.database import async_get_db
11-
from app.crud.crud_posts import crud_posts
12-
from app.crud.crud_users import crud_users
13-
from app.core.exceptions.http_exceptions import NotFoundException, ForbiddenException
14-
from app.core.utils.cache import cache
15-
from app.api.paginated import PaginatedListResponse, paginated_response, compute_offset
7+
from ...schemas.post import PostCreate, PostUpdate, PostRead, PostCreateInternal
8+
from ...schemas.user import UserRead
9+
from ...api.dependencies import get_current_user, get_current_superuser
10+
from ...core.db.database import async_get_db
11+
from ...crud.crud_posts import crud_posts
12+
from ...crud.crud_users import crud_users
13+
from ...core.exceptions.http_exceptions import NotFoundException, ForbiddenException
14+
from ...core.utils.cache import cache
15+
from ...api.paginated import PaginatedListResponse, paginated_response, compute_offset
1616

1717
router = fastapi.APIRouter(tags=["posts"])
1818

src/app/api/v1/rate_limits.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
from typing import Annotated, Dict
22

3-
from fastapi import Request, Depends, HTTPException
3+
from fastapi import Request, Depends
44
from sqlalchemy.ext.asyncio import AsyncSession
55
import fastapi
66

7-
from app.api.dependencies import get_current_superuser
8-
from app.api.paginated import PaginatedListResponse, paginated_response, compute_offset
9-
from app.core.db.database import async_get_db
10-
from app.core.exceptions.http_exceptions import NotFoundException, DuplicateValueException, RateLimitException
11-
from app.crud.crud_rate_limit import crud_rate_limits
12-
from app.crud.crud_tier import crud_tiers
13-
from app.schemas.rate_limit import (
7+
from ...api.dependencies import get_current_superuser
8+
from ...api.paginated import PaginatedListResponse, paginated_response, compute_offset
9+
from ...core.db.database import async_get_db
10+
from ...core.exceptions.http_exceptions import NotFoundException, DuplicateValueException, RateLimitException
11+
from ...crud.crud_rate_limit import crud_rate_limits
12+
from ...crud.crud_tier import crud_tiers
13+
from ...schemas.rate_limit import (
1414
RateLimitRead,
1515
RateLimitCreate,
1616
RateLimitCreateInternal,

src/app/api/v1/tasks.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from typing import Dict, Optional, Any
22

33
from arq.jobs import Job as ArqJob
4-
from fastapi import APIRouter, Depends, HTTPException
4+
from fastapi import APIRouter, Depends
55

6-
from app.core.utils import queue
7-
from app.schemas.job import Job
8-
from app.api.dependencies import rate_limiter
6+
from ...core.utils import queue
7+
from ...schemas.job import Job
8+
from ...api.dependencies import rate_limiter
99

1010
router = APIRouter(prefix="/tasks", tags=["tasks"])
1111

src/app/api/v1/tiers.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
from typing import Annotated, Dict
22

3-
from fastapi import Request, Depends, HTTPException
3+
from fastapi import Request, Depends
44
from sqlalchemy.ext.asyncio import AsyncSession
55
import fastapi
66

7-
from app.schemas.tier import (
7+
from ...schemas.tier import (
88
TierRead,
99
TierCreate,
1010
TierCreateInternal,
1111
TierUpdate
1212
)
13-
from app.api.dependencies import get_current_superuser
14-
from app.core.db.database import async_get_db
15-
from app.core.exceptions.http_exceptions import DuplicateValueException, NotFoundException
16-
from app.crud.crud_tier import crud_tiers
17-
from app.api.paginated import PaginatedListResponse, paginated_response, compute_offset
13+
from ...api.dependencies import get_current_superuser
14+
from ...core.db.database import async_get_db
15+
from ...core.exceptions.http_exceptions import DuplicateValueException, NotFoundException
16+
from ...crud.crud_tier import crud_tiers
17+
from ...api.paginated import PaginatedListResponse, paginated_response, compute_offset
1818

1919
router = fastapi.APIRouter(tags=["tiers"])
2020

src/app/api/v1/users.py

+11-11
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@
55
from fastapi import Request
66
import fastapi
77

8-
from app.api.dependencies import get_current_user, get_current_superuser
9-
from app.core.exceptions.http_exceptions import DuplicateValueException, NotFoundException, ForbiddenException
10-
from app.api.paginated import PaginatedListResponse, paginated_response, compute_offset
11-
from app.core.db.database import async_get_db
12-
from app.core.security import get_password_hash, blacklist_token, oauth2_scheme
13-
from app.crud.crud_users import crud_users
14-
from app.crud.crud_tier import crud_tiers
15-
from app.crud.crud_rate_limit import crud_rate_limits
16-
from app.models.tier import Tier
17-
from app.schemas.user import UserCreate, UserCreateInternal, UserUpdate, UserRead, UserTierUpdate
18-
from app.schemas.tier import TierRead
8+
from ...api.dependencies import get_current_user, get_current_superuser
9+
from ...core.exceptions.http_exceptions import DuplicateValueException, NotFoundException, ForbiddenException
10+
from ...api.paginated import PaginatedListResponse, paginated_response, compute_offset
11+
from ...core.db.database import async_get_db
12+
from ...core.security import get_password_hash, blacklist_token, oauth2_scheme
13+
from ...crud.crud_users import crud_users
14+
from ...crud.crud_tier import crud_tiers
15+
from ...crud.crud_rate_limit import crud_rate_limits
16+
from ...models.tier import Tier
17+
from ...schemas.user import UserCreate, UserCreateInternal, UserUpdate, UserRead, UserTierUpdate
18+
from ...schemas.tier import TierRead
1919

2020
router = fastapi.APIRouter(tags=["users"])
2121

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from app.crud.crud_base import CRUDBase
2-
from app.core.db.token_blacklist import TokenBlacklist
3-
from app.core.schemas import TokenBlacklistCreate, TokenBlacklistUpdate
1+
from ...crud.crud_base import CRUDBase
2+
from ..db.token_blacklist import TokenBlacklist
3+
from ..schemas import TokenBlacklistCreate, TokenBlacklistUpdate
44

55
CRUDTokenBlacklist = CRUDBase[TokenBlacklist, TokenBlacklistCreate, TokenBlacklistUpdate, TokenBlacklistUpdate, None]
66
crud_token_blacklist = CRUDTokenBlacklist(TokenBlacklist)

src/app/core/db/database.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sqlalchemy.orm import DeclarativeBase, sessionmaker, MappedAsDataclass
44

55

6-
from app.core.config import settings
6+
from ..config import settings
77

88
class Base(DeclarativeBase, MappedAsDataclass):
99
pass

src/app/core/db/token_blacklist.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sqlalchemy import String, DateTime
44
from sqlalchemy.orm import Mapped, mapped_column
55

6-
from app.core.db.database import Base
6+
from .database import Base
77

88
class TokenBlacklist(Base):
99
__tablename__ = "token_blacklist"

src/app/core/security.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
from jose import jwt, JWTError
77
from fastapi.security import OAuth2PasswordBearer
88

9-
from app.core.config import settings
10-
from app.core.schemas import TokenData, TokenBlacklistCreate
11-
from app.core.db.crud_token_blacklist import crud_token_blacklist
12-
from app.crud.crud_users import crud_users
9+
from .config import settings
10+
from .schemas import TokenData, TokenBlacklistCreate
11+
from .db.crud_token_blacklist import crud_token_blacklist
12+
from ..crud.crud_users import crud_users
1313

1414
SECRET_KEY = settings.SECRET_KEY
1515
ALGORITHM = settings.ALGORITHM

src/app/core/setup.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
from arq.connections import RedisSettings
1010
import anyio
1111

12-
from app.api.dependencies import get_current_superuser
13-
from app.core.utils import queue
14-
from app.core.config import settings
15-
from app.core.db.database import Base
16-
from app.core.db.database import async_engine as engine
17-
from app.core.config import (
12+
from ..api.dependencies import get_current_superuser
13+
from .utils import queue
14+
from .config import settings
15+
from .db.database import Base
16+
from .db.database import async_engine as engine
17+
from .config import (
1818
DatabaseSettings,
1919
RedisCacheSettings,
2020
AppSettings,
@@ -24,8 +24,8 @@
2424
EnvironmentOption,
2525
EnvironmentSettings
2626
)
27-
from app.middleware.client_cache_middleware import ClientCacheMiddleware
28-
from app.core.utils import cache, rate_limit
27+
from ..middleware.client_cache_middleware import ClientCacheMiddleware
28+
from .utils import cache, rate_limit
2929

3030
# -------------- database --------------
3131
async def create_tables() -> None:

src/app/core/utils/cache.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from fastapi.encoders import jsonable_encoder
88
from redis.asyncio import Redis, ConnectionPool
99

10-
from app.core.exceptions.cache_exceptions import CacheIdentificationInferenceError, InvalidRequestError, MissingClientError
10+
from ..exceptions.cache_exceptions import CacheIdentificationInferenceError, InvalidRequestError, MissingClientError
1111

1212
pool: ConnectionPool | None = None
1313
client: Redis | None = None

src/app/core/utils/rate_limit.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from redis.asyncio import Redis, ConnectionPool
44
from sqlalchemy.ext.asyncio import AsyncSession
55

6-
from app.core.logger import logging
7-
from app.schemas.rate_limit import sanitize_path
6+
from ...core.logger import logging
7+
from ...schemas.rate_limit import sanitize_path
88

99
logger = logging.getLogger(__name__)
1010

0 commit comments

Comments
 (0)