def test_invalid_connect(): """Check we get the right error when attempting to connect to invalid archive""" with pytest.raises(mincepy.ConnectionError): mincepy.connect('mongodb://unknown-server/db', timeout=5) with pytest.raises(ValueError): mincepy.connect('unknown-protocol://nowhere', timeout=5)
def test_sync(historian: mincepy.Historian, archive_uri): historian2 = mincepy.connect(archive_uri) historian2.register_types(mincepy.testing.HISTORIAN_TYPES) car = Car('ferrari', 'red') historian.save_one(car) # Simulate saving the car from another connection same_car = historian2.load(car.obj_id) same_car.make = 'honda' same_car.colour = 'black' same_car.save() honda_record = historian2.get_current_record(same_car) del same_car # Now update and check the state historian.sync(car) assert car.make == 'honda' assert car.colour == 'black' # Also, check the cached record car_record = historian.get_current_record(car) assert car_record.snapshot_hash == honda_record.snapshot_hash assert car_record.state == honda_record.state # Check that syncing an unsaved object returns False (because there's nothing to do) assert historian.sync(Car()) is False # Test syncing an object that is deleted historian2.delete(car.obj_id) with pytest.raises(mincepy.NotFound): car.sync()
def test_concurrent_modification(historian: mincepy.Historian, archive_uri: str): # Create a second historian connected to the same archive historian2 = mincepy.connect(archive_uri, use_globally=False) historian2.register_type(Car) ferrari = testing.Car(colour='red', make='ferrari') ferrari_id = historian.save(ferrari) ferrari2 = historian2.load(ferrari_id) assert ferrari_id == ferrari2.obj_id assert ferrari is not ferrari2, \ "The archive don't know about each other so the objects instances should not be the same" # Repaint ferrari.colour = 'yellow' historian.save(ferrari) # Now change ferrari2 and see what happens ferrari2.colour = 'green' with pytest.raises(mincepy.ModificationError): historian2.save(ferrari2) # Now, let's sync up assert historian2.sync(ferrari2), "ferrari2 hasn't been updated" assert ferrari2.colour == 'yellow'
def test_load_changed_ref(historian: mincepy.Historian, archive_uri): """Test what happens when you dereference a reference to an object that was mutated since the reference was loaded""" historian2 = mincepy.connect(archive_uri) car = testing.Car(make='skoda') car_id = historian.save(car) car_ref = mincepy.ref(car) ref_id = historian.save(car_ref) ref_sid = historian.get_snapshot_id(car_ref) del car, car_ref # Now, load the reference but don't dereference it yet loaded = historian.load(ref_id) # Now, mutate the car that is being referenced loaded_car = historian2.load(car_id) loaded_car.make = 'honda' historian2.save(loaded_car) # Finally, dereference and check that it is as expected assert loaded().make == 'honda' # Now, check the snapshot still points to the original loaded_snapshot = historian.load_snapshot(ref_sid) assert loaded_snapshot().make == 'skoda'