Skip to content

Commit

Permalink
Fix organization rename case sensitivity (#12208)
Browse files Browse the repository at this point in the history
* Use case sensitive check to confirm organization name

* Use case sensitive check to confirm team name

* Use case sensitive check to confirm project name

* Allow changing case with organization rename

For example, allow renaming 'Foo' to 'foo'.

* Allow changing case with team rename

For example, allow rename 'Bar' to 'bar'.

* Show org name in title of rename confirm modal

* Test case sensitive check to confirm actions

* Test allow changing case with rename
  • Loading branch information
divbzero authored Sep 15, 2022
1 parent b0096ca commit debf2b7
Show file tree
Hide file tree
Showing 11 changed files with 188 additions and 103 deletions.
6 changes: 3 additions & 3 deletions tests/unit/admin/views/test_projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ def test_sets_limit_with_less_than_minimum(self, db_request):

class TestDeleteProject:
def test_no_confirm(self):
project = pretend.stub(normalized_name="foo")
project = pretend.stub(name="foo", normalized_name="foo")
request = pretend.stub(
POST={},
session=pretend.stub(flash=pretend.call_recorder(lambda *a, **kw: None)),
Expand All @@ -457,7 +457,7 @@ def test_no_confirm(self):
]

def test_wrong_confirm(self):
project = pretend.stub(normalized_name="foo")
project = pretend.stub(name="foo", normalized_name="foo")
request = pretend.stub(
POST={"confirm_project_name": "bar"},
session=pretend.stub(flash=pretend.call_recorder(lambda *a, **kw: None)),
Expand Down Expand Up @@ -485,7 +485,7 @@ def test_deletes_project(self, db_request):
db_request.session = pretend.stub(
flash=pretend.call_recorder(lambda *a, **kw: None)
)
db_request.POST["confirm_project_name"] = project.normalized_name
db_request.POST["confirm_project_name"] = project.name
db_request.user = UserFactory.create()

views.delete_project(project, db_request)
Expand Down
115 changes: 79 additions & 36 deletions tests/unit/manage/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2923,10 +2923,10 @@ def test_save_organization_name(
enable_organizations,
monkeypatch,
):
organization = OrganizationFactory.create(name="old-name")
organization = OrganizationFactory.create(name="foobar")
db_request.POST = {
"confirm_current_organization_name": organization.name,
"name": "new-name",
"name": "FooBar",
}
db_request.route_path = pretend.call_recorder(
lambda *a, organization_name, **kw: (
Expand Down Expand Up @@ -2981,30 +2981,57 @@ def rename_organization(organization_id, organization_name):
f"/manage/organization/{organization.normalized_name}/settings/#modal-close"
)
assert organization_service.rename_organization.calls == [
pretend.call(organization.id, "new-name")
pretend.call(organization.id, "FooBar")
]
assert send_email.calls == [
pretend.call(
db_request,
admins,
organization_name="new-name",
previous_organization_name="old-name",
organization_name="FooBar",
previous_organization_name="foobar",
),
pretend.call(
db_request,
{pyramid_user},
organization_name="new-name",
previous_organization_name="old-name",
organization_name="FooBar",
previous_organization_name="foobar",
),
]

def test_save_organization_name_wrong_confirm(
self, db_request, organization_service, enable_organizations, monkeypatch
):
organization = OrganizationFactory.create(name="foobar")
db_request.POST = {
"confirm_current_organization_name": organization.name.upper(),
"name": "FooBar",
}
db_request.route_path = pretend.call_recorder(lambda *a, **kw: "/the-redirect")
db_request.session = pretend.stub(
flash=pretend.call_recorder(lambda *a, **kw: None)
)

view = views.ManageOrganizationSettingsViews(organization, db_request)
with pytest.raises(HTTPSeeOther):
view.save_organization_name()

assert db_request.session.flash.calls == [
pretend.call(
(
"Could not rename organization - "
"'FOOBAR' is not the same as 'foobar'"
),
queue="error",
)
]

def test_save_organization_name_validation_fails(
self, db_request, organization_service, enable_organizations, monkeypatch
):
organization = OrganizationFactory.create(name="old-name")
organization = OrganizationFactory.create(name="foobar")
db_request.POST = {
"confirm_current_organization_name": organization.name,
"name": "new-name",
"name": "FooBar",
}

def rename_organization(organization_id, organization_name):
Expand Down Expand Up @@ -4871,21 +4898,30 @@ def test_manage_team(

def test_save_team(self, db_request, organization_service, enable_organizations):
team = TeamFactory.create(name="Team Name")
db_request.POST = MultiDict({"name": "New Team Name"})
db_request.POST = MultiDict({"name": "Team name"})
db_request.route_path = pretend.call_recorder(lambda *a, **kw: "/foo/bar/")

view = views.ManageTeamSettingsViews(team, db_request)
result = view.save_team()

assert isinstance(result, HTTPSeeOther)
assert result.headers["Location"] == "/foo/bar/"
assert team.name == "New Team Name"
assert team.name == "Team name"

def test_save_team_validation_fails(
self, db_request, organization_service, enable_organizations
):
team = TeamFactory.create(name="Team Name")
db_request.POST = MultiDict({"name": "Team Name"})
organization = OrganizationFactory.create()
team = TeamFactory.create(
name="Team Name",
organization=organization,
)
TeamFactory.create(
name="Existing Team Name",
organization=organization,
)

db_request.POST = MultiDict({"name": "Existing Team Name"})

view = views.ManageTeamSettingsViews(team, db_request)
result = view.save_team()
Expand All @@ -4897,7 +4933,7 @@ def test_save_team_validation_fails(
}
assert team.name == "Team Name"
assert form.name.errors == [
("This team name has already been used. " "Choose a different team name.")
"This team name has already been used. Choose a different team name."
]

def test_delete_team(
Expand Down Expand Up @@ -4964,7 +5000,7 @@ def test_delete_team_wrong_confirm(
monkeypatch,
):
team = TeamFactory.create(name="Team Name")
db_request.POST = MultiDict({"confirm_team_name": "Wrong Team Name"})
db_request.POST = MultiDict({"confirm_team_name": "TEAM NAME"})
db_request.session = pretend.stub(
flash=pretend.call_recorder(lambda *a, **kw: None)
)
Expand All @@ -4978,7 +5014,7 @@ def test_delete_team_wrong_confirm(
pretend.call(
(
"Could not delete team - "
"'Wrong Team Name' is not the same as 'Team Name'"
"'TEAM NAME' is not the same as 'Team Name'"
),
queue="error",
)
Expand Down Expand Up @@ -5697,6 +5733,7 @@ def test_toggle_2fa_requirement_non_critical(
def test_remove_organization_project_no_confirm(self):
user = pretend.stub()
project = pretend.stub(
name="foo",
normalized_name="foo",
organization=pretend.stub(owners=[user]),
owners=[user],
Expand Down Expand Up @@ -5724,12 +5761,13 @@ def test_remove_organization_project_no_confirm(self):
def test_remove_organization_project_wrong_confirm(self):
user = pretend.stub()
project = pretend.stub(
name="foo",
normalized_name="foo",
organization=pretend.stub(owners=[user]),
owners=[user],
)
request = pretend.stub(
POST={"confirm_remove_organization_project_name": "bar"},
POST={"confirm_remove_organization_project_name": "FOO"},
user=user,
flags=pretend.stub(enabled=pretend.call_recorder(lambda *a: False)),
session=pretend.stub(flash=pretend.call_recorder(lambda *a, **kw: None)),
Expand All @@ -5748,7 +5786,7 @@ def test_remove_organization_project_wrong_confirm(self):
pretend.call(
(
"Could not remove project from organization - "
"'bar' is not the same as 'foo'"
"'FOO' is not the same as 'foo'"
),
queue="error",
)
Expand Down Expand Up @@ -5783,7 +5821,7 @@ def test_remove_organization_project_no_current_organization(

db_request.POST = MultiDict(
{
"confirm_remove_organization_project_name": project.normalized_name,
"confirm_remove_organization_project_name": project.name,
}
)
db_request.flags = pretend.stub(enabled=pretend.call_recorder(lambda *a: False))
Expand Down Expand Up @@ -5857,7 +5895,7 @@ def test_remove_organization_project_no_individual_owner(

db_request.POST = MultiDict(
{
"confirm_remove_organization_project_name": project.normalized_name,
"confirm_remove_organization_project_name": project.name,
}
)
db_request.flags = pretend.stub(enabled=pretend.call_recorder(lambda *a: False))
Expand Down Expand Up @@ -5899,7 +5937,7 @@ def test_remove_organization_project(self, monkeypatch, db_request):

db_request.POST = MultiDict(
{
"confirm_remove_organization_project_name": project.normalized_name,
"confirm_remove_organization_project_name": project.name,
}
)
db_request.flags = pretend.stub(enabled=pretend.call_recorder(lambda *a: False))
Expand Down Expand Up @@ -5945,6 +5983,7 @@ def test_remove_organization_project(self, monkeypatch, db_request):
def test_transfer_organization_project_no_confirm(self):
user = pretend.stub()
project = pretend.stub(
name="foo",
normalized_name="foo",
organization=pretend.stub(owners=[user]),
)
Expand All @@ -5971,11 +6010,12 @@ def test_transfer_organization_project_no_confirm(self):
def test_transfer_organization_project_wrong_confirm(self):
user = pretend.stub()
project = pretend.stub(
name="foo",
normalized_name="foo",
organization=pretend.stub(owners=[user]),
)
request = pretend.stub(
POST={"confirm_transfer_organization_project_name": "bar"},
POST={"confirm_transfer_organization_project_name": "FOO"},
user=user,
flags=pretend.stub(enabled=pretend.call_recorder(lambda *a: False)),
session=pretend.stub(flash=pretend.call_recorder(lambda *a, **kw: None)),
Expand All @@ -5992,7 +6032,7 @@ def test_transfer_organization_project_wrong_confirm(self):
]
assert request.session.flash.calls == [
pretend.call(
"Could not transfer project - 'bar' is not the same as 'foo'",
"Could not transfer project - 'FOO' is not the same as 'foo'",
queue="error",
)
]
Expand Down Expand Up @@ -6030,7 +6070,7 @@ def test_transfer_organization_project_no_current_organization(
db_request.POST = MultiDict(
{
"organization": organization.normalized_name,
"confirm_transfer_organization_project_name": project.normalized_name,
"confirm_transfer_organization_project_name": project.name,
}
)
db_request.flags = pretend.stub(enabled=pretend.call_recorder(lambda *a: False))
Expand Down Expand Up @@ -6127,7 +6167,7 @@ def test_transfer_organization_project_no_individual_owner(
db_request.POST = MultiDict(
{
"organization": organization.normalized_name,
"confirm_transfer_organization_project_name": project.normalized_name,
"confirm_transfer_organization_project_name": project.name,
}
)
db_request.flags = pretend.stub(enabled=pretend.call_recorder(lambda *a: False))
Expand Down Expand Up @@ -6198,7 +6238,7 @@ def test_transfer_organization_project_invalid(self, monkeypatch, db_request):
db_request.POST = MultiDict(
{
"organization": "",
"confirm_transfer_organization_project_name": project.normalized_name,
"confirm_transfer_organization_project_name": project.name,
}
)
db_request.flags = pretend.stub(enabled=pretend.call_recorder(lambda *a: False))
Expand Down Expand Up @@ -6234,7 +6274,7 @@ def test_transfer_organization_project(self, monkeypatch, db_request):
db_request.POST = MultiDict(
{
"organization": organization.normalized_name,
"confirm_transfer_organization_project_name": project.normalized_name,
"confirm_transfer_organization_project_name": project.name,
}
)
db_request.flags = pretend.stub(enabled=pretend.call_recorder(lambda *a: False))
Expand Down Expand Up @@ -6319,9 +6359,9 @@ def test_delete_project_no_confirm(self):
]

def test_delete_project_wrong_confirm(self):
project = pretend.stub(normalized_name="foo")
project = pretend.stub(name="foo", normalized_name="foo")
request = pretend.stub(
POST={"confirm_project_name": "bar"},
POST={"confirm_project_name": "FOO"},
flags=pretend.stub(enabled=pretend.call_recorder(lambda *a: False)),
session=pretend.stub(flash=pretend.call_recorder(lambda *a, **kw: None)),
route_path=lambda *a, **kw: "/foo/bar/",
Expand All @@ -6337,7 +6377,7 @@ def test_delete_project_wrong_confirm(self):
]
assert request.session.flash.calls == [
pretend.call(
"Could not delete project - 'bar' is not the same as 'foo'",
"Could not delete project - 'FOO' is not the same as 'foo'",
queue="error",
)
]
Expand Down Expand Up @@ -6401,7 +6441,7 @@ def test_delete_project(self, monkeypatch, db_request):
db_request.session = pretend.stub(
flash=pretend.call_recorder(lambda *a, **kw: None)
)
db_request.POST["confirm_project_name"] = project.normalized_name
db_request.POST["confirm_project_name"] = project.name
db_request.user = UserFactory.create()

RoleFactory.create(project=project, user=db_request.user, role_name="Owner")
Expand Down Expand Up @@ -6470,9 +6510,9 @@ def test_destroy_project_docs_no_confirm(self):
]

def test_destroy_project_docs_wrong_confirm(self):
project = pretend.stub(normalized_name="foo")
project = pretend.stub(name="foo", normalized_name="foo")
request = pretend.stub(
POST={"confirm_project_name": "bar"},
POST={"confirm_project_name": "FOO"},
session=pretend.stub(flash=pretend.call_recorder(lambda *a, **kw: None)),
route_path=lambda *a, **kw: "/foo/bar/",
)
Expand All @@ -6484,7 +6524,7 @@ def test_destroy_project_docs_wrong_confirm(self):

assert request.session.flash.calls == [
pretend.call(
"Could not delete project - 'bar' is not the same as 'foo'",
"Could not delete project - 'FOO' is not the same as 'foo'",
queue="error",
)
]
Expand All @@ -6500,7 +6540,7 @@ def test_destroy_project_docs(self, db_request):
db_request.session = pretend.stub(
flash=pretend.call_recorder(lambda *a, **kw: None)
)
db_request.POST["confirm_project_name"] = project.normalized_name
db_request.POST["confirm_project_name"] = project.name
db_request.user = UserFactory.create()
db_request.task = task

Expand Down Expand Up @@ -7226,7 +7266,10 @@ def test_delete_project_release_file(self, monkeypatch, db_request):
]

def test_delete_project_release_file_no_confirm(self):
release = pretend.stub(version="1.2.3", project=pretend.stub(name="foobar"))
release = pretend.stub(
version="1.2.3",
project=pretend.stub(name="foobar", normalized_name="foobar"),
)
request = pretend.stub(
POST={"confirm_project_name": ""},
method="POST",
Expand Down
6 changes: 3 additions & 3 deletions tests/unit/utils/test_organization.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@


def test_confirm():
organization = stub(normalized_name="foobar")
organization = stub(name="foobar", normalized_name="foobar")
request = stub(
POST={"confirm_organization_name": "foobar"},
route_path=call_recorder(lambda *a, **kw: stub()),
Expand All @@ -33,7 +33,7 @@ def test_confirm():


def test_confirm_no_input():
organization = stub(normalized_name="foobar")
organization = stub(name="foobar", normalized_name="foobar")
request = stub(
POST={"confirm_organization_name": ""},
route_path=call_recorder(lambda *a, **kw: "/the-redirect"),
Expand All @@ -49,7 +49,7 @@ def test_confirm_no_input():


def test_confirm_incorrect_input():
organization = stub(normalized_name="foobar")
organization = stub(name="foobar", normalized_name="foobar")
request = stub(
POST={"confirm_organization_name": "bizbaz"},
route_path=call_recorder(lambda *a, **kw: "/the-redirect"),
Expand Down
Loading

0 comments on commit debf2b7

Please sign in to comment.