137 lines
5.3 KiB
Python
137 lines
5.3 KiB
Python
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()
|