Adding tests for the user service , and closing a few logic errors. Adding support for a single wild card for matching all users.

This commit is contained in:
Dan 2022-12-19 10:05:19 -05:00
parent e78f2471df
commit 170d9c3098
5 changed files with 72 additions and 8 deletions

View File

@ -35,6 +35,7 @@ module.exports = {
new CopyWebpackPlugin({ new CopyWebpackPlugin({
patterns: [ patterns: [
{ from: 'assets/**', to: 'vendor/bpmn-js', context: 'node_modules/bpmn-js/dist/' }, { from: 'assets/**', to: 'vendor/bpmn-js', context: 'node_modules/bpmn-js/dist/' },
{ from: '*.css', to: 'vendor/bpmn-js-color-picker', context: 'node_modules/bpmn-js-color-picker/colors' },
{ {
from: 'assets/**', from: 'assets/**',
to: 'vendor/bpmn-js-properties-panel', to: 'vendor/bpmn-js-properties-panel',

View File

@ -7,11 +7,11 @@ from sqlalchemy.orm import relationship
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
class UserGroupAssignmentWaitingModel(SpiffworkflowBaseDBModel): class UserGroupAssignmentWaitingModel(SpiffworkflowBaseDBModel):
"""UserGroupAssignmentsWaitingModel - When a user is assinged to a group, but that user has not yet logged into """UserGroupAssignmentsWaitingModel - When a user is assinged to a group, but that username does not exist,
the system, this caches that assignment, so it can be applied at the time the user logs in.""" we cache it here to be applied in the event the user does log into the system.
"""
MATCH_ALL_USERS = "*"
__tablename__ = "user_group_assignment_waiting" __tablename__ = "user_group_assignment_waiting"
__table_args__ = ( __table_args__ = (
db.UniqueConstraint("username", "group_id", name="user_group_assignment_staged_unique"), db.UniqueConstraint("username", "group_id", name="user_group_assignment_staged_unique"),
@ -22,3 +22,8 @@ class UserGroupAssignmentWaitingModel(SpiffworkflowBaseDBModel):
group_id = db.Column(ForeignKey(GroupModel.id), nullable=False) group_id = db.Column(ForeignKey(GroupModel.id), nullable=False)
group = relationship("GroupModel", overlaps="groups,user_group_assignment_waiting,users") # type: ignore group = relationship("GroupModel", overlaps="groups,user_group_assignment_waiting,users") # type: ignore
def is_match_all(self):
if self.username == self.MATCH_ALL_USERS:
return True
return False

View File

@ -485,7 +485,6 @@ class AuthorizationService:
email=email, email=email,
display_name = display_name display_name = display_name
) )
UserService().apply_waiting_group_assignments(user_model)
else : else :
# Update with the latest information # Update with the latest information

View File

@ -56,6 +56,7 @@ class UserService:
message=f"Could not add user {username}", message=f"Could not add user {username}",
) from e ) from e
cls.create_principal(user_model.id) cls.create_principal(user_model.id)
UserService().apply_waiting_group_assignments(user_model)
return user_model return user_model
else: else:
@ -135,18 +136,26 @@ class UserService:
@classmethod @classmethod
def add_waiting_group_assignment(cls, username: str, group: GroupModel) -> None: def add_waiting_group_assignment(cls, username: str, group: GroupModel) -> None:
exists = UserGroupAssignmentWaitingModel().query.filter_by(username=username).filter_by(group_id=group.id).count() wugam = UserGroupAssignmentWaitingModel().query.filter_by(username=username).filter_by(group_id=group.id).first()
if not exists: if not wugam:
wugam = UserGroupAssignmentWaitingModel(username=username, group_id=group.id) wugam = UserGroupAssignmentWaitingModel(username=username, group_id=group.id)
db.session.add(wugam) db.session.add(wugam)
db.session.commit() db.session.commit()
if wugam.is_match_all():
for user in UserModel.query.all():
cls.add_user_to_group(user, group)
@classmethod @classmethod
def apply_waiting_group_assignments(cls, user: UserModel) -> None: def apply_waiting_group_assignments(cls, user: UserModel) -> None:
waiting = UserGroupAssignmentWaitingModel().query.filter(UserGroupAssignmentWaitingModel.username == user.username).all() waiting = UserGroupAssignmentWaitingModel().query.\
filter(UserGroupAssignmentWaitingModel.username == user.username).all()
for assignment in waiting: for assignment in waiting:
cls.add_user_to_group(user, assignment.group) cls.add_user_to_group(user, assignment.group)
db.session.delete(assignment) db.session.delete(assignment)
wildcard = UserGroupAssignmentWaitingModel().query.\
filter(UserGroupAssignmentWaitingModel.username == UserGroupAssignmentWaitingModel.MATCH_ALL_USERS).all()
for assignment in wildcard:
cls.add_user_to_group(user, assignment.group)
db.session.commit() db.session.commit()
@staticmethod @staticmethod

View File

@ -0,0 +1,50 @@
"""Process Model."""
from flask.app import Flask
from flask.testing import FlaskClient
from spiffworkflow_backend.models.user_group_assignment_waiting import UserGroupAssignmentWaitingModel
from spiffworkflow_backend.services.group_service import GroupService
from spiffworkflow_backend.services.user_service import UserService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.services.git_service import GitService
class TestUserService(BaseTest):
"""TestUserService."""
def test_assigning_a_group_to_a_user_before_the_user_is_created (
self,
app: Flask,
client: FlaskClient,
with_db_and_bpmn_file_cleanup: None,
) -> None:
"""Test_waiting_group_assignments"""
aTestGroup = GroupService.find_or_create_group("aTestGroup")
UserService.add_group_assignment("initiator_user", aTestGroup)
initiator_user = self.find_or_create_user("initiator_user")
assert initiator_user.groups[0] == aTestGroup
def test_assigning_a_group_to_all_users_updates_new_users (
self,
app: Flask,
client: FlaskClient,
with_db_and_bpmn_file_cleanup: None,
) -> None:
"""Test_waiting_group_assignments"""
everybody_group = GroupService.find_or_create_group("everybodyGroup")
UserService.add_group_assignment(UserGroupAssignmentWaitingModel.MATCH_ALL_USERS, everybody_group)
initiator_user = self.find_or_create_user("initiator_user")
assert initiator_user.groups[0] == everybody_group
def test_assigning_a_group_to_all_users_updates_existing_users (
self,
app: Flask,
client: FlaskClient,
with_db_and_bpmn_file_cleanup: None,
) -> None:
"""Test_waiting_group_assignments"""
initiator_user = self.find_or_create_user("initiator_user")
everybody_group = GroupService.find_or_create_group("everybodyGroup")
UserService.add_group_assignment(UserGroupAssignmentWaitingModel.MATCH_ALL_USERS, everybody_group)
assert initiator_user.groups[0] == everybody_group