diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..70ccfcb8a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +docs +.git +.github +LICENSE +README.md +renovate.json +**/staticroot +**/__pycache__ +**/.pytest_cache +**/.gitkeep +**/.gitignore diff --git a/.github/workflows/testing-pipline.yml b/.github/workflows/testing-pipline.yml index 599b9d4e4..f5ec499e8 100644 --- a/.github/workflows/testing-pipline.yml +++ b/.github/workflows/testing-pipline.yml @@ -44,7 +44,7 @@ jobs: - uses: actions/checkout@v3 - run: | sudo apt-get update - sudo apt-get install -y libgconf-2-4 libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm-dev libnss3-dev libxss-dev libasound2 + sudo apt-get install -y libatk1.0-0 libatk-bridge2.0-0 libgdk-pixbuf2.0-0 libgtk-3-0 libgbm-dev libnss3-dev libxss-dev libasound2-dev - uses: browser-actions/setup-chrome@v1 - uses: actions/cache@v3 with: @@ -119,7 +119,7 @@ jobs: - name: Allure report action # Step to generate Allure report if: (success() || failure()) && github.event_name != 'pull_request' - uses: simple-elf/allure-report-action@v1.7 + uses: simple-elf/allure-report-action@v1.13 with: allure_results: CodeListLibrary_project/clinicalcode/tests/allure-results allure_report: CodeListLibrary_project/clinicalcode/tests/allure-report diff --git a/CodeListLibrary_project/assets/style.css b/CodeListLibrary_project/assets/style.css deleted file mode 100644 index 561524c69..000000000 --- a/CodeListLibrary_project/assets/style.css +++ /dev/null @@ -1,319 +0,0 @@ -body { - font-family: Helvetica, Arial, sans-serif; - font-size: 12px; - /* do not increase min-width as some may use split screens */ - min-width: 800px; - color: #999; -} - -h1 { - font-size: 24px; - color: black; -} - -h2 { - font-size: 16px; - color: black; -} - -p { - color: black; -} - -a { - color: #999; -} - -table { - border-collapse: collapse; -} - -/****************************** - * SUMMARY INFORMATION - ******************************/ -#environment td { - padding: 5px; - border: 1px solid #e6e6e6; - vertical-align: top; -} -#environment tr:nth-child(odd) { - background-color: #f6f6f6; -} -#environment ul { - margin: 0; - padding: 0 20px; -} - -/****************************** - * TEST RESULT COLORS - ******************************/ -span.passed, -.passed .col-result { - color: green; -} - -span.skipped, -span.xfailed, -span.rerun, -.skipped .col-result, -.xfailed .col-result, -.rerun .col-result { - color: orange; -} - -span.error, -span.failed, -span.xpassed, -.error .col-result, -.failed .col-result, -.xpassed .col-result { - color: red; -} - -.col-links__extra { - margin-right: 3px; -} - -/****************************** - * RESULTS TABLE - * - * 1. Table Layout - * 2. Extra - * 3. Sorting items - * - ******************************/ -/*------------------ - * 1. Table Layout - *------------------*/ -#results-table { - border: 1px solid #e6e6e6; - color: #999; - font-size: 12px; - width: 100%; -} -#results-table th, -#results-table td { - padding: 5px; - border: 1px solid #e6e6e6; - text-align: left; -} -#results-table th { - font-weight: bold; -} - -/*------------------ - * 2. Extra - *------------------*/ -.logwrapper { - max-height: 230px; - overflow-y: scroll; - background-color: #e6e6e6; -} -.logwrapper.expanded { - max-height: none; -} -.logwrapper.expanded .logexpander:after { - content: "collapse [-]"; -} -.logwrapper .logexpander { - z-index: 1; - position: sticky; - top: 10px; - width: max-content; - border: 1px solid; - border-radius: 3px; - padding: 5px 7px; - margin: 10px 0 10px calc(100% - 80px); - cursor: pointer; - background-color: #e6e6e6; -} -.logwrapper .logexpander:after { - content: "expand [+]"; -} -.logwrapper .logexpander:hover { - color: #000; - border-color: #000; -} -.logwrapper .log { - min-height: 40px; - position: relative; - top: -50px; - height: calc(100% + 50px); - border: 1px solid #e6e6e6; - color: black; - display: block; - font-family: "Courier New", Courier, monospace; - padding: 5px; - padding-right: 80px; - white-space: pre-wrap; -} - -div.media { - border: 1px solid #e6e6e6; - float: right; - height: 240px; - margin: 0 5px; - overflow: hidden; - width: 320px; -} - -.media-container { - display: grid; - grid-template-columns: 25px auto 25px; - align-items: center; - flex: 1 1; - overflow: hidden; - height: 200px; -} - -.media-container--fullscreen { - grid-template-columns: 0px auto 0px; -} - -.media-container__nav--right, -.media-container__nav--left { - text-align: center; - cursor: pointer; -} - -.media-container__viewport { - cursor: pointer; - text-align: center; - height: inherit; -} -.media-container__viewport img, -.media-container__viewport video { - object-fit: cover; - width: 100%; - max-height: 100%; -} - -.media__name, -.media__counter { - display: flex; - flex-direction: row; - justify-content: space-around; - flex: 0 0 25px; - align-items: center; -} - -.collapsible td:not(.col-links) { - cursor: pointer; -} -.collapsible td:not(.col-links):hover::after { - color: #bbb; - font-style: italic; - cursor: pointer; -} - -.col-result { - width: 130px; -} -.col-result:hover::after { - content: " (hide details)"; -} - -.col-result.collapsed:hover::after { - content: " (show details)"; -} - -#environment-header h2:hover::after { - content: " (hide details)"; - color: #bbb; - font-style: italic; - cursor: pointer; - font-size: 12px; -} - -#environment-header.collapsed h2:hover::after { - content: " (show details)"; - color: #bbb; - font-style: italic; - cursor: pointer; - font-size: 12px; -} - -/*------------------ - * 3. Sorting items - *------------------*/ -.sortable { - cursor: pointer; -} -.sortable.desc:after { - content: " "; - position: relative; - left: 5px; - bottom: -12.5px; - border: 10px solid #4caf50; - border-bottom: 0; - border-left-color: transparent; - border-right-color: transparent; -} -.sortable.asc:after { - content: " "; - position: relative; - left: 5px; - bottom: 12.5px; - border: 10px solid #4caf50; - border-top: 0; - border-left-color: transparent; - border-right-color: transparent; -} - -.hidden, .summary__reload__button.hidden { - display: none; -} - -.summary__data { - flex: 0 0 550px; -} -.summary__reload { - flex: 1 1; - display: flex; - justify-content: center; -} -.summary__reload__button { - flex: 0 0 300px; - display: flex; - color: white; - font-weight: bold; - background-color: #4caf50; - text-align: center; - justify-content: center; - align-items: center; - border-radius: 3px; - cursor: pointer; -} -.summary__reload__button:hover { - background-color: #46a049; -} -.summary__spacer { - flex: 0 0 550px; -} - -.controls { - display: flex; - justify-content: space-between; -} - -.filters, -.collapse { - display: flex; - align-items: center; -} -.filters button, -.collapse button { - color: #999; - border: none; - background: none; - cursor: pointer; - text-decoration: underline; -} -.filters button:hover, -.collapse button:hover { - color: #ccc; -} - -.filter__label { - margin-right: 10px; -} diff --git a/CodeListLibrary_project/clinicalcode/context_processors/general.py b/CodeListLibrary_project/clinicalcode/context_processors/general.py index 2fe0433a6..c96da8281 100644 --- a/CodeListLibrary_project/clinicalcode/context_processors/general.py +++ b/CodeListLibrary_project/clinicalcode/context_processors/general.py @@ -7,6 +7,7 @@ def general_var(request): return { 'USER_CREATE_CONTEXT': permission_utils.user_has_create_context(request), 'IS_BRAND_ADMIN': permission_utils.is_requestor_brand_admin(request), + 'GA4_STUDIO_LINK': settings.GA4_STUDIO_LINK, 'MEDIA_URL': settings.MEDIA_URL, 'CLL_READ_ONLY': settings.CLL_READ_ONLY, 'SHOWADMIN': settings.SHOWADMIN, diff --git a/CodeListLibrary_project/clinicalcode/entity_utils/concept_utils.py b/CodeListLibrary_project/clinicalcode/entity_utils/concept_utils.py index 18be99d41..d12215b33 100644 --- a/CodeListLibrary_project/clinicalcode/entity_utils/concept_utils.py +++ b/CodeListLibrary_project/clinicalcode/entity_utils/concept_utils.py @@ -279,7 +279,11 @@ def get_concept_headers(concept_information, default=None): end as is_published, concept.phenotype_owner_id, codingsystem.id as coding_system_id, - codingsystem.name as coding_system_name + codingsystem.name as coding_system_name, + case + when concept.is_deleted is null then false + else concept.is_deleted + end as is_deleted from concept_information as info, json_array_elements(info.doc) as obj join public.clinicalcode_concept as concept @@ -909,10 +913,11 @@ def get_clinical_concept_data(concept_id, concept_history_id, include_reviewed_c if not latest_version: latest_version = historical_concept + ph_owner_id = concept.phenotype_owner.id if concept.phenotype_owner is not None else None concept_data['latest_version'] = { 'id': latest_version.id, 'history_id': latest_version.history_id, - 'is_out_of_date': historical_concept.history_id < latest_version.history_id, + 'is_out_of_date': (requested_entity_id is None or requested_entity_id != ph_owner_id) and historical_concept.history_id < latest_version.history_id, } concept_data['is_published'] = is_concept_published(concept_id, concept_history_id) diff --git a/CodeListLibrary_project/clinicalcode/entity_utils/constants.py b/CodeListLibrary_project/clinicalcode/entity_utils/constants.py index a2120233b..0626806d8 100644 --- a/CodeListLibrary_project/clinicalcode/entity_utils/constants.py +++ b/CodeListLibrary_project/clinicalcode/entity_utils/constants.py @@ -105,6 +105,15 @@ class ENTITY_STATUS(int, enum.Enum): FINAL = 2 +class DELETION_QUERY(int, enum.Enum): + """ + Used to alter query parameters examining the status of UGC + """ + ANY = 0 + ACTIVE = 1 + DELETED = 2 + + class APPROVAL_STATUS(int, enum.Enum): """ Approval status of a published entity diff --git a/CodeListLibrary_project/clinicalcode/entity_utils/permission_utils.py b/CodeListLibrary_project/clinicalcode/entity_utils/permission_utils.py index c578b98c7..aa636dc4f 100644 --- a/CodeListLibrary_project/clinicalcode/entity_utils/permission_utils.py +++ b/CodeListLibrary_project/clinicalcode/entity_utils/permission_utils.py @@ -25,8 +25,8 @@ from ..models.Organisation import Organisation, OrganisationAuthority from .constants import ( - ORGANISATION_ROLES, APPROVAL_STATUS, - GROUP_PERMISSIONS, WORLD_ACCESS_PERMISSIONS + APPROVAL_STATUS, DELETION_QUERY, + ORGANISATION_ROLES, GROUP_PERMISSIONS, WORLD_ACCESS_PERMISSIONS ) @@ -967,7 +967,7 @@ def get_accessible_entity_history( def get_accessible_entities( request, consider_user_perms=True, - only_deleted=False, + deletion_query=DELETION_QUERY.ACTIVE, status=[APPROVAL_STATUS.APPROVED], min_group_permission=ORGANISATION_ROLES.MEMBER, consider_brand=True, @@ -980,7 +980,7 @@ def get_accessible_entities( Args: request (RequestContext): the HTTPRequest consider_user_perms (boolean): Whether to consider user perms i.e. superuser, moderation status etc - only_deleted (boolean): Whether to incl/excl deleted entities + deletion_query (enum): Specifies how deleted entities should be handled status (list): A list of publication statuses to consider group_permissions (list): A list of which group permissions to consider consider_brand (boolean): Whether to consider the request Brand (only applies to Moderators, Non-Auth'd and Auth'd accounts) @@ -1011,15 +1011,16 @@ def get_accessible_entities( if brand is not None: results = GenericEntity.objects.filter(brands__overlap=[brand.id]) - if only_deleted: - results = results.filter(is_deleted=True) - else: - results = results.exclude(is_deleted=True) - results = GenericEntity.history \ .filter(id__in=list(results.values_list('id', flat=True))) else: results = GenericEntity.history.all() + + if deletion_query == DELETION_QUERY.ACTIVE: + results = results.exclude(is_deleted=True) + elif deletion_query == DELETION_QUERY.DELETED: + results = results.filter(is_deleted=True) + return results.latest_of_each() # Anon user query @@ -1063,22 +1064,6 @@ def get_accessible_entities( cursor.execute(sql, query_params) return GenericEntity.history.filter(history_id__in=[row[1] for row in cursor.fetchall()]) - # Clean publication status - pub_status = status.copy() if isinstance(status, list) else [] - if consider_user_perms and is_member(user, 'Moderators'): - pub_status += [ - APPROVAL_STATUS.REQUESTED, - APPROVAL_STATUS.PENDING, - APPROVAL_STATUS.REJECTED - ] - - if len(pub_status) > 0: - pub_status = [ - x.value if x in APPROVAL_STATUS else gen_utils.parse_int(x, default=None) - for x in pub_status - if x in APPROVAL_STATUS or gen_utils.parse_int(x, default=None) is not None - ] - # Non-anon user # i.e. dependent on user role org_view_clause = '' @@ -1098,30 +1083,61 @@ def get_accessible_entities( 'role_enum': min_group_permission }) - if len(pub_status) < 1: - clauses += f''' - or hist_entity.publish_status != {APPROVAL_STATUS.PENDING.value} - ''' - elif APPROVAL_STATUS.ANY in pub_status or APPROVAL_STATUS.ANY.value in pub_status: - clauses += f''' - or hist_entity.publish_status = {APPROVAL_STATUS.APPROVED.value} - ''' + # Clean publication status + pub_status = status.copy() if isinstance(status, list) else [] + if consider_user_perms: + if user.is_superuser: + pub_status += [ + APPROVAL_STATUS.ANY, + APPROVAL_STATUS.REQUESTED, + APPROVAL_STATUS.PENDING, + APPROVAL_STATUS.REJECTED + ] + elif is_member(user, 'Moderators'): + pub_status += [ + APPROVAL_STATUS.REQUESTED, + APPROVAL_STATUS.PENDING, + APPROVAL_STATUS.REJECTED + ] + + if len(pub_status) > 0: + pub_status = [ + x.value if x in APPROVAL_STATUS else gen_utils.parse_int(x, default=None) + for x in pub_status + if x in APPROVAL_STATUS or gen_utils.parse_int(x, default=None) is not None + ] + + if not consider_user_perms or not user.is_superuser or not is_member(user, 'Moderators'): + if len(pub_status) < 1: + clauses += f''' + or hist_entity.publish_status != {APPROVAL_STATUS.PENDING.value} + ''' + elif APPROVAL_STATUS.ANY in pub_status or APPROVAL_STATUS.ANY.value in pub_status: + clauses += f''' + or hist_entity.publish_status = {APPROVAL_STATUS.APPROVED.value} + ''' + else: + clauses += ''' + or hist_entity.publish_status = any(%(pub_status)s) + ''' + query_params.update({ 'pub_status': pub_status }) else: - clauses += ''' - or hist_entity.publish_status = any(%(pub_status)s) - ''' - query_params.update({ 'pub_status': pub_status }) + clauses += ''' + or hist_entity.publish_status = any(%(pub_status)s) + ''' + query_params.update({ 'pub_status': pub_status }) + # Deletion status conditional = '' - if only_deleted: - conditional = ''' - and live_entity.id is not null and live_entity.is_deleted = true - ''' - else: - conditional = ''' - and (live_entity.is_deleted is null or live_entity.is_deleted = false) - and (hist_entity.is_deleted is null or hist_entity.is_deleted = false) - ''' + if deletion_query == DELETION_QUERY.ACTIVE: + conditional = ''' + and (live_entity.is_deleted is null or live_entity.is_deleted = false) + and (hist_entity.is_deleted is null or hist_entity.is_deleted = false) + ''' + elif deletion_query == DELETION_QUERY.DELETED: + conditional = ''' + and live_entity.id is not null and live_entity.is_deleted = true + ''' sql = f''' select t0.id, t0.history_id @@ -1498,9 +1514,15 @@ def get_accessible_detail_entity(request, entity_id, entity_history_id=None): is_viewable = False is_editable = False - is_published = historical_entity.publish_status == APPROVAL_STATUS.APPROVED.value is_org_accessible = False + pub_ent = None + if historical_entity.publish_status == APPROVAL_STATUS.APPROVED.value: + pub_ent = PublishedGenericEntity.objects.filter(entity_id=entity_id, entity_history_id=entity_history_id) + pub_ent = pub_ent.first() if pub_ent.exists() and pub_ent.first().approval_status == APPROVAL_STATUS.APPROVED.value else None + + is_published = pub_ent is not None + if user is not None: is_owner = live_entity.owner == user is_moderatable = False diff --git a/CodeListLibrary_project/clinicalcode/entity_utils/search_utils.py b/CodeListLibrary_project/clinicalcode/entity_utils/search_utils.py index 02d069851..6b4cf1d67 100644 --- a/CodeListLibrary_project/clinicalcode/entity_utils/search_utils.py +++ b/CodeListLibrary_project/clinicalcode/entity_utils/search_utils.py @@ -708,7 +708,8 @@ def get_template_entities(request, template_id, method='GET', force_term=True, f entities = permission_utils.get_accessible_entities( request, - status=[constants.APPROVAL_STATUS.ANY] + status=[constants.APPROVAL_STATUS.APPROVED], + deletion_query=constants.DELETION_QUERY.ACTIVE, ) metadata_filters = [key for key, value in constants.metadata.items() if 'search' in value and 'filterable' in value.get('search')] @@ -815,7 +816,8 @@ def get_renderable_entities(request, entity_types=None, method='GET', force_term # Get entities relating to the user entities = permission_utils.get_accessible_entities( request, - status=[constants.APPROVAL_STATUS.ANY] + status=[constants.APPROVAL_STATUS.APPROVED], + deletion_query=constants.DELETION_QUERY.ACTIVE, ) if isinstance(entity_types, list) and len(entity_types) > 0: diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/README.md b/CodeListLibrary_project/clinicalcode/tests/legacy/README.md deleted file mode 100644 index 6a7dcaa96..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/README.md +++ /dev/null @@ -1,33 +0,0 @@ - -## CODE LIST LIBRARY TEST CODE - -_26/10/2018, Pete Arnold_ - -The code is currently under development. - -The test run procedure will run all tests in all directories within the -clinicalcode directory tree not just those in the test directory. Old tests may -be moved soon. - - -# The directory structure - -Assuming the CodeListLibrary/CodeListLibrary_project directory is the base -directory. The tests have been gathered together at: - - clinicalcode/tests - -This directory should contain any webdriver modules (e.g. chromedriver.exe). It -will also contain the base test classes and functions. The tests are gathered -in two folders - unit_tests and functional_tests. - - -# To run the tests :- - -To run all of the tests, use: - - manage.py test - -Note that this will not work if there is a tests.py file in the clinicalcode -directory as well as the tests directory. - diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/__init__.py b/CodeListLibrary_project/clinicalcode/tests/legacy/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_test_base.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_test_base.py deleted file mode 100644 index 6aa9aabf3..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_test_base.py +++ /dev/null @@ -1,99 +0,0 @@ -''' - Test base class - - Set-up and tear-down etc. for unit tests and functional tests. -''' -import datetime -import os -import time - -from clinicalcode.tests.test_base import * -#from django.conf import settings -from cll import test_settings as settings -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from selenium import webdriver -from selenium.common.exceptions import WebDriverException -from selenium.webdriver.common.keys import Keys - -SCREEN_DUMP_LOCATION = os.path.join(os.path.dirname(os.path.abspath(__file__)), - 'screendumps') - -base_url = settings.WEBAPP_HOST -login_url = base_url + '/account/login?next=/' -''' - Test helper functions. -''' -MAX_WAIT = 10 - - -def wait(fn): - - def modified_fn(*args, **kwargs): - start_time = time.time() - while True: - try: - return fn(*args, **kwargs) - except (AssertionError, WebDriverException) as e: - if time.time() - start_time > MAX_WAIT: - raise e - time.sleep(0.5) - - return modified_fn - - -class FunctionalTest(StaticLiveServerTestCase): - - def setUp(self): - if settings.REMOTE_TEST: - self.browser = webdriver.Remote( - command_executor=settings.REMOTE_TEST_HOST, - desired_capabilities=settings.chrome_options.to_capabilities()) - self.browser.implicitly_wait(settings.IMPLICTLY_WAIT) - else: - self.browser = webdriver.Chrome() - - def list2reason(self, exc_list): - if exc_list and exc_list[-1][0] is self: - return exc_list[-1][1] - - def tearDown(self): - print("Functional test tear-down ...") - self.result = getattr(self, '_outcomeForDoCleanups', - self._resultForDoCleanups) - #error = self.list2reason(result.errors) - #failure = self.list2reason(result.failures) - #ok = not error and not failure - if self._test_has_failed(): - if not os.path.exists(SCREEN_DUMP_LOCATION): - os.makedirs(SCREEN_DUMP_LOCATION) - for ix, handle in enumerate(self.browser.window_handles): - self._windowid = ix - self.browser.switch_to_window(handle) - self.take_screenshot() - self.dump_html() - self.browser.quit() - #super(StaticLiveServerTestCase).tearDown() - - def _test_has_failed(self): - # slightly obscure but couldn't find a better way! - return any(error for (method, error) in self.result.errors) - - def take_screenshot(self): - filename = self._get_filename() + '.png' - print(('sending screenshot to', filename)) - self.browser.get_screenshot_as_file(filename) - - def dump_html(self): - filename = self._get_filename() + '.html' - print(('dumping page HTML to', filename)) - with open(filename, 'w') as f: - f.write(self.browser.page_source.encode('utf8')) - - def _get_filename(self): - timestamp = datetime.datetime.now().isoformat().replace(':', '.')[:19] - return '{folder}/{classname}.{method}-window{windowid}-{timestamp}'.format( - folder=SCREEN_DUMP_LOCATION, - classname=self.__class__.__name__, - method=self._testMethodName, - windowid=self._windowid, - timestamp=timestamp) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/__init__.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/chromedriver b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/chromedriver deleted file mode 100644 index e334db3e0..000000000 Binary files a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/chromedriver and /dev/null differ diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/chromedriver.exe b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/chromedriver.exe deleted file mode 100644 index 4f5f3f055..000000000 Binary files a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/chromedriver.exe and /dev/null differ diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/read_only/__init__.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/read_only/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/read_only/test_functional_read_only_conf_concept.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/read_only/test_functional_read_only_conf_concept.py deleted file mode 100644 index 5ef58d2c9..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/read_only/test_functional_read_only_conf_concept.py +++ /dev/null @@ -1,561 +0,0 @@ -import sys -import time -from datetime import datetime -from os.path import dirname -from unittest import skip, skipIf - -from clinicalcode.models.Concept import * -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -# from django.conf import settings -# from cll import read_only_test_settings -# from cll import test_settings as settings -from cll import read_only_test_settings as settings -from decouple import Config, RepositoryEnv -from django.contrib.auth import logout -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from django.test import modify_settings, override_settings -from rest_framework.reverse import reverse -from selenium import webdriver -from selenium.common.exceptions import NoSuchElementException -from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.support.ui import WebDriverWait - -''' - If arguments does not contain read_only substring then skip the test - because it means that read only settings are not used and tests will fail. - See manage.py to see how it works. -''' - - -@skipIf('read_only' not in sys.argv[-1], "READ ONLY TEST SKIPPED") -class ReadOnlyTestConcept(StaticLiveServerTestCase): - - def setUp(self): - # settings for gitlab running - location = dirname(dirname(__file__)) - if settings.REMOTE_TEST: - self.browser = webdriver.Remote( - command_executor=settings.REMOTE_TEST_HOST, - desired_capabilities=settings.chrome_options.to_capabilities()) - self.browser.implicitly_wait(settings.IMPLICTLY_WAIT) - else: - if settings.IS_LINUX: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver"), - chrome_options=settings.chrome_options) - else: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver.exe"), - chrome_options=settings.chrome_options) - super(ReadOnlyTestConcept, self).setUp() - - self.WEBAPP_HOST = self.live_server_url.replace( - 'localhost', '127.0.0.1') - if settings.REMOTE_TEST: - self.WEBAPP_HOST = settings.WEBAPP_HOST - '''data''' - super_user = User.objects.create_superuser(username=su_user, - password=su_password, - email=None) - normal_user = User.objects.create_user(username=nm_user, - password=nm_password, - email=None) - owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - group_user = User.objects.create_user(username=gp_user, - password=gp_password, - email=None) - view_group_user = User.objects.create_user(username=vgp_user, - password=vgp_password, - email=None) - edit_group_user = User.objects.create_user(username=egp_user, - password=egp_password, - email=None) - - # Groups: a group that is not permitted and one that is. - permitted_group = Group.objects.create(name="permitted_group") - forbidden_group = Group.objects.create(name="forbidden_group") - view_group = Group.objects.create(name="view_group") - edit_group = Group.objects.create(name="edit_group") - # Add the group to the group-user's groups. - group_user.groups.add(permitted_group) - view_group_user.groups.add(view_group) - edit_group_user.groups.add(edit_group) - - coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - coding_system.save() - - self.concept_everybody_can_edit = Concept.objects.create( - name="concept_everybody_can_edit", - description="concept_everybody_can_edit", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.EDIT) - - update_friendly_id() - - - def tearDown(self): - self.browser.quit() - super(ReadOnlyTestConcept, self).tearDown() - - def login(self, username, password): - self.logout() - self.browser.find_element(By.NAME, 'username').send_keys(username) - self.browser.find_element(By.NAME, 'password').send_keys(password) - self.browser.find_element(By.NAME, 'password').send_keys(Keys.ENTER) - - def logout(self): - self.browser.get( - '%s%s' % - (self.WEBAPP_HOST, '/account/logout/?next=/account/login/')) - - def wait_to_be_logged_in(self, username): - wait = WebDriverWait(self.browser, 10) - element = wait.until( - EC.text_to_be_present_in_element( - (By.CSS_SELECTOR, 'p.navbar-text'), username)) - - ''' - A user cannot revert a concept. - ''' - - def test_normal_user_cannot_revert(self): - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/version/', - # self.concept_everybody_can_edit.history.first().history_id, '/detail/')) - - browser.get(self.WEBAPP_HOST + reverse( - 'concept_history_detail', - kwargs={ - 'pk': - self.concept_everybody_can_edit.id, - 'concept_history_id': - self.concept_everybody_can_edit.history.first().history_id - })) - - time.sleep(settings.TEST_SLEEP_TIME) - # self.wait_to_be_logged_in(nm_user) - - exist = True - try: - button = self.browser.find_element(By.ID, 'revert-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_normal_user_cannot_revert_through_url(self): - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/revert/')) - - time.sleep(settings.TEST_SLEEP_TIME) - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_owner_cannot_revert(self): - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - exist = True - try: - button = self.browser.find_element(By.ID, 'revert-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_owner_cannot_revert_through_url(self): - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/revert/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - ''' - A user cannot fork a concept. - ''' - - def test_normal_user_cannot_fork_in_detail(self): - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - exist = True - try: - button = self.browser.find_element(By.ID, 'fork-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_normal_user_cannot_fork_through_url(self): - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/fork/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_normal_user_cannot_fork_in_history(self): - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - exist = True - try: - button = self.browser.find_element(By.ID, 'fork-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_normal_user_cannot_fork_through_history_url(self): - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/fork/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_owner_cannot_fork_in_detail(self): - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - exist = True - try: - button = self.browser.find_element(By.ID, 'fork-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_owner_cannot_fork_through_url(self): - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/fork/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_owner_cannot_fork_in_history(self): - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - exist = True - try: - button = self.browser.find_element(By.ID, 'fork-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_owner_cannot_fork_through_history_url(self): - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/fork/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - ''' - A super user CANNOT create, edit, revert, or fork a working set. - ''' - - def test_super_user_cannot_create(self): - self.login(su_user, su_password) - browser = self.browser - # get the test server url - browser.get('%s%s' % (self.WEBAPP_HOST, '/concepts/create/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_super_user_cannot_edit(self): - self.login(su_user, su_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/update/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_super_user_cannot_revert(self): - self.login(su_user, su_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - exist = True - try: - button = self.browser.find_element(By.ID, 'revert-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_super_user_cannot_revert_through_url(self): - self.login(su_user, su_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/revert/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_super_user_cannot_fork_in_detail(self): - self.login(su_user, su_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - # self.wait_to_be_logged_in(su_user) - - exist = True - try: - button = self.browser.find_element(By.ID, 'fork-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_super_user_cannot_fork_through_url(self): - self.login(su_user, su_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/fork/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_super_user_cannot_fork_in_hisotry(self): - self.login(su_user, su_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - exist = True - try: - button = self.browser.find_element(By.ID, 'fork-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_super_user_cannot_fork_through_history_url(self): - self.login(su_user, su_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.first().history_id, - '/revert/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - ''' - A user cannot edit by creating their own URL string to bypass the interface. - ''' - - def test_normal_user_cannot_edit_by_own_url(self): - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/update/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_owner_cannot_edit_by_own_url(self): - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/update/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/read_only/test_functional_read_only_conf_workingset.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/read_only/test_functional_read_only_conf_workingset.py deleted file mode 100644 index 3d1dbe2a3..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/read_only/test_functional_read_only_conf_workingset.py +++ /dev/null @@ -1,304 +0,0 @@ -import sys -import time -from datetime import datetime -from os.path import dirname -from unittest import skip, skipIf - -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -# from django.conf import settings -# from cll import read_only_test_settings -# from cll import test_settings as settings -from cll import read_only_test_settings as settings -from decouple import Config, RepositoryEnv -from django.contrib.auth import logout -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from django.test import override_settings -from selenium import webdriver -from selenium.common.exceptions import NoSuchElementException -from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.support.ui import WebDriverWait - -''' - If arguments does not contain read_only substring then skip the test - because it means that read only settings are not used and tests will fail. - See manage.py to see how it works. -''' - - -@skipIf('read_only' not in sys.argv[-1], "READ ONLY TEST SKIPPED") -class ReadOnlyTestWorkingSet(StaticLiveServerTestCase): - - def setUp(self): - - location = dirname(dirname(__file__)) - if settings.REMOTE_TEST: - self.browser = webdriver.Remote( - command_executor=settings.REMOTE_TEST_HOST, - desired_capabilities=settings.chrome_options.to_capabilities()) - else: - if settings.IS_LINUX: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver"), - chrome_options=settings.chrome_options) - else: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver.exe"), - chrome_options=settings.chrome_options) - super(ReadOnlyTestWorkingSet, self).setUp() - - self.WEBAPP_HOST = self.live_server_url.replace( - 'localhost', '127.0.0.1') - if settings.REMOTE_TEST: - self.WEBAPP_HOST = settings.WEBAPP_HOST - - # Users: a normal user and a super_user. - super_user = User.objects.create_superuser(username=su_user, - password=su_password, - email=None) - normal_user = User.objects.create_user(username=nm_user, - password=nm_password, - email=None) - owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - group_user = User.objects.create_user(username=gp_user, - password=gp_password, - email=None) - view_group_user = User.objects.create_user(username=vgp_user, - password=vgp_password, - email=None) - edit_group_user = User.objects.create_user(username=egp_user, - password=egp_password, - email=None) - - # Groups: a group that is not permitted and one that is. - permitted_group = Group.objects.create(name="permitted_group") - forbidden_group = Group.objects.create(name="forbidden_group") - view_group = Group.objects.create(name="view_group") - edit_group = Group.objects.create(name="edit_group") - # Add the group to the group-user's groups. - group_user.groups.add(permitted_group) - view_group_user.groups.add(view_group) - edit_group_user.groups.add(edit_group) - - self.workingset_everybody_can_edit = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[], - created_by=super_user, - updated_by=super_user, - owner=owner_user, - group=permitted_group, - group_access=Permissions.EDIT, - owner_access=Permissions.NONE, - world_access=Permissions.EDIT) - - update_friendly_id() - - def tearDown(self): - self.browser.quit() - super(ReadOnlyTestWorkingSet, self).tearDown() - - def login(self, username, password): - self.logout() - self.browser.find_element(By.NAME, 'username').send_keys(username) - self.browser.find_element(By.NAME, 'password').send_keys(password) - self.browser.find_element(By.NAME, 'password').send_keys(Keys.ENTER) - - def logout(self): - self.browser.get( - '%s%s' % - (self.WEBAPP_HOST, '/account/logout/?next=/account/login/')) - - def wait_to_be_logged_in(self, username): - wait = WebDriverWait(self.browser, 10) - element = wait.until( - EC.text_to_be_present_in_element( - (By.CSS_SELECTOR, 'p.navbar-text'), username)) - - ''' - A user cannot revert a working set. - ''' - - def test_normal_user_cannot_revert(self): - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/version/', - self.workingset_everybody_can_edit.history.first().history_id, - '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - exist = True - try: - button = self.browser.find_element(By.ID, 'revert-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_normal_user_cannot_revert_through_url(self): - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/version/', - self.workingset_everybody_can_edit.history.first().history_id, - '/revert/')) - - time.sleep(settings.TEST_SLEEP_TIME) - # self.wait_to_be_logged_in(nm_user) - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_owner_cannot_revert(self): - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/version/', - self.workingset_everybody_can_edit.history.first().history_id, - '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - exist = True - try: - button = self.browser.find_element(By.ID, 'revert-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_owner_cannot_revert_through_url(self): - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/version/', - self.workingset_everybody_can_edit.history.first().history_id, - '/revert/')) - time.sleep(settings.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - ''' - A super user CANNOT create, edit, revert a working set. - ''' - - def test_super_user_cannot_create(self): - browser = self.browser - # get the test server url - browser.get('%s%s' % (self.WEBAPP_HOST, '/workingsets/create/')) - - self.login(su_user, su_password) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_super_user_cannot_edit(self): - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/update/')) - - self.login(su_user, su_password) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_super_user_cannot_revert(self): - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/version/', - self.workingset_everybody_can_edit.history.first().history_id, - '/detail/')) - - self.login(su_user, su_password) - - exist = True - try: - button = self.browser.find_element(By.ID, 'revert-btn') - is_disabled = button.get_attribute("disabled") - self.assertTrue(is_disabled) - - return True - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_super_user_cannot_revert_through_url(self): - browser = self.browser - # get the test server url - browser.get( - '%s%s%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/version/', - self.workingset_everybody_can_edit.history.first().history_id, - '/revert/')) - - self.login(su_user, su_password) - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - ''' - A user cannot edit by creating their own URL string to bypass the interface. - ''' - - def test_normal_user_cannot_edit_by_own_url(self): - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/update/')) - - self.login(nm_user, nm_password) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_owner_cannot_edit_by_own_url(self): - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/update/')) - - self.login(ow_user, ow_password) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_functional_other.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_functional_other.py deleted file mode 100644 index a828cf3be..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_functional_other.py +++ /dev/null @@ -1,1262 +0,0 @@ -import random -import time -from datetime import datetime - -from clinicalcode.models import Tag, Brand -from clinicalcode.models.Code import Code -from clinicalcode.models.CodeList import CodeList -from clinicalcode.models.Component import Component -from clinicalcode.models.Concept import * -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -from clinicalcode.views.Concept import concept_codes_to_csv -from clinicalcode.views.WorkingSet import workingset_to_csv -from cll import test_settings as settings_cll -from decouple import Config, RepositoryEnv -from django.conf import settings as setting_django -from django.contrib.auth import logout -from django.contrib.auth.models import AnonymousUser -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from django.test import (Client, LiveServerTestCase, RequestFactory, - override_settings) -from rest_framework.reverse import reverse -from selenium import webdriver -from selenium.common.exceptions import NoSuchElementException -from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.support.ui import WebDriverWait - -# from django.conf import settings -# from cll import settings as settings_cll -# from cll import test_settings as settings - - -class OtherTest(StaticLiveServerTestCase): - - def setUp(self): - # chrome_options = webdriver.ChromeOptions() - - # chrome_options.add_experimental_option( "prefs",{'profile.managed_default_content_settings.javascript': 'enable'}) - # chrome_options.add_argument('--headless') - # chrome_options.add_argument("--no-sandbox") - # chrome_options.add_argument("--disable-dev-shm-usage") - # - # chrome_options.add_argument("--start-maximized") - # chrome_options.add_argument("--disable-gpu") - # #chrome_options.add_argument("--window-size=1280,800") - # chrome_options.add_argument("--allow-insecure-localhost") - - self.factory = RequestFactory() - - location = os.path.dirname(__file__) - if settings_cll.REMOTE_TEST: - self.browser = webdriver.Remote( - command_executor=settings_cll.REMOTE_TEST_HOST, - desired_capabilities=settings_cll.chrome_options. - to_capabilities()) - else: - if settings_cll.IS_LINUX: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver"), - chrome_options=settings_cll.chrome_options) - else: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver.exe"), - chrome_options=settings_cll.chrome_options) - super(OtherTest, self).setUp() - - self.WEBAPP_HOST = self.live_server_url.replace( - 'localhost', '127.0.0.1') - if settings_cll.REMOTE_TEST: - self.WEBAPP_HOST = self.WEBAPP_HOST - - # Users: a normal user and a super_user. - self.normal_user = User.objects.create_user(username=nm_user, - password=nm_password, - email=None) - super_user = User.objects.create_superuser(username=su_user, - password=su_password, - email=None) - self.owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - group_user = User.objects.create_user(username=gp_user, - password=gp_password, - email=None) - - permitted_group = Group.objects.create(name="permitted_group") - # Add the group to the group-user's groups. - group_user.groups.add(permitted_group) - - - coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - coding_system.save() - - self.brand = self.create_brand("HDRUK", "cll/static/img/brands/HDRUK") - - self.nameTagsOrCollections = [ - "Phenotype_library", "Adolescent Data Platform (ADP)", "BREATHE", "CALIBER", "PIONEER", - "SAIL","ClinicalCodes Repository", "COVID-19","DATAMIND","BHF Data Science Centre", - "feasibility-check","TECC" - ] - - self.tags = [self.creat_tag(i,self.brand) for i in self.nameTagsOrCollections[:6]] - self.collections = [self.creat_collection(j,self.brand) for j in self.nameTagsOrCollections[6:]] - - self.concept_everybody_can_view = Concept.objects.create( - name="concept everybody can view", - description="concept description", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - tags=[1], - code_attribute_header=[], - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.VIEW) - self.concept_everybody_can_view.save() - - self.concept_everybody_can_edit = Concept.objects.create( - name="concept everybody can edit", - description="concept description", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - tags=[1], - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.EDIT) - - self.concept_none_can_access = Concept.objects.create( - name="concept everybody can edit", - description="concept description", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - tags=[1], - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.EDIT, - owner_access=Permissions.NONE, - world_access=Permissions.NONE) - - self.child_concept = Concept.objects.create( - name="child concept", - description="child concept", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=self.owner_user, - tags=[1], - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.VIEW) - - self.concept_with_excluded_codes = Concept.objects.create( - name="child concept", - description="child concept", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - tags=[1], - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.EDIT) - - component = Component.objects.create( - comment="child concept", - component_type=1, - concept=self.concept_everybody_can_view, - concept_ref=self.child_concept, - concept_ref_history_id=self.child_concept.history.first( - ).history_id, - created_by=self.owner_user, - logical_type=1, - name="child concept") - - code_child = CodeList.objects.create(component=component, - description="child") - self.code_child = Code.objects.create(code_list=code_child, - code="45512354", - description="child test") - - component_excluded = Component.objects.create( - comment="Component 2 exclusion", - component_type=2, - concept=self.concept_with_excluded_codes, - created_by=self.owner_user, - logical_type=2, - name="Component 2 exclusion") - - code_list = CodeList.objects.create(component=component_excluded, - description="Code list exclusion") - self.code_excluded1 = Code.objects.create(code_list=code_list, - code="45554", - description="Exclusion Test") - self.code_excluded2 = Code.objects.create(code_list=code_list, - code="24212", - description="Exclusion test") - - self.concept_with_excluded_and_included_codes = Concept.objects.create( - name="child concept", - description="child concept", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - tags=[1], - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.VIEW) - - component_included = Component.objects.create( - comment="Component 2 exclusion", - component_type=2, - concept=self.concept_with_excluded_and_included_codes, - created_by=self.owner_user, - logical_type=1, - name="Component 2 exclusion") - - component_excluded2 = Component.objects.create( - comment="Component 2 exclusion", - component_type=2, - concept=self.concept_with_excluded_and_included_codes, - created_by=self.owner_user, - logical_type=2, - name="Component 2 exclusion") - - code_list_excluded = CodeList.objects.create( - component=component_excluded2, description="Code list exclusion") - code_list_included = CodeList.objects.create( - component=component_included, description="Code list inclusion") - - # These are the same two instances of the same code to make it included and excluded - self.code_excluded3 = Code.objects.create( - code_list=code_list_excluded, - code="1111", - description="Inclusion/Exclusion test") - self.code_included = Code.objects.create( - code_list=code_list_included, - code="1111", - description="Inclusion/Exclusion Test") - - self.workingset_everybody_can_view = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{"3":{"ttt|3":"yyy"}}], - concept_version={"3": 1}, - created_by=super_user, - updated_by=super_user, - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.VIEW, - owner_access=Permissions.VIEW, - world_access=Permissions.VIEW) - - self.workingset_everybody_can_edit = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{str(self.concept_everybody_can_view.id):{"ttt|3":"yyy"}}, - {str(self.concept_everybody_can_edit.id):{"ttt|3":"yyy"}}], - concept_version={ - (str(self.concept_everybody_can_view.id)): - self.concept_everybody_can_view.history.first().history_id, - (str(self.concept_everybody_can_edit.id)): - self.concept_everybody_can_edit.history.first().history_id - }, - created_by=super_user, - updated_by=super_user, - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.VIEW, - owner_access=Permissions.VIEW, - world_access=Permissions.EDIT) - - self.workingset_none_can_access = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{str(self.concept_everybody_can_view.id):{"ttt|3":"yyy"}}], - concept_version={ - (str(self.concept_everybody_can_view.id)): - self.concept_everybody_can_view.history.first().history_id - }, - created_by=super_user, - updated_by=super_user, - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.EDIT, - world_access=Permissions.NONE) - - concept_info_list = [{str(self.concept_with_excluded_codes.id):{"ttt|3":"yyy"}}] - - self.workingset_with_excluded_codes = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=concept_info_list, - concept_version={ - (str(self.concept_with_excluded_codes.id)): - self.concept_with_excluded_codes.history.first().history_id - }, - # "1" - created_by=super_user, - updated_by=super_user, - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.EDIT, - world_access=Permissions.NONE) - - concept_info_list2 = [{str(self.concept_with_excluded_and_included_codes.id):{"ttt|3":"yyy"}}] - - self.workingset_with_excluded_and_included_codes = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=concept_info_list2, - concept_version={ - (str(self.concept_with_excluded_and_included_codes.id)): - self.concept_with_excluded_and_included_codes.history.first(). - history_id - }, - # "1" - created_by=super_user, - updated_by=super_user, - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.EDIT, - world_access=Permissions.NONE) - - update_friendly_id() - save_stat(self.WEBAPP_HOST) - - def creat_tag(self, nametag, brand): - tag = Tag.objects.create(collection_brand=brand, - description=nametag, - created_by=self.owner_user, - tag_type=1, - display=random.randint(1, 6)).save() - return tag - - def creat_collection(self, nametag, brand): - collection = Tag.objects.create(collection_brand=brand, - description=nametag, - created_by=self.owner_user, - tag_type=2, - display=random.randint(1, 6)).save() - return collection - - def create_brand(self, nameBrand, pathBrand): - brand = Brand.objects.create(name=nameBrand, - description='', - logo_path=pathBrand, - css_path=pathBrand, - owner=self.owner_user).save() - return brand - - def tearDown(self): - # self.browser.refresh() - self.browser.quit() - super(OtherTest, self).tearDown() - - def login(self, username, password): - self.logout() - self.browser.find_element(By.NAME, 'username').send_keys(username) - self.browser.find_element(By.NAME, 'password').send_keys(password) - self.browser.find_element(By.NAME, 'password').send_keys(Keys.ENTER) - - def logout(self): - # self.browser.get('%s%s' % (self.WEBAPP_HOST, '/account/logout/?next=/account/login/')) - self.browser.get( - '%s%s' % (self.live_server_url.replace('localhost', '127.0.0.1'), - '/account/logout/?next=/account/login/')) - - def wait_to_be_logged_in(self, username): - wait = WebDriverWait(self.browser, 10) - element = wait.until( - EC.text_to_be_present_in_element( - (By.CSS_SELECTOR, 'p.navbar-text'), username)) - - ''' - If one or more of workingset concepts is deleted or revoked permission - I do not have permission to view, cannot export csv and run api - ''' - - def test_revoking_permission(self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/update/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_update', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - browser.find_element( - By.XPATH, - ".//input[@type='radio' and @name='world_access' and @value='1']" - ).click() # Change world access permission to none - browser.find_element(By.ID, "save-changes").click() # save - - self.logout() - # ---------------------- - self.login(nm_user, nm_password) # logging as normal user - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - # self.workingset_everybody_can_edit.id, '/detail/')) - - browser.get( - self.WEBAPP_HOST + - reverse('workingset_detail', - kwargs={'pk': self.workingset_everybody_can_edit.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - export_button = self.browser.find_element(By.ID, 'export-btn') - is_disabled = export_button.get_attribute("disabled") - self.assertTrue(is_disabled) - - # Try to export to csv bu URL - # Todo needs to be confirmed which url should be used for reverse - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.concept_everybody_can_view.id, '/export/concepts/')) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_workingset_codes/', - # self.workingset_everybody_can_edit.id)) - - browser.get( - self.WEBAPP_HOST + - reverse('api:api_export_workingset_codes', - kwargs={'pk': self.workingset_everybody_can_edit.id})) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("You do not have permission to perform this action." - or "Permission denied" in browser.page_source) - - def test_deleting_concept(self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/delete/')) - browser.get(self.WEBAPP_HOST + - reverse('concept_delete', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - submit_button = browser.find_element( - By.XPATH, "//button[@type='submit']").click() - - is_deleted = Concept.objects.get( - pk=self.concept_everybody_can_edit.id).is_deleted - # print(self.concept_everybody_can_edit.id) - self.assertTrue( - is_deleted, - "concept is not deleted!") # make sure that concept is deleted - - self.logout() - # -------------------- - self.login(nm_user, nm_password) # logging as normal user - - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - # self.workingset_everybody_can_edit.id, '/detail/')) - # - browser.get(self.WEBAPP_HOST + - reverse('workingset_detail', - kwargs={ - 'pk': self.workingset_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - export_button = self.browser.find_element(By.ID, 'export-btn') - # print(str(export_button)) - is_disabled = export_button.get_attribute("disabled") - # print(is_disabled) - self.assertTrue(is_disabled) - - # Try to export to csv bu URL - # Todo needs to be confirmed which url should be used for reverse - browser.get('%s%s%s%s' % - (self.WEBAPP_HOST, '/workingsets/WS', - self.concept_everybody_can_view.id, '/export/concepts/')) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_workingset_codes/', - # self.workingset_everybody_can_edit.id)) - - browser.get( - self.WEBAPP_HOST + - reverse('api:api_export_workingset_codes', - kwargs={'pk': self.workingset_everybody_can_edit.id})) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("You do not have permission to perform this action." - or "Permission denied" in browser.page_source) - - ''' - Check if user has access to update, delete, API when - concept world access value is set to VIEW. test export button AND API - ''' - - def test_access_to_concept_update(self): - - self.login(nm_user, nm_password) - - browser = self.browser - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_view.id, '/update/')) - browser.get(self.WEBAPP_HOST + - reverse('concept_update', - kwargs={'pk': self.concept_everybody_can_view.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_access_to_concept_delete(self): - deleted_concept = self.concept_everybody_can_view - deleted_concept.is_deleted = True - deleted_concept.save() - - self.login(nm_user, nm_password) - - browser = self.browser - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # deleted_concept.id, '/delete/')) - - browser.get( - self.WEBAPP_HOST + - reverse('concept_delete', kwargs={'pk': deleted_concept.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - # print("bps="+browser.page_source) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - # self.logout() - - def test_access_to_concept_revert(self): - - self.login(nm_user, nm_password) - - browser = self.browser - # browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_view.id, '/version/', - # self.concept_everybody_can_view.history.first().history_id, '/revert/')) - browser.get(self.WEBAPP_HOST + reverse( - 'concept_history_revert', - kwargs={ - 'pk': - self.concept_everybody_can_view.id, - 'concept_history_id': - self.concept_everybody_can_view.history.first().history_id - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - # self.login(nm_user, nm_password) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_access_to_workingset_update(self): - - self.login(nm_user, nm_password) - - browser = self.browser - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - # self.concept_everybody_can_view.id, '/update/')) - browser.get(self.WEBAPP_HOST + - reverse('workingset_update', - kwargs={'pk': self.concept_everybody_can_view.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_access_to_workingset_delete(self): - - self.login(nm_user, nm_password) - browser = self.browser - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - # self.concept_everybody_can_view.id, '/delete/')) - browser.get(self.WEBAPP_HOST + - reverse('workingset_delete', - kwargs={'pk': self.concept_everybody_can_view.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_access_to_workingset_revert(self): - - self.login(nm_user, nm_password) - - browser = self.browser - # browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - # self.concept_everybody_can_view.id, '/version/', - # self.concept_everybody_can_view.history.first().history_id, '/revert/')) - - browser.get(self.WEBAPP_HOST + reverse( - 'workingset_history_revert', - kwargs={ - 'pk': - self.concept_everybody_can_view.id, - 'workingset_history_id': - self.concept_everybody_can_view.history.first().history_id - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - # print(browser.page_source ) - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source) - - def test_concept_api(self): - self.login(nm_user, nm_password) - - browser = self.browser - - browser.get('%s' % (self.WEBAPP_HOST)) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_concept_codes/', - # self.concept_none_can_access.id)) - - browser.get(self.WEBAPP_HOST + - reverse('api:api_export_concept_codes', - kwargs={'pk': self.concept_none_can_access.id})) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("You do not have permission to perform this action." - or "Permission denied" in browser.page_source) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/concepts/C', - # self.concept_none_can_access.id)) - - browser.get(self.WEBAPP_HOST + - reverse('api:concept_by_id', - kwargs={ - 'pk': self.concept_none_can_access.id, - })) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("Not found." in browser.page_source) - - def test_workingset_api(self): - self.login(nm_user, nm_password) - - browser = self.browser - browser.get('%s' % (self.WEBAPP_HOST)) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_workingset_codes/', - # self.workingset_none_can_access.id)) - - browser.get(self.WEBAPP_HOST + - reverse('api:api_export_workingset_codes', - kwargs={'pk': self.workingset_none_can_access.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("You do not have permission to perform this action." - or "Permission denied" in browser.page_source) - - ''' - If one or more child concepts of a concept is deleted or - revoked permission I do not have permission to view - ''' - - def test_child_concept_revoked_permission(self): - self.login(nm_user, nm_password) - - browser = self.browser - - # check if normal user can see concept - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_view.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_detail', - kwargs={'pk': self.concept_everybody_can_view.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # user should be able to see concept - self.assertTrue("403: Permission denied" not in browser.page_source - and # or - "500: Page unavailable" not in browser.page_source) - - self.logout() - - # login as owner and change permission - self.login(ow_user, ow_password) - - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.child_concept.id, '/update/')) - - browser.get( - self.WEBAPP_HOST + - reverse('concept_update', kwargs={ - 'pk': self.child_concept.id, - })) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - browser.find_element( - By.XPATH, - ".//input[@type='radio' and @name='world_access' and @value='1']" - ).click() # Change world access permission to none - browser.find_element(By.ID, "save-changes").click() # save - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.get(self.WEBAPP_HOST + - reverse('concept_update', - kwargs={ - 'pk': self.concept_everybody_can_view.id, - })) - # Update the child concept - browser.find_element(By.XPATH, '//*[@title="Edit component"]').click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - # Time wait for changes for cicking apply button - browser.find_element(By.ID, "saveBtn2").click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - self.logout() - - # login again as normal user and check if permission denied appears for concept with child - self.login(nm_user, nm_password) - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_view.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_detail', - kwargs={'pk': self.concept_everybody_can_view.id})) - - export_button = self.browser.find_element(By.ID, 'export-btn') - is_disabled = export_button.get_attribute("disabled") - - self.assertTrue(is_disabled) - - # Try to export csv bu using URL - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_view.id, '/export/codes/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_codes_to_csv', - kwargs={'pk': self.concept_everybody_can_view.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source - or "Not found." in browser.page_source) - - def test_child_concept_deleted(self): - self.login(nm_user, nm_password) - - browser = self.browser - - # check if normal user can see concept - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_view.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_detail', - kwargs={'pk': self.concept_everybody_can_view.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # user should be able to see concept - self.assertTrue("403: Permission denied" not in browser.page_source - or "500: Page unavailable" not in browser.page_source) - - self.logout() - - # login as owner and delete concept - self.login(ow_user, ow_password) - - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.child_concept.id, '/delete/')) - browser.get( - self.WEBAPP_HOST + - reverse('concept_delete', kwargs={'pk': self.child_concept.id})) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - submit_button = browser.find_element( - By.XPATH, "//button[@type='submit']").click() - - browser.get(self.WEBAPP_HOST + - reverse('concept_update', - kwargs={ - 'pk': self.concept_everybody_can_view.id, - })) - - # Time wait for changes for cicking apply button to save current parent concept - browser.find_element(By.ID, "save-changes").click() # save - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - self.logout() - - # login again as normal user and check if permission denied appears for concept with child - self.login(nm_user, nm_password) - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_view.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_detail', - kwargs={'pk': self.concept_everybody_can_view.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - export_button = self.browser.find_element(By.ID, 'export-btn') - - is_disabled = export_button.get_attribute("disabled") - self.assertTrue(is_disabled) - - # Try to export csv bu using URL - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_view.id, '/export/codes/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_codes_to_csv', - kwargs={'pk': self.concept_everybody_can_view.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue("403: Permission denied" in browser.page_source - or "500: Page unavailable" in browser.page_source - or "Not found." in browser.page_source) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_concept_codes/', - # self.workingset_everybody_can_edit.id)) - - # self.assertTrue("Permission denied" in browser.page_source) - - ''' - BrowsableAPI - ''' - - def test_if_buttons_exist(self): - self.login(nm_user, nm_password) - - browser = self.browser - browser.get('%s' % (self.WEBAPP_HOST)) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - #browser.get('%s%s' % (self.WEBAPP_HOST, '/api/')) - browser.get('%s%s' % - (self.WEBAPP_HOST, reverse('api:root', kwargs={}))) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - exist = True - try: - browser.find_element(By.XPATH, '//button[text()="OPTIONS"]') - browser.find_element(By.XPATH, '//a[text()="GET"]') - except NoSuchElementException: - exist = False - - self.assertFalse(exist) - - def test_api_is_not_browsable(self): - - # self.assertTrue('rest_framework.renderers.BrowsableAPIRenderer' not in settings.REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES']) - test = True - if setting_django.BROWSABLEAPI == True: - test = False - - if 'DEFAULT_RENDERER_CLASSES' in setting_django.REST_FRAMEWORK: - if 'rest_framework.renderers.BrowsableAPIRenderer' in setting_django.REST_FRAMEWORK[ - 'DEFAULT_RENDERER_CLASSES']: - test = False - print(( - "FROM ELSE: ", - setting_django.REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES'])) - else: - test = False # browsable=fail - - self.assertTrue(test) - - ''' - Test inclusion and exclusion of codes in a concept. (export CSV and API) - ''' - - def test_concept_codes_exclusion(self): - # url = ('%s%s%s' % ('/concepts/C', - # self.concept_with_excluded_codes.id, '/export/codes')) - - url = self.WEBAPP_HOST + reverse( - 'concept_codes_to_csv', - kwargs={'pk': self.concept_with_excluded_codes.id}) - - request = self.factory.get(url) - request.user = self.normal_user - request.CURRENT_BRAND = '' - - # pass request to the view - response = concept_codes_to_csv(request, - self.concept_with_excluded_codes.id) - - print(("RESPONSE ", response.content.decode('utf-8'))) - - codes = response.content.decode( - 'utf-8') # list with response content which contains codes - test_code1 = self.code_excluded1.code - test_code2 = self.code_excluded2.code # - - test = True - if test_code1 in codes or test_code2 in codes: - test = False - - self.assertTrue(test) - - def test_concept_codes_exclusion_in_api(self): - self.login(nm_user, nm_password) - - browser = self.browser - - browser.get('%s' % (self.WEBAPP_HOST)) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_concept_codes/', - # self.concept_with_excluded_codes.id)) - - browser.get( - self.WEBAPP_HOST + - reverse('api:api_export_concept_codes', - kwargs={'pk': self.concept_with_excluded_codes.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - test_code1 = self.code_excluded1.code - test_code2 = self.code_excluded2.code - - # Make sure that codes do not appear in API - self.assertFalse(test_code1 in browser.page_source - or test_code2 in browser.page_source) - - def test_concept_codes_inclusion_and_exclusion(self): - # url = ('%s%s%s' % ('/concepts/C', - # self.concept_with_excluded_and_included_codes.id, '/export/codes')) - - url = self.WEBAPP_HOST + reverse( - 'concept_codes_to_csv', - kwargs={'pk': self.concept_with_excluded_and_included_codes.id}) - - request = self.factory.get(url) - request.user = self.normal_user - request.CURRENT_BRAND = '' - - # pass request to the view - response = concept_codes_to_csv( - request, self.concept_with_excluded_and_included_codes.id) - - codes = response.content.decode( - 'utf-8') # list with response content which contains codes - test_code1 = self.code_included.code - test_code2 = self.code_excluded3.code - - test = True - if test_code1 in codes or test_code2 in codes: - test = False - - self.assertTrue(test) - - def test_concept_codes_exclusion_and_inclusion_in_api(self): - self.login(nm_user, nm_password) - - browser = self.browser - - browser.get('%s' % (self.WEBAPP_HOST)) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_concept_codes/', - # self.concept_with_excluded_codes.id)) - - browser.get( - self.WEBAPP_HOST + - reverse('api:api_export_concept_codes', - kwargs={'pk': self.concept_with_excluded_codes.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - test_code1 = self.code_included.code - test_code2 = self.code_excluded3.code - - # Make sure that codes do not appear in API - self.assertFalse(test_code1 in browser.page_source - or test_code2 in browser.page_source) - - def test_workingset_exclusion_and_inclusion(self): - # url = ('%s%s%s' % ('/workingsets/WS', - # self.workingset_with_excluded_codes.id, '/export/concepts')) - - url = self.WEBAPP_HOST + reverse( - 'workingset_to_csv', - kwargs={'pk': self.workingset_with_excluded_codes.id}) - request = self.factory.get(url) - request.user = self.owner_user - request.CURRENT_BRAND = '' - - # pass request to the view - response = workingset_to_csv(request, - self.workingset_with_excluded_codes.id) - - codes = response.content.decode( - 'utf-8') # list with response content which contains codes - test_code1 = self.code_excluded1.code - test_code2 = self.code_excluded2.code - - test = True - if test_code1 in codes or test_code2 in codes: - test = False - - self.assertTrue(test) - - def test_workingset_exclusion(self): - # url = ('%s%s%s' % ('/workingsets/WS', - # self.workingset_with_excluded_and_included_codes.id, '/export/concepts')) - - url = self.WEBAPP_HOST + reverse( - 'workingset_to_csv', - kwargs={'pk': self.workingset_with_excluded_and_included_codes.id}) - request = self.factory.get(url) - request.user = self.owner_user - request.CURRENT_BRAND = '' - - # pass request to the view - response = workingset_to_csv( - request, self.workingset_with_excluded_and_included_codes.id) - - codes = response.content.decode( - 'utf-8') # list with response content which contains codes - test_code1 = self.code_included.code - test_code2 = self.code_excluded3.code - - test = True - if test_code1 in codes or test_code2 in codes: - test = False - - self.assertTrue(test) - - def test_export_workingset_codes_exclusion_and_inclusion_in_api(self): - self.login(ow_user, ow_password) - - browser = self.browser - - browser.get('%s' % (self.WEBAPP_HOST)) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_workingset_codes/', - # self.workingset_with_excluded_and_included_codes.id)) - - browser.get(self.WEBAPP_HOST + reverse( - 'api:api_export_workingset_codes', - kwargs={'pk': self.workingset_with_excluded_and_included_codes.id}) - ) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - test_code1 = self.code_included.code - test_code2 = self.code_excluded3.code - - # Make sure that codes do not appear in API - self.assertFalse(test_code1 in browser.page_source - or test_code2 in browser.page_source) - - def test_export_workingset_codes_exclusion_in_api(self): - self.login(ow_user, ow_password) - - browser = self.browser - - browser.get('%s' % (self.WEBAPP_HOST)) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_workingset_codes/', - # self.workingset_with_excluded_codes.id)) - - browser.get( - self.WEBAPP_HOST + - reverse('api:api_export_workingset_codes', - kwargs={'pk': self.workingset_with_excluded_codes.id})) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - test_code1 = self.code_excluded1.code - test_code2 = self.code_excluded2.code - - # Make sure that codes do not appear in API - self.assertFalse(test_code1 in browser.page_source - or test_code2 in browser.page_source) - - ''' - Export to CSV permission test - ''' - - def test_concept_to_csv_permission(self): - # url = ('%s%s%s' % ('/concepts/C', - # self.concept_none_can_access.id, '/export/codes')) - - url = self.WEBAPP_HOST + reverse( - 'concept_codes_to_csv', - kwargs={'pk': self.concept_none_can_access.id}) - - request = self.factory.get(url) - request.user = self.normal_user - request.CURRENT_BRAND = '' - - test = False - try: - response = concept_codes_to_csv(request, - self.concept_none_can_access.id) - except PermissionDenied as error: - test = True - - self.assertTrue(test) - - def test_workingset_to_csv_permission(self): - # url = ('%s%s%s' % ('/workingsets/WS', - # self.workingset_none_can_access.id, '/export/codes')) - - url = self.WEBAPP_HOST + reverse( - 'workingset_to_csv', - kwargs={'pk': self.workingset_none_can_access.id}) - - request = self.factory.get(url) - request.user = self.normal_user - request.CURRENT_BRAND = '' - - test = False - try: - response = workingset_to_csv(request, - self.workingset_none_can_access.id) - except PermissionDenied as error: - test = True - - self.assertTrue(test) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_hierarchical_code_lists.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_hierarchical_code_lists.py deleted file mode 100644 index 7f32bacf2..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_hierarchical_code_lists.py +++ /dev/null @@ -1,832 +0,0 @@ -import time -import unittest -from datetime import datetime -from urllib.parse import urlparse - -from clinicalcode.models.Code import Code -from clinicalcode.models.CodeList import CodeList -from clinicalcode.models.Component import Component -from clinicalcode.models.Concept import * -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -# from django.conf import settings -# from cll import settings as settings_cll -# from cll import test_settings as settings -from cll import test_settings as settings_cll -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from rest_framework.reverse import reverse -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.support.ui import WebDriverWait - - -class HierarchicalCodeListsTest(StaticLiveServerTestCase): - - def setUp(self): - - location = os.path.dirname(__file__) - if settings_cll.REMOTE_TEST: - self.browser = webdriver.Remote( - command_executor=settings_cll.REMOTE_TEST_HOST, - desired_capabilities=settings_cll.chrome_options. - to_capabilities()) - self.browser.implicitly_wait(settings_cll.IMPLICTLY_WAIT) - else: - if settings_cll.IS_LINUX: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver"), - chrome_options=settings_cll.chrome_options) - else: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver.exe"), - chrome_options=settings_cll.chrome_options) - super(HierarchicalCodeListsTest, self).setUp() - - self.WEBAPP_HOST = self.live_server_url.replace( - 'localhost', '127.0.0.1') - if settings_cll.REMOTE_TEST: - self.WEBAPP_HOST = settings_cll.WEBAPP_HOST - '''data''' - self.super_user = User.objects.create_superuser(username=su_user, - password=su_password, - email=None) - self.normal_user = User.objects.create_user(username=nm_user, - password=nm_password, - email=None) - self.owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - self.group_user = User.objects.create_user(username=gp_user, - password=gp_password, - email=None) - - permitted_group = Group.objects.create(name="permitted_group") - self.group_user.groups.add(permitted_group) - - self.coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - self.coding_system.save() - - self.concept_everybody_can_edit = self.add_concept( - self, - name="concept everybody can edit", - world_access=Permissions.EDIT) - - concept_info_list = [{str(self.concept_everybody_can_edit.id):{"ttt|4":"yyy"}}] - - self.workingset_everybody_can_edit = WorkingSet.objects.create( - name="wokringset everybody can access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - created_by=self.super_user, - updated_by=self.super_user, - owner=self.owner_user, - concept_informations=concept_info_list, - concept_version={ - (str(self.concept_everybody_can_edit.id)): - str(self.concept_everybody_can_edit.history.first().history_id) - }, - group=permitted_group, - group_access=Permissions.VIEW, - owner_access=Permissions.VIEW, - world_access=Permissions.EDIT) - - self.child_concept_to_be_added = self.add_concept( - self, - name="child concept to be added", - world_access=Permissions.VIEW) - - self.child_concept = self.add_concept( - self, - name="child concept to be updated", - world_access=Permissions.VIEW) - self.child_component = self.add_child_component( - self, - name="child to be updated", - parent=self.concept_everybody_can_edit, - concept_ref=self.child_concept, - concept_ref_history_id=self.child_concept.history.first( - ).history_id) - - self.concept_only_owner_can_access = self.add_concept( - self, - name="concept only owner can access", - world_access=Permissions.NONE) - - # For the last test - self.child_concept2 = self.add_concept(self, - name="child concept 2", - world_access=Permissions.VIEW) - self.child_component2 = self.add_child_component( - self, - name="child 2", - parent=self.child_concept, - concept_ref=self.child_concept2, - concept_ref_history_id=self.child_concept2.history.first( - ).history_id) - - self.child_concept3 = self.add_concept(self, - name="child concept 3", - world_access=Permissions.VIEW) - self.child_component3 = self.add_child_component( - self, - name="child 3", - parent=self.child_concept2, - concept_ref=self.child_concept3, - concept_ref_history_id=self.child_concept3.history.first( - ).history_id) - - update_friendly_id() - save_stat(self.WEBAPP_HOST) - - @staticmethod - def add_concept(self, name, world_access): - concept = Concept.objects.create( - name=name, - description="child concept", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=self.super_user, - modified_by=self.super_user, - coding_system=self.coding_system, - is_deleted=False, - owner=self.owner_user, - # group=self.permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.EDIT, - world_access=world_access) - concept.save() - - return concept - - @staticmethod - def add_child_component(self, name, parent, concept_ref, - concept_ref_history_id): - child = Component.objects.create( - comment="child concept", - component_type=1, - concept=parent, - concept_ref=concept_ref, - concept_ref_history_id=concept_ref_history_id, - created_by=self.owner_user, - logical_type=1, - name=name) - - code_list = CodeList.objects.create( - component=child, description="code_list_description") - - code_list.save() - - # insert some codes as a proper data structure - Code.objects.create(code_list=code_list, - code="c2", - description="Test 2") - Code.objects.create(code_list=code_list, - code="c3", - description="Test 3") - - child.save() - - return child - - def tearDown(self): - # self.browser.refresh() - # time.sleep(settings.TEST_SLEEP_TIME) - - self.browser.quit() - super(HierarchicalCodeListsTest, self).tearDown() - - def login(self, username, password): - self.logout() - self.browser.find_element(By.NAME, 'username').send_keys(username) - self.browser.find_element(By.NAME, 'password').send_keys(password) - self.browser.find_element(By.NAME, 'password').send_keys(Keys.ENTER) - - def logout(self): - self.browser.get( - '%s%s' % - (self.WEBAPP_HOST, '/account/logout/?next=/account/login/')) - - def wait_to_be_logged_in(self, username): - wait = WebDriverWait(self.browser, 10) - element = wait.until( - EC.text_to_be_present_in_element( - (By.CSS_SELECTOR, 'p.navbar-text'), username)) - - ''' - When a child concept is added to a concept or working set, the latest version is always added. - Functions checks both concept and workingset. - ''' - - def test_latest_version_added_after_adding_child_to_concept(self): - # get latest version - concept_latest_version = self.concept_everybody_can_edit.history.first( - ).history_id - print(("0 concept_latest_version=" + str(concept_latest_version))) - workingset_latest_version = self.workingset_everybody_can_edit.history.first( - ).history_id - print( - ("0 workingset_latest_version=" + str(workingset_latest_version))) - - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/update/')) - browser.get(self.WEBAPP_HOST + - reverse('concept_update', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - wait = WebDriverWait(self.browser, 10) - wait.until(EC.presence_of_element_located((By.ID, "conceptTypes"))) - # add child - btn = browser.find_element(By.ID, 'conceptTypes') - btn.click() - - time.sleep(2) # wait for popup - btn.send_keys(Keys.DOWN) - time.sleep(2) - browser.find_element(By.ID, 'addConcept').click() - - wait.until( - EC.presence_of_element_located((By.ID, "concept-search-text"))) - - # time.sleep(2) - concept_search_field = browser.find_element(By.ID, - "concept-search-text") - - time.sleep(2) # wait to load component form - - concept_search_field.send_keys("child concept to be added") - - time.sleep(5) # wait to load concept prompt - - # click on a prompt to fill the field - concept_search_field.send_keys(Keys.DOWN) - concept_search_field.send_keys(Keys.ENTER) - - time.sleep(10) - # #component_name = browser.find_element(By.ID,"id_name") - # #component_name = browser.find_element(By.NAME,"name") - # #component_name.send_keys('comp name') - - browser.find_element(By.ID, "saveBtn").click() - - time.sleep(5) # wait to submition be completed - - # wait = WebDriverWait(self.browser, 10) - # wait.until(EC.presence_of_element_located( - # (By.CLASS_NAME, "alert-success"))) - - browser.find_element(By.ID, "save-changes").click() # save changes - - concept_latest_version_after_adding_child = self.concept_everybody_can_edit.history.first( - ).history_id - workingset_latest_version_after_adding_child = self.workingset_everybody_can_edit.history.first( - ).history_id - # print("1 concept_latest_version_after_adding_child=" + str(concept_latest_version_after_adding_child)) - # print("1 workingset_latest_version_after_adding_child=" + str(workingset_latest_version_after_adding_child)) - - self.assertNotEqual(concept_latest_version, - concept_latest_version_after_adding_child) - # propagation sync is stopped - - # # Michal: no idea why is not working... in live it is working... - # self.assertNotEquals(workingset_latest_version, - # workingset_latest_version_after_adding_child) - ''' - When a child concept is updated, any concept or working set that contains it automatically generates a new version. - The update happens recursively. - ''' - ''' - def test_latest_version_added_after_updating_child(self): - # propagation sync is stopped - # test is ignored - pass - return - - # get latest version - concept_latest_version = self.concept_everybody_can_edit.history.first().history_id - workingset_latest_version = self.workingset_everybody_can_edit.history.first().history_id - - self.login(ow_user, ow_password) - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - self.child_concept.id, '/update/')) - - - time.sleep(settings.TEST_SLEEP_TIME) - - # update child - browser.find_element(By.ID,"save-changes").click() - - wait = WebDriverWait(self.browser, 10) - wait.until(EC.presence_of_element_located( - (By.CLASS_NAME, "alert-success"))) - - concept_latest_version_after_adding_child = self.concept_everybody_can_edit.history.first().history_id - workingset_latest_version_after_adding_child = self.workingset_everybody_can_edit.history.first().history_id - - self.assertNotEquals(concept_latest_version, - concept_latest_version_after_adding_child) - self.assertNotEquals(workingset_latest_version, - workingset_latest_version_after_adding_child) - ''' - ''' - The version history shows this update as "Concept changed, automatic update" or something, - and the user field makes it clear that this was a system update, not a user update. - ''' - ''' - def test_version_history_shows_update(self): - # propagation sync is stopped - # cso this test is ignored - pass - return - ####################### - ####################### - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - self.child_concept.id, '/update/')) - - - time.sleep(settings.TEST_SLEEP_TIME) - - WebDriverWait(browser, 10).until( - EC.presence_of_element_located((By.ID, "save-changes")) - ) - # update child - browser.find_element(By.ID,"save-changes").click() - - - - browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - concept_history_change_reason = self.concept_everybody_can_edit.history.first( - ).history_change_reason - - # check if change reason appears in the page - self.assertTrue(concept_history_change_reason in browser.page_source) - - # repeat the same for workingset - browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/detail/')) - time.sleep(settings.TEST_SLEEP_TIME) - - workingset_history_change_reason = self.workingset_everybody_can_edit.history.first( - ).history_change_reason - - self.assertTrue( - workingset_history_change_reason in browser.page_source) - - ''' - ''' - When a user clicks "revert" or "fork" on a historical version of a concept or working set that has a child, - there is a warning message "the new version will refer to the latest version of child concepts. Continue? Yes/no" - ''' - '''def test_concept_warning_message_when_revert(self): - browser = self.browser - # get the test server url - browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.last().history_id, '/detail/')) - - self.login(ow_user, ow_password) - - browser.find_element(By.ID,"revert-btn").click() - time.sleep(2) - self.assertTrue("warning text" in browser.page_source) - - def test_concept_warning_message_when_fork(self): - browser = self.browser - # get the test server url - browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/version/', - self.concept_everybody_can_edit.history.last().history_id, '/detail/')) - - self.login(ow_user, ow_password) - - browser.find_element(By.ID,"fork-btn").click() - time.sleep(2) - self.assertTrue("warning text" in browser.page_source)''' - ''' - def xxtest_workingset_warning_message_when_revert(self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - self.workingset_everybody_can_edit.id, '/version/', - self.workingset_everybody_can_edit.history.last().history_id, '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - browser.find_element(By.ID,"revert-btn").click() - - time.sleep(2) - self.assertTrue( - "The concepts will automatically refer to the latest version" in browser.page_source) - ''' - ''' - When one code list includes another code list as a component, - the parent code list takes a copy of the codes, and it doesn't change when the child changes. - ''' - - def test_copy_of_codes(self): - pass - - ''' - The parent code list stores and displays the version of the child code list that was used. - ''' - '''def test_version_storing_of_the_child(self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - self.concept_everybody_can_edit.id, '/detail/')) - - time.sleep(settings.TEST_SLEEP_TIME) - - # update child - table = browser.find_element(By.ID,"component-table") - - # time.sleep(100) - - - #For some reason component table is showing None value for version!!!!!!! - - table_rows = table.find_element_by_tag_name('tr') - table_data = table.find_elements_by_tag_name('td') - - print("component history id: ", self.component.history.first().history_id)''' - ''' - If the child code list is no longer the latest version (and there is access), - then there is an "update" functionality to click a button and update the child to the latest. - ''' - - def test(self): - pass - - ''' - If the user no longer has access to view the child code list, this is highlighted with a warning. - ''' - - def test_warning_message(self): - # change permission of the child concept - # self.child_concept.world_access = Permissions.NONE - # self.child_concept.save() - - self.login(su_user, su_password) - - # ###################### - # from ... import db_utils - # - # print(self.child_concept.id) - # print(Component.objects.all().count()) - # print(Component.objects.filter(concept_id=self.concept_everybody_can_edit.id).values_list('id', 'concept_id')) - # print(Component.objects.get(concept_id=self.concept_everybody_can_edit.id).concept.id) - # print(Component.objects.get(concept_id=self.concept_everybody_can_edit.id).concept_ref) - # print(Component.objects.get(concept_id=self.concept_everybody_can_edit.id).concept_ref.id) - # print(Component.objects.get(concept_id=self.concept_everybody_can_edit.id).concept_ref_history_id) - # - # concept_history_id = int(Concept.objects.get(pk=self.concept_everybody_can_edit.id).history.latest().history_id) - # - # concept = db_utils.getHistoryConcept(concept_history_id) - # - # concept_history_date = concept['history_date'] - # print(concept_history_date) - # components = db_utils.getHistoryComponents(self.concept_everybody_can_edit.id, concept_history_date, skip_codes=True) - # print(components) - # ############################# - - # self.login(nm_user, nm_password) - browser = self.browser - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/detail/')) - - browser.get( - self.WEBAPP_HOST + - reverse('concept_update', kwargs={ - 'pk': self.child_concept.id, - })) - # Find the no acces flag and click - browser.find_element(By.ID, "id_world_access_0").click() - - # Wait for changes to apply - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.ID, "save-changes").click() - - browser.get(self.WEBAPP_HOST + - reverse('concept_update', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - # Update the child concept - browser.find_element(By.XPATH, '//*[@title="Edit component"]').click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - # Time wait for changes for cicking apply button - browser.find_element(By.ID, "saveBtn2").click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - self.logout() - - # login as user and see changes - self.login(nm_user, nm_password) - - browser.get(self.WEBAPP_HOST + - reverse('concept_detail', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - # warning = browser.find_element_by_class_name("alert-danger").text - self.assertTrue("no view permission" in browser.page_source) - - ''' - test if a child concept is pointing to the latest version when a parent is reverted or forked - ''' - - def test_concept_child_is_pointing_to_the_latest_version_when_parent_reverted( - self): - - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/version/', - # self.concept_everybody_can_edit.history.last().history_id, '/detail/')) - - browser.get(self.WEBAPP_HOST + reverse( - 'concept_history_detail', - kwargs={ - 'pk': - self.concept_everybody_can_edit.id, - 'concept_history_id': - self.concept_everybody_can_edit.history.last().history_id - })) - - time.sleep(5) - WebDriverWait(browser, 10).until( - EC.presence_of_element_located((By.ID, "revert-btn"))) - - # revert to the first version of the parent - browser.find_element(By.ID, "revert-btn").click() - - time.sleep(2) # wait for pop up - - browser.find_element(By.XPATH, - "//button[@type='submit']").click() # revert - - # go to the child details page - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.child_concept.id, '/detail/')) - - browser.get( - self.WEBAPP_HOST + - reverse('concept_detail', kwargs={ - 'pk': self.child_concept.id, - })) - time.sleep(settings_cll.TEST_SLEEP_TIME) - - latest = self.child_concept.history.first().history_id - - element = browser.find_element(By.ID, 'concept_history_id_div') - - self.assertEqual(''.join(filter(str.isdigit, str(element.text))), - str(latest)) - - def test_concept_child_is_pointing_to_the_latest_version_when_parent_forked( - self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/version/', - # self.concept_everybody_can_edit.history.last().history_id, '/detail/')) - - browser.get(self.WEBAPP_HOST + reverse( - 'concept_history_detail', - kwargs={ - 'pk': - self.concept_everybody_can_edit.id, - 'concept_history_id': - self.concept_everybody_can_edit.history.last().history_id - })) - - time.sleep(5) - WebDriverWait(browser, 10).until( - EC.presence_of_element_located((By.ID, "fork-btn"))) - - # revert to the first version of the parent - browser.find_element(By.ID, "fork-btn").click() - - time.sleep(2) # wait for pop up - - browser.find_element(By.XPATH, - "//button[@type='submit']").click() # revert - - # go to the child details page - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.child_concept.id, '/detail/')) - - browser.get( - self.WEBAPP_HOST + - reverse('concept_detail', kwargs={ - 'pk': self.child_concept.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - latest = self.child_concept.history.first().history_id - - element = browser.find_element(By.ID, 'concept_history_id_div') - - self.assertEqual(''.join(filter(str.isdigit, str(element.text))), - str(latest)) - - def test_workingset_child_is_pointing_to_the_latest_version_when_parent_reverted( - self): - # unnecessary test - - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - # self.workingset_everybody_can_edit.id, '/version/', - # self.workingset_everybody_can_edit.history.last().history_id, '/detail/')) - - browser.get(self.WEBAPP_HOST + reverse( - 'workingset_history_detail', - kwargs={ - 'pk': - self.workingset_everybody_can_edit.id, - 'workingset_history_id': - self.workingset_everybody_can_edit.history.last().history_id - })) - - time.sleep(5) - WebDriverWait(browser, 10).until( - EC.presence_of_element_located((By.ID, "revert-btn"))) - - # revert to the first version of the parent - browser.find_element(By.ID, "revert-btn").click() - - time.sleep(2) # wait for pop up - - browser.find_element(By.XPATH, - "//button[@type='submit']").click() # revert - - # go to the child details page - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_detail', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - latest = self.concept_everybody_can_edit.history.first().history_id - - element = browser.find_element(By.ID, 'concept_history_id_div') - - self.assertEqual(''.join(filter(str.isdigit, str(element.text))), - str(latest)) - - ''' - A concept cannot be added as a child - if you don't have permission to use that concept (i.e. view permission on all descendants). - ''' - - def test_child_cannot_be_added_without_permission(self): - # login as normal so he does not have access to the child - self.login(nm_user, nm_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/update/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_update', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # try to add child - browser.find_element(By.ID, 'conceptTypes').click() - - browser.implicitly_wait(5) - browser.find_element(By.ID, 'addConcept').click() - - wait = WebDriverWait(self.browser, 10) - wait.until( - EC.presence_of_element_located((By.ID, "concept-search-text"))) - - concept_search_field = browser.find_element(By.ID, - "concept-search-text") - - time.sleep(2) # wait to load component form - - concept_search_field.send_keys("concept only owner can access") - - time.sleep(settings.TEST_SLEEP_TIME) # wait to load concept prompt - - # click on a prompt to fill the field - concept_search_field.send_keys(Keys.DOWN) - concept_search_field.send_keys(Keys.ENTER) - - browser.find_element(By.ID, "saveBtn").click() - - time.sleep(2) - - self.assertTrue("Please enter component name" - # in browser.page_source - in str(browser.switch_to.alert.text)) - - ''' - A concept cannot be added as a child if it would create a circular situation - (the current concept would be its own descendant). Test this with 4 levels of inheritance. - ''' - '''def test_child_concept_cannot_be_added_to_itself(self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - self.child_concept3.id, '/update/')) - - - time.sleep(settings.TEST_SLEEP_TIME) - - wait = WebDriverWait(self.browser, 10) - wait.until(EC.presence_of_element_located( - (By.CSS_SELECTOR, "button.btn.btn-primary.dropdown-toggle"))) - - # add child - browser.find_element_by_css_selector( - 'button.btn.btn-primary.dropdown-toggle').click() - browser.find_element_by_link_text("Concept").click() - - wait.until(EC.presence_of_element_located( - (By.ID, "concept-search-text"))) - - concept_search_field = browser.find_element(By.ID, - "concept-search-text") - - time.sleep(2) # wait to load component form - - concept_search_field.send_keys("concept everybody can edit") - - time.sleep(2) # wait to load concept prompt - - # click on a prompt to fill the field - concept_search_field.send_keys(Keys.DOWN) - concept_search_field.send_keys(Keys.ENTER) - - browser.find_element(By.XPATH,"//button[@type='submit']").click() - - # time.sleep(100) # wait to submition be completed''' diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_history.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_history.py deleted file mode 100644 index dbd25fcf7..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_history.py +++ /dev/null @@ -1,334 +0,0 @@ -import time -import unittest -from datetime import datetime -from urllib.parse import urlparse - -from clinicalcode.models import Brand -from clinicalcode.models.Code import Code -from clinicalcode.models.CodeList import CodeList -from clinicalcode.models.CodeRegex import CodeRegex -from clinicalcode.models.Component import Component -from clinicalcode.models.Concept import * -from clinicalcode.models.Tag import Tag -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -# from django.conf import settings -# from cll import settings as settings_cll -# from cll import test_settings as settings -from cll import test_settings as settings_cll -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from rest_framework.reverse import reverse -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.support.ui import WebDriverWait - - -class HistoryTest(StaticLiveServerTestCase): - - def setUp(self): - - location = os.path.dirname(__file__) - if settings_cll.REMOTE_TEST: - self.browser = webdriver.Remote( - command_executor=settings_cll.REMOTE_TEST_HOST, - desired_capabilities=settings_cll.chrome_options. - to_capabilities()) - self.browser.implicitly_wait(settings_cll.IMPLICTLY_WAIT) - else: - if settings_cll.IS_LINUX: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver"), - chrome_options=settings_cll.chrome_options) - else: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver.exe"), - chrome_options=settings_cll.chrome_options) - super(HistoryTest, self).setUp() - - self.WEBAPP_HOST = self.live_server_url.replace( - 'localhost', '127.0.0.1') - if settings_cll.REMOTE_TEST: - self.WEBAPP_HOST = settings_cll.WEBAPP_HOST - # self.factory = RequestFactory() - - self.owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - - coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="test_code_list_library", - table_name="clinicalcode_code", - code_column_name="CODE", - desc_column_name="DESCRIPTION") - coding_system.save() - - self.brand = self.create_brand("HDRUK", "cll/static/img/brands/HDRUK") - - self.tag = Tag.objects.create(description="tagTest", - tag_type=1, - display =1, - collection_brand=self.brand, - created_by=self.owner_user) - self.tag.save() - - self.collection = Tag.objects.create(description="collectionTest", - tag_type=2, - display=1, - collection_brand=self.brand, - created_by=self.owner_user) - self.collection.save() - - self.concept1 = Concept.objects.create(name="concept level 4", - description="concept level 4", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=self.owner_user, - modified_by=self.owner_user, - coding_system=coding_system, - is_deleted=False, - owner=self.owner_user, - group_access=Permissions.EDIT, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT, - tags='{' + str(self.tag.id) + - '}') - - self.comp1 = self.create_component_with_codes( - self, - comp_type=4, - log_type=1, - comp_name="comp1", - comp_parent=self.concept1, - code_list_description="com1 comp 1", - codes_names_list=["i1", "i2"]) - - self.comp_pk = self.comp1[0].pk - - self.codes = self.comp1[2] - - update_friendly_id() - save_stat(self.WEBAPP_HOST) - - def create_brand(self, nameBrand, pathBrand): - brand = Brand.objects.create(name=nameBrand, - description='', - logo_path=pathBrand, - css_path=pathBrand, - owner=self.owner_user).save() - return brand - - def tearDown(self): - self.browser.quit() - super(HistoryTest, self).tearDown() - - def login(self, username, password): - self.logout() - self.browser.find_element(By.NAME, 'username').send_keys(username) - self.browser.find_element(By.NAME, 'password').send_keys(password) - self.browser.find_element(By.NAME, 'password').send_keys(Keys.ENTER) - - def logout(self): - self.browser.get( - '%s%s' % - (self.WEBAPP_HOST, '/account/logout/?next=/account/login/')) - - def wait_to_be_logged_in(self, username): - wait = WebDriverWait(self.browser, 10) - element = wait.until( - EC.text_to_be_present_in_element( - (By.CSS_SELECTOR, 'p.navbar-text'), username)) - - # Returns logical type of component and list of codes - - # Concept ref for reference to the child concept (optional) - @staticmethod - def create_component_with_codes(self, - comp_type, - log_type, - comp_name, - comp_parent, - code_list_description, - codes_names_list, - concept_ref=None, - concept_ref_history_id=None): - component = Component.objects.create(component_type=comp_type, - concept=comp_parent, - created_by=self.owner_user, - logical_type=log_type, - name=comp_name) - - # if component type is child concept add reference to the child - if comp_type == 1: - component.concept_ref = concept_ref - component.concept_ref_history_id = concept_ref_history_id - - code_list = CodeList.objects.create(component=component, - description=code_list_description) - list_of_codes = [] - - codeRegex = CodeRegex.objects.create(component=component, - regex_type=1, - regex_code="i%", - code_list=code_list, - column_search=1) - - codeRegex.save() - - for name in codes_names_list: - code = Code.objects.create(code_list=code_list, - code=name, - description="isudhfsuidhf") - code.save() - list_of_codes.append(code) - - code_list.save() - component.save() - comp_parent.save() - - return component, log_type, list_of_codes - - ''' - Select/express component is edited then concept is saved. - The test checks if latest historical version of the concept contains - the correct version of the component. - ''' - - def test_select_comp_after_edit(self): - - # remove one code and update the concept - code = Code.objects.filter(id=self.codes[0].id) - code.delete() - self.concept1.save() - - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept1.id, '/update/')) - browser.get( - self.WEBAPP_HOST + - reverse('concept_update', kwargs={ - 'pk': self.concept1.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # go to the latest historical version of the concept - href = "/concepts/C" + str(self.concept1.id) + "/version/" + str( - self.concept1.history.first().history_id) + "/detail/" - browser.find_element(By.XPATH, '//a[@href="' + href + '"]').click() - - # click the component details button - id = "code-preview-" + str(self.comp_pk) - browser.find_element(By.XPATH, '//button[@id="' + id + '"]').click() - - time.sleep(2) - - rows = browser.find_elements( - By.XPATH, '//tbody[@id="expressionSelectContentArea"]/tr') - # make sure there is one row of codes (there is one code) - self.assertEqual(len(rows), 1) - - # check the name of the code - name = browser.find_element( - By.XPATH, '//tbody[@id="expressionSelectContentArea"]/tr/td').text - self.assertEqual(name, "i2") - - ''' - Concept with a tag is created. Test checks if the latest historical version - of the concept contains the tag. - ''' - - def test_history_tags(self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - browser.get('%s%s' % (self.WEBAPP_HOST, '/concepts/create')) - - browser.get(self.WEBAPP_HOST + reverse('concept_create', kwargs=None)) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - - # create a concept - browser.find_element(By.ID, 'id_name').send_keys("concept2") - tagField = browser.find_element(By.ID, 'concept-tag-form-container').find_element(By.CLASS_NAME,'tt-input') - tagField.send_keys("tag") - - time.sleep(2) # wait to load concept prompt - - # click on a prompt to fill the field - tagField.send_keys(Keys.DOWN) - tagField.send_keys(Keys.ENTER) - - browser.find_element(By.ID, 'id_author').send_keys("conceptAuthor") - browser.find_element(By.ID, - 'id_description').send_keys("concept2222222") - browser.find_element(By.ID, 'id_coding_system').send_keys(Keys.DOWN) - - - browser.find_element(By.ID, 'save-changes').click() - concept = Concept.objects.all().order_by('-id')[0] - - # go to the latest historical version of the concept - href = "/concepts/C" + str(concept.id) + "/version/" + str( - concept.history.first().history_id) + "/detail/" - browser.find_element(By.XPATH, '//a[@href="' + href + '"]').click() - - # TO-DO assertTrue or equal that tag exist - self.assertTrue("tagTest" in browser.page_source) - - def test_history_collection(self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - browser.get('%s%s' % (self.WEBAPP_HOST, '/concepts/create')) - - browser.get(self.WEBAPP_HOST + reverse('concept_create', kwargs=None)) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # create a concept - browser.find_element(By.ID, 'id_name').send_keys("concept2") - collectionField = browser.find_element(By.ID, 'concept-collection-form-container').find_element(By.CLASS_NAME,'tt-input') - - collectionField.send_keys("collection") - - time.sleep(2) # wait to load concept prompt - - # click on a prompt to fill the field - collectionField.send_keys(Keys.DOWN) - collectionField.send_keys(Keys.ENTER) - - browser.find_element(By.ID, 'id_author').send_keys("conceptAuthor") - browser.find_element(By.ID, - 'id_description').send_keys("concept2222222") - browser.find_element(By.ID, 'id_coding_system').send_keys(Keys.DOWN) - - browser.find_element(By.ID, 'save-changes').click() - concept = Concept.objects.all().order_by('-id')[0] - - # go to the latest historical version of the concept - href = "/concepts/C" + str(concept.id) + "/version/" + str( - concept.history.first().history_id) + "/detail/" - browser.find_element(By.XPATH, '//a[@href="' + href + '"]').click() - - # TO-DO assertTrue or equal that tag exist - self.assertTrue("collectionTest" in browser.page_source) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_inclusion_exclusion.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_inclusion_exclusion.py deleted file mode 100644 index 4146528cc..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_inclusion_exclusion.py +++ /dev/null @@ -1,474 +0,0 @@ -from datetime import datetime -from unittest.case import skip - -from clinicalcode.models.Code import Code -from clinicalcode.models.CodeList import CodeList -from clinicalcode.models.CodeRegex import CodeRegex -from clinicalcode.models.Component import Component -from clinicalcode.models.Concept import * -from clinicalcode.models.PublishedConcept import * -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -from clinicalcode.views.Concept import concept_codes_to_csv -# from cll import test_settings as settings -from cll import test_settings as settings_cll -from django.test import RequestFactory, TestCase, TransactionTestCase -from rest_framework.reverse import reverse - -# from clinicalcode.publicsites.views import published_concept_codes_to_csv - - -# @skip("skip for now") -class InclusionExclusionTest(TestCase): - - @classmethod - def setUpClass(cls): - super(InclusionExclusionTest, cls).setUpClass() - cls.factory = RequestFactory() - - cls.owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - - coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - coding_system.save() - ''' - level 4 - The parent is excluded child so everything should be excluded - ''' - '''cls.excl_level4_withexcl = Concept.objects.create( - name="concept level 4", - description="concept level 4", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=cls.owner_user, - modified_by=cls.owner_user, - coding_system=coding_system, - is_deleted=False, - owner=cls.owner_user, - group_access=Permissions.EDIT, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT - ) - - - cls.excl_comp_type4_4_3 = cls.create_component_with_codes(cls, comp_type=4, log_type=1, comp_name="excluded component 5", comp_parent=cls.excl_level4_withexcl, - code_list_description="excluded code list", codes_names_list=["r2"]) - - - cls.level4_withexcl = Concept.objects.create( - name="concept level 4", - description="concept level 4", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=cls.owner_user, - modified_by=cls.owner_user, - coding_system=coding_system, - is_deleted=False, - owner=cls.owner_user, - group_access=Permissions.EDIT, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT - ) - - - cls.excl_comp_type4_4_2 = cls.create_component_with_codes(cls, comp_type=4, log_type=2, comp_name="excluded component 5", comp_parent=cls.level4_withexcl, - code_list_description="excluded code list", codes_names_list=["r1"]) - - cls.incl_level4 = Concept.objects.create( - name="concept level 4", - description="concept level 4", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=cls.owner_user, - modified_by=cls.owner_user, - coding_system=coding_system, - is_deleted=False, - owner=cls.owner_user, - group_access=Permissions.EDIT, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT - ) - - - cls.incl_comp_type4_4 = cls.create_component_with_codes(cls, comp_type=4, log_type=1, comp_name="included component 5", comp_parent=cls.incl_level4, - code_list_description="included code list", codes_names_list=["i9", "i10"]) - - cls.excl_comp_type4_4 = cls.create_component_with_codes(cls, comp_type=4, log_type=2, comp_name="excluded component 5", comp_parent=cls.incl_level4, - code_list_description="included code list", codes_names_list=["i10"])''' - ''' - level 3 - ''' - ''''cls.incl_level3 = Concept.objects.create( - name="concept level 3", - description="concept level 3", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=cls.owner_user, - modified_by=cls.owner_user, - coding_system=coding_system, - is_deleted=False, - owner=cls.owner_user, - group_access=Permissions.EDIT, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT - ) - - cls.excl_child_component_4_2 = cls.create_component_with_codes(cls, comp_type=1, log_type=2, comp_name="excluded child concept 5_2", comp_parent=cls.incl_level3, - code_list_description="included code list", codes_names_list=[], concept_ref=cls.excl_level4_withexcl, - concept_ref_history_id=cls.excl_level4_withexcl.history.first().history_id) - - cls.incl_child_component_4_2 = cls.create_component_with_codes(cls, comp_type=1, log_type=1, comp_name="included child concept 5_2", comp_parent=cls.incl_level3, - code_list_description="included code list", codes_names_list=[], concept_ref=cls.level4_withexcl, - concept_ref_history_id=cls.level4_withexcl.history.first().history_id) - - cls.incl_child_component_4 = cls.create_component_with_codes(cls, comp_type=1, log_type=1, comp_name="included child concept 5", comp_parent=cls.incl_level3, - code_list_description="included code list", codes_names_list=[], concept_ref=cls.incl_level4, - concept_ref_history_id=cls.incl_level4.history.first().history_id) - - cls.incl_comp_type3_3 = cls.create_component_with_codes(cls, comp_type=3, log_type=1, comp_name="included component 4", comp_parent=cls.incl_level3, - code_list_description="included code list", codes_names_list=["i7", "i8"]) - - cls.excl_comp_type3_3 = cls.create_component_with_codes(cls, comp_type=3, log_type=2, comp_name="excluded component 4", comp_parent=cls.incl_level3, - code_list_description="excluded code list", codes_names_list=["i2"])''' - ''' - level 2 - ''' - '''cls.level2 = Concept.objects.create( - name="concept level 2", - description="concept level 2", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=cls.owner_user, - modified_by=cls.owner_user, - coding_system=coding_system, - is_deleted=False, - owner=cls.owner_user, - group_access=Permissions.EDIT, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT - ) - - cls.incl_child_component_3 = cls.create_component_with_codes(cls, comp_type=1, log_type=1, comp_name="included child concept 4", comp_parent=cls.level2, - code_list_description="included code list", codes_names_list=[], concept_ref=cls.incl_level3, - concept_ref_history_id=cls.incl_level3.history.first().history_id) - - cls.incl_comp_type2_2 = cls.create_component_with_codes(cls, comp_type=2, log_type=1, comp_name="included component 3", comp_parent=cls.level2, - code_list_description="included code list", codes_names_list=["e6", "e7", "ic9"]) - - cls.excl_comp_type2_2 = cls.create_component_with_codes(cls, comp_type=2, log_type=2, comp_name="excluded component 3", comp_parent=cls.level2, - code_list_description="excluded code list", codes_names_list=["e6", "e7", "i5"])''' - ''' - level 1 - ''' - cls.level1 = Concept.objects.create(name="concept level 1", - description="concept level 1", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=cls.owner_user, - modified_by=cls.owner_user, - coding_system=coding_system, - is_deleted=False, - owner=cls.owner_user, - group_access=Permissions.EDIT, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT) - '''cls.incl_child_component_2 = cls.create_component_with_codes(cls, comp_type=1, log_type=1, comp_name="included child concept 3", comp_parent=cls.level1, - code_list_description="included code list", codes_names_list=[], concept_ref=cls.level2, - concept_ref_history_id=cls.level2.history.first().history_id) - - cls.incl_comp_type2_1 = cls.create_component_with_codes(cls, comp_type=2, log_type=1, comp_name="included component 2", comp_parent=cls.level1, - code_list_description="included code list", codes_names_list=["i4", "i5", "i6"]) - - cls.excl_comp_type2_1 = cls.create_component_with_codes(cls, comp_type=2, log_type=2, comp_name="excluded component 2", comp_parent=cls.level1, - code_list_description="excluded code list", codes_names_list=["e3", "e4"]) - - cls.incl_comp_type3_1 = cls.create_component_with_codes(cls, comp_type=3, log_type=1, comp_name="included component 2", comp_parent=cls.level1, - code_list_description="included code list", codes_names_list=["e3", "e4", "i6", "ic4", "ic5"]) - - cls.excl_comp_type3_1 = cls.create_component_with_codes(cls, comp_type=3, log_type=2, comp_name="excluded component 2", comp_parent=cls.level1, - code_list_description="excluded code list", codes_names_list=["i6"]) - - cls.incl_comp_type4_1 = cls.create_component_with_codes(cls, comp_type=4, log_type=1, comp_name="included component 2", comp_parent=cls.level1, - code_list_description="included code list", codes_names_list=["ic6", "ic7", "ic8"]) - - cls.excl_comp_type4_1 = cls.create_component_with_codes(cls, comp_type=4, log_type=2, comp_name="excluded component 2", comp_parent=cls.level1, - code_list_description="excluded code list", codes_names_list=["ic3", "ic8"])''' - ''' - root - ''' - cls.root = Concept.objects.create(name="root", - description="root", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=cls.owner_user, - modified_by=cls.owner_user, - coding_system=coding_system, - is_deleted=False, - owner=cls.owner_user, - group_access=Permissions.EDIT, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT) - - cls.incl_child_component_1 = cls.create_component_with_codes( - cls, - comp_type=1, - log_type=1, - comp_name="included child concept", - comp_parent=cls.root, - code_list_description="included code list", - codes_names_list=["i100", "i200", "i300"], - concept_ref=cls.level1, - concept_ref_history_id=cls.level1.history.first().history_id) - - cls.excl_child_component_1 = cls.create_component_with_codes( - cls, - comp_type=1, - log_type=2, - comp_name="excluded child concept", - comp_parent=cls.root, - code_list_description="included code list", - codes_names_list=["i300"], - concept_ref=cls.level1, - concept_ref_history_id=cls.level1.history.first().history_id) - - cls.incl_comp_type2 = cls.create_component_with_codes( - cls, - comp_type=2, - log_type=1, - comp_name="included component", - comp_parent=cls.root, - code_list_description="included code list", - codes_names_list=["i1", "i2", "i3"]) - - cls.excl_comp_type2 = cls.create_component_with_codes( - cls, - comp_type=2, - log_type=2, - comp_name="excluded component", - comp_parent=cls.root, - code_list_description="excluded code list", - codes_names_list=["i1", "e2"]) - - cls.incl_comp_type3 = cls.create_component_with_codes( - cls, - comp_type=3, - log_type=1, - comp_name="included component", - comp_parent=cls.root, - code_list_description="included code list", - codes_names_list=["ic1", "ic2"]) - - cls.excl_comp_type3 = cls.create_component_with_codes( - cls, - comp_type=3, - log_type=2, - comp_name="excluded component", - comp_parent=cls.root, - code_list_description="excluded code list", - codes_names_list=["ic2", "ec1"]) - - cls.incl_comp_type4 = cls.create_component_with_codes( - cls, - comp_type=4, - log_type=1, - comp_name="included component", - comp_parent=cls.root, - code_list_description="included code list", - codes_names_list=["ic3", "ic4"]) - - cls.excl_comp_type4 = cls.create_component_with_codes( - cls, - comp_type=4, - log_type=2, - comp_name="excluded component", - comp_parent=cls.root, - code_list_description="excluded code list", - codes_names_list=["ic4"]) - - cls.root.save() - - cls.output = ['i2', 'i3', 'ic1', 'ic3', 'i100', 'i200'] - '''published concept''' - cls.root_history_id = cls.root.history.first().history_id - cls.published_root = PublishedConcept.objects.create( - concept=cls.root, - concept_history_id=cls.root_history_id, - created_by=cls.owner_user) - - @classmethod - def tearDownClass(cls): - super(InclusionExclusionTest, cls).tearDownClass() - - # Returns logical type of component and list of codes - # Concept ref for reference to the child concept (optional) - @staticmethod - def create_component_with_codes(self, - comp_type, - log_type, - comp_name, - comp_parent, - code_list_description, - codes_names_list, - concept_ref=None, - concept_ref_history_id=None): - component = Component.objects.create(component_type=comp_type, - concept=comp_parent, - created_by=self.owner_user, - logical_type=log_type, - name=comp_name) - - # if component type is child concept add reference to the child - if comp_type == 1: - component.concept_ref = concept_ref - component.concept_ref_history_id = concept_ref_history_id - - code_list = CodeList.objects.create(component=component, - description=code_list_description) - list_of_codes = [] - - if comp_type != 1 and comp_type != 2: - codeRegex = CodeRegex.objects.create(component=component, - regex_type=1, - regex_code="%i%", - code_list=code_list) - - for name in codes_names_list: - code = Code.objects.create(code_list=code_list, - code=name, - description=name) - code.save() - list_of_codes.append(code.code) - - code_list.save() - component.save() - comp_parent.save() - - return log_type, list_of_codes - - def get_codes_from_response(self, response): - response = response.splitlines() - response.pop(0) # remove headers - - codes = [] - - for r in response: - code = r.split(",")[0] - codes.append(code) - - # sort both lists - codes.sort() - self.output.sort() - print(("EXPECTED OUTPUT: ", self.output)) - print(("RESPONSE_CODES: ", codes)) - - return codes - - def test_root(self): - # url = ('%s%s%s' % ('/concepts/C', - # self.root.id, '/export/codes')) - - url = reverse('concept_codes_to_csv', kwargs={'pk': self.root.id}) - - request = self.factory.get(url) - request.user = self.owner_user - request.CURRENT_BRAND = '' - - response = concept_codes_to_csv(request, self.root.id) - - response_codes = self.get_codes_from_response( - response.content.decode('utf-8')) - - expected_output = self.output - - self.assertEqual(response_codes, expected_output, - "response codes and expected output are not equal") - - def test_published(self): - from clinicalcode.views.Concept import history_concept_codes_to_csv - - # url = ('%s%s%s%s%s' % ('/concepts/C', self.published_root.concept_id - # , '/version/', self.published_root.concept_history_id - # , '/export/codes')) - - url = reverse('history_concept_codes_to_csv', - kwargs={ - 'pk': - self.published_root.concept_id, - 'concept_history_id': - self.published_root.concept_history_id - }) - request = self.factory.get(url) - request.user = self.owner_user - request.CURRENT_BRAND = '' - - response = history_concept_codes_to_csv( - request, self.published_root.concept_id, - self.published_root.concept_history_id) - - response_codes = self.get_codes_from_response( - response.content.decode('utf-8')) - - expected_output = self.output - - self.assertEqual( - response_codes, expected_output, - "response codes and expected output are not equal") diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_regular_expressions.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_regular_expressions.py deleted file mode 100644 index ef9636e98..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_regular_expressions.py +++ /dev/null @@ -1,240 +0,0 @@ -import time -from datetime import datetime -from urllib.parse import urlparse - -from clinicalcode.models.Code import Code -from clinicalcode.models.CodeList import CodeList -from clinicalcode.models.CodeRegex import CodeRegex -from clinicalcode.models.Component import Component -from clinicalcode.models.Concept import * -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -from clinicalcode.views.Concept import concept_codes_to_csv -# from django.conf import settings -# from cll import settings as settings_cll -# from cll import test_settings as settings -from cll import test_settings as settings_cll -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from django.test import RequestFactory -from rest_framework.reverse import reverse -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.support.ui import WebDriverWait - - -class RegularExpressionsTest(StaticLiveServerTestCase): - - def setUp(self): - - location = os.path.dirname(__file__) - if settings_cll.REMOTE_TEST: - self.browser = webdriver.Remote( - command_executor=settings_cll.REMOTE_TEST_HOST, - desired_capabilities=settings_cll.chrome_options. - to_capabilities()) - self.browser.implicitly_wait(settings_cll.IMPLICTLY_WAIT) - else: - if settings_cll.IS_LINUX: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver"), - chrome_options=settings_cll.chrome_options) - else: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver.exe"), - chrome_options=settings_cll.chrome_options) - super(RegularExpressionsTest, self).setUp() - - self.factory = RequestFactory() - - self.WEBAPP_HOST = self.live_server_url.replace( - 'localhost', '127.0.0.1') - if settings_cll.REMOTE_TEST: - self.WEBAPP_HOST = settings_cll.WEBAPP_HOST - '''data''' - super_user = User.objects.create_superuser(username=su_user, - password=su_password, - email=None) - normal_user = User.objects.create_user(username=nm_user, - password=nm_password, - email=None) - self.owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - group_user = User.objects.create_user(username=gp_user, - password=gp_password, - email=None) - - permitted_group = Group.objects.create(name="permitted_group") - group_user.groups.add(permitted_group) - - coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - coding_system.save() - - coding_system2 = CodingSystem.objects.create( - name="Lookup table 2", - description="Lookup Codes for testing purposes2", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - coding_system.save() - - self.concept_everybody_can_edit = Concept.objects.create( - name="concept everybody can edit", - description="concept description", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=self.owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.EDIT) - - self.code_list = self.create_component_with_codes( - self, - comp_name="included component", - comp_parent=self.concept_everybody_can_edit, - code_list_description="included code list", - codes_names_list=["i1", "i2", "i3"]) - - update_friendly_id() - save_stat(self.WEBAPP_HOST) - - def tearDown(self): - self.browser.quit() - super(RegularExpressionsTest, self).tearDown() - - def login(self, username, password): - self.logout() - self.browser.find_element(By.NAME, 'username').send_keys(username) - self.browser.find_element(By.NAME, 'password').send_keys(password) - self.browser.find_element(By.NAME, 'password').send_keys(Keys.ENTER) - - def logout(self): - self.browser.get( - '%s%s' % - (self.WEBAPP_HOST, '/account/logout/?next=/account/login/')) - - def wait_to_be_logged_in(self, username): - wait = WebDriverWait(self.browser, 10) - element = wait.until( - EC.text_to_be_present_in_element( - (By.CSS_SELECTOR, 'p.navbar-text'), username)) - - # Returns logical type of component and list of codes - - # Concept ref for reference to the child concept (optional) - @staticmethod - def create_component_with_codes(self, comp_name, comp_parent, - code_list_description, codes_names_list): - component = Component.objects.create(component_type=2, - concept=comp_parent, - created_by=self.owner_user, - logical_type=1, - name=comp_name) - - code_list = CodeList.objects.create(component=component, - description=code_list_description) - code_list.save() - list_of_codes = [] - - codeRegex = CodeRegex.objects.create(component=component, - regex_type=1, - regex_code="%i%", - code_list=code_list) - - for name in codes_names_list: - code = Code.objects.create(code_list=code_list, - code=name, - description=name) - code.save() - list_of_codes.append(code.code) - - return list_of_codes - - def get_codes_from_response(self, response): - response = response.splitlines() - response.pop(0) # remove headers - - codes = [] - - for r in response: - code = r.split(",")[0] - codes.append(code) - - print(("REPONSE_CODES: ", codes)) - - return codes - - ''' - The match with expression functionality makes a copy of the codes, - and the code list does not change if the lookup table changes. - ''' - - def test_regular_expression(self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/update/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_update', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - coding_system_select = browser.find_element(By.ID, "id_coding_system") - - # Change lookup table - coding_system_select.click() - coding_system_select.send_keys(Keys.DOWN) - coding_system_select.send_keys(Keys.ENTER) - - browser.find_element(By.ID, "save-changes").click() # save changes - - # url = ('%s%s%s' % ('/concepts/C', - # self.concept_everybody_can_edit.id, '/export/codes')) - - url = self.WEBAPP_HOST + reverse( - 'concept_codes_to_csv', - kwargs={'pk': self.concept_everybody_can_edit.id}) - request = self.factory.get(url) - request.user = self.owner_user - request.CURRENT_BRAND = '' - - # make export to csv request - response = concept_codes_to_csv(request, - self.concept_everybody_can_edit.id) - - codes = self.get_codes_from_response(response.content.decode('utf-8')) - - # Assert that the defined codes in setUp appears in the response - for code in self.code_list: - self.assertTrue(code in codes, code + " not in response") diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_search_filters.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_search_filters.py deleted file mode 100644 index 20b97d6a1..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_search_filters.py +++ /dev/null @@ -1,745 +0,0 @@ -import random -import string -import time -from datetime import datetime - -from clinicalcode.models.Brand import Brand -from clinicalcode.models.Concept import * -from clinicalcode.models.Phenotype import * -from clinicalcode.models.Tag import Tag -from clinicalcode.models.WorkingSet import * -from clinicalcode.tests.test_base import * -# from cll import test_settings as settings -from cll import test_settings as settings_cll -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -# from django.conf import settings -# from cll import settings as settings_cll -from django.test import RequestFactory -from rest_framework.reverse import reverse -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.support.ui import WebDriverWait - -from unittest import skip, skipIf - -@skipIf(True, "SEARCH PAGE TEST SKIPPED") -class SearchTest(StaticLiveServerTestCase): - reset_sequences = True - - def setUp(self): - location = os.path.dirname(__file__) - self.NUM_PHENOTYPES = 100 - - self.factory = RequestFactory() - if settings_cll.REMOTE_TEST: - self.browser = webdriver.Remote( - command_executor=settings_cll.REMOTE_TEST_HOST, - desired_capabilities=settings_cll.chrome_options. - to_capabilities()) - self.browser.implicitly_wait(settings_cll.IMPLICTLY_WAIT) - else: - if settings_cll.IS_LINUX: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver"), - chrome_options=settings_cll.chrome_options) - else: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver.exe"), - chrome_options=settings_cll.chrome_options) - - super(SearchTest, self).setUp() - - self.WEBAPP_HOST = self.live_server_url.replace( - 'localhost', '127.0.0.1') - if settings_cll.REMOTE_TEST: - self.WEBAPP_HOST = settings_cll.WEBAPP_HOST - - self.load_data() - - def load_data(self): - # Users: a normal user and a super_user. - self.normal_user = User.objects.create_user(username=nm_user, - password=nm_password, - email=None) - super_user = User.objects.create_superuser(username=su_user, - password=su_password, - email=None) - self.owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - group_user = User.objects.create_user(username=gp_user, - password=gp_password, - email=None) - - self.permitted_group = Group.objects.create(name="permitted_group") - # Add the group to the group-user's groups. - group_user.groups.add(self.permitted_group) - - coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - coding_system.save() - - self.concept_everybody_can_edit = Concept.objects.create( - name="concept everybody can edit", - description="concept description", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - tags=[1], - is_deleted=False, - owner=self.owner_user, - group=self.permitted_group, - group_access=Permissions.EDIT, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT) - self.brand = self.create_brand("HDRUK", "cll/static/img/brands/HDRUK") - - self.nameTags = [ - "Phenotype_library", "ADP", "BREATHE", "CALIBER", "PIONEER", - "SAIL", "BHF DSC" - ] - self.collectionOftags = [] - - for i in range(len(self.nameTags)): - self.collectionOftags.append( - self.creat_tag(self.nameTags[i], self.brand)) - - self.test_phenotypes = [] - for i in range(self.NUM_PHENOTYPES): - self.test_phenotypes.append( - self.create_test_phenotype( - "Phenotype" + str(i + 1), - "desc" + str(i + 1), - tags=[random.randrange(len(self.nameTags)) + 1], - group=self.permitted_group, - is_deleted=random.choice([True, False]), - owner=self.owner_user, - author="test_author")) - - update_friendly_id() - save_stat(self.WEBAPP_HOST) - - def create_test_phenotype(self, name, description, tags, group, is_deleted, - owner, author): - phenotype = Phenotype.objects.create( - name=str(name), - description="phenotype level " + str(description), - author=author, - layout="Phenotype", - valid_event_data_range="01/01/1999 - 01/07/2016", - phenotype_uuid="ideeee" + str(name), - is_deleted=is_deleted, - type=random.choice( - ["Disease or Syndrome", "Biomarker", "Lifestyle Risk Factor"]), - sex="Female,Male", - phenoflowid=4, - concept_informations= [{"concept_version_id": str(self.concept_everybody_can_edit.id), - "concept_id": str(self.concept_everybody_can_edit.id), - "attributes": []}], - validation_performed=False, - publication_doi="", - publication_link=Google_website, - source_reference=Google_website, - validation="", - publications=[], - status="FINAL", - secondary_publication_links="", - citation_requirements="", - created_by=self.owner_user, - updated_by=self.owner_user, - owner=owner, - group_access=Permissions.EDIT, - tags=tags, - group=group, - owner_access=Permissions.EDIT, - world_access=Permissions.EDIT).save() - return phenotype - - def creat_tag(self, nametag, brand): - tag = Tag.objects.create(collection_brand=brand, - description=nametag, - created_by=self.owner_user, - tag_type=2, - display=random.randint(1, 6)).save() - return tag - - def create_brand(self, nameBrand, pathBrand): - brand = Brand.objects.create(name=nameBrand, - description='', - logo_path=pathBrand, - css_path=pathBrand, - owner=self.owner_user).save() - return brand - - def tearDown(self): - self.browser.quit() - super(SearchTest, self).tearDown() - - def login(self, username, password): - self.logout() - self.browser.find_element(By.NAME, 'username').send_keys(username) - self.browser.find_element(By.NAME, 'password').send_keys(password) - self.browser.find_element(By.NAME, 'password').send_keys(Keys.ENTER) - - def logout(self): - self.browser.get( - '%s%s' % - (self.WEBAPP_HOST, '/account/logout/?next=/account/login/')) - - def wait_to_be_logged_in(self, username): - wait = WebDriverWait(self.browser, 10) - wait.until( - EC.text_to_be_present_in_element( - (By.CSS_SELECTOR, 'p.navbar-text'), username)) - - def test_tags_filter(self): - - self.login(su_user, su_password) - browser = self.browser - - # Go to phenotype list - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - checkboxes = browser.find_elements(By.ID, "collection_id") - - - # Iterate through checkboxes and make sure they are available - for i in range(len(checkboxes)): - browser.find_elements(By.NAME, "collection_id")[i].click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_elements(By.NAME, "collection_id")[i].click() - - updated_element = browser.find_elements(By.NAME, - "collection_id")[i] - - self.assertTrue(updated_element.is_enabled()) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - def test_tags_onrelevance(self): - - self.login(su_user, su_password) - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - checkboxes = browser.find_elements(By.NAME, "collection_id") - - # Iterate through checkboxes and compare phenotype tags with actual chosen tag - for i in range(1, len(checkboxes)): - - browser.find_elements(By.NAME, "collection_id")[i].click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - element = browser.find_elements(By.CSS_SELECTOR, - ".col-sm-12 > .tag") - - tag = browser.find_elements(By.CLASS_NAME, - "form-check-label")[i - 1].text - - for j in range(1, len(element), 2): - self.assertEqual(element[j].text, tag) - - browser.find_elements(By.NAME, "collection_id")[i].click() - - def xx_test_unexpected_symbol_search(self): - - self.login(su_user, su_password) - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - checkboxes = browser.find_elements(By.NAME, "collection_id") - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - # Iterate through checkboxes and test could search bar handle the random symbols - for i in range(1, len(checkboxes)): - browser.find_elements(By.NAME, "collection_id")[i].click() - - browser.find_element(By.ID, "search").send_keys("Phenotype") - - browser.find_element( - By.XPATH, '//button[@class = "btn btn-primary"]').click() - - self.assertTrue("No phenotypes" not in browser.page_source) - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.ID, "reset-form").click() - - # generate random symbol - randomstring = ''.join([ - random.choice(string.ascii_letters + string.digits + - string.punctuation) for _ in range(5) - ]) - - browser.find_element(By.ID, "search").send_keys(randomstring) - - browser.find_element( - By.XPATH, '//button[@class = "btn btn-primary"]').click() - - self.assertTrue("No phenotypes" in browser.page_source) - - browser.find_element(By.ID, "reset-form").click() - - def xx_test_unexpected_phenotype_name(self): - self.login(su_user, su_password) - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - checkboxes = browser.find_elements(By.NAME, "collection_id") - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - # Iterate through checkboxes and test if search bar could find the unexpected name of the phenotype - for i in range(1, len(checkboxes)): - browser.find_elements(By.NAME, "collection_id")[i].click() - - browser.find_element(By.ID, "search").send_keys("Phenotype") - - browser.find_element( - By.XPATH, '//button[@class = "btn btn-primary"]').click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - self.assertTrue("No phenotypes" not in browser.page_source) - - browser.find_element(By.ID, "reset-form").click() - - randomstring = ''.join([ - random.choice(string.ascii_letters + string.digits) - for _ in range(5) - ]) - - # Create test phenotype - self.create_test_phenotype(randomstring, - "desc", [i], - self.permitted_group, - False, - owner=self.owner_user, - author="author") - - browser.find_element(By.ID, "search").send_keys(randomstring) - - time.sleep(5) - - browser.find_element( - By.XPATH, '//button[@class = "btn btn-primary"]').click() - - time.sleep(10) - - self.assertTrue("No phenotypes" not in browser.page_source) - - browser.find_element(By.ID, "reset-form").click() - - """ - NOT FOR REALEASE 1 - def test_blank_search_input(self): - self.login(su_user, su_password) - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes') - ) - browser.find_element(By.XPATH,"//*[@id='show-advanced-search']").click() - - checkboxes = browser.find_elements(By.NAME,"collection_id") - - # Test how search bar could handle the empty search - for i in range(1, len(checkboxes)): - browser.find_elements(By.NAME,"collection_id")[i].click() - - browser.find_element(By.XPATH,'//button[@class = "btn btn-primary"]').click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - # Todo Should be discussed(Test empty in search space) - browser.find_element(By.ID,"search").send_keys(Keys.SPACE) - browser.find_element(By.XPATH,'//button[@class = "btn btn-primary"]').click() - time.sleep(settings_cll.IMPLICTLY_WAIT) - self.assertTrue("No phenotypes" not in browser.page_source) - browser.find_element(By.ID,"reset-form").click() - - # Test empty in author search space - browser.find_element(By.NAME,"author").send_keys(Keys.SPACE) - browser.find_element(By.XPATH,'//button[@class = "btn btn-primary"]').click() - time.sleep(settings_cll.IMPLICTLY_WAIT) - self.assertTrue("No phenotypes" not in browser.page_source) - browser.find_element(By.ID,"reset-form").click() - - # Test empty in owner search space - browser.find_element(By.NAME,"owner").send_keys(Keys.SPACE) - browser.find_element(By.XPATH,'//button[@class = "btn btn-primary"]').click() - time.sleep(settings_cll.IMPLICTLY_WAIT) - self.assertTrue("No phenotypes" not in browser.page_source) - browser.find_element(By.ID,"reset-form").click() - - browser.find_elements(By.NAME,"collection_id")[i].click() - """ - - def xx_test_blank_phenotype_search(self): - self.login(su_user, su_password) - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - # Test if blank phenotype could be exist - - browser.find_element(By.ID, "search").send_keys(Keys.SPACE) - - browser.find_element(By.XPATH, - '//button[@class = "btn btn-primary"]').click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - - self.assertTrue("No phenotypes" not in browser.page_source) - - # Reset and create phenotype - browser.find_element(By.ID, "reset-form").click() - - self.create_test_phenotype(" ", - "desc", [1], - self.permitted_group, - False, - owner=self.owner_user, - author="author") - - browser.find_element(By.ID, "search").send_keys(Keys.SPACE) - - browser.find_element(By.XPATH, - '//button[@class = "btn btn-primary"]').click() - - - self.assertTrue("No phenotypes" not in browser.page_source) - - def xx_test_all_tag(self): - - # Test 'all' tag when user wants to delete the previous search - self.login(su_user, su_password) - - browser = self.browser - self.create_test_phenotype("test", - "desc", [1], - self.permitted_group, - False, - owner=self.owner_user, - author="test_author") - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - browser.find_elements(By.NAME, "collection_id")[0].click() - - browser.find_element(By.ID, "search").send_keys("test") - - browser.find_element(By.XPATH, - '//button[@class = "btn btn-primary"]').click() - - self.assertTrue("No phenotypes" not in browser.page_source) - - browser.find_element(By.ID, "search").clear() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_elements(By.NAME, "collection_id")[0].click() - print(browser.find_element(By.ID, "search").text) - - self.assertTrue(browser.find_element(By.ID, "search").text == "") - - def xx_test_search(self): - self.login(su_user, su_password) - - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - checkboxes = browser.find_elements(By.NAME, "collection_id") - - # Iterate and check search by all tags except all tag - for i in range(1, len(checkboxes)): - browser.find_elements(By.NAME, "collection_id")[i].click() - - element = browser.find_element(By.XPATH, - "//span[contains(text(),'PH')]") - - random_phenotype = element.text - print(random_phenotype) - - # Test with actual name - browser.find_element(By.ID, "search").send_keys( - random_phenotype[6:].strip()) - browser.find_element( - By.XPATH, '//button[@class = "btn btn-primary"]').click() - time.sleep(settings_cll.IMPLICTLY_WAIT) - self.assertTrue("No phenotypes" not in browser.page_source) - - browser.find_element(By.ID, "reset-form").click() - - # Find phenotype by friendly ID (GOING to be extra feature) - # browser.find_element(By.ID,"search").send_keys(random_phenotype[:3].strip()) - # browser.find_element(By.XPATH,'//button[@class = "btn btn-primary"]').click() - # self.assertTrue("No phenotypes" not in browser.page_source) - # time.sleep(settings_cll.IMPLICTLY_WAIT) - # browser.find_element(By.ID,"reset-form").click() - - # time.sleep(settings_cll.IMPLICTLY_WAIT) - # Find phenotype by full name - # browser.find_element(By.ID,"search").send_keys(random_phenotype.strip()) - # browser.find_element(By.XPATH,'//button[@class = "btn btn-primary"]').click() - # self.assertTrue("No phenotypes" not in browser.page_source) - # time.sleep(settings_cll.IMPLICTLY_WAIT) - # browser.find_element(By.ID,"reset-form").click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - # Find by partial name of phenotype - self.create_test_phenotype("COVID-19 infection", - "desc", [i], - self.permitted_group, - False, - owner=self.owner_user, - author="author") - browser.find_element(By.ID, "search").send_keys("infection") - browser.find_element( - By.XPATH, '//button[@class = "btn btn-primary"]').click() - self.assertTrue("No phenotypes" not in browser.page_source) - browser.find_element(By.ID, "reset-form").click() - browser.find_elements(By.NAME, "collection_id")[i].click() - - def xx_test_deleted_phenotypes(self): - - self.login(su_user, su_password) - - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - checkboxes = browser.find_elements(By.NAME, "collection_id") - - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - # Iterate and check search by all tags except all tag - for i in range(1, len(checkboxes)): - browser.find_elements(By.NAME, "collection_id")[i].click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.ID, "show_deleted_phenotypes").click() - - browser.find_element( - By.XPATH, '//button[@class = "btn btn-primary"]').click() - - - self.assertTrue("cl-card-deleted" in - browser.page_source) - - browser.find_element(By.ID, "reset-form").click() - - browser.find_elements(By.NAME, "collection_id")[i].click() - - def xx_test_only_owned_phenotypes(self): - - # First login as superuser - self.login(su_user, su_password) - browser = self.browser - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.ID, "show_my_phenotypes").click() - - browser.find_element(By.XPATH, - '//button[@class = "btn btn-primary"]').click() - - self.assertTrue("No phenotypes" in browser.page_source) - - self.logout() - - # After login to owner and check owned phenotypes - self.login(ow_user, ow_password) - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.ID, "show_my_phenotypes").click() - - browser.find_element(By.XPATH, - '//button[@class = "btn btn-primary"]').click() - - self.assertTrue("No phenotypes" not in browser.page_source) - - def xx_test_author_filter(self): - - self.login(su_user, su_password) - browser = self.browser - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - checkboxes = browser.find_elements(By.NAME, "collection_id") - - # Check author name with author names of phenotype - for i in range(1, len(checkboxes)): - browser.find_elements(By.NAME, "collection_id")[i].click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.NAME, "author").send_keys("test_author") - - element = [ - k for k in browser.find_elements(By.CLASS_NAME, "col-sm-12") - if "test_author" in k.text - ] - - for j in range(1, len(element)): - self.assertEqual(element[j].text, "test_author") - - browser.find_elements(By.NAME, "collection_id")[i].click() - - def xx_test_phenotype_with_all_attributes(self): - self.login(ow_user, ow_password) - - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - browser.find_elements(By.NAME, "collection_id")[0].click() - - # Test phenotype which combines all filters - self.create_test_phenotype("test", - "desc", [1, 2, 3, 4, 5, 6, 7], - self.permitted_group, - False, - owner=self.owner_user, - author="owneruser") - - browser.find_element(By.NAME, "author").send_keys("owneruser") - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.ID, "search").send_keys("test") - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.NAME, "owner").send_keys("owneruser") - - browser.find_element(By.ID, "show_my_phenotypes").click() - - browser.find_element(By.XPATH, - '//button[@class = "btn btn-primary"]').click() - - self.assertTrue("No phenotypes" not in browser.page_source) - - """ - NOT FOR RELEASE 1 - def test_basic_to_advanced_search(self): - self.login(ow_user, ow_password) - - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - # Search phenotype in basic search - browser.find_element(By.ID,"search1").send_keys("Phenotype") - - browser.find_element(By.XPATH,'//button[@classxx = "btn btn-info"]').click() - - self.assertFalse(browser.find_element(By.ID,"search1").get_attribute("value") == "") - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - # Find phenotype in advanced search and go back to basic search to check the clear input - browser.find_element(By.XPATH,"//*[@id='show-advanced-search']").click() - - browser.find_element(By.XPATH,'//button[@class = "btn btn-primary"]').click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - self.assertTrue("No phenotypes" not in browser.page_source) - - browser.find_element(By.ID,"search").clear() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.XPATH,"//*[@id='show-basic-search']").click() - - self.assertTrue(browser.find_element(By.ID,"search1").get_attribute("value") == "") - - """ - - def xx_test_tag_input_bar(self): - self.login(ow_user, ow_password) - - browser = self.browser - - browser.get(self.WEBAPP_HOST + reverse('search_phenotypes')) - - browser.find_element(By.XPATH, - "//*[@id='show-advanced-search']").click() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.XPATH, - "//*[@class='bootstrap-tagsinput']").click() - - browser.find_element(By.CLASS_NAME, - "tt-input").send_keys("Phenotype_library") - - self.assertTrue("Nothing found." not in browser.page_source) - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.CLASS_NAME, "tt-input").clear() - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - browser.find_element(By.CLASS_NAME, "tt-input").send_keys("test") - - time.sleep(settings_cll.IMPLICTLY_WAIT) - - self.assertTrue("Nothing found." in browser.page_source) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_versioning.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_versioning.py deleted file mode 100644 index e49a364ef..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/test_versioning.py +++ /dev/null @@ -1,683 +0,0 @@ -import time -import xml.etree.ElementTree as ET -from datetime import datetime -from urllib.parse import urlparse - -from clinicalcode.db_utils import getGroupOfCodesByConceptId_HISTORICAL -from clinicalcode.models.Code import Code -from clinicalcode.models.CodeList import CodeList -from clinicalcode.models.Component import Component -from clinicalcode.models.Concept import * -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -from clinicalcode.views.Concept import concept_codes_to_csv -from clinicalcode.views.WorkingSet import workingset_to_csv -# from django.conf import settings -# from cll import settings as settings_cll -# from cll import test_settings as settings -from cll import test_settings as settings_cll -from django.contrib.staticfiles.testing import StaticLiveServerTestCase -from django.test import RequestFactory -from rest_framework.reverse import reverse -from selenium import webdriver -from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys -from selenium.webdriver.support import expected_conditions as EC -from selenium.webdriver.support.ui import WebDriverWait - - -class VersioningTest(StaticLiveServerTestCase): - - def setUp(self): - location = os.path.dirname(__file__) - if settings_cll.REMOTE_TEST: - self.browser = webdriver.Remote( - command_executor=settings_cll.REMOTE_TEST_HOST, - desired_capabilities=settings_cll.chrome_options. - to_capabilities()) - self.browser.implicitly_wait(settings_cll.IMPLICTLY_WAIT) - else: - if settings_cll.IS_LINUX: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver"), - chrome_options=settings_cll.chrome_options) - else: - self.browser = webdriver.Chrome( - os.path.join(location, "chromedriver.exe"), - chrome_options=settings_cll.chrome_options) - super(VersioningTest, self).setUp() - - super(VersioningTest, self).setUp() - - self.factory = RequestFactory() - - self.WEBAPP_HOST = self.live_server_url.replace('localhost', '127.0.0.1') - if settings_cll.REMOTE_TEST: - self.WEBAPP_HOST = settings_cll.WEBAPP_HOST - '''data''' - super_user = User.objects.create_superuser(username=su_user, password=su_password, email=None) - self.normal_user = User.objects.create_user(username=nm_user, password=nm_password, email=None) - owner_user = User.objects.create_user(username=ow_user, password=ow_password, email=None) - group_user = User.objects.create_user(username=gp_user, password=gp_password, email=None) - - # Groups: a group that is not permitted and one that is. - permitted_group = Group.objects.create(name="permitted_group") - # Add the group to the group-user's groups. - group_user.groups.add(permitted_group) - - coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - coding_system.save() - - self.concept_everybody_can_edit = Concept.objects.create( - name="concept everybody can edit", - description="concept description", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.EDIT) - - self.child_concept = Concept.objects.create( - name="child concept", - description="child concept", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.VIEW) - - self.component = Component.objects.create( - comment="child concept", - component_type=1, - concept=self.concept_everybody_can_edit, - concept_ref=self.child_concept, - created_by=owner_user, - logical_type=1, - name="child concept") - - self.component = Component.objects.create( - comment="Component visibility test", - component_type=2, - concept=self.concept_everybody_can_edit, - created_by=owner_user, - logical_type=1, - name="Component") - - self.code_list = CodeList.objects.create( - component=self.component, description="Code list visibility test") - self.code = Code.objects.create(code_list=self.code_list, - code="45554", - description="visibility test") - - # concept is updated two times to make hisotry - self.concept_everybody_can_edit.author = "the_test_goat2" - self.concept_everybody_can_edit.save() - self.concept_everybody_can_edit.author = "the_test_goat2" - self.concept_everybody_can_edit.save() - - concept_info_list = [{str(self.concept_everybody_can_edit.id):{"ttt|4":"yyy"}}] - - self.workingset_everybody_can_edit = WorkingSet.objects.create( - name="wokringset everybody can access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - created_by=super_user, - updated_by=super_user, - owner=owner_user, - concept_informations=concept_info_list, - concept_version={ - (str(self.concept_everybody_can_edit.id)): - str(self.concept_everybody_can_edit.history.first().history_id) - }, - group=permitted_group, - group_access=Permissions.VIEW, - owner_access=Permissions.VIEW, - world_access=Permissions.EDIT) - - # workingset is updated two times to make hisotry - self.workingset_everybody_can_edit.author = "the_test_goat2" - self.workingset_everybody_can_edit.save() - self.workingset_everybody_can_edit.author = "the_test_goat2" - self.workingset_everybody_can_edit.save() - - update_friendly_id() - save_stat(self.WEBAPP_HOST) - - def tearDown(self): - self.browser.quit() - super(VersioningTest, self).tearDown() - - def login(self, username, password): - self.logout() - self.browser.find_element(By.NAME, 'username').send_keys(username) - self.browser.find_element(By.NAME, 'password').send_keys(password) - self.browser.find_element(By.NAME, 'password').send_keys(Keys.ENTER) - - def logout(self): - self.browser.get( - '%s%s' % - (self.WEBAPP_HOST, '/account/logout/?next=/account/login/')) - - def wait_to_be_logged_in(self, username): - wait = WebDriverWait(self.browser, 10) - element = wait.until( - EC.text_to_be_present_in_element( - (By.CSS_SELECTOR, 'p.navbar-text'), username)) - - def get_codes_from_response(self, response): - response = response.splitlines() - response.pop(0) # remove headers - - codes = [] - - for r in response: - code = r.split(",")[0] - codes.append(code) - - codes.sort() - # self.output.sort() - print(("REPONSE_CODES: ", codes)) - - return codes - - ''' - Every version of a code list has a version ID (formerly the history ID) - ''' - - def test_concept_every_version_has_id(self): - self.login(nm_user, nm_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_detail', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - table = self.browser.find_element(By.ID, 'history-table') - table_rows = table.find_elements(By.TAG_NAME,'tr') - - i = 1 - for row in table_rows: - test = True - if i != 1: # omit first row which contains headers - table_data = row.find_elements(By.TAG_NAME,'td') - id = table_data[0].text - if id is None: - test = False - else: - try: - id = int(table_data[0].text) - except: - test = False - - self.assertTrue(test) - i += 1 - - def test_workingset_every_version_has_id(self): - self.login(ow_user, ow_password) - - browser = self.browser - print(("WORKINGSET ID", self.workingset_everybody_can_edit.id)) - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - # self.workingset_everybody_can_edit.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('workingset_detail', - kwargs={ - 'pk': self.workingset_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - # self.wait_to_be_logged_in(ow_user) - - table = self.browser.find_element(By.ID, 'history-table') - table_rows = table.find_elements(By.TAG_NAME,'tr') - - i = 1 - for row in table_rows: - test = True - if i != 1: # omit first row which contains headers - table_data = row.find_elements(By.TAG_NAME,'td') - id = table_data[0].text - if id is None: - test = False - else: - try: - id = int(table_data[0].text) - except: - test = False - - self.assertTrue(test) - i += 1 - - ''' - The version ID is displayed along with the title. - ''' - - def test_concept_every_version_has_title(self): - self.login(nm_user, nm_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_detail', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - table = self.browser.find_element(By.ID, 'history-table') - table_rows = table.find_elements(By.TAG_NAME,'tr') - - i = 1 - for row in table_rows: - test = True - if i != 1: # omit first row which contains headers - table_data = row.find_elements(By.TAG_NAME,'td') - title = table_data[1].text - self.assertEqual(title, self.concept_everybody_can_edit.name) - i += 1 - - def test_workingset_every_version_has_title(self): - self.login(ow_user, ow_password) - - browser = self.browser - print(("WORKINGSET ID", self.workingset_everybody_can_edit.id)) - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - # self.workingset_everybody_can_edit.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('workingset_detail', - kwargs={ - 'pk': self.workingset_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - table = self.browser.find_element(By.ID, 'history-table') - table_rows = table.find_elements(By.TAG_NAME,'tr') - - i = 1 - for row in table_rows: - test = True - if i != 1: # omit first row which contains headers - table_data = row.find_elements(By.TAG_NAME,'td') - title = table_data[1].text - self.assertEqual(title, - self.workingset_everybody_can_edit.name) - i += 1 - - ''' - There is a URL to refer to a specific version of a code list - ''' - - def test_concept_every_version_has_url(self): - self.login(nm_user, nm_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_detail', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - links = self.browser.find_elements(By.CLASS_NAME, 'version-link') - - id_index = 0 - for link in links: - url = link.get_attribute("href") - u = urlparse(url) - # check if url is valid - self.assertEqual(u.scheme, 'http') - path = u.path.split('/') - # check if url contains concept id - self.assertEqual(int(path[2]), self.concept_everybody_can_edit.id) - # check if url contains unique history id - version_id = self.concept_everybody_can_edit.history.all( - )[id_index].history_id - self.assertEqual(int(path[4]), version_id) - id_index += 1 - - def test_workingset_every_version_has_url(self): - self.login(ow_user, ow_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s' % (self.WEBAPP_HOST, '/workingsets/')) - - browser.get(self.WEBAPP_HOST + reverse('workingset_list')) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - links = self.browser.find_elements(By.CLASS_NAME, 'version-link') - - id_index = 0 - for link in links: - url = link.get_attribute("href") - u = urlparse(url) - # check if url is valid - self.assertEqual(u.scheme, 'http') - path = u.path.split('/') - # check if url contains workingset id - self.assertEqual(int(path[2]), - self.workingset_everybody_can_edit.id) - # check if url contains unique history id - version_id = self.workingset_everybody_can_edit.history.all( - )[id_index].history_id - self.assertEqual(int(path[4]), version_id) - id_index += 1 - - ''' - There is a URL that always refers to the latest version of a code list - ''' - - def test_concept_has_url_to_latest_ver(self): - - latest_version = self.concept_everybody_can_edit.history.first( - ).history_id - - self.login(nm_user, nm_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/version/', - # latest_version, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('concept_history_detail', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - 'concept_history_id': latest_version - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # url = ('%s%s%s' % ('/concepts/C', - # self.concept_everybody_can_edit.id, '/export/codes')) - - url = self.WEBAPP_HOST + reverse( - 'concept_codes_to_csv', - kwargs={'pk': self.concept_everybody_can_edit.id}) - request = self.factory.get(url) - request.user = self.normal_user - request.CURRENT_BRAND = '' - - # make export to csv request - response = concept_codes_to_csv(request, - self.concept_everybody_can_edit.id) - - codes = self.get_codes_from_response(response.content.decode('utf-8')) - - historical_codes = getGroupOfCodesByConceptId_HISTORICAL( - self.concept_everybody_can_edit.id, latest_version)[0]['code'] - - # test if live codes equals historical codes - self.assertEqual(codes[0], historical_codes) - - title = self.browser.find_element(By.TAG_NAME, 'h2').text - # title = self.browser.find_elements_by_tag_name('i') - - # test if page contains concept name - self.assertTrue(self.concept_everybody_can_edit.name in title) - - def test_workingset_has_url_to_latest_ver(self): - latest_version = self.workingset_everybody_can_edit.history.first( - ).history_id - - self.login(nm_user, nm_password) - - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s%s%s' % (self.WEBAPP_HOST, '/workingsets/WS', - # self.workingset_everybody_can_edit.id, '/version/', - # latest_version, '/detail/')) - - browser.get(self.WEBAPP_HOST + - reverse('workingset_history_detail', - kwargs={ - 'pk': self.workingset_everybody_can_edit.id, - 'workingset_history_id': latest_version - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # url = ('%s%s%s' % ('/workingsets/WS', - # self.workingset_everybody_can_edit.id, '/export/codes')) - - url = self.WEBAPP_HOST + reverse( - 'workingset_to_csv', - kwargs={'pk': self.workingset_everybody_can_edit.id}) - request = self.factory.get(url) - request.user = self.normal_user - request.CURRENT_BRAND = '' - - # make export to csv request - response = workingset_to_csv(request, - self.workingset_everybody_can_edit.id) - - codes = self.get_codes_from_response(response.content.decode('utf-8')) - - # check if workingset returns code contained by concept - self.assertEqual(codes, ['45554']) - - title = self.browser.find_element(By.TAG_NAME, 'h2').text - - # title = self.browser.find_elements_by_tag_name('i') - - # test if page contains concept name - self.assertTrue(self.workingset_everybody_can_edit.name in title) - - ''' - The API can get the latest version of a code list - ''' - - def test_concept_has_url_to_latest_ver_in_api(self): - latest_version = self.concept_everybody_can_edit.history.first().history_id - - self.login(nm_user, nm_password) - browser = self.browser - - browser.get(self.WEBAPP_HOST) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - # get the test server url - # browser.get('%s%s%s' % (self.WEBAPP_HOST, '/api/export_concept_codes/', - # self.concept_everybody_can_edit.id)) - - browser.get(self.WEBAPP_HOST + - reverse('api:api_export_concept_codes', - kwargs={'pk': self.concept_everybody_can_edit.id})) - - tree = ET.fromstring(browser.page_source) - - for x in tree.iter("concept_version_id"): - self.assertEqual(int(x.text), latest_version) - - def test_workingset_has_url_to_latest_ver_in_api(self): - latest_version = self.concept_everybody_can_edit.history.first().history_id - - self.login(nm_user, nm_password) - browser = self.browser - - browser.get(self.WEBAPP_HOST) - - browser.get(self.WEBAPP_HOST + reverse('api:api_export_workingset_codes', kwargs={'pk': self.workingset_everybody_can_edit.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - tree = ET.fromstring(browser.page_source) - - for x in tree.iter("concept_version_id"): - self.assertEqual(int(x.text), latest_version) - - ''' - The API can get a specific version of a code list - ''' - - def test_concept_api_get_specific_version(self): - - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get(self.WEBAPP_HOST) - - - browser.get(self.WEBAPP_HOST + - reverse('api:api_export_concept_codes', - kwargs={'pk': self.concept_everybody_can_edit.id})) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue( - self.code.code in browser.page_source - and self.concept_everybody_can_edit.name in browser.page_source) - - def test_workingset_api_get_specific_version(self): - - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - browser.get(self.WEBAPP_HOST) - - browser.get(self.WEBAPP_HOST + reverse( - 'api:api_export_workingset_codes_byVersionID', - kwargs={ - 'pk': - self.workingset_everybody_can_edit.id, - 'workingset_history_id': - self.workingset_everybody_can_edit.history.first().history_id - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - - self.assertTrue( - self.code.code in browser.page_source - and self.concept_everybody_can_edit.name in browser.page_source) - - ''' - When a child concept is added to a parent concept, it adds the latest version by default (but the version number can be changed). - ''' - - def test_latest_version_exist_after_adding_child(self): - # get latest version - latest_version = self.concept_everybody_can_edit.history.first( - ).history_id - - self.login(nm_user, nm_password) - browser = self.browser - # get the test server url - # browser.get('%s%s%s%s' % (self.WEBAPP_HOST, '/concepts/C', - # self.concept_everybody_can_edit.id, '/update/')) - browser.get(self.WEBAPP_HOST + - reverse('concept_update', - kwargs={ - 'pk': self.concept_everybody_can_edit.id, - })) - - time.sleep(settings_cll.TEST_SLEEP_TIME) - # add child - # try to add child - browser.find_element(By.ID, 'conceptTypes').click() - - browser.implicitly_wait(5) - browser.find_element(By.ID, 'addConcept').click() - - wait = WebDriverWait(self.browser, 10) - wait.until( - EC.presence_of_element_located((By.ID, "concept-search-text"))) - - concept_search_field = browser.find_element(By.ID, - "concept-search-text") - - time.sleep(3) # wait to load component form - - concept_search_field.send_keys("concept") - - time.sleep(3) # wait to load concept prompt - - concept_search_field.send_keys(Keys.DOWN) - concept_search_field.send_keys(Keys.ENTER) - - browser.find_element(By.ID, "saveBtn").click() - - time.sleep(4) # wait to submition be completed - - latest_version_after_adding_child = self.concept_everybody_can_edit.history.first( - ).history_id - self.assertNotEqual(latest_version, latest_version_after_adding_child) - - ''' - When a child concept is updated, the parent concept does not change - ''' - - def test_concept_version_when_child_concept_updated(self): - latest_version = self.concept_everybody_can_edit.history.first( - ).history_id - - self.child_concept.author = "the_test_goat2" - self.child_concept.save() - - latest_version_after_child_updatge = self.concept_everybody_can_edit.history.first( - ).history_id - - self.assertEqual(latest_version, latest_version_after_child_updatge) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/tests.py b/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/tests.py deleted file mode 100644 index a69704f9a..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/functional_tests/tests.py +++ /dev/null @@ -1,1413 +0,0 @@ -# from datetime import datetime -# from django.test import TestCase -# from django.contrib.auth.models import User -# from clinicalcode.models.CodingSystem import CodingSystem -# from clinicalcode.models.Concept import Concept -# from clinicalcode.models.Component import Component -# from clinicalcode.models.CodeList import CodeList -# from clinicalcode.models.Code import Code -# from clinicalcode.db_utils import getGroupOfCodesByConceptId -# -# -# # Create your tests here. -# -# -# class GroupConceptCodesTestCase(TestCase): -# -# @classmethod -# def setUpTestData(cls): -# ''' -# create all the concepts, components, code lists, code regexes and codes to use within the test database -# ''' -# user = User.objects.create_user( -# username="david", -# email="d.m.bown@swansea.ac.uk", -# password="password") -# -# coding_system = CodingSystem.objects.create( -# name="Lookup table", -# description="Lookup Codes for testing purposes", -# link=Google_website, -# database_connection_name="default", -# table_name="clinicalcode_lookup", -# code_column_name="code", -# desc_column_name="description") -# coding_system.save() -# -# concept_heart_disease_1 = Concept.objects.create( -# name="Heart disease 1", -# description="Heart disease 1", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.concept_heart_disease_1_id = concept_heart_disease_1.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=concept_heart_disease_1, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="1", description="Test 1") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="4", description="Test 4") -# Code.objects.create(code_list=code_list, code="11", description="Test 11") -# Code.objects.create(code_list=code_list, code="12", description="Test 12") -# Code.objects.create(code_list=code_list, code="16", description="Test 16") -# Code.objects.create(code_list=code_list, code="21", description="Test 21") -# Code.objects.create(code_list=code_list, code="24", description="Test 24") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=concept_heart_disease_1, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="45", description="Test 45") -# -# concept_heart_attack_2a = Concept.objects.create( -# name="Heart attack 2a", -# description="Heart attack 2a", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.concept_heart_attack_2a_id = concept_heart_attack_2a.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=concept_heart_attack_2a, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="2", description="Test 2") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=concept_heart_attack_2a, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="3", description="Test 3") -# -# concept_heart_failure_2b = Concept.objects.create( -# name="Heart failure 2b", -# description="Heart failure 2b", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.concept_heart_failure_2b_id = concept_heart_failure_2b.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=concept_heart_failure_2b, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="8", description="Test 8") -# Code.objects.create(code_list=code_list, code="12", description="Test 12") -# Code.objects.create(code_list=code_list, code="16", description="Test 16") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=concept_heart_failure_2b, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# concept_heart_attack_3a = Concept.objects.create( -# name="Heart attack 3a", -# description="Heart attack 3a", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.concept_heart_attack_3a_id = concept_heart_attack_3a.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=concept_heart_attack_3a, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="5", description="Test 5") -# Code.objects.create(code_list=code_list, code="6", description="Test 6") -# Code.objects.create(code_list=code_list, code="7", description="Test 7") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=concept_heart_attack_3a, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="7", description="Test 7") -# -# concept_heart_attack_3b = Concept.objects.create( -# name="Heart attack 3b", -# description="Heart attack 3b", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.concept_heart_attack_3b_id = concept_heart_attack_3b.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=concept_heart_attack_3b, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="4", description="Test 4") -# Code.objects.create(code_list=code_list, code="5", description="Test 5") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=concept_heart_attack_3b, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="4", description="Test 4") -# -# concept_heart_failure_3a = Concept.objects.create( -# name="Heart failure 3a", -# description="Heart failure 3a", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.concept_heart_failure_3a_id = concept_heart_failure_3a.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=concept_heart_failure_3a, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="8", description="Test 8") -# Code.objects.create(code_list=code_list, code="9", description="Test 9") -# Code.objects.create(code_list=code_list, code="10", description="Test 10") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=concept_heart_failure_3a, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="9", description="Test 9") -# -# concept_heart_failure_3b = Concept.objects.create( -# name="Heart failure 3b", -# description="Heart failure 3b", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.concept_heart_failure_3b_id = concept_heart_failure_3b.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=concept_heart_failure_3b, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="11", description="Test 11") -# Code.objects.create(code_list=code_list, code="12", description="Test 12") -# Code.objects.create(code_list=code_list, code="13", description="Test 13") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=concept_heart_failure_3b, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="12", description="Test 12") -# Code.objects.create(code_list=code_list2, code="13", description="Test 13") -# -# # add the concept links -# component = Component.objects.create( -# comment="Component 3 inclusion", -# component_type=1, -# concept=concept_heart_disease_1, -# concept_ref=concept_heart_attack_2a, -# created_by=user, -# logical_type=1, -# name="Component 3 inclusion") -# -# component = Component.objects.create( -# comment="Component 4 exclusion", -# component_type=1, -# concept=concept_heart_disease_1, -# concept_ref=concept_heart_failure_2b, -# created_by=user, -# logical_type=2, -# name="Component 4 exclusion") -# -# component = Component.objects.create( -# comment="Component 3 inclusion", -# component_type=1, -# concept=concept_heart_attack_2a, -# concept_ref=concept_heart_attack_3a, -# created_by=user, -# logical_type=1, -# name="Component 3 inclusion") -# -# component = Component.objects.create( -# comment="Component 4 exclusion", -# component_type=1, -# concept=concept_heart_attack_2a, -# concept_ref=concept_heart_attack_3b, -# created_by=user, -# logical_type=2, -# name="Component 4 exclusion") -# -# component = Component.objects.create( -# comment="Component 3 exclusion", -# component_type=1, -# concept=concept_heart_failure_2b, -# concept_ref=concept_heart_failure_3a, -# created_by=user, -# logical_type=2, -# name="Component 3 exclusion") -# -# component = Component.objects.create( -# comment="Component 4 inclusion", -# component_type=1, -# concept=concept_heart_failure_2b, -# concept_ref=concept_heart_failure_3b, -# created_by=user, -# logical_type=1, -# name="Component 4 inclusion") -# -# # test 2 -# # level 1 circ system -# circ_system_1 = Concept.objects.create( -# name="Circ system 1", -# description="Circ system 1", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.circ_system_1_id = circ_system_1.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=circ_system_1, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="2", description="Test 2") -# Code.objects.create(code_list=code_list, code="4", description="Test 4") -# Code.objects.create(code_list=code_list, code="6", description="Test 6") -# Code.objects.create(code_list=code_list, code="7", description="Test 7") -# Code.objects.create(code_list=code_list, code="8", description="Test 8") -# Code.objects.create(code_list=code_list, code="13", description="Test 13") -# Code.objects.create(code_list=code_list, code="16", description="Test 16") -# Code.objects.create(code_list=code_list, code="19", description="Test 19") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=circ_system_1, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="16", description="Test 16") -# Code.objects.create(code_list=code_list2, code="2", description="Test 2") -# # end of level 1 circ system -# -# # level 2 acute rheu -# acute_rheu_2a = Concept.objects.create( -# name="Acute rheu 2a", -# description="Acute rheu 2a", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.acute_rheu_2a_id = acute_rheu_2a.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=acute_rheu_2a, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="4", description="Test 4") -# Code.objects.create(code_list=code_list, code="8", description="Test 8") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=acute_rheu_2a, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="1", description="Test 1") -# # end of level 2 acute rheu -# -# # level 2 chronic rheu -# chronic_rheu_2b = Concept.objects.create( -# name="Chronic rheu 2b", -# description="Chronic rheu 2b", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.chronic_rheu_2b_id = chronic_rheu_2b.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=chronic_rheu_2b, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="2", description="Test 2") -# Code.objects.create(code_list=code_list, code="10", description="Test 10") -# Code.objects.create(code_list=code_list, code="12", description="Test 12") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=chronic_rheu_2b, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="3", description="Test 3") -# # end of level 2 chronic rheu -# -# # level 2 hypertensive dis -# hypertensive_dis_2c = Concept.objects.create( -# name="hypertensive dis 2c", -# description="hypertensive dis 2c", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.hypertensive_dis_2c_id = hypertensive_dis_2c.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=hypertensive_dis_2c, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="12", description="Test 12") -# Code.objects.create(code_list=code_list, code="7", description="Test 7") -# Code.objects.create(code_list=code_list, code="14", description="Test 14") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=hypertensive_dis_2c, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="8", description="Test 8") -# # end of level 2 hypertensive dis -# -# # level 3 heart inv -# heart_inv_3a = Concept.objects.create( -# name="Heart inv 3a", -# description="Heart inv 3a", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.heart_inv_3a_id = heart_inv_3a.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=heart_inv_3a, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="1", description="Test 1") -# Code.objects.create(code_list=code_list, code="6", description="Test 6") -# Code.objects.create(code_list=code_list, code="7", description="Test 7") -# Code.objects.create(code_list=code_list, code="8", description="Test 8") -# -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=heart_inv_3a, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="2", description="Test 2") -# Code.objects.create(code_list=code_list2, code="7", description="Test 7") -# # end of heart inv -# -# # no heart inv -# no_heart_inv_3b = Concept.objects.create( -# name="No heart 3b", -# description="No heart 3b", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.no_heart_inv_3b_id = no_heart_inv_3b.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=no_heart_inv_3b, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="7", description="Test 7") -# Code.objects.create(code_list=code_list, code="8", description="Test 8") -# Code.objects.create(code_list=code_list, code="9", description="Test 9") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=no_heart_inv_3b, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="9", description="Test 9") -# Code.objects.create(code_list=code_list2, code="12", description="Test 12") -# # end of level 3 no heart inv -# -# # level 3 mit dis -# mit_dis_3c = Concept.objects.create( -# name="Mit dis 3b", -# description="Mit dis 3b", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.mit_dis_3c_id = mit_dis_3c.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=mit_dis_3c, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="2", description="Test 2") -# Code.objects.create(code_list=code_list, code="4", description="Test 4") -# Code.objects.create(code_list=code_list, code="5", description="Test 5") -# Code.objects.create(code_list=code_list, code="10", description="Test 10") -# Code.objects.create(code_list=code_list, code="11", description="Test 11") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=mit_dis_3c, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="5", description="Test 5") -# Code.objects.create(code_list=code_list2, code="10", description="Test 10") -# # end of level 3 mit dis -# -# # level 3 renal dis -# renal_dis_3d = Concept.objects.create( -# name="Renal dis 3d", -# description="Renal dis 3d", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.renal_dis_3d_id = renal_dis_3d.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=renal_dis_3d, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="5", description="Test 5") -# Code.objects.create(code_list=code_list, code="6", description="Test 6") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=renal_dis_3d, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="5", description="Test 5") -# # end of level 3 renal dis -# -# # heart dis -# heart_dis_3e = Concept.objects.create( -# name="Heart dis 3e", -# description="Heart dis 3e", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.heart_dis_3e_id = heart_dis_3e.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=heart_dis_3e, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="4", description="Test 4") -# Code.objects.create(code_list=code_list, code="5", description="Test 5") -# Code.objects.create(code_list=code_list, code="8", description="Test 8") -# Code.objects.create(code_list=code_list, code="12", description="Test 12") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=heart_dis_3e, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="4", description="Test 4") -# Code.objects.create(code_list=code_list2, code="5", description="Test 5") -# # end of level 3 heart dis -# -# # level 4 stenosis -# stenosis_4a = Concept.objects.create( -# name="stenosis 4a", -# description="stenosis 4a", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.stenosis_4a_id = stenosis_4a.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=stenosis_4a, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="4", description="Test 4") -# Code.objects.create(code_list=code_list, code="5", description="Test 5") -# Code.objects.create(code_list=code_list, code="6", description="Test 6") -# Code.objects.create(code_list=code_list, code="8", description="Test 8") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=stenosis_4a, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="6", description="Test 6") -# # end of level 4 stenosis -# -# # level 4 valve -# valve_4b = Concept.objects.create( -# name="valve 4b", -# description="valve 4b", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.valve_4b_id = valve_4b.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=valve_4b, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="5", description="Test 5") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="1", description="Test 1") -# Code.objects.create(code_list=code_list, code="4", description="Test 4") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=valve_4b, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="5", description="Test 5") -# # end of level 4 valve -# -# # level 4 renal fail -# fail_4c = Concept.objects.create( -# name="fail_4c", -# description="fail_4c", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.fail_4c_id = fail_4c.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=fail_4c, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="5", description="Test 5") -# Code.objects.create(code_list=code_list, code="7", description="Test 7") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=fail_4c, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="8", description="Test 8") -# Code.objects.create(code_list=code_list2, code="7", description="Test 7") -# # end of level 4 renal fail -# -# # level 4 renal no fail -# no_fail_4d = Concept.objects.create( -# name="no_fail_4d", -# description="no_fail_4d", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.no_fail_4d_id = no_fail_4d.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=no_fail_4d, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="4", description="Test 4") -# Code.objects.create(code_list=code_list, code="7", description="Test 7") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=no_fail_4d, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="8", description="Test 8") -# # end of level 4 renal no fail -# -# # level 4 heart dis failure -# failure_4e = Concept.objects.create( -# name="failure_4e", -# description="failure_4e", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.failure_4e_id = failure_4e.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=failure_4e, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="9", description="Test 9") -# Code.objects.create(code_list=code_list, code="10", description="Test 10") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=failure_4e, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="10", description="Test 10") -# # end of level 4 heart dis failure -# -# # level 4 heart dis no fail -# no_fail_4f = Concept.objects.create( -# name="no_fail_4f", -# description="no_fail_4f", -# author="David Bown", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# shared=1, -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# editable=1, -# created_by=user, -# modified_by=user, -# coding_system=coding_system, -# is_deleted=False) -# cls.no_fail_4f_id = no_fail_4f.concept_id -# -# component = Component.objects.create( -# comment="Component 1 inclusion", -# component_type=2, -# concept=no_fail_4f, -# created_by=user, -# logical_type=1, -# name="Component 1 inclusion") -# -# code_list = CodeList.objects.create(component=component, description="Code list 1 inclusion") -# Code.objects.create(code_list=code_list, code="3", description="Test 3") -# Code.objects.create(code_list=code_list, code="9", description="Test 9") -# Code.objects.create(code_list=code_list, code="10", description="Test 10") -# -# component2 = Component.objects.create( -# comment="Component 2 exclusion", -# component_type=2, -# concept=no_fail_4f, -# created_by=user, -# logical_type=2, -# name="Component 2 exclusion") -# -# code_list2 = CodeList.objects.create(component=component2, description="Code list 2 exclusion") -# Code.objects.create(code_list=code_list2, code="10", description="Test 10") -# # end of level 4 heart dis no fail -# -# # add the concept links -# component = Component.objects.create( -# comment="Component 4 exclusion", -# component_type=1, -# concept=circ_system_1, -# concept_ref=acute_rheu_2a, -# created_by=user, -# logical_type=2, -# name="Component 4 exclusion") -# -# component = Component.objects.create( -# comment="Component 3 inclusion", -# component_type=1, -# concept=circ_system_1, -# concept_ref=chronic_rheu_2b, -# created_by=user, -# logical_type=1, -# name="Component 3 inclusion") -# -# component = Component.objects.create( -# comment="Component 5 exclusion", -# component_type=1, -# concept=circ_system_1, -# concept_ref=hypertensive_dis_2c, -# created_by=user, -# logical_type=2, -# name="Component 5 exclusion") -# -# component = Component.objects.create( -# comment="Component 5 exclusion", -# component_type=1, -# concept=acute_rheu_2a, -# concept_ref=heart_inv_3a, -# created_by=user, -# logical_type=2, -# name="Component 5 exclusion") -# -# component = Component.objects.create( -# comment="Component 3 inclusion", -# component_type=1, -# concept=acute_rheu_2a, -# concept_ref=no_heart_inv_3b, -# created_by=user, -# logical_type=1, -# name="Component 3 inclusion") -# -# component = Component.objects.create( -# comment="Component 3 inclusion", -# component_type=1, -# concept=chronic_rheu_2b, -# concept_ref=mit_dis_3c, -# created_by=user, -# logical_type=1, -# name="Component 3 inclusion") -# -# component = Component.objects.create( -# comment="Component 3 inclusion", -# component_type=1, -# concept=hypertensive_dis_2c, -# concept_ref=renal_dis_3d, -# created_by=user, -# logical_type=1, -# name="Component 3 inclusion") -# -# component = Component.objects.create( -# comment="Component 3 exclusion", -# component_type=1, -# concept=hypertensive_dis_2c, -# concept_ref=heart_dis_3e, -# created_by=user, -# logical_type=2, -# name="Component 3 exclusion") -# -# component = Component.objects.create( -# comment="Component 3 inclusion", -# component_type=1, -# concept=mit_dis_3c, -# concept_ref=stenosis_4a, -# created_by=user, -# logical_type=1, -# name="Component 3 inclusion") -# -# component = Component.objects.create( -# comment="Component 3 exclusion", -# component_type=1, -# concept=mit_dis_3c, -# concept_ref=valve_4b, -# created_by=user, -# logical_type=2, -# name="Component 3 exclusion") -# -# component = Component.objects.create( -# comment="Component 3 inclusion", -# component_type=1, -# concept=renal_dis_3d, -# concept_ref=fail_4c, -# created_by=user, -# logical_type=1, -# name="Component 3 inclusion") -# -# component = Component.objects.create( -# comment="Component 3 exclusion", -# component_type=1, -# concept=renal_dis_3d, -# concept_ref=no_fail_4d, -# created_by=user, -# logical_type=2, -# name="Component 3 exclusion") -# -# component = Component.objects.create( -# comment="Component 3 exclusion", -# component_type=1, -# concept=heart_dis_3e, -# concept_ref=failure_4e, -# created_by=user, -# logical_type=2, -# name="Component 3 exclusion") -# -# component = Component.objects.create( -# comment="Component 3 inclusion", -# component_type=1, -# concept=heart_dis_3e, -# concept_ref=no_fail_4f, -# created_by=user, -# logical_type=1, -# name="Component 3 inclusion") -# -# def test_export_concept_codes_heart_disease_1(self): -# codes = getGroupOfCodesByConceptId(self.concept_heart_disease_1_id) -# -# expected_result = [{'code': u'1', 'description': u'Test 1'}, {'code': u'2', 'description': u'Test 2'}, {'code': u'21', 'description': u'Test 21'}, {'code': u'24', 'description': u'Test 24'}, {'code': u'3', 'description': u'Test 3'}, {'code': u'4', 'description': u'Test 4'}, {'code': u'6', 'description': u'Test 6'}] -# -# self.assertEqual(len(codes), 7) -# self.assertListEqual(codes, expected_result) -# -# def test_export_concept_codes_heart_failure_3b(self): -# codes = getGroupOfCodesByConceptId(self.concept_heart_failure_3b_id) -# -# expected_result = [{'code': u'11', 'description': u'Test 11'}] -# -# self.assertEqual(len(codes), 1, msg="Codes returned do not match") -# self.assertListEqual(codes, expected_result) -# -# def test_export_concept_codes_heart_failure_3a(self): -# codes = getGroupOfCodesByConceptId(self.concept_heart_failure_3a_id) -# -# expected_result = [{'code': u'10', 'description': u'Test 10'}, {'code': u'8', 'description': u'Test 8'}] -# -# self.assertEqual(len(codes), 2, msg="Codes returned do not match") -# self.assertListEqual(codes, expected_result) -# -# def test_export_concept_codes_heart_attack_3b(self): -# codes = getGroupOfCodesByConceptId(self.concept_heart_attack_3b_id) -# -# expected_result = [{'code': u'5', 'description': u'Test 5'}] -# -# self.assertEqual(len(codes), 1, msg="Codes returned do not match") -# self.assertListEqual(codes, expected_result) -# -# def test_export_concept_codes_heart_attack_3a(self): -# codes = getGroupOfCodesByConceptId(self.concept_heart_attack_3a_id) -# -# expected_result = [{'code': u'5', 'description': u'Test 5'}, {'code': u'6', 'description': u'Test 6'}] -# -# self.assertEqual(len(codes), 2, msg="Codes returned do not match") -# self.assertListEqual(codes, expected_result) -# -# def test_export_concept_codes_heart_attack_2a(self): -# codes = getGroupOfCodesByConceptId(self.concept_heart_attack_2a_id) -# -# expected_result = [{'code': u'2', 'description': u'Test 2'}, {'code': u'6', 'description': u'Test 6'}] -# -# self.assertEqual(len(codes), 2, msg="Codes returned do not match") -# self.assertListEqual(codes, expected_result) -# -# def test_export_concept_codes_heart_failure_2b(self): -# codes = getGroupOfCodesByConceptId(self.concept_heart_failure_2b_id) -# -# expected_result = [{'code': u'11', 'description': u'Test 11'}, {'code': u'12', 'description': u'Test 12'}, {'code': u'16', 'description': u'Test 16'}] -# -# self.assertEqual(len(codes), 3, msg="Codes returned do not match") -# self.assertListEqual(codes, expected_result) -# -# def test_group_circ_system_1(self): -# codes = getGroupOfCodesByConceptId(self.circ_system_1_id) -# -# expected_result = [{'code': u'8', 'description': u'Test 8'}, {'code': u'13', 'description': u'Test 13'}, {'code': u'19', 'description': u'Test 19'}, {'code': u'2', 'description': u'Test 2'}, {'code': u'10', 'description': u'Test 10'}, {'code': u'11', 'description': u'Test 11'}, {'code': u'12', 'description': u'Test 12'}] -# -# self.assertEqual(len(codes), 7) -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_acute_rheu_2a(self): -# codes = getGroupOfCodesByConceptId(self.acute_rheu_2a_id) -# -# expected_result = [{'code': u'3', 'description': u'Test 3'}, {'code': u'4', 'description': u'Test 4'}, {'code': u'7', 'description': u'Test 7'}] -# -# self.assertEqual(len(codes), 3, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_chronic_rheu_2b(self): -# codes = getGroupOfCodesByConceptId(self.chronic_rheu_2b_id) -# -# expected_result = [{'code': u'2', 'description': u'Test 2'}, {'code': u'10', 'description': u'Test 10'}, {'code': u'8', 'description': u'Test 8'}, {'code': u'11', 'description': u'Test 11'}, {'code': u'12', 'description': u'Test 12'}, {'code': u'5', 'description': u'Test 5'}] -# -# self.assertEqual(len(codes), 6, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_hypertensive_dis_2c(self): -# codes = getGroupOfCodesByConceptId(self.hypertensive_dis_2c_id) -# -# expected_result = [{'code': u'6', 'description': u'Test 6'}, {'code': u'5', 'description': u'Test 5'}, {'code': u'7', 'description': u'Test 7'}, {'code': u'14', 'description': u'Test 14'}] -# -# self.assertEqual(len(codes), 4, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_heart_inv_3a(self): -# codes = getGroupOfCodesByConceptId(self.heart_inv_3a_id) -# -# expected_result = [{'code': u'6', 'description': u'Test 6'}, {'code': u'8', 'description': u'Test 8'}, {'code': u'1', 'description': u'Test 1'}] -# -# self.assertEqual(len(codes), 3, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_no_heart_inv_3b(self): -# codes = getGroupOfCodesByConceptId(self.no_heart_inv_3b_id) -# -# expected_result = [{'code': u'7', 'description': u'Test 7'}, {'code': u'8', 'description': u'Test 8'}] -# -# self.assertEqual(len(codes), 2, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_mit_dis_3c(self): -# codes = getGroupOfCodesByConceptId(self.mit_dis_3c_id) -# -# expected_result = [{'code': u'2', 'description': u'Test 2'}, {'code': u'5', 'description': u'Test 5'}, {'code': u'8', 'description': u'Test 8'}, {'code': u'11', 'description': u'Test 11'}] -# -# self.assertEqual(len(codes), 4, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_renal_dis_3d(self): -# codes = getGroupOfCodesByConceptId(self.renal_dis_3d_id) -# -# expected_result = [{'code': u'6', 'description': u'Test 6'}, {'code': u'5', 'description': u'Test 5'}] -# -# self.assertEqual(len(codes), 2, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_heart_dis_3e(self): -# codes = getGroupOfCodesByConceptId(self.heart_dis_3e_id) -# -# expected_result = [ {'code': u'12', 'description': u'Test 12'}, {'code': u'8', 'description': u'Test 8'}] -# -# self.assertEqual(len(codes), 2, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_stenosis_4a(self): -# codes = getGroupOfCodesByConceptId(self.stenosis_4a_id) -# -# expected_result = [{'code': u'4', 'description': u'Test 4'}, {'code': u'5', 'description': u'Test 5'}, {'code': u'8', 'description': u'Test 8'}] -# -# self.assertEqual(len(codes), 3, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_valve_4b(self): -# codes = getGroupOfCodesByConceptId(self.valve_4b_id) -# -# expected_result = [{'code': u'3', 'description': u'Test 3'}, {'code': u'1', 'description': u'Test 1'}, {'code': u'4', 'description': u'Test 4'}] -# -# self.assertEqual(len(codes), 3, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_fail_4c(self): -# codes = getGroupOfCodesByConceptId(self.fail_4c_id) -# -# expected_result = [{'code': u'5', 'description': u'Test 5'}, {'code': u'3', 'description': u'Test 3'}] -# -# self.assertEqual(len(codes), 2, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_no_fail_4d(self): -# codes = getGroupOfCodesByConceptId(self.no_fail_4d_id) -# -# expected_result = [{'code': u'3', 'description': u'Test 3'}, {'code': u'7', 'description': u'Test 7'}, {'code': u'4', 'description': u'Test 4'}] -# -# self.assertEqual(len(codes), 3, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_failure_4e(self): -# codes = getGroupOfCodesByConceptId(self.failure_4e_id) -# -# expected_result = [{'code': u'3', 'description': u'Test 3'}, {'code': u'9', 'description': u'Test 9'}] -# -# self.assertEqual(len(codes), 2, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) -# -# def test_export_concept_codes_no_fail_4f(self): -# codes = getGroupOfCodesByConceptId(self.no_fail_4f_id) -# -# expected_result = [{'code': u'3', 'description': u'Test 3'}, {'code': u'9', 'description': u'Test 9'}] -# -# self.assertEqual(len(codes), 2, msg="Codes returned do not match") -# self.assertListEqual(sorted(codes), sorted(expected_result)) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/test_base.py b/CodeListLibrary_project/clinicalcode/tests/legacy/test_base.py deleted file mode 100644 index f9e9c2f44..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/test_base.py +++ /dev/null @@ -1,77 +0,0 @@ -''' - Test base class - Set-up and tear-down etc. which are common for unit and functional tests. -''' -import os -import time - -import requests - -import urllib3 -from django.db import connection, connections # , transaction -from rest_framework.reverse import reverse - -SCREEN_DUMP_LOCATION = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'screendumps') -''' - Global test parameters. -''' -su_user = 'superuser' -su_password = 'superuserPassword' -ow_user = 'owneruser' -ow_password = 'owneruserPassword' -gp_user = 'groupuser' -gp_password = 'groupuserPassword' -vgp_user = 'viewGroupUser' -vgp_password = 'viewGroupUserPassword' -egp_user = 'editGroupUser' -egp_password = 'editGroupUserPassword' -nm_user = 'reginald' -nm_password = 'reginaldspassword' -Google_website = "https://www.google.com" - - -def update_friendly_id(): - update_sqls = [ - "UPDATE clinicalcode_historicalconcept SET friendly_id = concat('C', cast(id as text));", - "UPDATE clinicalcode_concept SET friendly_id = concat('C', cast(id as text));", - "UPDATE clinicalcode_historicalworkingset SET friendly_id = concat('WS', cast(id as text));", - "UPDATE clinicalcode_workingset SET friendly_id = concat('WS', cast(id as text));" - ] - - for sql in update_sqls: - with connection.cursor() as cursor: - try: - cursor.execute(sql) - except: - pass - - print("###### update_friendly_id #############################") - - -def save_stat000(host): - url_run = host + reverse("HDRUK_run_statistics") - resp_stat = requests.get(url_run) - - - print((str(resp_stat.status) + "#### Run-stat ####")) - - url_save = host + reverse("collections_run_filters") - resp_stat = requests.get(url_save) - - print((str(resp_stat.status) + "#### Run-stat-filters save ####")) - -def save_stat(host): - http = urllib3.PoolManager() - - url_run = host + "/admin/run-stat/" - resp_stat = http.request("GET", url_run) - - print("#### Run-stat- HDRUK home page ####" + "(status-code= " + str(resp_stat.status) + ")") - - url_save = host + "/admin/run-stat-filters/" - resp_stat = http.request("GET", url_save) - - print("#### Run-stat-filters save ####" + "(status-code= " + str(resp_stat.status) + ")") - - - \ No newline at end of file diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_test_base.py b/CodeListLibrary_project/clinicalcode/tests/legacy/unit_test_base.py deleted file mode 100644 index f14506d7e..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_test_base.py +++ /dev/null @@ -1,5 +0,0 @@ -''' - Unit test base class - - Set-up and tear-down etc. for unit tests tests. -''' diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/__init__.py b/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/read_only/__init__.py b/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/read_only/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/read_only/test_read_only_conf_concept.py b/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/read_only/test_read_only_conf_concept.py deleted file mode 100644 index 611a73737..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/read_only/test_read_only_conf_concept.py +++ /dev/null @@ -1,119 +0,0 @@ -import sys -from datetime import datetime -from unittest import skip, skipIf - -from clinicalcode.models.Concept import * -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -from decouple import Config, RepositoryEnv -from django.conf import settings -from django.test import TestCase, override_settings - -''' - If arguments does not contain read_only substring then skip the test - because it means that read only settings are not used and tests will fail. - See manage.py to see how it works. -''' - - -@skipIf('read_only' not in sys.argv[-1], "READ ONLY TEST SKIPPED") -class ReadOnlyTest(TestCase): - - @classmethod - def setUpTestData(cls): - - # Users: a normal user and a super_user. - super_user = User.objects.create_superuser(username=su_user, - password=su_password, - email=None) - normal_user = User.objects.create_user(username=nm_user, - password=nm_password, - email=None) - owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - group_user = User.objects.create_user(username=gp_user, - password=gp_password, - email=None) - view_group_user = User.objects.create_user(username=vgp_user, - password=vgp_password, - email=None) - edit_group_user = User.objects.create_user(username=egp_user, - password=egp_password, - email=None) - - # Groups: a group that is not permitted and one that is. - permitted_group = Group.objects.create(name="permitted_group") - forbidden_group = Group.objects.create(name="forbidden_group") - view_group = Group.objects.create(name="view_group") - edit_group = Group.objects.create(name="edit_group") - # Add the group to the group-user's groups. - group_user.groups.add(permitted_group) - view_group_user.groups.add(view_group) - edit_group_user.groups.add(edit_group) - - coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - coding_system.save() - - cls.concept_everybody_can_edit = Concept.objects.create( - name="concept_noone_can_access", - description="concept_noone_can_access", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.EDIT) - - ''' - A concept owner cannot edit. - ''' - - def test_owner_not_allowed_to_edit(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit(None, - Concept, - ReadOnlyTest.concept_everybody_can_edit.id, - user=owner) - self.assertFalse(permitted) - - ''' - A user cannot create a new concept. - ''' - - def test_user_not_allowed_to_create(self): - permitted = allowed_to_create() - self.assertFalse(permitted) - - ''' - A super user CANNOT create, edit, revert, or fork a concept. - ''' - - def test_super_user_not_allowed_to_edit(self): - super = User.objects.get(username=su_user) - permitted = allowed_to_edit(None, - Concept, - ReadOnlyTest.concept_everybody_can_edit.id, - user=super) - self.assertFalse(permitted) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/read_only/test_read_only_conf_workingset.py b/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/read_only/test_read_only_conf_workingset.py deleted file mode 100644 index e0896b8c4..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/read_only/test_read_only_conf_workingset.py +++ /dev/null @@ -1,105 +0,0 @@ -import sys -from datetime import datetime -from unittest import skip, skipIf - -from clinicalcode.models.Concept import * -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -from decouple import Config, RepositoryEnv -from django.test import TestCase, override_settings - -''' - If arguments does not contain read_only substring then skip the test - because it means that read only settings are not used and tests will fail. - See manage.py to see how it works. -''' - - -@skipIf('read_only' not in sys.argv[-1], "READ ONLY TEST SKIPPED") -class ReadOnlyTest(TestCase): - - @classmethod - def setUpTestData(cls): - - # Users: a normal user and a super_user. - super_user = User.objects.create_superuser(username=su_user, - password=su_password, - email=None) - normal_user = User.objects.create_user(username=nm_user, - password=nm_password, - email=None) - owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - group_user = User.objects.create_user(username=gp_user, - password=gp_password, - email=None) - view_group_user = User.objects.create_user(username=vgp_user, - password=vgp_password, - email=None) - edit_group_user = User.objects.create_user(username=egp_user, - password=egp_password, - email=None) - - # Groups: a group that is not permitted and one that is. - permitted_group = Group.objects.create(name="permitted_group") - forbidden_group = Group.objects.create(name="forbidden_group") - view_group = Group.objects.create(name="view_group") - edit_group = Group.objects.create(name="edit_group") - # Add the group to the group-user's groups. - group_user.groups.add(permitted_group) - view_group_user.groups.add(view_group) - edit_group_user.groups.add(edit_group) - - cls.workingset_everybody_can_edit = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{"concept1": "id"}], - created_by=super_user, - updated_by=super_user, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.EDIT) - - ''' - A working set owner cannot edit. - ''' - - def test_owner_not_allowed_to_edit(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit( - None, - WorkingSet, - ReadOnlyTest.workingset_everybody_can_edit.id, - user=owner) - self.assertFalse(permitted) - - ''' - A user cannot create a new working set. - ''' - - def test_user_not_allowed_to_create(self): - permitted = allowed_to_create() - self.assertFalse(permitted) - - ''' - A super user CANNOT create, edit, revert, or fork a working set. - ''' - - def test_super_user_not_allowed_to_edit(self): - super = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - WorkingSet, - ReadOnlyTest.workingset_everybody_can_edit.id, - user=super) - self.assertFalse(permitted) diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/test_permissions.py b/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/test_permissions.py deleted file mode 100644 index 21fe313b0..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/test_permissions.py +++ /dev/null @@ -1,854 +0,0 @@ -# ''' -# Unit Tests for Permissions -# -# For deciding who gets to access what. -# ''' -# -# from django.test import TestCase -# # Test system imports specifically for these tests. -# from clinicalcode.tests.test_base import * -# from clinicalcode.tests.unit_test_base import * -# from clinicalcode.permissions import * -# # Additional imports to support these tests. -# from clinicalcode.models.Concept import * -# # Additional imports to support test database creation. -# from datetime import datetime -# -# -# class PermissionTest(TestCase): -# -# def test_permission_values(self): -# ''' -# Check that the values to be used in the database are expected and -# make sure that if they are changed, this test asks that that is -# correct. -# !!! This is intentional constants checking. -# ''' -# self.assertEqual(Permissions.NONE, 1) -# self.assertEqual(Permissions.VIEW, 2) -# self.assertEqual(Permissions.EDIT, 3) -# -# -# def allowed_to_view_concept(self, user_name, user_password, concept): -# user = User.objects.get(username=user_name); -# login = self.client.login(username=user_name, password=user_password) -# self.assertTrue(login) -# permitted = allowed_to_view(user, Concept, concept) -# return permitted -# -# -# def allowed_to_edit_concept(self, user_name, user_password, concept): -# user = User.objects.get(username=user_name); -# login = self.client.login(username=user_name, password=user_password) -# self.assertTrue(login) -# permitted = allowed_to_edit(user, Concept, concept) -# return permitted -# -# -# def test_concept_view_permissions(self): -# ''' -# Test Concept view permission. -# - that we must be logged-in -# - that a superuser can always access a Concept -# - that we can only access as the owner if we have View/Edit -# permission -# - that we can only access as the group-member if we belong to a -# group with View/Edit permission -# - that we can only access as the otherwise if everyone has -# View/Edit permission -# - that we are allowed to view if we have edit permission -# ''' -# def test_not_allowed_to_view_when_not_loggedin(self): -# user = User.objects.get(username=nm_user); -# self.client.logout() -# permitted = allowed_to_view(user, Concept, -# PermissionTest.concept_noone_can_access.id) -# self.assertFalse(permitted) -# -# def test_allowed_to_view_when_everyone_is(self): -# self.assertTrue( -# self.allowed_to_view_concept(gp_user, gp_password, -# PermissionTest.concept_everyone_can_view.id)) -# -# def test_allowed_to_view_when_in_group(self): -# self.assertTrue( -# self.allowed_to_view_concept(gp_user, gp_password, -# PermissionTest.concept_group_can_view.id)) -# -# def test_not_allowed_to_view_when_not_in_group(self): -# self.assertFalse( -# self.allowed_to_view_concept(nm_user, nm_password, -# PermissionTest.concept_group_can_view.id)) -# self.assertFalse( -# self.allowed_to_view_concept(ow_user, ow_password, -# PermissionTest.concept_group_can_view.id)) -# -# def test_allowed_to_view_when_owner(self): -# self.assertTrue( -# self.allowed_to_view_concept(ow_user, ow_password, -# PermissionTest.concept_owner_can_view.id)) -# -# def test_not_allowed_to_view_when_not_owner(self): -# self.assertFalse( -# self.allowed_to_view_concept(nm_user, nm_password, -# PermissionTest.concept_owner_can_view.id)) -# self.assertFalse( -# self.allowed_to_view_concept(gp_user, gp_password, -# PermissionTest.concept_owner_can_view.id)) -# -# def test_allowed_to_view_when_superuser(self): -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_noone_can_access.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_owner_can_view.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_group_can_view.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_owner_and_group_can_view.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_everyone_and_owner_can_view.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_everyone_and_group_can_view.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_everyone_and_group_and_owner_can_view.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_everyone_can_view.id)) -# -# -# print"test_concept_view_permissions" -# test_not_allowed_to_view_when_not_loggedin(self) -# test_allowed_to_view_when_everyone_is(self) -# test_allowed_to_view_when_superuser(self) -# test_allowed_to_view_when_in_group(self) -# test_not_allowed_to_view_when_not_in_group(self) -# test_allowed_to_view_when_owner(self) -# test_not_allowed_to_view_when_not_owner(self) -# -# def test_concept_view_with_edit_permissions(self): -# ''' -# Test Concept view access with edit permission. -# Same tests as for view access with view permission but with -# concepts that have EDIT rather than VIEW permission. -# ''' -# def test_allowed_to_view_when_everyone_is(self): -# self.assertTrue( -# self.allowed_to_view_concept(gp_user, gp_password, -# PermissionTest.concept_everyone_can_edit.id)) -# -# def test_allowed_to_view_when_in_group(self): -# self.assertTrue( -# self.allowed_to_view_concept(gp_user, gp_password, -# PermissionTest.concept_group_can_edit.id)) -# -# def test_not_allowed_to_view_when_not_in_group(self): -# self.assertFalse( -# self.allowed_to_view_concept(nm_user, nm_password, -# PermissionTest.concept_group_can_edit.id)) -# self.assertFalse( -# self.allowed_to_view_concept(ow_user, ow_password, -# PermissionTest.concept_group_can_edit.id)) -# -# def test_allowed_to_view_when_owner(self): -# self.assertTrue( -# self.allowed_to_view_concept(ow_user, ow_password, -# PermissionTest.concept_owner_can_edit.id)) -# -# def test_not_allowed_to_view_when_not_owner(self): -# self.assertFalse( -# self.allowed_to_view_concept(nm_user, nm_password, -# PermissionTest.concept_owner_can_edit.id)) -# self.assertFalse( -# self.allowed_to_view_concept(gp_user, gp_password, -# PermissionTest.concept_owner_can_edit.id)) -# -# def test_allowed_to_view_when_superuser(self): -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_owner_can_edit.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_group_can_edit.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_owner_and_group_can_edit.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_everyone_and_owner_can_edit.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_everyone_and_group_can_edit.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_everyone_and_group_and_owner_can_edit.id)) -# self.assertTrue( -# self.allowed_to_view_concept(su_user, su_password, -# PermissionTest.concept_everyone_can_edit.id)) -# -# -# print"test_concept_view_with_edit_permissions" -# test_allowed_to_view_when_everyone_is(self) -# test_allowed_to_view_when_superuser(self) -# test_allowed_to_view_when_in_group(self) -# test_not_allowed_to_view_when_not_in_group(self) -# test_allowed_to_view_when_owner(self) -# test_not_allowed_to_view_when_not_owner(self) -# -# def test_concept_edit_permissions(self): -# ''' -# Test Concept edit permission. -# Same tests as for view permission except that we are testing that -# we are allowed to edit with concepts with EDIT permission. -# Add tests that we are not allowed to edit the VIEW permitted -# concepts. -# ''' -# def test_not_allowed_to_edit_when_not_loggedin(self): -# user = User.objects.get(username=nm_user); -# self.client.logout() -# permitted = allowed_to_edit(user, Concept, -# PermissionTest.concept_noone_can_access.id) -# self.assertFalse(permitted) -# -# def test_allowed_to_edit_when_everyone_is(self): -# self.assertTrue( -# self.allowed_to_edit_concept(gp_user, gp_password, -# PermissionTest.concept_everyone_can_edit.id)) -# -# def test_not_allowed_to_edit_when_everyone_can_view(self): -# self.assertFalse( -# self.allowed_to_edit_concept(gp_user, gp_password, -# PermissionTest.concept_everyone_can_view.id)) -# -# def test_allowed_to_edit_when_in_group(self): -# self.assertTrue( -# self.allowed_to_edit_concept(gp_user, gp_password, -# PermissionTest.concept_group_can_edit.id)) -# -# def test_not_allowed_to_edit_when_in_group_can_view(self): -# self.assertFalse( -# self.allowed_to_edit_concept(gp_user, gp_password, -# PermissionTest.concept_group_can_view.id)) -# -# def test_not_allowed_to_edit_when_in_view_group(self): -# self.assertFalse( -# self.allowed_to_edit_concept(vgp_user, vgp_password, -# PermissionTest.concept_group_can_edit.id)) -# -# def test_not_allowed_to_edit_when_not_in_group(self): -# self.assertFalse( -# self.allowed_to_edit_concept(nm_user, nm_password, -# PermissionTest.concept_group_can_edit.id)) -# self.assertFalse( -# self.allowed_to_edit_concept(ow_user, ow_password, -# PermissionTest.concept_group_can_edit.id)) -# -# def test_allowed_to_edit_when_owner(self): -# self.assertTrue( -# self.allowed_to_edit_concept(ow_user, ow_password, -# PermissionTest.concept_owner_can_edit.id)) -# -# def test_not_allowed_to_edit_when_owner_can_view(self): -# self.assertFalse( -# self.allowed_to_edit_concept(ow_user, ow_password, -# PermissionTest.concept_owner_can_view.id)) -# -# def test_not_allowed_to_edit_when_not_owner(self): -# self.assertFalse( -# self.allowed_to_edit_concept(nm_user, nm_password, -# PermissionTest.concept_owner_can_edit.id)) -# self.assertFalse( -# self.allowed_to_edit_concept(gp_user, gp_password, -# PermissionTest.concept_owner_can_edit.id)) -# -# def test_allowed_to_edit_when_superuser(self): -# self.assertTrue( -# self.allowed_to_edit_concept(su_user, su_password, -# PermissionTest.concept_noone_can_access.id)) -# self.assertTrue( -# self.allowed_to_edit_concept(su_user, su_password, -# PermissionTest.concept_owner_can_edit.id)) -# self.assertTrue( -# self.allowed_to_edit_concept(su_user, su_password, -# PermissionTest.concept_group_can_edit.id)) -# self.assertTrue( -# self.allowed_to_edit_concept(su_user, su_password, -# PermissionTest.concept_owner_and_group_can_edit.id)) -# self.assertTrue( -# self.allowed_to_edit_concept(su_user, su_password, -# PermissionTest.concept_everyone_and_owner_can_edit.id)) -# self.assertTrue( -# self.allowed_to_edit_concept(su_user, su_password, -# PermissionTest.concept_everyone_and_group_can_edit.id)) -# self.assertTrue( -# self.allowed_to_edit_concept(su_user, su_password, -# PermissionTest.concept_everyone_and_group_and_owner_can_edit.id)) -# self.assertTrue( -# self.allowed_to_edit_concept(su_user, su_password, -# PermissionTest.concept_everyone_can_edit.id)) -# -# -# print"test_concept_edit_permissions" -# test_not_allowed_to_edit_when_not_loggedin(self) -# test_allowed_to_edit_when_everyone_is(self) -# test_allowed_to_edit_when_in_group(self) -# test_not_allowed_to_edit_when_not_in_group(self) -# test_allowed_to_edit_when_owner(self) -# test_not_allowed_to_edit_when_owner_can_view(self) -# test_not_allowed_to_edit_when_not_owner(self) -# test_allowed_to_edit_when_superuser(self) -# test_not_allowed_to_edit_when_everyone_can_view(self) -# test_not_allowed_to_edit_when_in_group_can_view(self) -# -# def test_not_allowed_to_edit_when_not_loggedin(self): -# user = User.objects.get(username=nm_user); -# self.client.logout() -# response = self.client.get('/') -# permitted = allowed_to_edit(user, Concept, -# PermissionTest.concept_noone_can_access.id) -# self.assertFalse(permitted) -# -# -# def test_not_allowed_to_edit_when_normaluser(self): -# user = User.objects.get(username=nm_user); -# login = self.client.login(username=nm_user, password=nm_password) -# self.assertTrue(login) -# response = self.client.get('/') -# permitted = allowed_to_edit(user, Concept, -# PermissionTest.concept_noone_can_access.id) -# self.client.logout() -# self.assertFalse(permitted) -# -# -# def test_allowed_to_edit_when_superuser(self): -# user = User.objects.get(username=su_user); -# login = self.client.login(username=su_user, password=su_password) -# self.assertTrue(login) -# response = self.client.get('/') -# permitted = allowed_to_edit(user, Concept, -# PermissionTest.concept_noone_can_access.id) -# self.client.logout() -# self.assertTrue(permitted) -# -# """ -# def test_not_allowed_to_edit_when_normaluser(self): -# user = User.objects.get(username=nm_user); -# login = self.client.login(username=nm_user, password=nm_password) -# self.assertTrue(login) -# response = self.client.get('/') -# permitted = allowed_to_edit(user, Concept, -# PermissionTest.concept_noone_can_access.id) -# self.client.logout() -# self.assertFalse(permitted) -# """ -# -# """ -# base_url = 'http://localhost:8000' -# login_url = base_url + '/account/login?next=/' -# su_user = 'pete' -# su_password = 'geiriauwedieillyncu' -# user = 'pete.arnold' -# password = 'llyncugeiriau' -# test_urls = ['/concepts', '/workingset', -# '/concepts/200/detail', '/concepts/200/update'] -# test_api_urls = ['/api'] -# -# @wait -# def wait_to_be_redirected_to_signin(self): -# print "Waiting for redirection ... ", self.login_url -# signinbar = self.browser.find_element_by_css_selector('div.panel-title') -# print signinbar.text -# self.assertIn('Sign In', signinbar.text) -# -# -# @wait -# def wait_to_be_redirected_to_api_noauth(self): -# print "Waiting for redirection to unauthorised API page ... " -# noauth_json = self.browser.find_elements_by_css_selector('.str') -# self.assertEqual(len(noauth_json), 2) -# print noauth_json.text[1] -# self.assertIn('"Authentication credentials were not provided."', noauth_json.text[1]) -# -# -# @wait -# def wait_to_be_logged_in(self, username): -# print "Waiting for login ... ", self.login_url -# navbar = self.browser.find_element_by_css_selector('p.navbar-text') -# print navbar.text -# self.assertIn(username, navbar.text) -# -# -# def log_inout(self, username, password): -# self.wait_to_be_redirected_to_signin() -# -# self.browser.find_element_by_name('username').send_keys(username) -# self.browser.find_element_by_name('password').send_keys(password) -# self.browser.find_element_by_name('password').send_keys(Keys.ENTER) -# -# self.wait_to_be_logged_in(username) -# -# self.browser.find_element_by_class_name('navbar-link').click() -# -# self.wait_to_be_redirected_to_signin() -# -# -# def can_log_inout_superuser(self): -# print "Permissions:unit-tests:test_can_log_inout_superuser." -# print "Logging in as ", self.su_user , ", ", self.su_password, " to ", self.login_url -# self.browser.get(self.login_url) -# self.log_inout(self.su_user, self.su_password) -# -# -# def can_log_inout_normaluser(self): -# print "Permissions:unit-tests:test_can_log_inout_normaluser." -# print "Logging in as ", self.user , ", ", self.password, " to ", self.login_url -# self.browser.get(self.login_url) -# self.log_inout(self.user, self.password) -# -# -# def no_access_when_not_logged_in(self, urls): -# print "Permissions:unit-tests:no_access_when_not_logged_in." -# for url in urls: -# print "Checking ", self.base_url + url -# self.browser.get(self.base_url + url) -# self.wait_to_be_redirected_to_signin() -# -# def no_access_to_api_when_not_logged_in(self, apiurls): -# print "Permissions:unit-tests:no_access_to_api_when_not_logged_in." -# for apiurl in apiurls: -# print "Checking ", self.base_url + apiurl -# self.browser.get(self.base_url + apiurl) -# self.wait_to_be_redirected_to_api_noauth() -# -# -# def test_loginout(self): -# ''' -# Test the ability to log in and out. -# (1) Check that a super-user can log-in and out. -# (2) Check that a normal-user can log-in and out. -# (n) Check that access to a page produces the sign-in page if logged -# out. -# ''' -# self.can_log_inout_superuser() -# self.can_log_inout_normaluser() -# self.no_access_when_not_logged_in(self.test_urls) -# self.no_access_to_api_when_not_logged_in(self.test_api_urls) -# -# ''' -# (1) parameters: user, set-class, set-id. -# variables: user is SU; user is in a group -# Check that a non-user, ordinary user and admin user work -# Check that concepts and working-sets work -# check with a concept/working-set with all types of permission is/is not visible and/or editable -# Check that good set-ids and bad set-ids work -# ''' -# # There's a concept 'Can_be_viewed_by_everyone'. -# # There's a user 'Not_authenticated'. -# # The user cannot view the concept. -# #self.fail('test_allowed_to_view failed!') -# """ -# -# def setUp(self): -# # Set-up access to the test database. -# pass -# -# -# @classmethod -# def setUpTestData(cls): -# ''' -# !!! Move this to test_base. -# Create all the users, concepts, components, code lists, code -# regexes and codes to use within the test database. -# ''' -# print "Permission Unit Tests" -# # Users: a normal user and a super_user. -# super_user = User.objects.create_superuser(username=su_user, password=su_password, email=None) -# normal_user = User.objects.create_user(username=nm_user, password=nm_password, email=None) -# owner_user = User.objects.create_user(username=ow_user, password=ow_password, email=None) -# group_user = User.objects.create_user(username=gp_user, password=gp_password, email=None) -# view_group_user = User.objects.create_user(username=vgp_user, password=vgp_password, email=None) -# edit_group_user = User.objects.create_user(username=egp_user, password=egp_password, email=None) -# -# # Groups: a group that is not permitted and one that is. -# permitted_group = Group.objects.create(name="permitted_group") -# forbidden_group = Group.objects.create(name="forbidden_group") -# view_group = Group.objects.create(name="view_group") -# edit_group = Group.objects.create(name="edit_group") -# # Add the group to the group-user's groups. -# group_user.groups.add(permitted_group) -# view_group_user.groups.add(view_group) -# edit_group_user.groups.add(edit_group) -# -# coding_system = CodingSystem.objects.create( -# name="Lookup table", -# description="Lookup Codes for testing purposes", -# link=Google_website, -# database_connection_name="default", -# table_name="clinicalcode_lookup", -# code_column_name="code", -# desc_column_name="description") -# coding_system.save() -# -# # Concepts with various view characteristics. -# ''' -# Owner Group Everyone -# No No No noone -# Yes No No owner -# No Yes No group -# Yes Yes No owner+group -# No No Yes everyone -# Yes No Yes owner+everyone -# No Yes Yes group+everyone -# Yes Yes Yes owner+group+everyone -# ''' -# cls.concept_noone_can_access = Concept.objects.create( -# name="concept_noone_can_access", -# description="concept_noone_can_access", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# group_access=Permissions.NONE, -# owner_access=Permissions.NONE, -# world_access=Permissions.NONE -# ) -# -# cls.concept_owner_can_view = Concept.objects.create( -# name="concept_owner_can_view", -# description="concept_owner_can_view", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.VIEW, -# group_access=Permissions.NONE, -# world_access=Permissions.NONE -# ) -# -# cls.concept_group_can_view = Concept.objects.create( -# name="concept_group_can_view", -# description="concept_group_can_view", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.NONE, -# group_access=Permissions.VIEW, -# world_access=Permissions.NONE -# ) -# -# cls.concept_owner_and_group_can_view = Concept.objects.create( -# name="concept_owner_and_group_can_view", -# description="concept_owner_and_group_can_view", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.VIEW, -# group_access=Permissions.VIEW, -# world_access=Permissions.NONE -# ) -# -# cls.concept_everyone_can_view = Concept.objects.create( -# name="concept_everyone_can_view", -# description="concept_everyone_can_view", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.NONE, -# group_access=Permissions.NONE, -# world_access=Permissions.VIEW -# ) -# -# cls.concept_everyone_and_owner_can_view = Concept.objects.create( -# name="concept_everyone_and_owner_can_view", -# description="concept_everyone_and_owner_can_view", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.VIEW, -# group_access=Permissions.NONE, -# world_access=Permissions.VIEW -# ) -# -# cls.concept_everyone_and_group_can_view = Concept.objects.create( -# name="concept_everyone_and_group_can_view", -# description="concept_everyone_and_group_can_view", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.NONE, -# group_access=Permissions.VIEW, -# world_access=Permissions.VIEW -# ) -# -# cls.concept_everyone_and_group_and_owner_can_view = Concept.objects.create( -# name="concept_everyone_and_group_and_owner_can_view", -# description="concept_everyone_and_group_and_owner_can_view", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.VIEW, -# group_access=Permissions.VIEW, -# world_access=Permissions.VIEW -# ) -# -# cls.concept_owner_can_edit = Concept.objects.create( -# name="concept_owner_can_edit", -# description="concept_owner_can_edit", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.EDIT, -# group_access=Permissions.NONE, -# world_access=Permissions.NONE -# ) -# -# cls.concept_group_can_edit = Concept.objects.create( -# name="concept_group_can_edit", -# description="concept_group_can_edit", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.NONE, -# group_access=Permissions.EDIT, -# world_access=Permissions.NONE -# ) -# -# cls.concept_owner_and_group_can_edit = Concept.objects.create( -# name="concept_owner_and_group_can_edit", -# description="concept_owner_and_group_can_edit", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.EDIT, -# group_access=Permissions.EDIT, -# world_access=Permissions.NONE -# ) -# -# cls.concept_everyone_can_edit = Concept.objects.create( -# name="concept_everyone_can_edit", -# description="concept_everyone_can_edit", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.NONE, -# group_access=Permissions.NONE, -# world_access=Permissions.EDIT -# ) -# -# cls.concept_everyone_and_owner_can_edit = Concept.objects.create( -# name="concept_everyone_and_owner_can_edit", -# description="concept_everyone_and_owner_can_edit", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.EDIT, -# group_access=Permissions.NONE, -# world_access=Permissions.EDIT -# ) -# -# cls.concept_everyone_and_group_can_edit = Concept.objects.create( -# name="concept_everyone_and_group_can_edit", -# description="concept_everyone_and_group_can_edit", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.NONE, -# group_access=Permissions.EDIT, -# world_access=Permissions.EDIT -# ) -# -# cls.concept_everyone_and_group_and_owner_can_edit = Concept.objects.create( -# name="concept_everyone_and_group_and_owner_can_edit", -# description="concept_everyone_and_group_and_owner_can_edit", -# author="the_test_goat", -# entry_date=datetime.now(), -# validation_performed=True, -# validation_description="", -# publication_doi="", -# publication_link=Google_website, -# paper_published=False, -# source_reference="", -# citation_requirements="", -# created_by=super_user, -# modified_by=super_user, -# coding_system=coding_system, -# is_deleted=False, -# owner=owner_user, -# group=permitted_group, -# owner_access=Permissions.EDIT, -# group_access=Permissions.EDIT, -# world_access=Permissions.EDIT -# ) -# diff --git a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/test_permissions_and_visible_fetch_code.py b/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/test_permissions_and_visible_fetch_code.py deleted file mode 100644 index 7601ea57e..000000000 --- a/CodeListLibrary_project/clinicalcode/tests/legacy/unit_tests/test_permissions_and_visible_fetch_code.py +++ /dev/null @@ -1,1529 +0,0 @@ -from datetime import datetime - -from clinicalcode.models.Code import Code -from clinicalcode.models.CodeList import CodeList -from clinicalcode.models.Component import Component -from clinicalcode.models.Concept import * -from clinicalcode.models.WorkingSet import * -from clinicalcode.permissions import * -from clinicalcode.tests.test_base import * -from clinicalcode.tests.unit_test_base import * -from django.test import TestCase - - -class PermissionTest(TestCase): - - @classmethod - def setUpClass(cls): - super(PermissionTest, cls).setUpClass() - super_user = User.objects.create_superuser(username=su_user, - password=su_password, - email=None) - normal_user = User.objects.create_user(username=nm_user, - password=nm_password, - email=None) - owner_user = User.objects.create_user(username=ow_user, - password=ow_password, - email=None) - group_user = User.objects.create_user(username=gp_user, - password=gp_password, - email=None) - - permitted_group = Group.objects.create(name="permitted_group") - group_user.groups.add(permitted_group) - - coding_system = CodingSystem.objects.create( - name="Lookup table", - description="Lookup Codes for testing purposes", - link=Google_website, - database_connection_name="default", - table_name="clinicalcode_lookup", - code_column_name="code", - desc_column_name="description") - coding_system.save() - - cls.concept_none_can_access = Concept.objects.create( - name="concept_noone_can_access", - description="concept_noone_can_access", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.NONE) - - cls.concept_owner_can_view = Concept.objects.create( - name="concept_owner_can_edit", - description="concept_owner_can_edit", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - owner_access=Permissions.VIEW, - group_access=Permissions.NONE, - world_access=Permissions.NONE) - - cls.concept_owner_can_edit = Concept.objects.create( - name="concept_owner_can_edit", - description="concept_owner_can_edit", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - owner_access=Permissions.EDIT, - group_access=Permissions.NONE, - world_access=Permissions.NONE) - - cls.concept_everyone_can_view = Concept.objects.create( - name="concept_everyone_can_view", - description="concept_view_everyone", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - owner_access=Permissions.NONE, - group_access=Permissions.NONE, - world_access=Permissions.VIEW) - - cls.concept_everyone_can_edit = Concept.objects.create( - name="concept_everyone_can_edit", - description="concept_everyone_can_edit", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - owner_access=Permissions.NONE, - group_access=Permissions.NONE, - world_access=Permissions.EDIT) - - cls.concept_group_can_view = Concept.objects.create( - name="concept_group_can_view", - description="concept_group_can_view", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - owner_access=Permissions.NONE, - group_access=Permissions.VIEW, - world_access=Permissions.NONE) - - cls.concept_group_can_edit = Concept.objects.create( - name="concept_group_can_view", - description="concept_group_can_view", - author="the_test_goat", - entry_date=datetime.now(), - validation_performed=True, - validation_description="", - publication_doi="", - publication_link=Google_website, - paper_published=False, - source_reference="", - citation_requirements="", - created_by=super_user, - modified_by=super_user, - coding_system=coding_system, - is_deleted=False, - owner=owner_user, - group=permitted_group, - owner_access=Permissions.NONE, - group_access=Permissions.EDIT, - world_access=Permissions.NONE) - - cls.workingset_none_can_access = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{"concept1": "id"}], - created_by=super_user, - updated_by=super_user, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.NONE) - - cls.workingset_everyone_can_edit = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{"concept1": "id"}], - created_by=super_user, - updated_by=super_user, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.EDIT) - - cls.workingset_everyone_can_view = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{"concept1": "id"}], - created_by=super_user, - updated_by=super_user, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.NONE, - world_access=Permissions.VIEW) - - cls.workingset_owner_can_view = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{"concept1": "id"}], - created_by=super_user, - updated_by=super_user, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.VIEW, - world_access=Permissions.NONE) - - cls.workingset_owner_can_edit = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{"concept1": "id"}], - created_by=super_user, - updated_by=super_user, - owner=owner_user, - group=permitted_group, - group_access=Permissions.NONE, - owner_access=Permissions.EDIT, - world_access=Permissions.NONE) - - cls.workingset_group_can_view = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{"concept1": "id"}], - created_by=super_user, - updated_by=super_user, - owner=owner_user, - group=permitted_group, - group_access=Permissions.VIEW, - owner_access=Permissions.NONE, - world_access=Permissions.NONE) - - cls.workingset_group_can_edit = WorkingSet.objects.create( - name="workingset_noone_can_access", - description="workingset_noone_can_access", - author="the_test_goat", - publication_doi="", - publication_link=Google_website, - source_reference="", - citation_requirements="", - concept_informations=[{"concept1": "id"}], - created_by=super_user, - updated_by=super_user, - owner=owner_user, - group=permitted_group, - group_access=Permissions.EDIT, - owner_access=Permissions.NONE, - world_access=Permissions.NONE) - - cls.component_for_none = Component.objects.create( - comment="Component visibility test", - component_type=2, - concept=cls.concept_none_can_access, - created_by=owner_user, - logical_type=2, - name="Component") - - cls.code_list_for_none = CodeList.objects.create( - component=cls.component_for_none, - description="Code list visibility test") - cls.code_for_none = Code.objects.create( - code_list=cls.code_list_for_none, - code="45554", - description="visibility test") - - cls.component_for_everybody = Component.objects.create( - comment="Component visibility test", - component_type=2, - concept=cls.concept_everyone_can_view, - created_by=owner_user, - logical_type=2, - name="Component") - - cls.code_list_for_everybody = CodeList.objects.create( - component=cls.component_for_everybody, - description="Code list visibility test") - cls.code_for_everybody = Code.objects.create( - code_list=cls.code_list_for_everybody, - code="24212", - description="visibility test") - - cls.component_for_group = Component.objects.create( - comment="Component visibility test", - component_type=2, - concept=cls.concept_group_can_view, - created_by=owner_user, - logical_type=2, - name="Component") - - cls.code_list_for_group = CodeList.objects.create( - component=cls.component_for_group, - description="Code list visibility test") - cls.code_for_group = Code.objects.create( - code_list=cls.code_list_for_group, - code="24212", - description="visibility test") - - @classmethod - def tearDownClass(cls): - super(PermissionTest, cls).tearDownClass() - - ''' - Verify that a user with edit rights - who is not an owner cannot change the permissions. - ''' - - def test_normal_user_not_allowed_to_permit_con(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_permit( - user, Concept, PermissionTest.concept_everyone_can_edit.id) - self.assertFalse(permitted) - - def test_group_user_not_allowed_to_permit_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_permit( - group, Concept, PermissionTest.concept_everyone_can_edit.id) - self.assertFalse(permitted) - - ''' - Verify that a user can transfer ownership to a different user - ''' - - def test_owner_allowed_to_permit_con(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_permit(owner, Concept, - PermissionTest.concept_owner_can_edit.id) - self.assertTrue(permitted) - - ''' - Verify that when a new concept is created and no changes are made to the permissions, - only the owner can view and edit the concept. - ''' - - def test_owner_allowed_to_view_new_concept_con(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_owner_can_edit.id, - user=owner) - self.assertTrue(permitted) - - def test_owner_allowed_to_edit_new_concept_con(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_owner_can_edit.id, - user=owner) - self.assertTrue(permitted) - - def test_normal_user_not_allowed_to_view_new_concept_con(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_owner_can_edit.id, - user=user) - self.assertFalse(permitted) - - def test_normal_user_not_allowed_to_edit_new_concept_con(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_owner_can_edit.id, - user=user) - self.assertFalse(permitted) - - def test_group_user_not_allowed_to_view_new_concept_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_owner_can_edit.id, - user=group) - self.assertFalse(permitted) - - def test_group_user_not_allowed_to_edit_new_concept_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_owner_can_edit.id, - user=group) - self.assertFalse(permitted) - - ''' - Verify that if everyone is set to "view", - a different user can view the concept but not edit it. - ''' - - def test_normal_user_allowed_to_view_when_everybody_set_to_view_con(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_view( - None, - Concept, - PermissionTest.concept_everyone_can_view.id, - user=user) - self.assertTrue(permitted) - - def test_normal_user_not_allowed_to_edit_when_everybody_set_to_view_con( - self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_edit( - None, - Concept, - PermissionTest.concept_everyone_can_view.id, - user=user) - self.assertFalse(permitted) - - def test_group_user_allowed_to_view_when_everybody_set_to_view_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view( - None, - Concept, - PermissionTest.concept_everyone_can_view.id, - user=group) - self.assertTrue(permitted) - - def test_group_user_not_allowed_to_edit_when_everybody_set_to_view_con( - self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit( - None, - Concept, - PermissionTest.concept_everyone_can_view.id, - user=group) - self.assertFalse(permitted) - - def test_owner_allowed_to_view_when_everybody_set_to_view_con(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_view( - None, - Concept, - PermissionTest.concept_everyone_can_view.id, - user=owner) - self.assertTrue(permitted) - - def test_owner_allowed_to_edit_when_everybody_set_to_view_con(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit( - None, - Concept, - PermissionTest.concept_everyone_can_view.id, - user=owner) - self.assertTrue(permitted) - - ''' - Verify that if everyone is set to "edit" - a different user can view and edit the concept. - ''' - - def test_normal_user_allowed_to_edit_when_everybody_set_to_edit_con(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_edit( - None, - Concept, - PermissionTest.concept_everyone_can_edit.id, - user=user) - self.assertTrue(permitted) - - def test_normal_user_allowed_to_view_when_everybody_set_to_edit_con(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_view( - None, - Concept, - PermissionTest.concept_everyone_can_edit.id, - user=user) - self.assertTrue(permitted) - - def test_group_user_allowed_to_edit_when_everybody_set_to_edit_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit( - None, - Concept, - PermissionTest.concept_everyone_can_edit.id, - user=group) - self.assertTrue(permitted) - - def test_group_user_allowed_to_view_when_everybody_set_to_edit_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view( - None, - Concept, - PermissionTest.concept_everyone_can_edit.id, - user=group) - self.assertTrue(permitted) - - def test_owner_allowed_to_edit_when_everybody_set_to_edit_con(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit( - None, - Concept, - PermissionTest.concept_everyone_can_edit.id, - user=owner) - self.assertTrue(permitted) - - def test_owner_allowed_to_view_when_everybody_set_to_edit_con(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_view( - None, - Concept, - PermissionTest.concept_everyone_can_edit.id, - user=owner) - self.assertTrue(permitted) - - ''' - Verify that if group is set to "view", - a different group member can view the concept but not edit it. - ''' - - def test_group_allowed_to_view_when_group_set_to_view_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_group_can_view.id, - user=group) - self.assertTrue(permitted) - - def test_group_not_allowed_to_edit_when_group_set_to_view_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_group_can_view.id, - user=group) - self.assertFalse(permitted) - - ''' - Verify that if group is set to "edit" - a different group member can view and edit the concept. - ''' - - def test_group_allowed_to_view_when_group_set_to_edit_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_group_can_edit.id, - user=group) - self.assertTrue(permitted) - - def test_group_allowed_to_edit_when_group_set_to_edit_con(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_group_can_edit.id, - user=group) - self.assertTrue(permitted) - - ''' - Verify that if group is set to "edit" and everyone "none", - a non-group member cannot view or edit. - ''' - - def test_normal_user_not_allowed_to_view_when_only_group_set_to_edit_con( - self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_group_can_edit.id, - user=user) - self.assertFalse(permitted) - - def test_normal_user_not_allowed_to_edit_when_only_group_set_to_edit_con( - self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_group_can_edit.id, - user=user) - self.assertFalse(permitted) - - def test_owner_allowed_to_view_when_only_group_set_to_edit_con(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_group_can_edit.id, - user=owner) - self.assertTrue(permitted) - - def test_owner_allowed_to_edit_when_only_group_set_to_edit_con(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_group_can_edit.id, - user=owner) - self.assertTrue(permitted) - - ''' - Verify that a super user can do everything, - regardless of permission settings. - ''' - - def test_super_user_allowed_to_permit_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_permit(super_user, Concept, - PermissionTest.concept_owner_can_edit.id) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_everybody_set_to_view_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view( - None, - Concept, - PermissionTest.concept_everyone_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_everybody_set_to_view_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - Concept, - PermissionTest.concept_everyone_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_everybody_set_to_edit_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view( - None, - Concept, - PermissionTest.concept_everyone_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_everybody_set_to_edit_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - Concept, - PermissionTest.concept_everyone_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_owner_set_to_view_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_owner_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_owner_set_to_view_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_owner_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_owner_set_to_edit_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_owner_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_owner_set_to_edit_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_owner_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_group_set_to_view_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_group_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_group_set_to_view_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_group_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_group_set_to_edit_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_group_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_group_set_to_edit_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_group_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_none_has_access_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view(None, - Concept, - PermissionTest.concept_none_can_access.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_none_has_access_con(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit(None, - Concept, - PermissionTest.concept_none_can_access.id, - user=super_user) - self.assertTrue(permitted) - - ''' - -------------------------WORKINGSET TESTS-------------------------- - ''' - ''' - Verify that a user with edit rights - who is not an owner cannot change the permissions. - ''' - - def test_normal_user_not_allowed_to_permit_ws(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_permit( - user, WorkingSet, PermissionTest.workingset_everyone_can_edit.id) - self.assertFalse(permitted) - - def test_group_user_not_allowed_to_permit_ws(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_permit( - group, WorkingSet, PermissionTest.workingset_everyone_can_edit.id) - self.assertFalse(permitted) - - ''' - Verify that a user can transfer ownership to a different user - ''' - - def test_owner_allowed_to_permit_ws(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_permit( - owner, WorkingSet, PermissionTest.workingset_owner_can_edit.id) - self.assertTrue(permitted) - - ''' - Verify that when a new workingset is created and no changes are made to the permissions, - only the owner can view and edit the working set. - ''' - - def test_owner_allowed_to_view_new_workingset(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_owner_can_edit.id, - user=owner) - self.assertTrue(permitted) - - def test_owner_allowed_to_edit_new_workingset(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_owner_can_edit.id, - user=owner) - self.assertTrue(permitted) - - def test_normal_user_not_allowed_to_view_new_workingset(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_owner_can_edit.id, - user=user) - self.assertFalse(permitted) - - def test_normal_user_not_allowed_to_edit_new_workingset(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_owner_can_edit.id, - user=user) - self.assertFalse(permitted) - - def test_group_user_not_allowed_to_view_new_workingset(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_owner_can_edit.id, - user=group) - self.assertFalse(permitted) - - def test_group_user_not_allowed_to_edit_new_workingset(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_owner_can_edit.id, - user=group) - self.assertFalse(permitted) - - ''' - Verify that if everyone is set to "view", - a different user can view the working set but not edit it. - ''' - - def test_normal_user_allowed_to_view_when_everybody_set_to_view_ws(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_view.id, - user=user) - self.assertTrue(permitted) - - def test_normal_user_not_allowed_to_edit_when_everybody_set_to_view_ws( - self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_view.id, - user=user) - self.assertFalse(permitted) - - def test_group_user_allowed_to_view_when_everybody_set_to_view_ws(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_view.id, - user=group) - self.assertTrue(permitted) - - def test_group_user_not_allowed_to_edit_when_everybody_set_to_view_ws( - self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_view.id, - user=group) - self.assertFalse(permitted) - - def test_owner_allowed_to_view_when_everybody_set_to_view_ws(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_view.id, - user=owner) - self.assertTrue(permitted) - - def test_owner_allowed_to_edit_when_everybody_set_to_view_ws(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_view.id, - user=owner) - self.assertTrue(permitted) - - ''' - Verify that if everyone is set to "edit" - a different user can view and edit the working set. - ''' - - def test_normal_user_allowed_to_edit_when_everybody_set_to_edit_ws(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_edit.id, - user=user) - self.assertTrue(permitted) - - def test_normal_user_allowed_to_view_when_everybody_set_to_edit_ws(self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_edit.id, - user=user) - self.assertTrue(permitted) - - def test_group_user_allowed_to_edit_when_everybody_set_to_edit_ws(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_edit.id, - user=group) - self.assertTrue(permitted) - - def test_group_user_allowed_to_view_when_everybody_set_to_edit_ws(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_edit.id, - user=group) - self.assertTrue(permitted) - - def test_owner_allowed_to_edit_when_everybody_set_to_edit_ws(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_edit.id, - user=owner) - self.assertTrue(permitted) - - def test_owner_allowed_to_view_when_everybody_set_to_edit_ws(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_edit.id, - user=owner) - self.assertTrue(permitted) - - ''' - Verify that if group is set to "view", - a different group member can view the working set but not edit it. - ''' - - def test_group_allowed_to_view_when_group_set_to_view_ws(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_group_can_view.id, - user=group) - self.assertTrue(permitted) - - def test_group_not_allowed_to_edit_when_group_set_to_view_ws(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_group_can_view.id, - user=group) - self.assertFalse(permitted) - - ''' - Verify that if group is set to "edit" - a different group member can view and edit the working set. - ''' - - def test_group_allowed_to_view_when_group_set_to_edit_ws(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_group_can_edit.id, - user=group) - self.assertTrue(permitted) - - def test_group_allowed_to_edit_when_group_set_to_edit_ws(self): - group = User.objects.get(username=gp_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_group_can_edit.id, - user=group) - self.assertTrue(permitted) - - ''' - Verify that if group is set to "edit" and everyone "none", - a non-group member cannot view or edit. - ''' - - def test_normal_user_not_allowed_to_view_when_only_group_set_to_edit_ws( - self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_group_can_edit.id, - user=user) - self.assertFalse(permitted) - - def test_normal_user_not_allowed_to_edit_when_only_group_set_to_edit_ws( - self): - user = User.objects.get(username=nm_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_group_can_edit.id, - user=user) - self.assertFalse(permitted) - - def test_owner_allowed_to_view_when_only_group_set_to_edit_ws(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_group_can_edit.id, - user=owner) - self.assertTrue(permitted) - - def test_owner_allowed_to_edit_when_only_group_set_to_edit_ws(self): - owner = User.objects.get(username=ow_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_group_can_edit.id, - user=owner) - self.assertTrue(permitted) - - ''' - Verify that a super user can do everything, - regardless of permission settings. - ''' - - def test_super_user_allowed_to_permit_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_permit( - super_user, WorkingSet, - PermissionTest.workingset_owner_can_edit.id) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_everybody_set_to_view_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_everybody_set_to_view_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_everybody_set_to_edit_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_everybody_set_to_edit_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_everyone_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_owner_set_to_view_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_owner_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_owner_set_to_view_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_owner_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_owner_set_to_edit_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_owner_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_owner_set_to_edit_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_owner_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_group_set_to_view_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_group_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_group_set_to_view_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_group_can_view.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_group_set_to_edit_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_group_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_group_set_to_edit_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_group_can_edit.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_view_when_none_has_access_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_view( - None, - WorkingSet, - PermissionTest.workingset_none_can_access.id, - user=super_user) - self.assertTrue(permitted) - - def test_superuser_allowed_to_edit_when_none_has_access_ws(self): - super_user = User.objects.get(username=su_user) - permitted = allowed_to_edit( - None, - WorkingSet, - PermissionTest.workingset_none_can_access.id, - user=super_user) - self.assertTrue(permitted) - - ''' - ------------Test visible data fetch code---------------------- - ''' - ''' - test visible code list - ''' - - def test_nornal_user_user_visible_code_list_for_none(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_codelists(normal_user, self.code_list_for_none.id) - - self.assertTrue(query.count() == 0) - - def test_nornal_user_user_visible_code_list_for_group(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_codelists(normal_user, self.code_list_for_group.id) - - self.assertTrue(query.count() == 0) - - def test_normal_user_user_visible_code_list_for_everybody(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_codelists(normal_user, - self.code_list_for_everybody.id) - - self.assertTrue(query.count() > 0) - - def test_group_user_visible_code_list_for_none(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_codelists(group_user, self.code_list_for_none.id) - - self.assertTrue(query.count() == 0) - - def test_group_user_visible_code_list_for_group(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_codelists(group_user, self.code_list_for_group.id) - - self.assertTrue(query.count() == 1) - - def test_group_user_visible_code_list_for_everybody(self): - group_user = User.objects.get(username=nm_user) - query = get_visible_codelists(group_user, - self.code_list_for_everybody.id) - - self.assertTrue(query.count() > 0) - - def test_owner_visible_code_list_for_none(self): - owner = User.objects.get(username=ow_user) - query = get_visible_codelists(owner, self.code_list_for_none.id) - - self.assertTrue(query.count() > 0) - - def test_owner_visible_code_list_for_group(self): - owner = User.objects.get(username=ow_user) - query = get_visible_codelists(owner, self.code_list_for_group.id) - - self.assertTrue(query.count() > 0) - - def test_owner_visible_code_list_for_everybody(self): - owner = User.objects.get(username=ow_user) - query = get_visible_codelists(owner, self.code_list_for_everybody.id) - - self.assertTrue(query.count() > 0) - - def test_superuser_visible_code_list_for_none(self): - super_user = User.objects.get(username=su_user) - query = get_visible_codelists(super_user, self.code_list_for_none.id) - - self.assertTrue(query.count() > 0) - - def test_superuser_visible_code_list_for_group(self): - super_user = User.objects.get(username=su_user) - query = get_visible_codelists(super_user, self.code_list_for_group.id) - - self.assertTrue(query.count() > 0) - - def test_superuser_visible_code_list_for_everybody(self): - super_user = User.objects.get(username=su_user) - query = get_visible_codelists(super_user, - self.code_list_for_everybody.id) - - self.assertTrue(query.count() > 0) - - ''' - visible codes - ''' - - def test_normal_user_visible_codes_for_none(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_codes(normal_user, self.code_list_for_none.id) - - self.assertTrue(query.count() == 0) - - def test_normal_user_visible_codes_for_group(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_codes(normal_user, self.code_list_for_group.id) - - self.assertTrue(query.count() == 0) - - def test_normal_user_visible_codes_for_everybody(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_codes(normal_user, self.code_list_for_everybody.id) - - self.assertTrue(query.count() > 0) - - def test_group_user_visible_codes_for_none(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_codes(group_user, self.code_list_for_none.id) - - self.assertTrue(query.count() == 0) - - def test_group_user_visible_codes_for_group(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_codes(group_user, self.code_list_for_group.id) - - self.assertTrue(query.count() > 0) - - def test_group_user_visible_codes_for_everybody(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_codes(group_user, self.code_list_for_everybody.id) - - self.assertTrue(query.count() > 0) - - def test_owner_visible_codes_for_none(self): - owner = User.objects.get(username=ow_user) - query = get_visible_codes(owner, self.code_list_for_none.id) - - self.assertTrue(query.count() > 0) - - def test_owner_visible_codes_for_group(self): - owner = User.objects.get(username=ow_user) - query = get_visible_codes(owner, self.code_list_for_group.id) - - self.assertTrue(query.count() > 0) - - def test_owner_visible_codes_for_everybody(self): - owner = User.objects.get(username=ow_user) - query = get_visible_codes(owner, self.code_list_for_everybody.id) - - self.assertTrue(query.count() > 0) - - def test_superuser_visible_codes_for_none(self): - super_user = User.objects.get(username=su_user) - query = get_visible_codes(super_user, self.code_list_for_none.id) - - self.assertTrue(query.count() > 0) - - def test_superuser_visible_codes_for_group(self): - super_user = User.objects.get(username=su_user) - query = get_visible_codes(super_user, self.code_list_for_group.id) - - self.assertTrue(query.count() > 0) - - def test_superuser_visible_codes_for_everybody(self): - super_user = User.objects.get(username=su_user) - query = get_visible_codes(super_user, self.code_list_for_everybody.id) - - self.assertTrue(query.count() > 0) - - ''' - visible components - ''' - - def test_normal_user_visible_components_for_none(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_components(normal_user, self.component_for_none.id) - - self.assertTrue(query.count() == 0) - - def test_normal_user_visible_components_for_group(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_components(normal_user, - self.component_for_group.id) - - self.assertTrue(query.count() == 0) - - def test_normal_user_visible_components_for_everybody(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_components(normal_user, - self.component_for_everybody.id) - - self.assertTrue(query.count() > 0) - - def test_group_user_visible_components_for_none(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_components(group_user, self.component_for_none.id) - - self.assertTrue(query.count() == 0) - - def test_group_user_visible_components_for_group(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_components(group_user, self.component_for_group.id) - - self.assertTrue(query.count() > 0) - - def test_group_user_visible_components_for_everybody(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_components(group_user, - self.component_for_everybody.id) - - self.assertTrue(query.count() > 0) - - def test_owner_visible_components_for_none(self): - owner = User.objects.get(username=ow_user) - query = get_visible_components(owner, self.component_for_none.id) - - self.assertTrue(query.count() > 0) - - def test_owner_visible_components_for_group(self): - owner = User.objects.get(username=ow_user) - query = get_visible_components(owner, self.component_for_group.id) - - self.assertTrue(query.count() > 0) - - def test_owner_visible_componentss_for_everybody(self): - owner = User.objects.get(username=ow_user) - query = get_visible_components(owner, self.component_for_everybody.id) - - self.assertTrue(query.count() > 0) - - def test_superuser_visible_components_for_none(self): - super_user = User.objects.get(username=su_user) - query = get_visible_components(super_user, self.component_for_none.id) - - self.assertTrue(query.count() > 0) - - def test_superuser_visible_components_for_group(self): - super_user = User.objects.get(username=su_user) - query = get_visible_components(super_user, self.component_for_group.id) - - self.assertTrue(query.count() > 0) - - def test_superuser_visible_components_for_everybody(self): - super_user = User.objects.get(username=su_user) - query = get_visible_components(super_user, - self.component_for_everybody.id) - - self.assertTrue(query.count() > 0) - - ''' - visible concepts - ''' - - def test_normal_user_visible_concepts(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_concepts_live(normal_user) - - # Query should contain two concepts only (concept everybody can view and concept everybody can edit) - self.assertTrue(query.count() == 2) - self.assertTrue( - (self.concept_everyone_can_view and self.concept_everyone_can_edit - ) in query.all()) - - def test_group_user_visible_concepts(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_concepts_live(group_user) - - # Query should contain four concepts only (concept everybody can view and concept everybody can edit... - # concept group can view and concept group can edit - self.assertTrue(query.count() == 4) - self.assertTrue( - (self.concept_everyone_can_view and self.concept_everyone_can_edit - and self.concept_group_can_edit and self.concept_group_can_view - ) in query.all()) - - def test_owner_visible_concepts(self): - owner = User.objects.get(username=ow_user) - query = get_visible_concepts_live(owner) - - # Owner can see all of the concepts - self.assertTrue(query.count() == 7) - - def test_superuser_visible_concepts(self): - super_user = User.objects.get(username=su_user) - query = get_visible_concepts_live(super_user) - - # super user can see all of the concepts - self.assertTrue(query.count() == 7) - - ''' - visible workingset - ''' - - def test_normal_user_visible_workingsets(self): - normal_user = User.objects.get(username=nm_user) - query = get_visible_workingsets(normal_user) - - # Query should contain two concepts only (concept everybody can view and concept everybody can edit) - self.assertTrue(query.count() == 2) - self.assertTrue((self.workingset_everyone_can_view - and self.workingset_everyone_can_edit) in query.all()) - - def test_group_user_visible_workingsets(self): - group_user = User.objects.get(username=gp_user) - query = get_visible_workingsets(group_user) - - # Query should contain four concepts only (concept everybody can view and concept everybody can edit... - # concept group can view and concept group can edit - self.assertTrue(query.count() == 4) - self.assertTrue( - (self.workingset_everyone_can_view and self. - workingset_everyone_can_edit and self.workingset_group_can_view - and self.workingset_group_can_edit) in query.all()) - - def test_owner_visible_workingsets(self): - owner = User.objects.get(username=ow_user) - query = get_visible_workingsets(owner) - - # Owner can see all of the concepts - self.assertTrue(query.count() == 7) - - def test_superuser_visible_workingsets(self): - super_user = User.objects.get(username=su_user) - query = get_visible_workingsets(super_user) - - # super user can see all of the concepts - self.assertTrue(query.count() == 7) diff --git a/CodeListLibrary_project/clinicalcode/views/GenericEntity.py b/CodeListLibrary_project/clinicalcode/views/GenericEntity.py index feb9c04ab..f939de1ac 100644 --- a/CodeListLibrary_project/clinicalcode/views/GenericEntity.py +++ b/CodeListLibrary_project/clinicalcode/views/GenericEntity.py @@ -4,8 +4,9 @@ --------------------------------------------------------------------------- """ from django.urls import reverse -from django.http import HttpResponseNotFound, HttpResponseBadRequest +from django.http import HttpResponseBadRequest from collections import OrderedDict +from collections.abc import Iterable from django.contrib import messages from django.shortcuts import render, redirect from rest_framework.views import APIView @@ -606,7 +607,7 @@ def generic_entity_detail(request, pk, history_id=None): # find latest accessible entity for given pk if historical id not specified history_id = gen_utils.parse_int(history_id, default=None) if not isinstance(history_id, int): - entities = permission_utils.get_accessible_entities(request, pk=pk) + entities = permission_utils.get_accessible_entities(request, pk=pk, deletion_query=constants.DELETION_QUERY.ANY) if not entities.exists(): return View.notify_err( @@ -735,7 +736,7 @@ def export_entity_codes_to_csv(request, pk, history_id=None): # get the latest version/ or latest published version if not isinstance(history_id, int): - entities = permission_utils.get_accessible_entities(request, pk=pk) + entities = permission_utils.get_accessible_entities(request, pk=pk, deletion_query=constants.DELETION_QUERY.ANY) if not entities.exists(): return View.notify_err( @@ -748,32 +749,31 @@ def export_entity_codes_to_csv(request, pk, history_id=None): history_id = entities.first().history_id # validate access for login and public site - permission_utils.validate_access_to_view(request, pk, history_id) - - is_published = permission_utils.check_if_published(GenericEntity, pk, history_id) - - # ---------------------------------------------------------------------- - - # exclude(is_deleted=True) - if GenericEntity.objects.filter(id=pk).count() == 0: - return HttpResponseNotFound("Not found.") - # raise permission_denied # although 404 is more relevant - - # exclude(is_deleted=True) - if GenericEntity.history.filter(id=pk, history_id=history_id).count() == 0: - return HttpResponseNotFound("Not found.") - # raise permission_denied # although 404 is more relevant + accessibility, err = permission_utils.get_accessible_detail_entity(request, pk, history_id) + if err is not None: + return View.notify_err( + request, + title=err.get('title'), + status_code=err.get('status_code'), + details=[err.get('message')] + ) + elif not accessibility or not accessibility.get('view_access'): + return View.notify_err( + request, + title='Forbidden - Permission Denied', + status_code=403, + details=[f'Sorry but it looks like this {pk} hasn\'t been made accessible to you yet. Please contact the author of this {pk} to grant you access.'] + ) - # here, check live version + # check live version current_ph = GenericEntity.objects.get(pk=pk) - - # if not is_published: - # children_permitted_and_not_deleted, error_dict = db_utils.chk_children_permission_and_deletion(request, GenericEntity, pk, set_history_id=history_id) - # if not children_permitted_and_not_deleted: - # raise PermissionDenied - if current_ph.is_deleted == True: - raise PermissionDenied + return View.notify_err( + request, + title=f'Page Not Found - Missing {pk}', + status_code=403, + details=[f'Sorry but it looks like this {pk} has been archived by its creator and is no longer available.'] + ) current_ph_version = GenericEntity.history.get(id=pk, history_id=history_id) @@ -794,12 +794,12 @@ def export_entity_codes_to_csv(request, pk, history_id=None): 'code', 'description', 'coding_system', 'concept_id', 'concept_version_id', 'concept_name', 'phenotype_id', 'phenotype_version_id', 'phenotype_name' - ]) + ]) # if the phenotype contains only one concept, write titles in the loop below final_titles = final_titles + ["code_attributes"] writer.writerow(final_titles) - + for concept in concept_ids_historyIDs: concept_id = concept[0] concept_version_id = concept[1] @@ -816,25 +816,36 @@ def export_entity_codes_to_csv(request, pk, history_id=None): include_reviewed_codes=True) #--------------------------------------------- - - for cc in concept_data['codelist']: + codelist = [] + if isinstance(concept_data, dict) and isinstance(concept_data.get('codelist'), list): + codelist = concept_data.get('codelist') + + for cc in codelist: + code = cc.get('code', None) + if code is None: + continue + rows_no += 1 - + #--------------------------------------------- code_attributes = [] code_attributes_dict = OrderedDict([]) if code_attribute_header: - code_attributes_dict = OrderedDict(zip(code_attribute_header, cc['attributes'])) + code_attr_values = cc.get('attributes', None) + if code_attr_values is None or not isinstance(cc.get('attributes'), Iterable): + code_attr_values = ['']*len(code_attribute_header) + + code_attributes_dict = OrderedDict(zip(code_attribute_header, code_attr_values)) code_attributes.append(dict(code_attributes_dict)) if code_attributes: code_attributes = [json.dumps(code_attributes)] #--------------------------------------------- - + desc = cc.get('description', '') writer.writerow([ - cc['code'], - cc['description'].encode('ascii', 'ignore').decode('ascii'), + code, + desc.encode('ascii', 'ignore').decode('ascii'), concept_coding_system, 'C' + str(concept_id), concept_version_id, diff --git a/CodeListLibrary_project/clinicalcode/views/Organisation.py b/CodeListLibrary_project/clinicalcode/views/Organisation.py index a4b0eb232..66ba835b4 100644 --- a/CodeListLibrary_project/clinicalcode/views/Organisation.py +++ b/CodeListLibrary_project/clinicalcode/views/Organisation.py @@ -379,6 +379,9 @@ def cancel_invite(self, request, *args, **kwargs): ''' View Organisation ''' class OrganisationView(TemplateView): + # Specify how many items to return when computing popular entities + MAX_POPULAR_ITEMS = 5 + template_name = 'clinicalcode/organisation/view.html' fetch_methods = [ 'leave_organisation' @@ -391,183 +394,26 @@ def get_context_data(self, *args, **kwargs): context = super(OrganisationView, self).get_context_data(*args, **kwargs) request = self.request + slug = kwargs.get('slug') user = request.user if request.user and not request.user.is_anonymous else None current_brand = model_utils.try_get_brand(request) current_brand = current_brand if current_brand and current_brand.org_user_managed else None - - slug = kwargs.get('slug') - if not gen_utils.is_empty_string(slug): - organisation = Organisation.objects.filter(slug=slug) - if organisation.exists(): - organisation = organisation.first() - - members = organisation.members.through.objects \ - .filter(organisation_id=organisation.id) \ - .annotate( - role_name=Case( - *[When(role=v.value, then=Value(v.name)) for v in constants.ORGANISATION_ROLES], - default=Value(constants.ORGANISATION_ROLES.MEMBER.name), - output_field=models.CharField() - ) - ) \ - .distinct('user_id') - - is_owner = False - is_member = False - is_admin = False - if user: - is_owner = organisation.owner_id == user.id - - membership = organisation.organisationmembership_set.filter(user_id=user.id) - if membership.exists(): - membership = membership.first() - - is_member = True - is_admin = membership.role >= constants.ORGANISATION_ROLES.ADMIN - - entity_brand_clause = '' - user_perms_sql = f''' - select memb.user_id, memb.organisation_id, memb.role - from public.auth_user as uau - join public.clinicalcode_organisationmembership as memb - on uau.id = memb.user_id - join public.clinicalcode_organisation as org - on memb.organisation_id = org.id - where memb.organisation_id = {organisation.id} - and memb.user_id = {user.id if user else 'null'} - union - select uau.id as user_id, org.id as organisation_id, 3 as role - from public.auth_user as uau - join public.clinicalcode_organisation as org - on org.owner_id = uau.id - where uau.id = {user.id if user else 'null'} - ''' - if current_brand is not None: - entity_brand_clause = f'and ge.brands && array[{current_brand.id}]' - - user_perms_sql = f''' - select memb.user_id, memb.organisation_id, memb.role - from public.auth_user as uau - join public.clinicalcode_organisationmembership as memb - on uau.id = memb.user_id - join public.clinicalcode_organisation as org - on memb.organisation_id = org.id - join public.clinicalcode_organisationauthority as auth - on auth.organisation_id = org.id - where memb.organisation_id = {organisation.id} - and memb.user_id = {user.id if user else 'null'} - and auth.brand_id = {current_brand.id} - union - select uau.id as user_id, org.id as organisation_id, 3 as role - from public.auth_user as uau - join public.clinicalcode_organisation as org - on org.owner_id = uau.id - where uau.id = {user.id if user else 'null'} - ''' - - sql = f''' - with user_perms as ( - {user_perms_sql} - ), - entities as ( - select hge.id, hge.history_id, hge.name, hge.updated, - hge.publish_status, ge.organisation_id, ge.is_deleted, - row_number() over (partition by hge.id order by hge.history_id desc) as rn - from public.clinicalcode_historicalgenericentity as hge - join public.clinicalcode_genericentity as ge - on hge.id = ge.id - where ge.organisation_id = {organisation.id} - {entity_brand_clause} - ), - published as ( - select id, history_id, name, updated, publish_status - from ( - select *, - min(rn) over (partition by entities.id) as min_rn - from entities - where publish_status = {constants.APPROVAL_STATUS.APPROVED} - ) as sq - where rn = min_rn - ), - draft as ( - select id, history_id, name, updated, publish_status - from ( - select entities.*, - min(entities.rn) over (partition by entities.id) as min_rn - from entities - join user_perms - on entities.organisation_id = user_perms.organisation_id - left join published - on entities.id = published.id - and published.history_id > entities.history_id - where entities.publish_status != {constants.APPROVAL_STATUS.APPROVED} - and published.id is null - and entities.is_deleted is null or entities.is_deleted = false - ) as sq - where rn = min_rn - ), - moderated as ( - select entities.id, entities.history_id, entities.name, - entities.updated, entities.publish_status - from entities - join user_perms - on entities.organisation_id = user_perms.organisation_id - where user_perms.role >= 2 - and entities.publish_status in ( - {constants.APPROVAL_STATUS.REQUESTED}, {constants.APPROVAL_STATUS.PENDING} - ) - ) - select json_build_object( - 'published', ( - select json_agg(json_build_object( - 'id', id, - 'history_id', history_id, - 'name', name, - 'updated', updated, - 'publish_status', publish_status - )) from published - ), - 'draft', ( - select json_agg(json_build_object( - 'id', id, - 'history_id', history_id, - 'name', name, - 'updated', updated, - 'publish_status', publish_status - )) from draft - ), - 'moderated', ( - select json_agg(json_build_object( - 'id', id, - 'history_id', history_id, - 'name', name, - 'updated', updated, - 'publish_status', publish_status - )) from moderated - ) - ) as "data" - ''' - entities = None - with connection.cursor() as cursor: - cursor.execute(sql) - - columns = [col[0] for col in cursor.description] - entities = [dict(zip(columns, row)) for row in cursor.fetchall()][0] - entities = entities.get('data') - - return context | { - 'instance': organisation, - 'is_owner': is_owner, - 'is_member': is_member, - 'is_admin': is_admin, - 'members': members, - 'published': entities.get('published'), - 'draft': entities.get('draft'), - 'moderated': entities.get('moderated') - } - raise Http404('No organisation found') + organisation = Organisation.objects.filter(slug=slug) if isinstance(slug, str) and not gen_utils.is_empty_string(slug) else None + if organisation is None or not organisation.exists(): + raise Http404('No organisation found') + + organisation = organisation.first() + + org_data = self.__resolve_org_context(organisation, user, current_brand) + + if org_data.get('has_entities', False) and (org_data.get('is_owner') or org_data.get('is_member')): + org_data.update({ + 'org_stats': self.__resolve_org_stats(organisation), + }) + + return context | org_data def get(self, request, *args, **kwargs): context = self.get_context_data(*args, **kwargs) @@ -608,6 +454,269 @@ def leave_organisation(self, request, *args, **kwargs): return gen_utils.jsonify_response(code=200, status='true') + def __resolve_org_stats(self, organisation): + sql = ''' + with + const_org_id as (values ({org_id})), + const_max_popular as (values ({pop_limit})), + ge_vis as ( + select ge.* + from public.clinicalcode_genericentity as ge + join public.clinicalcode_organisation as org + on ge.organisation_id = org.id + where ge.organisation_id = (table const_org_id)::bigint + ), + hge_vis as ( + select hge.* + from ge_vis as ge + join public.clinicalcode_historicalgenericentity as hge + using (id) + ), + ent_total as ( + select count(ge.*) as cnt + from ge_vis as ge + ), + ent_created as ( + select count(ge.*) as cnt + from ge_vis as ge + where ge.created >= date_trunc('day', now()) - interval '30 day' + ), + ent_updated as ( + select count(hge.*) as cnt + from hge_vis as hge + where hge.updated >= date_trunc('day', now()) - interval '30 day' + ), + ent_views as ( + select count(req.*) as cnt + from ge_vis as ge + join public.easyaudit_requestevent as req + on req.url like concat('%%', ge.id::text, '%%') + where req.datetime >= date_trunc('day', now()) - interval '30 day' + ), + ent_downloads as ( + select count(req.*) as cnt + from ge_vis as ge + join public.easyaudit_requestevent as req + on req.url ~ concat('api.*', ge.id, '|', ge.id, '.*export') + where req.datetime >= date_trunc('day', now()) - interval '30 day' + ), + ent_popular as ( + select + json_agg( + json_build_object( + 'id', ge.id, + 'name', ge.name, + 'view_count', req.cnt + ) + order by req.cnt desc + ) as cnt + from ( + select t0.id, count(t1.*) as cnt + from ge_vis as t0 + join public.easyaudit_requestevent as t1 + on t1.url like concat('%%', t0.id::text, '%%') + group by t0.id + order by cnt desc + limit (table const_max_popular)::int + ) as req + join ge_vis as ge + on req.id = ge.id + ) + select + (select cnt from ent_total) as total, + (select cnt from ent_created) as created, + (select cnt from ent_updated) as edited, + (select cnt from ent_views) as views, + (select cnt from ent_downloads) as downloads, + (select cnt from ent_popular) as popular + ''' \ + .format( + org_id=organisation.id, + pop_limit=self.MAX_POPULAR_ITEMS + ) + + with connection.cursor() as cursor: + cursor.execute(sql) + + columns = [col[0] for col in cursor.description] + return dict(zip(columns, cursor.fetchone())) + + def __resolve_org_context(self, organisation, user, current_brand): + members = organisation.members.through.objects \ + .filter(organisation_id=organisation.id) \ + .annotate( + role_name=Case( + *[When(role=v.value, then=Value(v.name)) for v in constants.ORGANISATION_ROLES], + default=Value(constants.ORGANISATION_ROLES.MEMBER.name), + output_field=models.CharField() + ) + ) \ + .distinct('user_id') + + is_owner = False + is_member = False + is_admin = False + if user: + is_owner = organisation.owner_id == user.id + + membership = organisation.organisationmembership_set.filter(user_id=user.id) + if membership.exists(): + membership = membership.first() + + is_member = True + is_admin = membership.role >= constants.ORGANISATION_ROLES.ADMIN + + entity_brand_clause = '' + user_perms_sql = f''' + select memb.user_id, memb.organisation_id, memb.role + from public.auth_user as uau + join public.clinicalcode_organisationmembership as memb + on uau.id = memb.user_id + join public.clinicalcode_organisation as org + on memb.organisation_id = org.id + where memb.organisation_id = {organisation.id} + and memb.user_id = {user.id if user else 'null'} + union + select uau.id as user_id, org.id as organisation_id, 3 as role + from public.auth_user as uau + join public.clinicalcode_organisation as org + on org.owner_id = uau.id + where uau.id = {user.id if user else 'null'} + ''' + if current_brand is not None: + entity_brand_clause = f'and ge.brands && array[{current_brand.id}]' + + user_perms_sql = f''' + select memb.user_id, memb.organisation_id, memb.role + from public.auth_user as uau + join public.clinicalcode_organisationmembership as memb + on uau.id = memb.user_id + join public.clinicalcode_organisation as org + on memb.organisation_id = org.id + join public.clinicalcode_organisationauthority as auth + on auth.organisation_id = org.id + where memb.organisation_id = {organisation.id} + and memb.user_id = {user.id if user else 'null'} + and auth.brand_id = {current_brand.id} + union + select uau.id as user_id, org.id as organisation_id, 3 as role + from public.auth_user as uau + join public.clinicalcode_organisation as org + on org.owner_id = uau.id + where uau.id = {user.id if user else 'null'} + ''' + + sql = f''' + with user_perms as ( + {user_perms_sql} + ), + entities as ( + select hge.id, hge.history_id, hge.name, hge.updated, + hge.publish_status, ge.organisation_id, ge.is_deleted, + row_number() over (partition by hge.id order by hge.history_id desc) as rn + from public.clinicalcode_historicalgenericentity as hge + join public.clinicalcode_genericentity as ge + on hge.id = ge.id + where ge.organisation_id = {organisation.id} + {entity_brand_clause} + ), + published as ( + select id, history_id, name, updated, publish_status + from ( + select *, + min(rn) over (partition by entities.id) as min_rn + from entities + where publish_status = {constants.APPROVAL_STATUS.APPROVED} + ) as sq + where rn = min_rn + ), + draft as ( + select id, history_id, name, updated, publish_status + from ( + select entities.*, + min(entities.rn) over (partition by entities.id) as min_rn + from entities + join user_perms + on entities.organisation_id = user_perms.organisation_id + left join published + on entities.id = published.id + and published.history_id > entities.history_id + where entities.publish_status != {constants.APPROVAL_STATUS.APPROVED} + and published.id is null + and entities.is_deleted is null or entities.is_deleted = false + ) as sq + where rn = min_rn + ), + moderated as ( + select entities.id, entities.history_id, entities.name, + entities.updated, entities.publish_status + from entities + join user_perms + on entities.organisation_id = user_perms.organisation_id + where user_perms.role >= 2 + and entities.publish_status in ( + {constants.APPROVAL_STATUS.REQUESTED}, {constants.APPROVAL_STATUS.PENDING} + ) + ) + select json_build_object( + 'published', ( + select json_agg(json_build_object( + 'id', id, + 'history_id', history_id, + 'name', name, + 'updated', updated, + 'publish_status', publish_status + )) from published + ), + 'draft', ( + select json_agg(json_build_object( + 'id', id, + 'history_id', history_id, + 'name', name, + 'updated', updated, + 'publish_status', publish_status + )) from draft + ), + 'moderated', ( + select json_agg(json_build_object( + 'id', id, + 'history_id', history_id, + 'name', name, + 'updated', updated, + 'publish_status', publish_status + )) from moderated + ) + ) as "data" + ''' + entities = None + with connection.cursor() as cursor: + cursor.execute(sql) + + columns = [col[0] for col in cursor.description] + entities = [dict(zip(columns, row)) for row in cursor.fetchall()][0] + entities = entities.get('data') + + entities = entities if isinstance(entities, dict) else {} + drafts = entities.get('draft') + published = entities.get('published') + + has_entities = ( + (isinstance(drafts, list) and len(drafts) > 0) + or (isinstance(published, list) and len(published) > 0) + ) + + return { + 'instance': organisation, + 'is_owner': is_owner, + 'is_member': is_member, + 'is_admin': is_admin, + 'members': members, + 'published': published, + 'draft': drafts, + 'moderated': entities.get('moderated'), + 'has_entities': has_entities, + } + ''' View Invite ''' class OrganisationInviteView(TemplateView): diff --git a/CodeListLibrary_project/clinicalcode/views/dashboard/BrandAdmin.py b/CodeListLibrary_project/clinicalcode/views/dashboard/BrandAdmin.py index 5eef479b8..fb2c0f207 100644 --- a/CodeListLibrary_project/clinicalcode/views/dashboard/BrandAdmin.py +++ b/CodeListLibrary_project/clinicalcode/views/dashboard/BrandAdmin.py @@ -12,9 +12,13 @@ from rest_framework.decorators import schema from django.contrib.staticfiles import finders from django.contrib.staticfiles.storage import staticfiles_storage +from google.oauth2 import service_account +from google.auth.transport.requests import Request import os import math +import json +import codecs import logging import psycopg2 @@ -292,6 +296,59 @@ def __compute_summary(self, brand): stats_context = '^\/%s.*$' % brand.name query_params.update({ 'stats_ctx': stats_context }) + result = { + 'data': { }, + 'timestamp': datetime.now().isoformat() + } + + if settings.GA4_ACTIVE: + try: + scopes = settings.GA4_INFO.get('scopes') + property_id = settings.GA4_INFO.get('property_id') + client_info = settings.GA4_INFO.get('client') + + client_info['private_key'] = codecs.decode(client_info.get('private_key'), 'unicode_escape') + + credentials = service_account.Credentials.from_service_account_info( + client_info, + scopes=scopes.split(',') + ) + + request = Request() + credentials.refresh(request) + + response = request( + url=f'https://analyticsdata.googleapis.com/v1beta/properties/{property_id}:runReport', + method='POST', + body=json.dumps({ + 'dateRanges': [ + { 'startDate': 'today', 'endDate': 'today' }, + { 'startDate': '28daysAgo', 'endDate': 'yesterday' }, + # { 'startDate': '7daysAgo', 'endDate': 'yesterday' }, + ], + 'metrics': [ + { 'name': 'activeUsers' }, + # { 'name': 'newUsers' }, + ] + }), + headers={ + 'Authorization': f'Bearer {credentials.token}', + 'Content-Type': 'application/json' + }, + timeout=5 + ) + + if response.status == 200: + report_data = json.loads(response.data) + report_rows = report_data.get('rows') + + monthly_users = report_rows[0].get('metricValues')[0].get('value') + daily_users = report_rows[1].get('metricValues')[0].get('value') + + result['data'] |= { 'mau': monthly_users, 'dau': daily_users } + except Exception as e: + logger.error(f'Failed to retrieve GA4 API report w/ err:\n{e}\n') + with connection.cursor() as cursor: if isinstance(content_visibility, dict): allowed_brands = content_visibility.get('ids') @@ -411,6 +468,8 @@ def __compute_summary(self, brand): cursor.execute(sql, params=query_params) columns = [col[0] for col in cursor.description] + resultset = dict(zip(columns, cursor.fetchone())) + + result['data'] = resultset | result['data'] - result = { 'data': dict(zip(columns, row)) for row in cursor.fetchall() } - return result | { 'timestamp': datetime.now().isoformat() } + return result diff --git a/CodeListLibrary_project/clinicalcode/views/tests/test_views.py b/CodeListLibrary_project/clinicalcode/views/tests/test_views.py deleted file mode 100644 index f4b15cd0b..000000000 --- a/CodeListLibrary_project/clinicalcode/views/tests/test_views.py +++ /dev/null @@ -1,36 +0,0 @@ -from unittest.case import skip -from django.test import Client, TestCase - -from ...utils import (detect_sql_meta_characters, detect_sql_injection_with_keywords) - -@skip("just skip") -class ViewTest(TestCase): - - @classmethod - def setUpClass(cls): - super(ViewTest, cls).setUpClass() - print("View tests ...") - - def setup(self): - self.client = Client() - - def test_sqlInjection_sqlMetaCharacters_provideMatch(self): - value = 'SELECT --:\'' - match = detect_sql_meta_characters(value) - self.assertEqual(match, True) - - def test_sqlInjection_noSqlMetaCharacters_doesNotProvideMatch(self): - value = 'C08' - match = detect_sql_meta_characters(value) - self.assertEqual(match, False) - - def test_sqlInject_sqlWithKeywords_provideMatch(self): - value = "' select" - - match = detect_sql_injection_with_keywords(value) - self.assertEqual(match, True) - - def test_sqlInject_sqlWithoutKeywords_doesNotProvideMatch(self): - value = "C09" - match = detect_sql_injection_with_keywords(value) - self.assertEqual(match, False) diff --git a/CodeListLibrary_project/cll/settings.py b/CodeListLibrary_project/cll/settings.py index 0e0b6603f..cfb951845 100644 --- a/CodeListLibrary_project/cll/settings.py +++ b/CodeListLibrary_project/cll/settings.py @@ -76,19 +76,20 @@ def GET_SERVER_IP(TARGET_IP='10.255.255.255', PORT=1): return IP -def get_env_value(env_variable, cast=None, default=Symbol('None')): +def get_env_value(env_variable, cast=None, default=Symbol('None'), strip_empty=False): """ Attempts to get env variable from OS """ try: - if cast == None: - return os.environ[env_variable] - elif cast == 'int': + if cast == 'int': return int(os.environ[env_variable]) elif cast == 'bool': return bool(strtobool(os.environ[env_variable])) else: - return os.environ[env_variable] + value = os.environ[env_variable] + if strip_empty and len(value) < 1: + return default + return value except KeyError: if isinstance(default, Symbol): error_msg = 'Expected environment variable "{}" of type<{}>, please set a valid "{}" environment variable' \ @@ -678,6 +679,35 @@ def get_env_value(env_variable, cast=None, default=Symbol('None')): and DOI_RELATION is not None )) +## GA4 info +GA4_INFO = { + 'scopes': get_env_value('GA4_SCOPES', default=None, strip_empty=True), + 'property_id': get_env_value('GA4_PROP_ID', default=None, strip_empty=True), + 'client': { + 'type': get_env_value('GA4_ACC', default=None, strip_empty=True), + 'project_id': get_env_value('GA4_PID', default=None, strip_empty=True), + 'private_key': get_env_value('GA4_PKEY', default=None, strip_empty=True), + 'private_key_id': get_env_value('GA4_PKID', default=None, strip_empty=True), + 'client_id': get_env_value('GA4_CID', default=None, strip_empty=True), + 'client_email': get_env_value('GA4_EMAIL', default=None, strip_empty=True), + 'auth_uri': get_env_value('GA4_AUTH_URI', default=None, strip_empty=True), + 'token_uri': get_env_value('GA4_TOKEN_URI', default=None, strip_empty=True), + 'auth_provider_x509_cert_url': get_env_value('GA4_PAUTH_CERT_URL', default=None, strip_empty=True), + 'client_x509_cert_url': get_env_value('GA4_CAUTH_CERT_URL', default=None, strip_empty=True), + 'universe_domain': get_env_value('GA4_UNIVERSE_DOMAIN', default=None, strip_empty=True), + }, +} + +GA4_ACTIVE = ( + not REMOTE_TEST + and not IS_DEMO + and not CLL_READ_ONLY + and not IS_INSIDE_GATEWAY + and not IS_DEVELOPMENT_PC +) + +GA4_STUDIO_LINK = get_env_value('GA4_STUDIO_LINK', default=None, strip_empty=True) + ## CAPTCHA ### To ignore captcha during debug builds try: diff --git a/CodeListLibrary_project/cll/static/js/clinicalcode/cookies/analytics.js b/CodeListLibrary_project/cll/static/js/clinicalcode/cookies/analytics.js index 39ced79f1..4bda2157c 100644 --- a/CodeListLibrary_project/cll/static/js/clinicalcode/cookies/analytics.js +++ b/CodeListLibrary_project/cll/static/js/clinicalcode/cookies/analytics.js @@ -117,28 +117,6 @@ const setAnalyticsEnv = (config, consent = null) => { } } -const getAnalyticsTarget = () => { - const host = getCurrentHost(); - const brand = document.documentElement.getAttribute('data-brand'); - const isUnbranded = isNullOrUndefined(brand) || isStringEmpty(brand) || brand === 'none'; - if (!!host.match(CLU_HOST.HDRUK)) { - return { - brand: 'HDRUK', - configId: 'G-W6XK339B16', - }; - } else if (!isUnbranded && brand.toLowerCase() === 'HDRUK') { - return { - brand: 'HDRUK', - configId: 'G-QE37B9J5WK', - } - } - - return { - brand: isUnbranded ? 'none' : brand, - configId: 'G-KLBS2646W1', - } -}; - domReady.finally(() => { const cookieSrc = document.querySelector('script[data-src="cookies"]'); if (!cookieSrc) { diff --git a/CodeListLibrary_project/cll/static/js/clinicalcode/services/organisationService/utils.js b/CodeListLibrary_project/cll/static/js/clinicalcode/services/organisationService/utils.js index fb444e434..25e951976 100644 --- a/CodeListLibrary_project/cll/static/js/clinicalcode/services/organisationService/utils.js +++ b/CodeListLibrary_project/cll/static/js/clinicalcode/services/organisationService/utils.js @@ -30,3 +30,115 @@ export const confirmationPrompt = ({ } }); } + +export const getStatsIcon = (key) => { + switch (key) { + case 'total': + return { + title: 'Content', + icon: '', + desc: 'No. of owned Phenotypes', + } + case 'created': + return { + title: 'Created', + icon: '', + desc: 'No. created in the last 30 days', + } + case 'edited': + return { + title: 'Edited', + icon: '', + desc: 'No. edited in the last 30 days', + } + case 'views': + return { + title: 'Phenotypes', + icon: '', + desc: 'View count in the last 30 days', + } + case 'downloads': + return { + title: 'Downloads', + icon: '', + desc: 'Downloads in the last 30 days', + } + case 'popular': + return { + title: 'Popular', + icon: '', + desc: 'Top 5 Phenotypes', + } + default: + // ''; + return null; + } +} + +export const composeStatsCard = (parent, key, data, entityResolver) => { + if (typeof data === 'undefined' || data === null) { + console.warn(`Failed to compose StatsCard w/ err:\nInvalid data`); + return null; + } + + const info = getStatsIcon(key); + if (typeof info === 'undefined' || info === null) { + console.warn(`Failed to compose StatsCard w/ err:\nUnknown key type`); + return null; + } + + let template; + let className = getObjectClassName(data); + switch (className) { + case 'Number': + template = '
\ +
\ +

${title}

\ + \ +
\ +

${desc}

\ +
${data}
\ +
' + break; + + case 'Array': + data = Object.values(data) + if (data.length < 1) { + return null; + } + + data = data + .reduce((out, x) => { + const url = entityResolver(x.id); + out.push(`
+ ${x.id} + ${x.view_count} +
`) + + return out; + }, []) + .join('\n') + + template = '
\ +
\ +

${title}

\ + \ +
\ +

${desc}

\ +
\ + ${data} \ +
\ +
' + + break; + + default: + console.warn(`Failed to compose StatsCard w/ err:\nUnknown datatype for case Data`) + return null; + } + + return composeTemplate(template, { + params: Object.assign(info, { 'data': data }), + parent: parent, + }); +} \ No newline at end of file diff --git a/CodeListLibrary_project/cll/static/js/clinicalcode/services/organisationService/view.js b/CodeListLibrary_project/cll/static/js/clinicalcode/services/organisationService/view.js index 14f56386d..3423fa11f 100644 --- a/CodeListLibrary_project/cll/static/js/clinicalcode/services/organisationService/view.js +++ b/CodeListLibrary_project/cll/static/js/clinicalcode/services/organisationService/view.js @@ -3,6 +3,11 @@ import * as orgUtils from './utils.js'; let ARCHIVE_TEMPLATE; const + /** + * ENTITY_URL + * @desc specifies the URL(s) associated with the "Popular" card + */ + ENTITY_URL = '/${url_target}/${id}/detail/', /** * DETAIL_URL * @desc describes the URL(s) associated with the action button(s) @@ -146,14 +151,23 @@ const getCollectionData = () => { let value = data.innerText.trim(); if (!isNullOrUndefined(value) && !isStringEmpty(value.trim())) { if (type == 'text/json') { - value = JSON.parse(value); + try { + value = JSON.parse(value); + } catch (e) { + console.error(`Failed to parse data w/ err:\n${e}`); + value = null; + } } } + if (isNullOrUndefined(value) || !(Array.isArray(value) || isObjectType(value))) { + value = null; + } + result[name] = { pageType: pageType, - container: data.parentNode.querySelector('.organisation-collection__table-container'), - data: value || [ ], + container: data.parentNode.querySelector('[data-cx="container"]'), + data: value, } } @@ -353,7 +367,32 @@ domReady.finally(() => { delete data.mapping; for (let [key, value] of Object.entries(data)) { - if (value.data.length < 1) { + if (isNullOrUndefined(value.data) || (Array.isArray(value.data) && value.data.length < 1)) { + continue; + } + + if (value.pageType === 'STATS') { + if (!isObjectType(value.data)) { + continue; + } + + let entityResolver = (id) => { + let urlTarget = mapping?.phenotype_url; + if (!stringHasChars(urlTarget)) { + urlTarget = 'phenotypes'; + } + + const brand = getBrandedHost(); + return interpolateString(brand + ENTITY_URL, { + id: id, + url_target: urlTarget, + }); + } + + for (const key in value.data) { + console.log(key, value.data[key], value.container) + orgUtils.composeStatsCard(value.container, key, value.data[key], entityResolver) + } continue; } diff --git a/CodeListLibrary_project/cll/static/js/clinicalcode/utils.js b/CodeListLibrary_project/cll/static/js/clinicalcode/utils.js index 6c801cf72..4c1cb4ca0 100644 --- a/CodeListLibrary_project/cll/static/js/clinicalcode/utils.js +++ b/CodeListLibrary_project/cll/static/js/clinicalcode/utils.js @@ -2539,6 +2539,33 @@ const findMissingComponents = (templates, expected, missing = []) => { return missing; } +/** + * @desc resolves the analytics manager's brand context and target config ID + * + * @returns {{ brand: string, configId: string }} the resulting analytics target info + */ +const getAnalyticsTarget = () => { + const host = getCurrentHost(); + const brand = document.documentElement.getAttribute('data-brand'); + const isUnbranded = isNullOrUndefined(brand) || isStringEmpty(brand) || brand === 'none'; + if (!!host.match(CLU_HOST.HDRUK)) { + return { + brand: 'HDRUK', + configId: 'G-W6XK339B16', + }; + } else if (!isUnbranded && brand.toLowerCase() === 'HDRUK') { + return { + brand: 'HDRUK', + configId: 'G-QE37B9J5WK', + } + } + + return { + brand: isUnbranded ? 'none' : brand, + configId: 'G-KLBS2646W1', + } +}; + /** * @desc analytics manager wrapper * @@ -2566,3 +2593,35 @@ const tryAnalytics = (fn) => { } }); } + +/** + * @desc attempts to resolve the profile associated with this client + * + * @returns {{ active: boolean, client_id: string, session_id: string }} GA4 user analytics profile data + */ +const getAnalyticsProfile = () => { + const res = { active: false }; + const mngr = window?.gtag ?? null; + if (typeof mngr !== 'function') { + return Promise.resolve(result); + } + + const conf = getAnalyticsTarget(); + const wrap = (key, resolver) => (value) => resolver({ name: key, result: value }); + return Promise.allSettled([ + new Promise((resolve) => mngr('get', conf.configId, 'client_id', wrap('client_id', resolve))), + new Promise((resolve) => mngr('get', conf.configId, 'session_id', wrap('session_id', resolve))), + ]) + .then(result => { + res.active = true; + + return result.reduce((out, data) => { + if (data.status !== 'fulfilled') { + return; + } + + out[data.value.name] = data.value.result; + return out; + }, res); + }); +} \ No newline at end of file diff --git a/CodeListLibrary_project/cll/static/scss/pages/organisations.scss b/CodeListLibrary_project/cll/static/scss/pages/organisations.scss index 08da7853e..3fe1b9d9c 100644 --- a/CodeListLibrary_project/cll/static/scss/pages/organisations.scss +++ b/CodeListLibrary_project/cll/static/scss/pages/organisations.scss @@ -3,6 +3,124 @@ @import '../_media'; @import '../_utils'; +/// Organisation card +/// @desc Used to display organisation metrics +.org-stats-card { + @include flex-col(false, true); + width: 100%; + max-height: 220px; + flex: 1; + padding: 20px 20px; + overflow: hidden; + color: $mostly_black; + background-color: $white; + + @include apply-border; + @include prefix(box-shadow, rgba(99, 99, 99, 0.3) 0px 2px 8px 0px, webkit moz o); + + &--flex-1 { + flex: 1; + } + + &__desc { + color: $lightblack-grey; + margin: 0.25rem 0 0.5rem 0; + } + + &__header { + @include flex-row(false, true); + width: 100%; + max-width: 100%; + align-items: flex-start; + justify-content: space-between; + vertical-align: middle; + white-space: normal; + word-break: break-word; + word-wrap: break-word; + text-wrap: wrap; + + &:has(> :last-child:nth-child(1)) { + justify-content: flex-start; + } + + & > h3 { + color: $blackish-grey; + font-size: 1.05em; + margin: 0 0 0.5rem 0; + white-space: normal; + word-break: break-word; + word-wrap: break-word; + text-wrap: wrap; + } + } + + &__data { + display: flex; + flex-flow: row nowrap; + align-self: flex end; + width: auto; + height: 2.5em; + max-height: 2.5em; + align-items: center; + justify-content: center; + text-align: center; + font-size: 2em; + margin: 0; + padding: 0; + margin-top: auto; + } + + &__items { + display: flex; + flex-flow: column nowrap; + width: auto; + height: auto; + max-width: 100%; + max-height: 110px; + align-items: center; + margin: 0; + padding: 0; + margin-top: auto; + overflow-y: auto; + overflow-x: hidden; + + &-elem { + display: flex; + flex-flow: row wrap; + width: calc(100% - 5px); + height: auto; + max-width: 100%; + max-height: 100%; + padding: 0 5px 0 0; + align-items: center; + justify-content: space-between; + } + } + + &__footer { + @include flex-col(false, true); + width: 100%; + max-width: 100%; + overflow: clip; + color: $lightblack-grey; + + span:not(:last-of-type){ + margin-right: 1rem; + } + + svg { + margin-right: 5px; + } + + &--action { + @include flex-row(0.5rem, false); + align-items: center; + justify-content: flex-end; + padding: 5px 2px; + } + } +} + /// Organisation page /// @desc Stylesheet relating to organisations .organisation-page { @@ -83,6 +201,45 @@ } } } + + &__group { + @include apply-bbox(); + @include flex-col(false, true); + overflow: auto; + width: fit-content; + height: fit-content; + width: 100%; + max-width: 100%; + height: fit-content; + max-height: 210px; + } + + &__grid { + @include apply-bbox(); + // @include flex-row(1rem, true); + display: grid; + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); + grid-gap: 20px; + width: 100%; + height: fit-content; + max-width: 100%; + padding: 5px 10px; + align-items: stretch; + justify-content: space-evenly; + + &:has(> :last-child:nth-child(1)) { + justify-content: flex-start; + } + + .org-stats-card { + width: calc(100% - 40px); + } + + @include media(' Home + {% if IS_HDRUK_EXT and GA4_STUDIO_LINK and not IS_DEMO %} + + {% endif %}
{% csrf_token %}