Test multi instance and multi user session

!lamin login testuser1
!lamin init --storage "./testsetup-prepare"
!lamin disconnect
import lamindb_setup as ln_setup
import lamindb as ln
import pytest

If you try to use lamindb, it will raise an CurrentInstanceNotConfigured and ask you to init or connect an instance via the python API.

with pytest.raises(ln.setup.errors.CurrentInstanceNotConfigured):
    ln.track()
ln_setup.core.django.reset_django()  # django is not configured, so no effect
assert ln_setup.settings.user.handle == "testuser1"
ln_setup.init(storage="./testsetup")
assert ln_setup.settings.instance.slug == "testuser1/testsetup"
from lamindb.models import User
User.objects.get(handle="testuser1")
with pytest.raises(Exception):  # does not exist
    User.objects.get(handle="testuser2")
ln.track()

Let us try connecting to another instance:

with pytest.raises(ln.setup.errors.CannotSwitchDefaultInstance) as error:
    ln.connect("testsetup3")
assert error.exconly().endswith(
    "Cannot switch default instance while `ln.track()` is live: call `ln.finish()`"
)

Let us try to init another instance in the same Python session.

with pytest.raises(ln.setup.errors.CannotSwitchDefaultInstance) as error:
    ln.setup.init(storage="./testsetup2")
assert error.exconly().endswith(
    "Cannot switch default instance while `ln.track()` is live: call `ln.finish()`"
)

Switch off ln.track().

ln.context._transform = None

Let us login with another user:

ln_setup.login("testuser2")
User.objects.get(handle="testuser2")

Connect to another instance in the same process:

ln_setup.connect("testuser1/testsetup-prepare")
assert ln_setup.settings.instance.slug == "testuser1/testsetup-prepare"
!lamin login testuser1
!lamin delete --force testsetup-prepare
!lamin delete --force testsetup