def test_delete_user_where_org_has_affiliations(session, auth_mock, keycloak_mock): # pylint:disable=unused-argument """Assert that a user can be deleted.""" user_model = factory_user_model(user_info=TestUserInfo.user_test) contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model contact_link = contact_link.flush() contact_link.commit() org = OrgService.create_org(TestOrgInfo.org1, user_id=user_model.id).as_dict() org_id = org['id'] entity = factory_entity_model(entity_info=TestEntityInfo.entity_lear_mock) affiliation = AffiliationModel(org_id=org_id, entity_id=entity.id) affiliation.save() with pytest.raises(BusinessException) as exception: UserService.delete_user(TestJwtClaims.user_test) assert exception.code == Error.DELETE_FAILED_ONLY_OWNER updated_user = UserModel.find_by_jwt_token(TestJwtClaims.user_test) contacts = UserService.get_contacts(TestJwtClaims.user_test) assert len(contacts) == 1 user_orgs = MembershipModel.find_orgs_for_user(updated_user.id) for org in user_orgs: assert org.status_code == 'ACTIVE'
def test_delete_contact_org_link(session, auth_mock): # pylint:disable=unused-argument """Assert that a contact can not be deleted if it's still being used by an entity.""" entity_model = factory_entity_model() entity = EntityService(entity_model) org = factory_org_service() org_dictionary = org.as_dict() org_id = org_dictionary['id'] contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.entity = entity._model # pylint:disable=protected-access contact_link.org = org._model # pylint:disable=protected-access contact_link.commit() OrgService.delete_contact(org_id=org_id) org = OrgService.find_by_org_id(org_id) response = OrgService.get_contacts(org_id) assert len(response['contacts']) == 0 delete_contact_link = ContactLinkModel.find_by_entity_id(entity.identifier) assert delete_contact_link exist_contact_link = ContactLinkModel.find_by_org_id(org_id) assert not exist_contact_link
def test_delete_contact_user_link(session, auth_mock): # pylint:disable=unused-argument """Assert that a contact can not be deleted if contact link exists.""" user_model = factory_user_model(user_info=TestUserInfo.user_test) user = UserService(user_model) org = OrgService.create_org(TestOrgInfo.org1, user_id=user.identifier) org_dictionary = org.as_dict() org_id = org_dictionary['id'] contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model contact_link.org = org._model # pylint:disable=protected-access contact_link.commit() updated_user = user.delete_contact(TestJwtClaims.user_test) dictionary = None dictionary = updated_user.as_dict() assert len(dictionary['contacts']) == 0 delete_contact_link = ContactLinkModel.find_by_user_id(user.identifier) assert not delete_contact_link exist_contact_link = ContactLinkModel.find_by_org_id(org_id) assert exist_contact_link
def test_delete_contact_user_link(session, auth_mock, keycloak_mock): # pylint:disable=unused-argument """Assert that a contact can not be deleted if contact link exists.""" user_with_token = TestUserInfo.user_test user_with_token['keycloak_guid'] = TestJwtClaims.edit_role['sub'] user_model = factory_user_model(user_info=user_with_token) user = UserService(user_model) org = OrgService.create_org(TestOrgInfo.org1, user_id=user.identifier) org_dictionary = org.as_dict() org_id = org_dictionary['id'] contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model contact_link.org = org._model # pylint:disable=protected-access contact_link = contact_link.flush() contact_link.commit() deleted_contact = UserService.delete_contact(TestJwtClaims.edit_role) assert deleted_contact is None delete_contact_link = ContactLinkModel.find_by_user_id(user.identifier) assert not delete_contact_link exist_contact_link = ContactLinkModel.find_by_org_id(org_id) assert exist_contact_link
def test_delete_contact_entity_link(session, auth_mock): # pylint:disable=unused-argument """Assert that a contact can not be deleted without entity.""" entity_model = factory_entity_model() entity = EntityService(entity_model) org = factory_org_service() org_dictionary = org.as_dict() org_id = org_dictionary['id'] contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.entity = entity._model # pylint:disable=protected-access contact_link.org = org._model # pylint:disable=protected-access contact_link.commit() updated_entity = entity.delete_contact() dictionary = None dictionary = updated_entity.as_dict() assert len(dictionary['contacts']) == 0 delete_contact_link = ContactLinkModel.find_by_entity_id(entity.identifier) assert not delete_contact_link exist_contact_link = ContactLinkModel.find_by_org_id(org_id) assert exist_contact_link
def test_get_user_settings(client, jwt, session, keycloak_mock): # pylint:disable=unused-argument """Assert that get works and adhere to schema.""" user_model = factory_user_model(user_info=TestUserInfo.user_test) contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model contact_link.commit() kc_id = user_model.keycloak_guid OrgService.create_org(TestOrgInfo.org1, user_id=user_model.id) claims = copy.deepcopy(TestJwtClaims.updated_test.value) claims['sub'] = str(kc_id) # post token with updated claims headers = factory_auth_header(jwt=jwt, claims=claims) rv = client.get(f'/api/v1/users/{kc_id}/settings', headers=headers, content_type='application/json') item_list = rv.json account = next(obj for obj in item_list if obj['type'] == 'ACCOUNT') assert account['accountType'] == 'BASIC' assert rv.status_code == http_status.HTTP_200_OK assert schema_utils.validate(item_list, 'user_settings_response')[0] assert account[ 'productSettings'] == f'/account/{account["id"]}/settings/product-settings'
def test_delete_user_as_only_admin_returns_400(client, jwt, session, keycloak_mock): # pylint:disable=unused-argument """Test if the user is the only owner of a team assert status is 400.""" user_model = factory_user_model(user_info=TestUserInfo.user_test) contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model contact_link.commit() org = OrgService.create_org(TestOrgInfo.org1, user_id=user_model.id) org_dictionary = org.as_dict() org_id = org_dictionary['id'] entity = factory_entity_model(entity_info=TestEntityInfo.entity_lear_mock) affiliation = AffiliationModel(org_id=org_id, entity_id=entity.id) affiliation.save() claims = copy.deepcopy(TestJwtClaims.edit_role.value) claims['sub'] = str(user_model.keycloak_guid) headers = factory_auth_header(jwt=jwt, claims=claims) rv = client.delete('/api/v1/users/@me', headers=headers, content_type='application/json') assert rv.status_code == http_status.HTTP_400_BAD_REQUEST
def test_delete_user_is_member_returns_204(client, jwt, session, keycloak_mock): # pylint:disable=unused-argument """Test if the user is the member of a team assert status is 204.""" user_model = factory_user_model(user_info=TestUserInfo.user_test) contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model contact_link.commit() org = OrgService.create_org(TestOrgInfo.org1, user_id=user_model.id) org_dictionary = org.as_dict() org_id = org_dictionary['id'] entity = factory_entity_model(entity_info=TestEntityInfo.entity_lear_mock) affiliation = AffiliationModel(org_id=org_id, entity_id=entity.id) affiliation.save() user_model2 = factory_user_model(user_info=TestUserInfo.user2) contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model2 contact_link.commit() membership = MembershipModel(org_id=org_id, user_id=user_model2.id, membership_type_code='MEMBER', membership_type_status=Status.ACTIVE.value) membership.save() claims = copy.deepcopy(TestJwtClaims.public_user_role.value) claims['sub'] = str(user_model2.keycloak_guid) headers = factory_auth_header(jwt=jwt, claims=claims) rv = client.delete('/api/v1/users/@me', headers=headers, content_type='application/json') assert rv.status_code == http_status.HTTP_204_NO_CONTENT
def test_get_user_settings(client, jwt, session, keycloak_mock, monkeypatch): # pylint:disable=unused-argument """Assert that get works and adhere to schema.""" user_model = factory_user_model(user_info=TestUserInfo.user_test) contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model contact_link.commit() kc_id = user_model.keycloak_guid claims = copy.deepcopy(TestJwtClaims.updated_test.value) claims['sub'] = str(kc_id) patch_token_info(claims, monkeypatch) OrgService.create_org(TestOrgInfo.org_branch_name, user_id=user_model.id) # post token with updated claims headers = factory_auth_header(jwt=jwt, claims=claims) rv = client.get(f'/api/v1/users/{kc_id}/settings', headers=headers, content_type='application/json') item_list = rv.json account = next(obj for obj in item_list if obj['type'] == 'ACCOUNT') assert account['accountType'] == 'BASIC' assert account['additionalLabel'] == TestOrgInfo.org_branch_name.get( 'branchName') assert rv.status_code == http_status.HTTP_200_OK assert schema_utils.validate(item_list, 'user_settings_response')[0] assert account[ 'productSettings'] == f'/account/{account["id"]}/restricted-product' kc_id_no_user = TestUserInfo.user1.get('keycloak_guid') claims = copy.deepcopy(TestJwtClaims.updated_test.value) claims['sub'] = str(kc_id_no_user) patch_token_info(claims, monkeypatch) # post token with updated claims headers = factory_auth_header(jwt=jwt, claims=claims) rv = client.get(f'/api/v1/users/{kc_id_no_user}/settings', headers=headers, content_type='application/json') assert rv.status_code == http_status.HTTP_200_OK assert schema_utils.validate(item_list, 'user_settings_response')[0] item_list = rv.json account = next((obj for obj in item_list if obj['type'] == 'ACCOUNT'), None) assert account is None user_profile = next(obj for obj in item_list if obj['type'] == 'USER_PROFILE') assert '/userprofile' in user_profile.get('urlpath')
def add_contact(self, contact_info: dict): """Add a business contact to this entity.""" # check for existing contact (we only want one contact per user) contact_link = ContactLinkModel.find_by_entity_id(self._model.id) if contact_link is not None: raise BusinessException(Error.DATA_ALREADY_EXISTS, None) contact = ContactModel(**camelback2snake(contact_info)) contact.commit() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.entity = self._model contact_link.commit() return self
def test_delete_user_where_org_has_another_owner(session, auth_mock, keycloak_mock, monkeypatch): # pylint:disable=unused-argument """Assert that a user can be deleted.""" # Create a user and org user_model = factory_user_model(user_info=TestUserInfo.user_test) contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model contact_link.commit() patch_token_info(TestJwtClaims.get_test_user(user_model.keycloak_guid), monkeypatch) org = OrgService.create_org(TestOrgInfo.org1, user_id=user_model.id) org_dictionary = org.as_dict() org_id = org_dictionary['id'] entity = factory_entity_model(entity_info=TestEntityInfo.entity_lear_mock) affiliation = AffiliationModel(org_id=org_id, entity_id=entity.id) affiliation.save() # Create another user and add membership to the above org user_model2 = factory_user_model(user_info=TestUserInfo.user2) contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model2 contact_link.commit() membership = MembershipModel(org_id=org_id, user_id=user_model2.id, membership_type_code='ADMIN', membership_type_status=Status.ACTIVE.value) membership.save() membership.commit() # with pytest.raises(BusinessException) as exception: patch_token_info(TestJwtClaims.get_test_user(user_model2.keycloak_guid), monkeypatch) UserService.delete_user() updated_user = UserModel.find_by_jwt_token() assert len(updated_user.contacts) == 0 user_orgs = MembershipModel.find_orgs_for_user(updated_user.id) for org in user_orgs: assert org.status_code == 'INACTIVE'
def add_contact(self, contact_info): """Create a new contact for this org.""" # check for existing contact (only one contact per org for now) current_app.logger.debug('>add_contact ') contact_link = ContactLinkModel.find_by_org_id(self._model.id) if contact_link is not None: raise BusinessException(Error.DATA_ALREADY_EXISTS, None) contact = ContactModel(**camelback2snake(contact_info)) contact.commit() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.org = self._model contact_link.commit() current_app.logger.debug('>add_contact ') return self
def test_delete_user(session, auth_mock): # pylint:disable=unused-argument """Assert that a user can be deleted.""" user_model = factory_user_model(user_info=TestUserInfo.user_test) contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.user = user_model contact_link.commit() org = OrgService.create_org(TestOrgInfo.org1, user_id=user_model.id) UserService.delete_user(TestJwtClaims.user_test) updated_user = UserModel.find_by_jwt_token(TestJwtClaims.user_test) assert len(updated_user.contacts) == 0 user_orgs = MembershipModel.find_orgs_for_user(updated_user.id) for org in user_orgs: assert org.status_code == 'INACTIVE'
def test_delete_entity(app, session): # pylint:disable=unused-argument """Assert that an entity can be deleted.""" entity_model = factory_entity_model() entity = EntityService(entity_model) org = factory_org_service() contact = factory_contact_model() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.entity = entity._model # pylint:disable=protected-access contact_link.org = org._model # pylint:disable=protected-access contact_link.commit() entity.delete() entity = EntityService.find_by_entity_id(entity.identifier) assert entity is None
def add_contact(token, contact_info: dict): """Add or update contact information for an existing user.""" user = UserModel.find_by_jwt_token(token) if user is None: raise BusinessException(Error.DATA_NOT_FOUND, None) # check for existing contact (we only want one contact per user) contact_link = ContactLinkModel.find_by_user_id(user.id) if contact_link is not None: raise BusinessException(Error.DATA_ALREADY_EXISTS, None) contact = ContactModel(**camelback2snake(contact_info)) contact.commit() contact_link = ContactLinkModel() contact_link.user = user contact_link.contact = contact contact_link.commit() return User(user)
def add_contact(org_id, contact_info): """Create a new contact for this org.""" # check for existing contact (only one contact per org for now) current_app.logger.debug('>add_contact') org = OrgModel.find_by_org_id(org_id) if org is None: raise BusinessException(Error.DATA_NOT_FOUND, None) contact_link = ContactLinkModel.find_by_org_id(org_id) if contact_link is not None: raise BusinessException(Error.DATA_ALREADY_EXISTS, None) contact = ContactModel(**camelback2snake(contact_info)) contact = contact.flush() contact.commit() contact_link = ContactLinkModel() contact_link.contact = contact contact_link.org = org contact_link = contact_link.flush() contact_link.commit() current_app.logger.debug('<add_contact') return ContactService(contact)