|
| 1 | +import json |
| 2 | + |
1 | 3 | from django.test import TestCase |
2 | 4 | from facility_profile.models import MyUser |
| 5 | +from facility_profile.models import TestModel |
3 | 6 |
|
| 7 | +from morango.models.core import Store |
4 | 8 | from morango.models.manager import SyncableModelManager |
5 | 9 | from morango.models.query import SyncableModelQuerySet |
| 10 | +from morango.sync.controller import MorangoProfileController |
6 | 11 |
|
7 | 12 |
|
8 | 13 | class SyncingModelsTestCase(TestCase): |
@@ -61,3 +66,79 @@ def test_syncable_save(self): |
61 | 66 | self.assertTrue(MyUser.objects.first()._morango_dirty_bit) |
62 | 67 | user.save(update_dirty_bit_to=None) |
63 | 68 | self.assertTrue(MyUser.objects.first()._morango_dirty_bit) |
| 69 | + |
| 70 | + def test_syncing_objects_manager_with_custom_default_manager(self): |
| 71 | + """Test that syncing_objects manager includes all objects even when default manager filters them out""" |
| 72 | + # Create some test objects |
| 73 | + TestModel.objects.create(name="visible", hidden=False) |
| 74 | + hidden_obj = TestModel(name="hidden", hidden=True) |
| 75 | + # Use save() to bypass the manager filter during creation |
| 76 | + hidden_obj.save() |
| 77 | + |
| 78 | + # Verify that the default objects manager filters out hidden objects |
| 79 | + self.assertEqual(TestModel.objects.count(), 1) |
| 80 | + self.assertEqual(TestModel.objects.first().name, "visible") |
| 81 | + |
| 82 | + # Verify that syncing_objects manager includes all objects for syncing |
| 83 | + self.assertEqual(TestModel.syncing_objects.count(), 2) |
| 84 | + syncing_names = set(TestModel.syncing_objects.values_list('name', flat=True)) |
| 85 | + self.assertEqual(syncing_names, {"visible", "hidden"}) |
| 86 | + |
| 87 | + def test_hidden_models_serialization_into_store(self): |
| 88 | + """Test that hidden models (filtered by default manager) still get serialized into Store""" |
| 89 | + controller = MorangoProfileController(TestModel.morango_profile) |
| 90 | + |
| 91 | + # Create both visible and hidden objects |
| 92 | + visible_obj = TestModel.objects.create(name="visible", hidden=False) |
| 93 | + hidden_obj = TestModel(name="hidden", hidden=True) |
| 94 | + # Use save() to bypass the manager filter during creation |
| 95 | + hidden_obj.save() |
| 96 | + |
| 97 | + # Serialize into store |
| 98 | + controller.serialize_into_store() |
| 99 | + |
| 100 | + # Verify both objects (visible and hidden) are serialized into Store |
| 101 | + store_records = Store.objects.filter(model_name=TestModel.morango_model_name) |
| 102 | + self.assertEqual(store_records.count(), 2) |
| 103 | + |
| 104 | + # Verify both objects are present in store by checking serialized data |
| 105 | + serialized_names = set() |
| 106 | + for store_record in store_records: |
| 107 | + serialized_data = json.loads(store_record.serialized) |
| 108 | + serialized_names.add(serialized_data['name']) |
| 109 | + |
| 110 | + self.assertEqual(serialized_names, {"visible", "hidden"}) |
| 111 | + |
| 112 | + # Verify the store records have the correct IDs |
| 113 | + store_ids = set(store_records.values_list('id', flat=True)) |
| 114 | + expected_ids = {str(visible_obj.id), str(hidden_obj.id)} |
| 115 | + self.assertEqual(store_ids, expected_ids) |
| 116 | + |
| 117 | + def test_hidden_models_deletion_during_deserialization(self): |
| 118 | + """Test that hidden models can be deleted during deserialization using syncing_objects""" |
| 119 | + controller = MorangoProfileController(TestModel.morango_profile) |
| 120 | + |
| 121 | + # Create and serialize a hidden object |
| 122 | + hidden_obj = TestModel(name="hidden", hidden=True) |
| 123 | + hidden_obj.save() |
| 124 | + controller.serialize_into_store() |
| 125 | + |
| 126 | + # Verify object exists in Store |
| 127 | + store_record = Store.objects.get(id=hidden_obj.id) |
| 128 | + self.assertFalse(store_record.deleted) |
| 129 | + |
| 130 | + # Mark the store record as deleted (simulating deletion from another device) |
| 131 | + # Also set dirty_bit=True so it gets processed during deserialization |
| 132 | + store_record.deleted = True |
| 133 | + store_record.dirty_bit = True |
| 134 | + store_record.save() |
| 135 | + |
| 136 | + # Deserialize from store - this should delete the hidden object |
| 137 | + controller.deserialize_from_store() |
| 138 | + |
| 139 | + # Verify the hidden object was deleted from the database |
| 140 | + self.assertFalse(TestModel.syncing_objects.filter(id=hidden_obj.id).exists()) |
| 141 | + self.assertFalse(TestModel.objects.filter(id=hidden_obj.id).exists()) |
| 142 | + |
| 143 | + # The store record should still exist but marked as deleted |
| 144 | + self.assertTrue(Store.objects.filter(id=hidden_obj.id, deleted=True).exists()) |
0 commit comments