Source code for ibllib.tests.qc.test_critical_reasons
import unittest
from unittest import mock
import json
import random
import string
import requests
from one.api import ONE
from ibllib.tests import TEST_DB
import ibllib.qc.critical_reasons as usrpmt
one = ONE(**TEST_DB)
[docs]def mock_input(prompt):
if "Select from this list the reason(s)" in prompt:
return "1,3"
elif "Explain why you selected" in prompt:
return "Estoy un poco preocupada"
elif "You are about to delete" in prompt:
return "y"
[docs]class TestUserPmtSess(unittest.TestCase):
[docs] def setUp(self) -> None:
# Make sure tests use correct session ID
one.alyx.clear_rest_cache()
self.sess_id = one.alyx.rest('sessions', 'list', task_protocol='ephys')[0]['url'][-36:]
# Make new insertion with random name
data = {'name': ''.join(random.choices(string.ascii_letters, k=5)),
'session': self.sess_id,
'model': '3A',
'json': None,
'datasets': []}
one.alyx.rest('insertions', 'create', data=data)
# 3. Save ins id in global variable for test access
self.ins_id = one.alyx.rest('insertions', 'list', session=self.sess_id, name=data['name'], no_cache=True)[0]['id']
[docs] def test_reason_addnumberstr(self):
outstr = usrpmt._reason_addnumberstr(reason_list=['a', 'b'])
self.assertEqual(outstr, ['0) a', '1) b'])
[docs] def test_userinput_sess(self):
eid = self.sess_id # sess id
with mock.patch('builtins.input', mock_input):
usrpmt.main(eid=eid, one=one)
note = one.alyx.rest('notes', 'list', django=f'object_id,{eid}', no_cache=True)
critical_dict = json.loads(note[0]['text'])
expected_dict = {
'title': '=== EXPERIMENTER REASON(S) FOR MARKING THE SESSION AS CRITICAL ===',
'reasons_selected': ['synching impossible', 'essential dataset missing'],
'reason_for_other': []}
assert expected_dict == critical_dict
[docs] def test_userinput_ins(self):
eid = self.ins_id # probe id
with mock.patch('builtins.input', mock_input):
usrpmt.main(eid=eid, one=one)
note = one.alyx.rest('notes', 'list', django=f'object_id,{eid}', no_cache=True)
critical_dict = json.loads(note[0]['text'])
expected_dict = {
'title': '=== EXPERIMENTER REASON(S) FOR MARKING THE INSERTION AS CRITICAL ===',
'reasons_selected': ['Track not visible on imaging data', 'Drift'],
'reason_for_other': []}
assert expected_dict == critical_dict
[docs] def test_guiinput_ins(self):
eid = self.ins_id # probe id
str_notes_static = '=== EXPERIMENTER REASON(S) FOR MARKING THE INSERTION AS CRITICAL ==='
notes = one.alyx.rest('notes', 'list',
django=f'text__icontains,{str_notes_static},object_id,{eid}',
no_cache=True)
# delete any previous notes
for note in notes:
one.alyx.rest('notes', 'delete', id=note['id'])
# write a new note and make sure it is found
usrpmt.main_gui(eid=eid, reasons_selected=['Drift'], one=one)
note = one.alyx.rest('notes', 'list',
django=f'text__icontains,{str_notes_static},object_id,{eid}',
no_cache=True)
assert len(note) == 1
critical_dict = json.loads(note[0]['text'])
expected_dict = {
'title': '=== EXPERIMENTER REASON(S) FOR MARKING THE INSERTION AS CRITICAL ===',
'reasons_selected': ['Drift'], 'reason_for_other': []}
assert expected_dict == critical_dict
[docs] def test_note_probe_ins(self):
# Note: this test is redundant with the above, but it tests specifically whether
# the nomenclature of writing notes in insertion is correct.
eid = self.ins_id # probe id
content_type = 'probeinsertion'
note_text = 'USING A FAKE SINGLE STRING HERE KSROI283IF982HKJFHWRY'
notes = one.alyx.rest('notes', 'list',
django=f'text__icontains,{note_text},object_id,{eid}',
no_cache=True)
# delete any previous notes
for note in notes:
one.alyx.rest('notes', 'delete', id=note['id'])
# create new note
my_note = {'user': one.alyx.user,
'content_type': content_type,
'object_id': eid,
'text': f'{note_text}'}
one.alyx.rest('notes', 'create', data=my_note)
notes = one.alyx.rest('notes', 'list',
django=f'text__icontains,{note_text},object_id,{eid}',
no_cache=True)
assert len(notes) == 1
[docs] def tearDown(self) -> None:
try:
one.alyx.rest('insertions', 'delete', id=self.ins_id)
except requests.HTTPError as ex:
if ex.errno != 404:
raise ex
if __name__ == '__main__':
unittest.main()