From e383ee533a103cf67166e1327a9b274782c50c16 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Fri, 5 Oct 2018 16:48:12 -0400 Subject: [PATCH 1/6] Super factories! --- tests/domain/test_environments.py | 44 +++++++++++----- tests/factories.py | 84 +++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 13 deletions(-) diff --git a/tests/domain/test_environments.py b/tests/domain/test_environments.py index eb432f77..65e808a0 100644 --- a/tests/domain/test_environments.py +++ b/tests/domain/test_environments.py @@ -16,6 +16,7 @@ from tests.factories import ( WorkspaceFactory, EnvironmentFactory, ProjectFactory, + SuperWorkspaceFactory, ) @@ -55,20 +56,37 @@ def test_update_environment_roles(): def test_get_scoped_environments(db): developer = UserFactory.create() - workspace = WorkspaceFactory.create() - workspace_user = Workspaces.add_member(workspace, developer, "developer") - project1 = ProjectFactory.create(workspace=workspace) - project2 = ProjectFactory.create(workspace=workspace) - env1 = EnvironmentFactory.create(project=project1, name="project1 dev") - env2 = EnvironmentFactory.create(project=project1, name="project1 staging") - env3 = EnvironmentFactory.create(project=project2, name="project2 dev") - env4 = EnvironmentFactory.create(project=project2, name="project2 staging") - db.session.add(EnvironmentRole(user=developer, environment=env1, role="developer")) - db.session.add(EnvironmentRole(user=developer, environment=env4, role="developer")) - db.session.commit() + workspace = SuperWorkspaceFactory.create( + name="hey", + members=[{"user": developer, "role_name": "developer"}], + projects=[ + { + "name": "project1", + "environments": [ + { + "name": "project1 dev", + "members": [{"user": developer, "role_name": "developer"}], + }, + {"name": "project1 staging"}, + {"name": "project1 prod"}, + ], + }, + { + "name": "project2", + "environments": [ + {"name": "project2 dev"}, + { + "name": "project2 staging", + "members": [{"user": developer, "role_name": "developer"}], + }, + {"name": "project2 prod"}, + ], + }, + ], + ) - project1_envs = Environments.for_user(developer, project1) + project1_envs = Environments.for_user(developer, workspace.projects[0]) assert [env.name for env in project1_envs] == ["project1 dev"] - project2_envs = Environments.for_user(developer, project2) + project2_envs = Environments.for_user(developer, workspace.projects[1]) assert [env.name for env in project2_envs] == ["project2 staging"] diff --git a/tests/factories.py b/tests/factories.py index b2b973e9..b8ab9b47 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -18,6 +18,8 @@ from atst.models.user import User from atst.models.role import Role from atst.models.workspace import Workspace from atst.domain.roles import Roles +from atst.models.workspace_role import WorkspaceRole +from atst.models.environment_role import EnvironmentRole class Base(factory.alchemy.SQLAlchemyModelFactory): @@ -98,6 +100,7 @@ class RequestFactory(Base): new_status=RequestStatus.STARTED, revision=factory.LazyAttribute(lambda se: se.factory_parent.revisions[-1]), ) + task_order = factory.SubFactory("tests.factories.TaskOrderFactory") class Params: initial_revision = None @@ -233,3 +236,84 @@ class ProjectFactory(Base): class EnvironmentFactory(Base): class Meta: model = Environment + + +class WorkspaceRoleFactory(Base): + class Meta: + model = WorkspaceRole + + workspace = factory.SubFactory(WorkspaceFactory) + role = factory.SubFactory(RoleFactory) + user = factory.SubFactory(UserFactory) + + +class EnvironmentRoleFactory(Base): + class Meta: + model = EnvironmentRole + + environment = factory.SubFactory(EnvironmentFactory) + role = factory.Faker("name") + user = factory.SubFactory(UserFactory) + + +class SuperEnvironmentFactory(EnvironmentFactory): + @classmethod + def create(cls, *args, **kwargs): + with_members = kwargs.pop("members", []) + environment = super().create(*args, **kwargs) + + for member in with_members: + user = member.get("user", UserFactory.create()) + role_name = member["role_name"] + EnvironmentRoleFactory.create( + environment=environment, role=role_name, user=user + ) + + return environment + + +class SuperProjectFactory(ProjectFactory): + @classmethod + def create(cls, *args, **kwargs): + with_environments = kwargs.pop("environments", []) + project = super().create(*args, **kwargs) + + environments = [ + SuperEnvironmentFactory.create(project=project, **e) for e in with_environments + ] + + project.environments = environments + return project + + +class SuperWorkspaceFactory(WorkspaceFactory): + class Meta: + pass + + @classmethod + def create(cls, *args, **kwargs): + with_projects = kwargs.pop("projects", []) + owner = kwargs.pop("owner", None) + members = kwargs.pop("members", []) + + workspace = super().create(*args, **kwargs) + + projects = [ + SuperProjectFactory.create(workspace=workspace, **p) for p in with_projects + ] + + if owner: + workspace.request.creator = owner + WorkspaceRoleFactory.create( + workspace=workspace, role=Roles.get("owner"), user=owner + ) + + for member in members: + user = member.get("user", UserFactory.create()) + role_name = member["role_name"] + WorkspaceRoleFactory.create( + workspace=workspace, role=Roles.get(role_name), user=user + ) + + workspace.projects = projects + return workspace From 9061c3515ccc3096cb5476198fd1bee595fd2ae0 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Sun, 7 Oct 2018 11:52:28 -0400 Subject: [PATCH 2/6] Refactor test_update_environment_roles --- tests/domain/test_environments.py | 58 +++++++++++++------------------ 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/tests/domain/test_environments.py b/tests/domain/test_environments.py index 65e808a0..64ad12b4 100644 --- a/tests/domain/test_environments.py +++ b/tests/domain/test_environments.py @@ -1,51 +1,42 @@ -import pytest -from uuid import uuid4 - from atst.domain.environments import Environments from atst.domain.environment_roles import EnvironmentRoles -from atst.domain.projects import Projects -from atst.domain.roles import Roles -from atst.domain.workspaces import Workspaces -from atst.domain.workspace_users import WorkspaceUsers -from atst.domain.exceptions import NotFoundError -from atst.models.environment_role import EnvironmentRole -from tests.factories import ( - RequestFactory, - UserFactory, - WorkspaceFactory, - EnvironmentFactory, - ProjectFactory, - SuperWorkspaceFactory, -) +from tests.factories import UserFactory, SuperWorkspaceFactory def test_update_environment_roles(): owner = UserFactory.create() - developer_data = { - "dod_id": "1234567890", - "first_name": "Test", - "last_name": "User", - "email": "test.user@mail.com", - "workspace_role": "developer", - } + developer = UserFactory.from_atat_role("developer") - workspace = Workspaces.create(RequestFactory.create(creator=owner)) - workspace_user = Workspaces.create_member(owner, workspace, developer_data) - project = Projects.create( - owner, workspace, "my test project", "It's mine.", ["dev", "staging", "prod"] + workspace = SuperWorkspaceFactory.create( + owner=owner, + members=[{"user": developer, "role_name": "developer"}], + projects=[ + { + "name": "project1", + "environments": [ + { + "name": "project1 dev", + "members": [{"user": developer, "role_name": "devlops"}], + }, + { + "name": "project1 staging", + "members": [{"user": developer, "role_name": "developer"}] + }, + {"name": "project1 prod"}, + ], + } + ], ) - dev_env = project.environments[0] - staging_env = project.environments[1] - Environments.add_member(dev_env, workspace_user.user, "devops") - Environments.add_member(staging_env, workspace_user.user, "developer") - + dev_env = workspace.projects[0].environments[0] + staging_env = workspace.projects[0].environments[1] new_ids_and_roles = [ {"id": dev_env.id, "role": "billing_admin"}, {"id": staging_env.id, "role": "developer"}, ] + workspace_user = workspace.members[0] Environments.update_environment_role(owner, new_ids_and_roles, workspace_user) new_dev_env_role = EnvironmentRoles.get(workspace_user.user.id, dev_env.id) staging_env_role = EnvironmentRoles.get(workspace_user.user.id, staging_env.id) @@ -57,7 +48,6 @@ def test_update_environment_roles(): def test_get_scoped_environments(db): developer = UserFactory.create() workspace = SuperWorkspaceFactory.create( - name="hey", members=[{"user": developer, "role_name": "developer"}], projects=[ { From e06025366aca9a3fff12d239f01bca09db8a69f5 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Mon, 8 Oct 2018 10:35:36 -0400 Subject: [PATCH 3/6] Allow RequestFactory to generate task order --- tests/factories.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/factories.py b/tests/factories.py index b8ab9b47..6844006d 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -100,11 +100,16 @@ class RequestFactory(Base): new_status=RequestStatus.STARTED, revision=factory.LazyAttribute(lambda se: se.factory_parent.revisions[-1]), ) - task_order = factory.SubFactory("tests.factories.TaskOrderFactory") class Params: initial_revision = None + @classmethod + def _adjust_kwargs(cls, **kwargs): + if kwargs.pop("with_task_order", False) and "task_order" not in kwargs: + kwargs["task_order"] = TaskOrderFactory.build() + return kwargs + @classmethod def create_initial_status_event(cls, request): return RequestStatusEventFactory( From 40557a549403683b39164511049e02790507b7a9 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Mon, 8 Oct 2018 10:36:02 -0400 Subject: [PATCH 4/6] Merge SuperFactories into Factories, overriding _create --- tests/domain/test_environments.py | 6 +- tests/factories.py | 119 ++++++++++++++---------------- 2 files changed, 58 insertions(+), 67 deletions(-) diff --git a/tests/domain/test_environments.py b/tests/domain/test_environments.py index 64ad12b4..70d862fb 100644 --- a/tests/domain/test_environments.py +++ b/tests/domain/test_environments.py @@ -1,14 +1,14 @@ from atst.domain.environments import Environments from atst.domain.environment_roles import EnvironmentRoles -from tests.factories import UserFactory, SuperWorkspaceFactory +from tests.factories import UserFactory, WorkspaceFactory def test_update_environment_roles(): owner = UserFactory.create() developer = UserFactory.from_atat_role("developer") - workspace = SuperWorkspaceFactory.create( + workspace = WorkspaceFactory.create( owner=owner, members=[{"user": developer, "role_name": "developer"}], projects=[ @@ -47,7 +47,7 @@ def test_update_environment_roles(): def test_get_scoped_environments(db): developer = UserFactory.create() - workspace = SuperWorkspaceFactory.create( + workspace = WorkspaceFactory.create( members=[{"user": developer, "role_name": "developer"}], projects=[ { diff --git a/tests/factories.py b/tests/factories.py index 6844006d..a26ee452 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -224,10 +224,38 @@ class WorkspaceFactory(Base): class Meta: model = Workspace - request = factory.SubFactory(RequestFactory) + request = factory.SubFactory(RequestFactory, with_task_order=True) # name it the same as the request ID by default name = factory.LazyAttribute(lambda w: w.request.id) + @classmethod + def _create(cls, model_class, *args, **kwargs): + with_projects = kwargs.pop("projects", []) + owner = kwargs.pop("owner", None) + members = kwargs.pop("members", []) + + workspace = super()._create(model_class, *args, **kwargs) + + projects = [ + ProjectFactory.create(workspace=workspace, **p) for p in with_projects + ] + + if owner: + workspace.request.creator = owner + WorkspaceRoleFactory.create( + workspace=workspace, role=Roles.get("owner"), user=owner + ) + + for member in members: + user = member.get("user", UserFactory.create()) + role_name = member["role_name"] + WorkspaceRoleFactory.create( + workspace=workspace, role=Roles.get(role_name), user=user + ) + + workspace.projects = projects + return workspace + class ProjectFactory(Base): class Meta: @@ -237,11 +265,37 @@ class ProjectFactory(Base): name = factory.Faker("name") description = "A test project" + @classmethod + def _create(cls, model_class, *args, **kwargs): + with_environments = kwargs.pop("environments", []) + project = super()._create(model_class, *args, **kwargs) + + environments = [ + EnvironmentFactory.create(project=project, **e) for e in with_environments + ] + + project.environments = environments + return project + class EnvironmentFactory(Base): class Meta: model = Environment + @classmethod + def _create(cls, model_class, *args, **kwargs): + with_members = kwargs.pop("members", []) + environment = super()._create(model_class, *args, **kwargs) + + for member in with_members: + user = member.get("user", UserFactory.create()) + role_name = member["role_name"] + EnvironmentRoleFactory.create( + environment=environment, role=role_name, user=user + ) + + return environment + class WorkspaceRoleFactory(Base): class Meta: @@ -259,66 +313,3 @@ class EnvironmentRoleFactory(Base): environment = factory.SubFactory(EnvironmentFactory) role = factory.Faker("name") user = factory.SubFactory(UserFactory) - - -class SuperEnvironmentFactory(EnvironmentFactory): - @classmethod - def create(cls, *args, **kwargs): - with_members = kwargs.pop("members", []) - environment = super().create(*args, **kwargs) - - for member in with_members: - user = member.get("user", UserFactory.create()) - role_name = member["role_name"] - EnvironmentRoleFactory.create( - environment=environment, role=role_name, user=user - ) - - return environment - - -class SuperProjectFactory(ProjectFactory): - @classmethod - def create(cls, *args, **kwargs): - with_environments = kwargs.pop("environments", []) - project = super().create(*args, **kwargs) - - environments = [ - SuperEnvironmentFactory.create(project=project, **e) for e in with_environments - ] - - project.environments = environments - return project - - -class SuperWorkspaceFactory(WorkspaceFactory): - class Meta: - pass - - @classmethod - def create(cls, *args, **kwargs): - with_projects = kwargs.pop("projects", []) - owner = kwargs.pop("owner", None) - members = kwargs.pop("members", []) - - workspace = super().create(*args, **kwargs) - - projects = [ - SuperProjectFactory.create(workspace=workspace, **p) for p in with_projects - ] - - if owner: - workspace.request.creator = owner - WorkspaceRoleFactory.create( - workspace=workspace, role=Roles.get("owner"), user=owner - ) - - for member in members: - user = member.get("user", UserFactory.create()) - role_name = member["role_name"] - WorkspaceRoleFactory.create( - workspace=workspace, role=Roles.get(role_name), user=user - ) - - workspace.projects = projects - return workspace From 7df8d3bfa44ddb5c9f7cc963f1be55b5014117e8 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Mon, 8 Oct 2018 10:44:38 -0400 Subject: [PATCH 5/6] Replace setup with WorkspaceFactory --- tests/domain/test_projects.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/domain/test_projects.py b/tests/domain/test_projects.py index e473f4df..480e588c 100644 --- a/tests/domain/test_projects.py +++ b/tests/domain/test_projects.py @@ -1,5 +1,5 @@ from atst.domain.projects import Projects -from tests.factories import RequestFactory, UserFactory +from tests.factories import RequestFactory, UserFactory, WorkspaceFactory from atst.domain.workspaces import Workspaces @@ -18,12 +18,17 @@ def test_create_project_with_multiple_environments(): def test_workspace_owner_can_view_environments(): owner = UserFactory.create() - request = RequestFactory.create(creator=owner) - workspace = Workspaces.create(request) - _project = Projects.create( - owner, workspace, "My Test Project", "Test", ["dev", "prod"] + workspace = WorkspaceFactory.create( + owner=owner, + projects=[ + { + "environments": [ + {"name": "dev"}, + {"name": "prod"} + ] + } + ] ) - - project = Projects.get(owner, workspace, _project.id) + project = Projects.get(owner, workspace, workspace.projects[0].id) assert len(project.environments) == 2 From 7a23b096769e34488becfb015b2a7ad7a3dfad18 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Mon, 8 Oct 2018 11:40:15 -0400 Subject: [PATCH 6/6] Formatting --- tests/domain/test_environments.py | 2 +- tests/domain/test_projects.py | 10 +--------- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/tests/domain/test_environments.py b/tests/domain/test_environments.py index 70d862fb..b81e0366 100644 --- a/tests/domain/test_environments.py +++ b/tests/domain/test_environments.py @@ -21,7 +21,7 @@ def test_update_environment_roles(): }, { "name": "project1 staging", - "members": [{"user": developer, "role_name": "developer"}] + "members": [{"user": developer, "role_name": "developer"}], }, {"name": "project1 prod"}, ], diff --git a/tests/domain/test_projects.py b/tests/domain/test_projects.py index 480e588c..d46b1135 100644 --- a/tests/domain/test_projects.py +++ b/tests/domain/test_projects.py @@ -19,15 +19,7 @@ def test_create_project_with_multiple_environments(): def test_workspace_owner_can_view_environments(): owner = UserFactory.create() workspace = WorkspaceFactory.create( - owner=owner, - projects=[ - { - "environments": [ - {"name": "dev"}, - {"name": "prod"} - ] - } - ] + owner=owner, projects=[{"environments": [{"name": "dev"}, {"name": "prod"}]}] ) project = Projects.get(owner, workspace, workspace.projects[0].id)