示例#1
0
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)
示例#2
0
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()
示例#3
0
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'
示例#4
0
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'