Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion lib/SampleService/core/samples.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ def create_data_link(
duid: DataUnitID,
sna: SampleNodeAddress,
update: bool = False,
as_admin: bool = False):
as_admin: bool = False) -> DataLink:
'''
Create a link from a data unit to a sample. The user must have admin access to the sample,
since linking data grants permissions: once linked, if a user
Expand All @@ -291,6 +291,7 @@ def create_data_link(
If False and a link from the data unit already exists, link creation will fail.
:param as_admin: allow link creation to proceed if user does not have
appropriate permissions.
:returns: the new link.
:raises UnauthorizedError: if the user does not have acceptable permissions.
:raises NoSuchSampleError: if the sample does not exist.
:raises NoSuchSampleVersionError: if the sample version does not exist.
Expand All @@ -309,6 +310,7 @@ def create_data_link(
self._ws.has_permission(user, wsperm, upa=duid.upa)
dl = DataLink(self._uuid_gen(), duid, sna, self._now(), user)
self._storage.create_data_link(dl, update=update)
return dl

def expire_data_link(self, user: UserID, duid: DataUnitID, as_admin: bool = False) -> None:
'''
Expand Down
67 changes: 30 additions & 37 deletions test/core/samples_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -527,38 +527,10 @@ def _replace_sample_acls(user: UserID, as_admin):
kafka.notify_sample_acl_change.assert_called_once_with(id_)


def test_replace_sample_acls_without_notifier():
storage = create_autospec(ArangoSampleStorage, spec_set=True, instance=True)
lu = create_autospec(KBaseUserLookup, spec_set=True, instance=True)
meta = create_autospec(MetadataValidatorSet, spec_set=True, instance=True)
ws = create_autospec(WS, spec_set=True, instance=True)
samples = Samples(storage, lu, meta, ws, now=nw,
uuid_gen=lambda: UUID('1234567890abcdef1234567890abcdef'))
id_ = UUID('1234567890abcdef1234567890abcde0')

lu.invalid_users.return_value = []

storage.get_sample_acls.return_value = SampleACL(
u('someuser'),
[u('otheruser'), u('y')],
[u('anotheruser'), u('ur mum')],
[u('Fungus J. Pustule Jr.'), u('x')])

samples.replace_sample_acls(id_, u('y'), SampleACL(
u('someuser'), [u('x'), u('y')], [u('z'), u('a')], [u('b'), u('c')]))

assert lu.invalid_users.call_args_list == [
(([u(x) for x in ['x', 'y', 'z', 'a', 'b', 'c']],), {})]

assert storage.get_sample_acls.call_args_list == [
((UUID('1234567890abcdef1234567890abcde0'),), {})]

assert storage.replace_sample_acls.call_args_list == [
((UUID('1234567890abcdef1234567890abcde0'),
SampleACL(u('someuser'), [u('x'), u('y')], [u('z'), u('a')], [u('b'), u('c')])), {})]


def test_replace_sample_acls_with_owner_change():
"""
Also tests replacing sample acls without a notifier.
"""
storage = create_autospec(ArangoSampleStorage, spec_set=True, instance=True)
lu = create_autospec(KBaseUserLookup, spec_set=True, instance=True)
meta = create_autospec(MetadataValidatorSet, spec_set=True, instance=True)
Expand Down Expand Up @@ -928,10 +900,17 @@ def _create_data_link(user):
[u('anotheruser'), u('ur mum')],
[u('Fungus J. Pustule Jr.'), u('x')])

s.create_data_link(
assert s.create_data_link(
user,
DataUnitID(UPA('1/1/1')),
SampleNodeAddress(SampleAddress(UUID('1234567890abcdef1234567890abcdee'), 3), 'mynode'))
SampleNodeAddress(SampleAddress(UUID('1234567890abcdef1234567890abcdee'), 3), 'mynode')
) == DataLink(
UUID('1234567890abcdef1234567890abcdef'),
DataUnitID(UPA('1/1/1')),
SampleNodeAddress(SampleAddress(UUID('1234567890abcdef1234567890abcdee'), 3), 'mynode'),
dt(6),
user
)

storage.get_sample_acls.assert_called_once_with(UUID('1234567890abcdef1234567890abcdee'))

Expand Down Expand Up @@ -961,11 +940,18 @@ def test_create_data_link_with_data_id_and_update():

storage.get_sample_acls.return_value = SampleACL(u('someuser'))

s.create_data_link(
assert s.create_data_link(
UserID('someuser'),
DataUnitID(UPA('1/1/1'), 'foo'),
SampleNodeAddress(SampleAddress(UUID('1234567890abcdef1234567890abcdee'), 3), 'mynode'),
update=True)
update=True
) == DataLink(
UUID('1234567890abcdef1234567890abcdef'),
DataUnitID(UPA('1/1/1'), 'foo'),
SampleNodeAddress(SampleAddress(UUID('1234567890abcdef1234567890abcdee'), 3), 'mynode'),
dt(6),
UserID('someuser')
)

storage.get_sample_acls.assert_called_once_with(UUID('1234567890abcdef1234567890abcdee'))

Expand All @@ -991,11 +977,18 @@ def test_create_data_link_as_admin():
s = Samples(storage, lu, meta, ws, now=nw,
uuid_gen=lambda: UUID('1234567890abcdef1234567890abcdef'))

s.create_data_link(
assert s.create_data_link(
UserID('someuser'),
DataUnitID(UPA('1/1/1'), 'foo'),
SampleNodeAddress(SampleAddress(UUID('1234567890abcdef1234567890abcdee'), 3), 'mynode'),
as_admin=True)
as_admin=True
) == DataLink(
UUID('1234567890abcdef1234567890abcdef'),
DataUnitID(UPA('1/1/1'), 'foo'),
SampleNodeAddress(SampleAddress(UUID('1234567890abcdef1234567890abcdee'), 3), 'mynode'),
dt(6),
UserID('someuser')
)

ws.has_permission.assert_called_once_with(
UserID('someuser'), WorkspaceAccessType.NONE, upa=UPA('1/1/1'))
Expand Down