|
22 | 22 |
|
23 | 23 | from warehouse.manage import views
|
24 | 24 | from warehouse.accounts.interfaces import IUserService, IPasswordBreachedService
|
25 |
| -from warehouse.packaging.models import JournalEntry, Project, Role, User |
| 25 | +from warehouse.packaging.models import JournalEntry, Project, File, Role, User |
26 | 26 | from warehouse.utils.project import remove_documentation
|
27 | 27 |
|
28 | 28 | from ...common.db.accounts import EmailFactory
|
29 | 29 | from ...common.db.packaging import (
|
30 | 30 | JournalEntryFactory,
|
31 | 31 | ProjectFactory,
|
32 | 32 | ReleaseFactory,
|
| 33 | + FileFactory, |
33 | 34 | RoleFactory,
|
34 | 35 | UserFactory,
|
35 | 36 | )
|
@@ -977,53 +978,51 @@ def test_delete_project_release_bad_confirm(self):
|
977 | 978 | )
|
978 | 979 | ]
|
979 | 980 |
|
980 |
| - def test_delete_project_release_file(self, monkeypatch): |
981 |
| - release_file = pretend.stub(filename="foo-bar.tar.gz", id=str(uuid.uuid4())) |
982 |
| - release = pretend.stub(version="1.2.3", project=pretend.stub(name="foobar")) |
983 |
| - request = pretend.stub( |
984 |
| - POST={ |
985 |
| - "confirm_project_name": release.project.name, |
986 |
| - "file_id": release_file.id, |
987 |
| - }, |
988 |
| - method="POST", |
989 |
| - db=pretend.stub( |
990 |
| - delete=pretend.call_recorder(lambda a: None), |
991 |
| - add=pretend.call_recorder(lambda a: None), |
992 |
| - query=lambda a: pretend.stub( |
993 |
| - filter=lambda *a: pretend.stub(one=lambda: release_file) |
994 |
| - ), |
995 |
| - ), |
996 |
| - route_path=pretend.call_recorder(lambda *a, **kw: "/the-redirect"), |
997 |
| - session=pretend.stub(flash=pretend.call_recorder(lambda *a, **kw: None)), |
998 |
| - user=pretend.stub(), |
999 |
| - remote_addr=pretend.stub(), |
| 981 | + def test_delete_project_release_file(self, db_request): |
| 982 | + user = UserFactory.create() |
| 983 | + |
| 984 | + project = ProjectFactory.create(name="foobar") |
| 985 | + release = ReleaseFactory.create(project=project) |
| 986 | + release_file = FileFactory.create( |
| 987 | + release=release, filename=f"foobar-{release.version}.tar.gz" |
1000 | 988 | )
|
1001 |
| - journal_obj = pretend.stub() |
1002 |
| - journal_cls = pretend.call_recorder(lambda **kw: journal_obj) |
1003 |
| - monkeypatch.setattr(views, "JournalEntry", journal_cls) |
1004 | 989 |
|
1005 |
| - view = views.ManageProjectRelease(release, request) |
| 990 | + db_request.POST = { |
| 991 | + "confirm_project_name": release.project.name, |
| 992 | + "file_id": release_file.id, |
| 993 | + } |
| 994 | + db_request.method = ("POST",) |
| 995 | + db_request.route_path = pretend.call_recorder(lambda *a, **kw: "/the-redirect") |
| 996 | + db_request.session = pretend.stub( |
| 997 | + flash=pretend.call_recorder(lambda *a, **kw: None) |
| 998 | + ) |
| 999 | + db_request.user = user |
| 1000 | + db_request.remote_addr = "1.2.3.4" |
| 1001 | + |
| 1002 | + view = views.ManageProjectRelease(release, db_request) |
1006 | 1003 |
|
1007 | 1004 | result = view.delete_project_release_file()
|
1008 | 1005 |
|
1009 | 1006 | assert isinstance(result, HTTPSeeOther)
|
1010 | 1007 | assert result.headers["Location"] == "/the-redirect"
|
1011 | 1008 |
|
1012 |
| - assert request.session.flash.calls == [ |
| 1009 | + assert db_request.session.flash.calls == [ |
1013 | 1010 | pretend.call(f"Deleted file {release_file.filename!r}", queue="success")
|
1014 | 1011 | ]
|
1015 |
| - assert request.db.delete.calls == [pretend.call(release_file)] |
1016 |
| - assert request.db.add.calls == [pretend.call(journal_obj)] |
1017 |
| - assert journal_cls.calls == [ |
1018 |
| - pretend.call( |
1019 |
| - name=release.project.name, |
1020 |
| - action=f"remove file {release_file.filename}", |
| 1012 | + |
| 1013 | + assert db_request.db.query(File).filter_by(id=release_file.id).first() is None |
| 1014 | + assert ( |
| 1015 | + db_request.db.query(JournalEntry) |
| 1016 | + .filter_by( |
| 1017 | + name=project.name, |
1021 | 1018 | version=release.version,
|
1022 |
| - submitted_by=request.user, |
1023 |
| - submitted_from=request.remote_addr, |
| 1019 | + action=f"remove file {release_file.filename}", |
| 1020 | + submitted_by=user, |
| 1021 | + submitted_from="1.2.3.4", |
1024 | 1022 | )
|
1025 |
| - ] |
1026 |
| - assert request.route_path.calls == [ |
| 1023 | + .one() |
| 1024 | + ) |
| 1025 | + assert db_request.route_path.calls == [ |
1027 | 1026 | pretend.call(
|
1028 | 1027 | "manage.project.release",
|
1029 | 1028 | project_name=release.project.name,
|
@@ -1059,74 +1058,77 @@ def test_delete_project_release_file_no_confirm(self):
|
1059 | 1058 | )
|
1060 | 1059 | ]
|
1061 | 1060 |
|
1062 |
| - def test_delete_project_release_file_not_found(self): |
1063 |
| - release = pretend.stub(version="1.2.3", project=pretend.stub(name="foobar")) |
| 1061 | + def test_delete_project_release_file_not_found(self, db_request): |
| 1062 | + project = ProjectFactory.create(name="foobar") |
| 1063 | + release = ReleaseFactory.create(project=project) |
1064 | 1064 |
|
1065 | 1065 | def no_result_found():
|
1066 | 1066 | raise NoResultFound
|
1067 | 1067 |
|
1068 |
| - request = pretend.stub( |
1069 |
| - POST={"confirm_project_name": "whatever"}, |
1070 |
| - method="POST", |
1071 |
| - db=pretend.stub( |
1072 |
| - delete=pretend.call_recorder(lambda a: None), |
1073 |
| - query=lambda a: pretend.stub( |
1074 |
| - filter=lambda *a: pretend.stub(one=no_result_found) |
1075 |
| - ), |
| 1068 | + db_request.POST = {"confirm_project_name": "whatever"} |
| 1069 | + db_request.method = "POST" |
| 1070 | + db_request.db = pretend.stub( |
| 1071 | + delete=pretend.call_recorder(lambda a: None), |
| 1072 | + query=lambda a: pretend.stub( |
| 1073 | + filter=lambda *a: pretend.stub(one=no_result_found) |
1076 | 1074 | ),
|
1077 |
| - route_path=pretend.call_recorder(lambda *a, **kw: "/the-redirect"), |
1078 |
| - session=pretend.stub(flash=pretend.call_recorder(lambda *a, **kw: None)), |
1079 | 1075 | )
|
1080 |
| - view = views.ManageProjectRelease(release, request) |
| 1076 | + db_request.route_path = pretend.call_recorder(lambda *a, **kw: "/the-redirect") |
| 1077 | + db_request.session = pretend.stub( |
| 1078 | + flash=pretend.call_recorder(lambda *a, **kw: None) |
| 1079 | + ) |
| 1080 | + |
| 1081 | + view = views.ManageProjectRelease(release, db_request) |
1081 | 1082 |
|
1082 | 1083 | result = view.delete_project_release_file()
|
1083 | 1084 |
|
1084 | 1085 | assert isinstance(result, HTTPSeeOther)
|
1085 | 1086 | assert result.headers["Location"] == "/the-redirect"
|
1086 | 1087 |
|
1087 |
| - assert request.db.delete.calls == [] |
1088 |
| - assert request.session.flash.calls == [ |
| 1088 | + assert db_request.db.delete.calls == [] |
| 1089 | + assert db_request.session.flash.calls == [ |
1089 | 1090 | pretend.call("Could not find file", queue="error")
|
1090 | 1091 | ]
|
1091 |
| - assert request.route_path.calls == [ |
| 1092 | + assert db_request.route_path.calls == [ |
1092 | 1093 | pretend.call(
|
1093 | 1094 | "manage.project.release",
|
1094 | 1095 | project_name=release.project.name,
|
1095 | 1096 | version=release.version,
|
1096 | 1097 | )
|
1097 | 1098 | ]
|
1098 | 1099 |
|
1099 |
| - def test_delete_project_release_file_bad_confirm(self): |
1100 |
| - release_file = pretend.stub(filename="foo-bar.tar.gz", id=str(uuid.uuid4())) |
1101 |
| - release = pretend.stub(version="1.2.3", project=pretend.stub(name="foobar")) |
1102 |
| - request = pretend.stub( |
1103 |
| - POST={"confirm_project_name": "invalid"}, |
1104 |
| - method="POST", |
1105 |
| - db=pretend.stub( |
1106 |
| - delete=pretend.call_recorder(lambda a: None), |
1107 |
| - query=lambda a: pretend.stub( |
1108 |
| - filter=lambda *a: pretend.stub(one=lambda: release_file) |
1109 |
| - ), |
1110 |
| - ), |
1111 |
| - route_path=pretend.call_recorder(lambda *a, **kw: "/the-redirect"), |
1112 |
| - session=pretend.stub(flash=pretend.call_recorder(lambda *a, **kw: None)), |
| 1100 | + def test_delete_project_release_file_bad_confirm(self, db_request): |
| 1101 | + project = ProjectFactory.create(name="foobar") |
| 1102 | + release = ReleaseFactory.create(project=project, version="1.2.3") |
| 1103 | + release_file = FileFactory.create( |
| 1104 | + release=release, filename="foobar-1.2.3.tar.gz" |
1113 | 1105 | )
|
1114 |
| - view = views.ManageProjectRelease(release, request) |
| 1106 | + |
| 1107 | + db_request.POST = { |
| 1108 | + "confirm_project_name": "invalid", |
| 1109 | + "file_id": str(release_file.id), |
| 1110 | + } |
| 1111 | + db_request.method = "POST" |
| 1112 | + db_request.route_path = pretend.call_recorder(lambda *a, **kw: "/the-redirect") |
| 1113 | + db_request.session = pretend.stub( |
| 1114 | + flash=pretend.call_recorder(lambda *a, **kw: None) |
| 1115 | + ) |
| 1116 | + |
| 1117 | + view = views.ManageProjectRelease(release, db_request) |
1115 | 1118 |
|
1116 | 1119 | result = view.delete_project_release_file()
|
1117 | 1120 |
|
1118 | 1121 | assert isinstance(result, HTTPSeeOther)
|
1119 | 1122 | assert result.headers["Location"] == "/the-redirect"
|
1120 |
| - |
1121 |
| - assert request.db.delete.calls == [] |
1122 |
| - assert request.session.flash.calls == [ |
| 1123 | + assert db_request.db.query(File).filter_by(id=release_file.id).one() |
| 1124 | + assert db_request.session.flash.calls == [ |
1123 | 1125 | pretend.call(
|
1124 | 1126 | "Could not delete file - "
|
1125 | 1127 | + f"'invalid' is not the same as {release.project.name!r}",
|
1126 | 1128 | queue="error",
|
1127 | 1129 | )
|
1128 | 1130 | ]
|
1129 |
| - assert request.route_path.calls == [ |
| 1131 | + assert db_request.route_path.calls == [ |
1130 | 1132 | pretend.call(
|
1131 | 1133 | "manage.project.release",
|
1132 | 1134 | project_name=release.project.name,
|
|
0 commit comments