@@ -0,0 +1,136 @@
|
||||
import os
|
||||
import tempfile
|
||||
import unittest
|
||||
from datetime import datetime
|
||||
|
||||
from app import create_app, db
|
||||
from app.models import FeedDispenser, FeedingPeriod, PeriodRecipe, Recipe
|
||||
from config import TestingConfig
|
||||
|
||||
|
||||
class LegacyThirdBatchConfig(TestingConfig):
|
||||
_TMP_DIR = tempfile.mkdtemp(prefix="wesp-legacy-batch3-tests-")
|
||||
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.join(_TMP_DIR, 'recipes_test.db')}"
|
||||
SQLALCHEMY_BINDS = {"reports": f"sqlite:///{os.path.join(_TMP_DIR, 'reports_test.db')}"}
|
||||
AUTH_LOGIN = "legacy3-admin"
|
||||
AUTH_PASSWORD = "legacy3-secret"
|
||||
|
||||
|
||||
class LegacyCompatThirdBatchTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.app = create_app(LegacyThirdBatchConfig)
|
||||
self.client = self.app.test_client()
|
||||
self.ctx = self.app.app_context()
|
||||
self.ctx.push()
|
||||
db.create_all()
|
||||
login = self.client.post(
|
||||
"/api/auth/login", json={"login": "legacy3-admin", "password": "legacy3-secret"}
|
||||
)
|
||||
self.assertEqual(login.status_code, 200)
|
||||
|
||||
def tearDown(self) -> None:
|
||||
db.session.remove()
|
||||
db.drop_all()
|
||||
self.ctx.pop()
|
||||
|
||||
def test_feed_dispenser_crud_legacy_endpoints(self) -> None:
|
||||
create_resp = self.client.post(
|
||||
"/api/feed_dispensers",
|
||||
json={"name": "Disp A", "farm": "Farm A", "operator": "Op A", "type": "dispenser"},
|
||||
)
|
||||
self.assertEqual(create_resp.status_code, 201)
|
||||
dispenser_id = create_resp.get_json()["id"]
|
||||
|
||||
get_resp = self.client.get(f"/api/feed_dispensers/{dispenser_id}")
|
||||
self.assertEqual(get_resp.status_code, 200)
|
||||
self.assertEqual(get_resp.get_json()["name"], "Disp A")
|
||||
|
||||
update_resp = self.client.put(
|
||||
f"/api/feed_dispensers/{dispenser_id}",
|
||||
json={"name": "Disp A+", "operator": "Op A+"},
|
||||
)
|
||||
self.assertEqual(update_resp.status_code, 200)
|
||||
|
||||
get_after_update = self.client.get(f"/api/feed_dispensers/{dispenser_id}")
|
||||
self.assertEqual(get_after_update.status_code, 200)
|
||||
self.assertEqual(get_after_update.get_json()["name"], "Disp A+")
|
||||
|
||||
delete_resp = self.client.delete(f"/api/feed_dispensers/{dispenser_id}")
|
||||
self.assertEqual(delete_resp.status_code, 200)
|
||||
|
||||
get_after_delete = self.client.get(f"/api/feed_dispensers/{dispenser_id}")
|
||||
self.assertEqual(get_after_delete.status_code, 404)
|
||||
|
||||
def test_period_mutation_and_period_recipe_attach_detach(self) -> None:
|
||||
dispenser = FeedDispenser(
|
||||
id="d-legacy3", name="Disp B", farm="Farm B", operator="Op B", type="dispenser"
|
||||
)
|
||||
recipe = Recipe(
|
||||
id="r-legacy3", name="Route B", heads_per_trip=20, mixing_time=9, trip_percent=100
|
||||
)
|
||||
db.session.add_all([dispenser, recipe])
|
||||
db.session.commit()
|
||||
|
||||
create_period = self.client.post(
|
||||
"/api/feed_dispensers/d-legacy3/periods", json={"name": "Morning"}
|
||||
)
|
||||
self.assertEqual(create_period.status_code, 201)
|
||||
period_id = create_period.get_json()["id"]
|
||||
|
||||
update_period = self.client.put(
|
||||
f"/api/feed_dispensers/d-legacy3/periods/{period_id}", json={"name": "Morning+"}
|
||||
)
|
||||
self.assertEqual(update_period.status_code, 200)
|
||||
|
||||
attach_recipe = self.client.post(
|
||||
f"/api/feed_dispensers/d-legacy3/periods/{period_id}/recipes/r-legacy3"
|
||||
)
|
||||
self.assertEqual(attach_recipe.status_code, 200)
|
||||
|
||||
list_period_recipes = self.client.get(f"/api/periods/{period_id}/recipes")
|
||||
self.assertEqual(list_period_recipes.status_code, 200)
|
||||
self.assertEqual([r["id"] for r in list_period_recipes.get_json()], ["r-legacy3"])
|
||||
|
||||
detach_recipe = self.client.delete(
|
||||
f"/api/feed_dispensers/d-legacy3/periods/{period_id}/recipes/r-legacy3"
|
||||
)
|
||||
self.assertEqual(detach_recipe.status_code, 200)
|
||||
|
||||
list_after_detach = self.client.get(f"/api/periods/{period_id}/recipes")
|
||||
self.assertEqual(list_after_detach.status_code, 200)
|
||||
self.assertEqual(list_after_detach.get_json(), [])
|
||||
|
||||
delete_period = self.client.delete(f"/api/feed_dispensers/d-legacy3/periods/{period_id}")
|
||||
self.assertEqual(delete_period.status_code, 200)
|
||||
|
||||
def test_delete_recipe_link_keeps_period_alive(self) -> None:
|
||||
dispenser = FeedDispenser(
|
||||
id="d-legacy3-2", name="Disp C", farm="Farm C", operator="Op C", type="dispenser"
|
||||
)
|
||||
period = FeedingPeriod(id="p-legacy3-2", name="Evening", dispenser_id=dispenser.id)
|
||||
recipe = Recipe(id="r-legacy3-2", name="Route C", heads_per_trip=10, mixing_time=5)
|
||||
db.session.add_all([dispenser, period, recipe])
|
||||
db.session.flush()
|
||||
db.session.add(
|
||||
PeriodRecipe(
|
||||
period_id=period.id,
|
||||
recipe_id=recipe.id,
|
||||
order=1,
|
||||
created_at=datetime.now(),
|
||||
created_by="system",
|
||||
updated_by="system",
|
||||
)
|
||||
)
|
||||
db.session.commit()
|
||||
|
||||
resp = self.client.delete(
|
||||
"/api/feed_dispensers/d-legacy3-2/periods/p-legacy3-2/recipes/r-legacy3-2"
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
period_still_exists = FeedingPeriod.query.filter_by(id=period.id, is_deleted=False).first()
|
||||
self.assertIsNotNone(period_still_exists)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user