keep it minimal first

This commit is contained in:
Jun-te Kim 2026-04-20 13:17:35 +00:00
parent 85cfa15335
commit 414bdc6431
3 changed files with 1 additions and 94 deletions

View file

@ -1,17 +1,14 @@
import boto3
import json
from uuid import UUID
from datetime import datetime, timezone
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlmodel import select
from sqlalchemy.dialects.postgresql import insert
from backend.app.dependencies import validate_token
from backend.app.config import get_settings
from backend.app.db.connection import get_db_session
from backend.app.db.models.bulk_address_uploads import BulkAddressUpload
from backend.app.db.models.portfolio import PropertyModel, PropertyCreationStatus, PortfolioStatus
from backend.app.bulk_uploads.schema import TriggerSplitterRequest, ConfirmMatchesRequest
from backend.app.bulk_uploads.schema import TriggerSplitterRequest
from utils.s3 import parse_s3_uri, read_csv_from_s3

View file

@ -1,20 +1,7 @@
from pydantic import BaseModel
from typing import Optional
class TriggerSplitterRequest(BaseModel):
task_id: str
sub_task_id: str
s3_uri: str
class AcceptedRow(BaseModel):
uprn: int
address_line_1: str
address_line_2: Optional[str] = None
postcode: str
internal_reference: Optional[str] = None
class ConfirmMatchesRequest(BaseModel):
accepted_rows: list[AcceptedRow]

View file

@ -1,77 +0,0 @@
from unittest.mock import MagicMock, patch
import pytest
from fastapi.testclient import TestClient
@pytest.fixture
def client():
with patch("backend.app.config.get_settings") as mock_settings:
mock_settings.return_value = MagicMock(
ENVIRONMENT="local",
AWS_DEFAULT_REGION="eu-west-1",
POSTCODE_SPLITTER_SQS_URL="https://sqs.eu-west-1.amazonaws.com/123456789/postcode-splitter",
)
from backend.app.main import app
yield TestClient(app)
@patch("backend.app.bulk_uploads.router.boto3")
@patch("backend.app.bulk_uploads.router.TasksInterface")
def test_trigger_splitter_creates_task_and_enqueues(mock_tasks_cls, mock_boto3, client):
mock_tasks = MagicMock()
mock_tasks.create_task.return_value = ("task-123", "subtask-456")
mock_tasks_cls.return_value = mock_tasks
mock_sqs = MagicMock()
mock_sqs.send_message.return_value = {"MessageId": "msg-789"}
mock_boto3.client.return_value = mock_sqs
response = client.post(
"/v1/bulk-uploads/trigger-splitter",
json={
"upload_id": "upload-abc",
"s3_uri": "s3://bucket/file.csv",
"portfolio_id": "portfolio-xyz",
},
headers={"Authorization": "Bearer test-token"},
)
assert response.status_code == 202
body = response.json()
assert body["task_id"] == "task-123"
assert body["sub_task_id"] == "subtask-456"
assert body["sqs_message_id"] == "msg-789"
mock_sqs.send_message.assert_called_once()
call_kwargs = mock_sqs.send_message.call_args[1]
import json
payload = json.loads(call_kwargs["MessageBody"])
assert payload["task_id"] == "task-123"
assert payload["sub_task_id"] == "subtask-456"
assert payload["s3_uri"] == "s3://bucket/file.csv"
@patch("backend.app.bulk_uploads.router.boto3")
@patch("backend.app.bulk_uploads.router.TasksInterface")
def test_trigger_splitter_uses_provided_task_ids(mock_tasks_cls, mock_boto3, client):
mock_sqs = MagicMock()
mock_sqs.send_message.return_value = {"MessageId": "msg-999"}
mock_boto3.client.return_value = mock_sqs
response = client.post(
"/v1/bulk-uploads/trigger-splitter",
json={
"upload_id": "upload-abc",
"s3_uri": "s3://bucket/file.csv",
"portfolio_id": "portfolio-xyz",
"task_id": "existing-task",
"sub_task_id": "existing-subtask",
},
headers={"Authorization": "Bearer test-token"},
)
assert response.status_code == 202
mock_tasks_cls.assert_not_called()
body = response.json()
assert body["task_id"] == "existing-task"
assert body["sub_task_id"] == "existing-subtask"