def test_initial_recur_baseline_done(self): # backdate to be within the first recurrence window backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=3, days=2)) self.bless_with_basics( setdate=backdate, local_metastatic='metastatic') # add baseline QNRs, as if submitted nearly 3 months ago, during # baseline window backdated = nowish - relativedelta(months=2, days=25) baseline = QuestionnaireBank.query.filter_by( name='metastatic').one() for instrument in metastatic_baseline_instruments: mock_qr(instrument, qb=baseline, timestamp=backdated) self.test_user = db.session.merge(self.test_user) # Check status during baseline window a_s_baseline = QB_Status( user=self.test_user, as_of_date=backdated) assert a_s_baseline.overall_status == OverallStatus.completed assert not a_s_baseline.instruments_needing_full_assessment() # Whereas "current" status for the initial recurrence show due. a_s = QB_Status(user=self.test_user, as_of_date=nowish) assert a_s.overall_status == OverallStatus.due # in the initial window w/ no questionnaires submitted # should include all from initial recur assert set(a_s.instruments_needing_full_assessment()) == metastatic_3
def test_initial_recur_baseline_done(self): # backdate to be within the first recurrence window backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=3, days=2)) self.bless_with_basics( setdate=backdate, local_metastatic='metastatic') # add baseline QNRs, as if submitted nearly 3 months ago, during # baseline window backdated = nowish - relativedelta(months=2, days=25) baseline = QuestionnaireBank.query.filter_by( name='metastatic').one() for instrument in metastatic_baseline_instruments: mock_qr(instrument, qb=baseline, timestamp=backdated) self.test_user = db.session.merge(self.test_user) # Check status during baseline window a_s_baseline = QB_Status( user=self.test_user, as_of_date=backdated) assert a_s_baseline.overall_status == OverallStatus.completed assert not a_s_baseline.instruments_needing_full_assessment() # Whereas "current" status for the initial recurrence show due. a_s = QB_Status(user=self.test_user, as_of_date=nowish) assert a_s.overall_status == OverallStatus.due # in the initial window w/ no questionnaires submitted # should include all from initial recur assert set(a_s.instruments_needing_full_assessment()) == metastatic_3
def test_metastatic_due(self): # hasn't taken, but still in OverallStatus.due period self.bless_with_basics(local_metastatic='metastatic', setdate=now) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=now) assert a_s.overall_status == OverallStatus.due # confirm list of expected intruments needing attention assert (metastatic_baseline_instruments == set(a_s.instruments_needing_full_assessment())) assert not a_s.instruments_in_progress() # metastatic indefinite should also be 'due' assert (metastatic_indefinite_instruments == set(a_s.instruments_needing_full_assessment('indefinite'))) assert not a_s.instruments_in_progress('indefinite')
def test_metastatic_due(self): # hasn't taken, but still in OverallStatus.due period self.bless_with_basics(local_metastatic='metastatic', setdate=now) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=now) assert a_s.overall_status == OverallStatus.due # confirm list of expected intruments needing attention assert (metastatic_baseline_instruments == set(a_s.instruments_needing_full_assessment())) assert not a_s.instruments_in_progress() # metastatic indefinite should also be 'due' assert (metastatic_indefinite_instruments == set(a_s.instruments_needing_full_assessment('indefinite'))) assert not a_s.instruments_in_progress('indefinite')
def test_localized_using_org(self): self.bless_with_basics(local_metastatic='localized', setdate=now) self.test_user = db.session.merge(self.test_user) # confirm appropriate instruments a_s = QB_Status(user=self.test_user, as_of_date=now) assert (set(a_s.instruments_needing_full_assessment()) == localized_instruments)
def test_localized_using_org(self): self.bless_with_basics(local_metastatic='localized', setdate=now) self.test_user = db.session.merge(self.test_user) # confirm appropriate instruments a_s = QB_Status(user=self.test_user, as_of_date=now) assert (set(a_s.instruments_needing_full_assessment()) == localized_instruments)
def test_localized_on_time(self): # User finished both on time self.bless_with_basics(local_metastatic='localized', setdate=now) mock_qr(instrument_id='eproms_add', timestamp=now) mock_qr(instrument_id='epic26', timestamp=now) mock_qr(instrument_id='comorb', timestamp=now) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=now) assert a_s.overall_status == OverallStatus.completed # confirm appropriate instruments assert not a_s.instruments_needing_full_assessment('all')
def test_localized_on_time(self): # User finished both on time self.bless_with_basics(local_metastatic='localized', setdate=now) mock_qr(instrument_id='eproms_add', timestamp=now) mock_qr(instrument_id='epic26', timestamp=now) mock_qr(instrument_id='comorb', timestamp=now) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=now) assert a_s.overall_status == OverallStatus.completed # confirm appropriate instruments assert not a_s.instruments_needing_full_assessment('all')
def test_localized_in_process(self): # User finished one, time remains for other self.bless_with_basics(local_metastatic='localized', setdate=now) mock_qr(instrument_id='eproms_add', timestamp=now) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=now) assert a_s.overall_status == OverallStatus.in_progress # confirm appropriate instruments assert (localized_instruments - set(a_s.instruments_needing_full_assessment('all')) == {'eproms_add'}) assert not a_s.instruments_in_progress()
def test_localized_in_process(self): # User finished one, time remains for other self.bless_with_basics(local_metastatic='localized', setdate=now) mock_qr(instrument_id='eproms_add', timestamp=now) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=now) assert a_s.overall_status == OverallStatus.in_progress # confirm appropriate instruments assert (localized_instruments - set(a_s.instruments_needing_full_assessment('all')) == {'eproms_add'}) assert not a_s.instruments_in_progress()
def test_secondary_recur_due(self): # backdate so baseline q's have expired, and we are within the # second recurrence window backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=6, hours=1)) self.bless_with_basics( setdate=backdate, local_metastatic='metastatic') self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=nowish) assert a_s.overall_status == OverallStatus.due # w/ no questionnaires submitted # should include all from second recur assert set(a_s.instruments_needing_full_assessment()) == metastatic_4
def test_secondary_recur_due(self): # backdate so baseline q's have expired, and we are within the # second recurrence window backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=6, hours=1)) self.bless_with_basics( setdate=backdate, local_metastatic='metastatic') self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=nowish) assert a_s.overall_status == OverallStatus.due # w/ no questionnaires submitted # should include all from second recur assert set(a_s.instruments_needing_full_assessment()) == metastatic_4
def test_completed_older_rp(self): """If current qb completed on older rp, should show as done""" fourmonthsago = now - timedelta(days=120) weekago = now - timedelta(weeks=1) twoweeksago = now - timedelta(weeks=2) org = self.setup_org_qbs(rp_name='v2', retired_as_of=weekago) org_id = org.id self.setup_org_qbs(org=org, rp_name='v3') self.promote_user(role_name=ROLE.PATIENT.value) self.test_user = db.session.merge(self.test_user) self.test_user.organizations.append(org) audit = Audit(user_id=TEST_USER_ID, subject_id=TEST_USER_ID) uc = UserConsent(user_id=TEST_USER_ID, organization_id=org_id, audit=audit, agreement_url='http://no.com', acceptance_date=fourmonthsago) with SessionScope(db): db.session.add(audit) db.session.add(uc) db.session.commit() user = db.session.merge(self.test_user) # Now, should still be rp v3, 3mo recurrence a_s = QB_Status(user=user, as_of_date=now) assert (a_s.current_qbd().questionnaire_bank.name == 'CRV_recurring_3mo_period v3') assert a_s.instruments_needing_full_assessment() == [ 'epic26_v3', 'eortc_v3' ] # Complete the questionnaire from the 3mo v2 QB v2qb = QuestionnaireBank.query.filter( QuestionnaireBank.name == 'CRV_recurring_3mo_period v2').one() mock_qr('epic26_v2', timestamp=twoweeksago, qb=v2qb, iteration=0) mock_qr('eortc_v2', timestamp=twoweeksago, qb=v2qb, iteration=0) # Two weeks ago, should be completed user = db.session.merge(user) a_s = QB_Status(user=user, as_of_date=twoweeksago) assert a_s.overall_status == OverallStatus.completed # Current should also be completed, even tho protocol changed a_s = QB_Status(user=user, as_of_date=now) assert a_s.overall_status == OverallStatus.completed
def test_metastatic_on_time(self): # User finished both on time self.bless_with_basics( local_metastatic='metastatic', setdate=now) for i in metastatic_baseline_instruments: mock_qr(instrument_id=i, timestamp=now) mi_qb = QuestionnaireBank.query.filter_by( name='metastatic_indefinite').first() mock_qr(instrument_id='irondemog', qb=mi_qb, timestamp=now) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=now) assert a_s.overall_status == OverallStatus.completed # shouldn't need full or any inprocess assert not a_s.instruments_needing_full_assessment('all') assert not a_s.instruments_in_progress('all')
def test_metastatic_on_time(self): # User finished both on time self.bless_with_basics( local_metastatic='metastatic', setdate=now) for i in metastatic_baseline_instruments: mock_qr(instrument_id=i, timestamp=now) mi_qb = QuestionnaireBank.query.filter_by( name='metastatic_indefinite').first() mock_qr(instrument_id='irondemog', qb=mi_qb, timestamp=now) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=now) assert a_s.overall_status == OverallStatus.completed # shouldn't need full or any inprocess assert not a_s.instruments_needing_full_assessment('all') assert not a_s.instruments_in_progress('all')
def test_completed_older_rp(self): """If current qb completed on older rp, should show as done""" fourmonthsago = now - timedelta(days=120) weekago = now - timedelta(weeks=1) twoweeksago = now - timedelta(weeks=2) org = self.setup_org_qbs(rp_name='v2', retired_as_of=weekago) org_id = org.id self.setup_org_qbs(org=org, rp_name='v3') self.promote_user(role_name=ROLE.PATIENT.value) self.test_user = db.session.merge(self.test_user) self.test_user.organizations.append(org) audit = Audit( user_id=TEST_USER_ID, subject_id=TEST_USER_ID) uc = UserConsent( user_id=TEST_USER_ID, organization_id=org_id, audit=audit, agreement_url='http://no.com', acceptance_date=fourmonthsago) with SessionScope(db): db.session.add(audit) db.session.add(uc) db.session.commit() user = db.session.merge(self.test_user) # Now, should still be rp v3, 3mo recurrence a_s = QB_Status(user=user, as_of_date=now) assert (a_s.current_qbd().questionnaire_bank.name == 'CRV_recurring_3mo_period v3') assert a_s.instruments_needing_full_assessment() == [ 'epic26_v3', 'eortc_v3'] # Complete the questionnaire from the 3mo v2 QB v2qb = QuestionnaireBank.query.filter( QuestionnaireBank.name == 'CRV_recurring_3mo_period v2').one() mock_qr('epic26_v2', timestamp=twoweeksago, qb=v2qb, iteration=0) mock_qr('eortc_v2', timestamp=twoweeksago, qb=v2qb, iteration=0) # Two weeks ago, should be completed user = db.session.merge(user) a_s = QB_Status(user=user, as_of_date=twoweeksago) assert a_s.overall_status == OverallStatus.completed # Current should also be completed, even tho protocol changed a_s = QB_Status(user=user, as_of_date=now) assert a_s.overall_status == OverallStatus.completed
def test_2nd_recur_due(self): # backdate so baseline q's have expired, and we within the 2nd # recurrence window backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=9, hours=1)) self.bless_with_basics( setdate=backdate, local_metastatic='metastatic') self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=nowish) assert a_s.overall_status == OverallStatus.due # in the initial window w/ no questionnaires submitted # should include all from initial recur assert set(a_s.instruments_needing_full_assessment()) == metastatic_3 # however, we should be looking at iteration 2 (zero index)! assert a_s.current_qbd().iteration == 1
def test_2nd_recur_due(self): # backdate so baseline q's have expired, and we within the 2nd # recurrence window backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=9, hours=1)) self.bless_with_basics( setdate=backdate, local_metastatic='metastatic') self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=nowish) assert a_s.overall_status == OverallStatus.due # in the initial window w/ no questionnaires submitted # should include all from initial recur assert set(a_s.instruments_needing_full_assessment()) == metastatic_3 # however, we should be looking at iteration 2 (zero index)! assert a_s.current_qbd().iteration == 1
def test_metastatic_as_of_date(self): # backdating consent beyond expired and the status lookup date # within a valid window should show available assessments. backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=3)) self.bless_with_basics(setdate=backdate, local_metastatic='metastatic') # backdate so the baseline q's have expired mock_qr(instrument_id='epic23', status='in-progress', doc_id='doc-23', timestamp=backdate) self.test_user = db.session.merge(self.test_user) as_of_date = backdate + relativedelta(days=2) a_s = QB_Status(user=self.test_user, as_of_date=as_of_date) assert a_s.overall_status == OverallStatus.in_progress # with only epic26 started, should see results for both # instruments_needing_full_assessment and instruments_in_progress assert ['doc-23'] == a_s.instruments_in_progress() assert a_s.instruments_needing_full_assessment()
def test_metastatic_as_of_date(self): # backdating consent beyond expired and the status lookup date # within a valid window should show available assessments. backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=3)) self.bless_with_basics(setdate=backdate, local_metastatic='metastatic') # backdate so the baseline q's have expired mock_qr(instrument_id='epic23', status='in-progress', doc_id='doc-23', timestamp=backdate) self.test_user = db.session.merge(self.test_user) as_of_date = backdate + relativedelta(days=2) a_s = QB_Status(user=self.test_user, as_of_date=as_of_date) assert a_s.overall_status == OverallStatus.in_progress # with only epic26 started, should see results for both # instruments_needing_full_assessment and instruments_in_progress assert ['doc-23'] == a_s.instruments_in_progress() assert a_s.instruments_needing_full_assessment()
def test_localized_overdue(self): # if the user completed something on time, and nothing else # is due, should see the thank you message. backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=3, hours=1)) self.bless_with_basics( setdate=backdate, local_metastatic='localized') # backdate so the baseline q's have expired mock_qr( instrument_id='epic26', status='in-progress', timestamp=backdate) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=nowish) assert a_s.overall_status == OverallStatus.partially_completed # with all q's expired, # instruments_needing_full_assessment and instruments_in_progress # should be empty assert not a_s.instruments_needing_full_assessment() assert not a_s.instruments_in_progress()
def test_localized_overdue(self): # if the user completed something on time, and nothing else # is due, should see the thank you message. backdate, nowish = associative_backdate( now=now, backdate=relativedelta(months=3, hours=1)) self.bless_with_basics( setdate=backdate, local_metastatic='localized') # backdate so the baseline q's have expired mock_qr( instrument_id='epic26', status='in-progress', timestamp=backdate) self.test_user = db.session.merge(self.test_user) a_s = QB_Status(user=self.test_user, as_of_date=nowish) assert a_s.overall_status == OverallStatus.partially_completed # with all q's expired, # instruments_needing_full_assessment and instruments_in_progress # should be empty assert not a_s.instruments_needing_full_assessment() assert not a_s.instruments_in_progress()
def test_outdated_done_indef(self): """Confirm completed indefinite counts after RP switch""" # boiler plate to create baseline and indef with retired RP yesterday = now - timedelta(days=1) weekago = now - timedelta(weeks=1) org, rp2, rp2_id = self.setup_org_n_rp( org_name='testorg', rp_name='v2', retired_as_of=yesterday) org, rp3, rp3_id = self.setup_org_n_rp(org=org, rp_name='v3') org_id = org.id self.promote_user(role_name=ROLE.PATIENT.value) self.test_user = db.session.merge(self.test_user) self.test_user.organizations.append(org) audit = Audit(user_id=TEST_USER_ID, subject_id=TEST_USER_ID) uc = UserConsent( user_id=TEST_USER_ID, organization_id=org_id, audit=audit, agreement_url='http://no.com', acceptance_date=weekago) with SessionScope(db): db.session.add(audit) db.session.add(uc) db.session.commit() self.setup_qb( questionnaire_name='epic23', qb_name='baseline v2', classification='baseline', rp_id=rp2_id) self.setup_qb( questionnaire_name='epic26', qb_name='baseline v3', classification='baseline', rp_id=rp3_id) qb2_indef = self.setup_qb( questionnaire_name='irondemog', qb_name='indef v2', classification='indefinite', rp_id=rp2_id) self.setup_qb( questionnaire_name='irondemog_v3', qb_name='indef v3', classification='indefinite', rp_id=rp3_id) # for today, should get the v3 baseline user = db.session.merge(self.test_user) a_s = QB_Status(user=user, as_of_date=now) assert (['epic26', 'irondemog_v3'] == a_s.instruments_needing_full_assessment(classification='all')) # create done QNR for indefinite dated prior to rp transition # belonging to older qb - confirm that clears indef work as of then mock_qr('irondemog', timestamp=weekago, qb=qb2_indef) user = db.session.merge(self.test_user) invalidate_users_QBT(user_id=TEST_USER_ID) a_s = QB_Status(user=user, as_of_date=weekago) assert (a_s.instruments_needing_full_assessment( classification='indefinite') == []) # move forward in time; user should no longer need indefinite, even # tho RP changed qb2_indef = db.session.merge(qb2_indef) a_s = QB_Status(user=user, as_of_date=now) assert qb2_indef == a_s.current_qbd( classification='indefinite').questionnaire_bank assert (a_s.instruments_needing_full_assessment( classification='indefinite') == []) assert (a_s.instruments_needing_full_assessment( classification='all') == ['epic26'])
def test_outdated_done_indef(self): """Confirm completed indefinite counts after RP switch""" # boiler plate to create baseline and indef with retired RP yesterday = now - timedelta(days=1) weekago = now - timedelta(weeks=1) org, rp2, rp2_id = self.setup_org_n_rp(org_name='testorg', rp_name='v2', retired_as_of=yesterday) org, rp3, rp3_id = self.setup_org_n_rp(org=org, rp_name='v3') org_id = org.id self.promote_user(role_name=ROLE.PATIENT.value) self.test_user = db.session.merge(self.test_user) self.test_user.organizations.append(org) audit = Audit(user_id=TEST_USER_ID, subject_id=TEST_USER_ID) uc = UserConsent(user_id=TEST_USER_ID, organization_id=org_id, audit=audit, agreement_url='http://no.com', acceptance_date=weekago) with SessionScope(db): db.session.add(audit) db.session.add(uc) db.session.commit() self.setup_qb(questionnaire_name='epic23', qb_name='baseline v2', classification='baseline', rp_id=rp2_id) self.setup_qb(questionnaire_name='epic26', qb_name='baseline v3', classification='baseline', rp_id=rp3_id) qb2_indef = self.setup_qb(questionnaire_name='irondemog', qb_name='indef v2', classification='indefinite', rp_id=rp2_id) self.setup_qb(questionnaire_name='irondemog_v3', qb_name='indef v3', classification='indefinite', rp_id=rp3_id) # for today, should get the v3 baseline user = db.session.merge(self.test_user) a_s = QB_Status(user=user, as_of_date=now) assert ([ 'epic26', 'irondemog_v3' ] == a_s.instruments_needing_full_assessment(classification='all')) # create done QNR for indefinite dated prior to rp transition # belonging to older qb - confirm that clears indef work as of then mock_qr('irondemog', timestamp=weekago, qb=qb2_indef) user = db.session.merge(self.test_user) invalidate_users_QBT(user_id=TEST_USER_ID) a_s = QB_Status(user=user, as_of_date=weekago) assert (a_s.instruments_needing_full_assessment( classification='indefinite') == []) # move forward in time; user should no longer need indefinite, even # tho RP changed qb2_indef = db.session.merge(qb2_indef) a_s = QB_Status(user=user, as_of_date=now) assert qb2_indef == a_s.current_qbd( classification='indefinite').questionnaire_bank assert (a_s.instruments_needing_full_assessment( classification='indefinite') == []) assert (a_s.instruments_needing_full_assessment( classification='all') == ['epic26'])