Почему моя рабочая база данных изменена, а не макет, который я создал для тестирования?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему моя рабочая база данных изменена, а не макет, который я создал для тестирования?

Сообщение Anonymous »

Я пытаюсь написать несколько тестов для конечных точек fastapi. Однако я понял, что использую не макеты баз данных, которые, как мне казалось, я создал... а настоящие. Что происходит? Чего мне не хватает?
Вот что я пробовал для своего файла test_main.py:

Код: Выделить всё

import pytest
from FruitCaloriesApp.main import CaloriesCalculator, get_db, app
from FruitCaloriesApp.database import SessionLocal
from FruitCaloriesApp.models import FruitCalories, CaloriesHistory,Base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine("sqlite:///:memory:")  # In-memory SQLite database
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

@pytest.fixture(scope="function")
def db_session():
# Create fruitcalories table in the in-memory database
Base.metadata.create_all(bind=engine)
db = SessionLocal()

# Insert mock data to fruitcalories table
apple = FruitCalories(fruit="apple", calories=20.3)
pear= FruitCalories(fruit="pear", calories=10.3)

db.add_all([apple, pear])
db.commit()
yield db
db.close()
Base.metadata.drop_all(bind=engine)

def test_calc_cals_apple(db_session):
calculator = CaloriesCalculator(amount=3, fruit="apple", db=db_session)
expected = 3 * 20.3
assert calculator.calc_calories() == pytest.approx(expected, 0.001)

#2.  Test End Points -------
from fastapi.testclient import TestClient       #create a client for our app, like app=Fastapi()
from CaloriesCalc import main
from fastapi import status
from FruitCalcApp.main import app, CaloriesInput
from datetime import datetime

client = TestClient(main.app)
#/calculate_calories correct answer
def test_calculate_calories(db_session):
apple_calories = db_session.query(FruitCalories).filter(FruitCalories.fruit == "apple").first().calories
response=client.post("/calculate_calories",json={"amount": 3, "fruit": "apple"})
assert response.status_code== status.HTTP_200_OK
assert response.json() =={"fruit": "apple", "amount": 3, "total_calories": 3 * 20.3}

#/store_calories correctly returns expected results
def test_store_calories(db_session):
response = client.post("/store_calories", json={"fruit": "apple", "amount": 3}, params={"user_id": 1})
assert response.status_code == 201
data = response.json()["data"]
assert data["user_id"] == 1
assert data["fruit"] == "apple"
assert data["amount"] == 3
expected = 3 * 20.3
assert data["total_calories"] == pytest.approx(expected, 0.001)
А мой файл main.py выглядит так:

Код: Выделить всё

from pydantic import BaseModel
from typing import Annotated, Optional, List
from fastapi import FastAPI, Depends, status, HTTPException, Body, Path, Query
from sqlalchemy.orm import Session
from FruitCaloriesApp import models
from FruitCaloriesApp.models import FruitCalories
from FruitCaloriesApp.database import engine, SessionLocal
import sqlite3
from datetime import datetime

app = FastAPI()
models.Base.metadata.create_all(bind=engine)

def get_db():
db=SessionLocal()
try:
yield db
finally:
db.close()

db_dependency = Annotated[Session, Depends(get_db)]

class CaloriesInput(BaseModel):
fruit: str
calories: float

class CaloriesHistoryResponse(BaseModel):
user_id: int
date: str
fruit: str
amount: float
total_calories: float

#OOP structure
class CaloriesCalculator():
def __init__(self, amount: float, fruit: str, db: Session):
self.amount = amount
self.fruit = fruit
self.db = db
self.calories = self.get_calories()

def get_calories(self):
result = (self.db.query(FruitCalories.calories).filter(FruitCalories.fruit == self.fruit).first())
if result:
return result[0]
else:
return None

def calc_calories(self):
if self.calories is None:
raise ValueError("valerror")
else:
return self.amount * self.calories

def store_calories(self, db: Session, user_id: str, date, total_calories: float):
calories_entry = CaloriesHistory(user_id=user_id, date=date, amount=self.amount,fruit=self.fruit,total_calories=total_calories)
db.add(calories_entry)
db.commit()
db.refresh(calories_entry)
return calories_entry

@app.post("/store_calories", status_code = status.HTTP_201_CREATED)
def store_calories_fruit(data: CaloriesInput, user_id: int, db: Session = Depends(get_db)):
try:
calculator = CaloriesCalculator(fruit=data.fruit, disamount=data.amount, db=db)
total_calories = calculator.calc_calories()
date=datetime.now().isoformat()
calculator.store_calories(db, user_id, date, total_calories)

return {
"message": "Stored",
"data": {"user_id": user_id, "date":  date, "fruit": data.fruit, "amount": data.amount,"total_calories": total_calories}
}
А затем, когда я запускаю pytest, я вижу, что данные добавляются в мою производственную базу данных, в которой есть таблица под названием «калорииистория». Почему?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ed-for-tes
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»