Coverage for app/services/setup_service.py: 100%

22 statements  

« prev     ^ index     » next       coverage.py v7.14.1, created at 2026-06-16 20:06 +0000

1from app.core.observability import Observability 

2from app.domain.probe.entities.grid import Grid 

3from app.domain.probe.exceptions import InvalidSizeError 

4from app.models.Probe import Probe as ModelProbe 

5from app.schemas.setup import SetupRequest, SetupResponse 

6from app.repositories.probe_repository import ProbeRepository 

7from fastapi import HTTPException 

8from app.core.events import ProbeEvents 

9 

10 

11class SetupService: 

12 def __init__( 

13 self, 

14 repository: ProbeRepository, 

15 ) -> None: 

16 self.repository = repository 

17 

18 async def process( 

19 self, 

20 setup: SetupRequest, 

21 ) -> SetupResponse: 

22 try: 

23 grid = Grid(x_size=setup.x, y_size=setup.y) 

24 

25 probe = await self.repository.setup( 

26 ModelProbe(x=grid.x_size, y=grid.y_size, direction=setup.direction) 

27 ) 

28 

29 Observability.emit( 

30 ProbeEvents.PROBE_CREATED, 

31 grid_id=str(probe.grid.id), 

32 grid_x=grid.x_size, 

33 grid_y=grid.y_size, 

34 probe_id=str(probe.id), 

35 probe_x=probe.x, 

36 probe_y=probe.y, 

37 probe_direction=probe.direction, 

38 ) 

39 

40 return SetupResponse( 

41 id=probe.id, x=probe.x, y=probe.y, direction=probe.direction 

42 ) 

43 except InvalidSizeError as e: 

44 Observability.emit( 

45 ProbeEvents.PROBE_INVALID_SETUP, 

46 grid_x=setup.x, 

47 grid_y=setup.y, 

48 probe_direction=setup.direction, 

49 ) 

50 raise HTTPException( 

51 status_code=422, 

52 detail={ 

53 "code": "INVALID_PROBE_SETUP", 

54 "message": f"The grid size ({setup.x}, {setup.y}) is invalid. {e}", 

55 }, 

56 ) from e 

57 except Exception as e: 

58 raise HTTPException( 

59 status_code=500, 

60 detail={ 

61 "code": "SETUP_UNEXPECTED_ERROR", 

62 "message": "Unexpected error. Try again in a few seconds.", 

63 }, 

64 ) from e