@@ -0,0 +1,69 @@
|
||||
"""Dual sync: устаревший push на master не перезаписывает сервер."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from app import db
|
||||
from app.models import Recipe
|
||||
from app.services.recipe_update_service import update_recipe_from_payload
|
||||
from app.services.sync_manager import SyncManager
|
||||
from tests.helpers.mill_recipe_fixtures import (
|
||||
create_recipe_with_children,
|
||||
recipe_update_payload,
|
||||
)
|
||||
from tests.helpers.sync_dual_harness import SyncDualInstanceHarness
|
||||
|
||||
SCENARIO_DUAL_CONCURRENT_RECIPE = "DUAL_CONCURRENT_RECIPE"
|
||||
|
||||
|
||||
class SyncDualConcurrentRecipeTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.harness = SyncDualInstanceHarness()
|
||||
self.harness.start()
|
||||
|
||||
def tearDown(self) -> None:
|
||||
self.harness.stop()
|
||||
|
||||
def test_stale_push_does_not_overwrite_server_master(self) -> None:
|
||||
with self.harness.server_ctx():
|
||||
recipe_id, _, _ = create_recipe_with_children(name="Initial")
|
||||
self.harness.drain_sync()
|
||||
|
||||
with self.harness.server_ctx():
|
||||
recipe = db.session.get(Recipe, recipe_id)
|
||||
update_recipe_from_payload(
|
||||
recipe_id,
|
||||
recipe_update_payload(recipe, ingredients=[], groups=[])
|
||||
| {"name": "Server authoritative"},
|
||||
)
|
||||
db.session.commit()
|
||||
server_version = int(recipe.version or 1)
|
||||
|
||||
self.harness.drain_sync()
|
||||
|
||||
with self.harness.server_ctx():
|
||||
result = SyncManager.process_push(
|
||||
client_id=self.harness.NODE_A,
|
||||
changes=[
|
||||
{
|
||||
"table_name": "recipe",
|
||||
"record_id": recipe_id,
|
||||
"action": "update",
|
||||
"data": {
|
||||
"id": recipe_id,
|
||||
"name": "Stale from client",
|
||||
"version": max(1, server_version - 1),
|
||||
},
|
||||
}
|
||||
],
|
||||
)
|
||||
self.assertEqual(result["status_code"], 200)
|
||||
|
||||
with self.harness.server_ctx():
|
||||
row = db.session.get(Recipe, recipe_id)
|
||||
self.assertEqual(row.name, "Server authoritative")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user