Skip to content

Destroy documentation #3413

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Mar 25, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion dev/environment
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ CAMO_KEY="insecure camo key"

DOCS_URL="https://pythonhosted.org/{project}/"

FILES_BACKEND=warehouse.packaging.services.LocalFileStorage path=/var/opt/warehouse/packages/ url=http://files.example.com/packages/{path}
FILES_BACKEND=warehouse.packaging.services.LocalFileStorage path=/var/opt/warehouse/packages/ url=http://files.example.com/packages/{path} name=files
DOCS_BACKEND=warehouse.packaging.services.LocalFileStorage path=/var/opt/warehouse/docs/ name=docs

MAIL_HOST=smtp
MAIL_PORT=2525
Expand Down
1 change: 1 addition & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ def app_config(database):
"ratelimit.url": "memory://",
"elasticsearch.url": "https://localhost/warehouse",
"files.backend": "warehouse.packaging.services.LocalFileStorage",
"docs.backend": "warehouse.packaging.services.LocalFileStorage",
"files.url": "http://localhost:7000/",
"sessions.secret": "123456",
"sessions.url": "redis://localhost:0/",
Expand Down
38 changes: 22 additions & 16 deletions tests/unit/forklift/test_legacy.py
Original file line number Diff line number Diff line change
Expand Up @@ -1196,13 +1196,15 @@ def storage_service_store(path, file_path, *, meta):

storage_service = pretend.stub(store=storage_service_store)
db_request.find_service = pretend.call_recorder(
lambda svc: storage_service
lambda svc, name=None: storage_service
)

resp = legacy.file_upload(db_request)

assert resp.status_code == 200
assert db_request.find_service.calls == [pretend.call(IFileStorage)]
assert db_request.find_service.calls == [
pretend.call(IFileStorage, name="files"),
]
assert len(storage_service.store.calls) == 2 if has_signature else 1
assert storage_service.store.calls[0] == pretend.call(
"/".join([
Expand Down Expand Up @@ -2110,7 +2112,7 @@ def storage_service_store(path, file_path, *, meta):

storage_service = pretend.stub(store=storage_service_store)
db_request.find_service = pretend.call_recorder(
lambda svc: storage_service
lambda svc, name=None: storage_service
)

monkeypatch.setattr(
Expand All @@ -2121,7 +2123,9 @@ def storage_service_store(path, file_path, *, meta):
resp = legacy.file_upload(db_request)

assert resp.status_code == 200
assert db_request.find_service.calls == [pretend.call(IFileStorage)]
assert db_request.find_service.calls == [
pretend.call(IFileStorage, name="files"),
]
assert storage_service.store.calls == [
pretend.call(
"/".join([
Expand Down Expand Up @@ -2218,7 +2222,7 @@ def storage_service_store(path, file_path, *, meta):

storage_service = pretend.stub(store=storage_service_store)
db_request.find_service = pretend.call_recorder(
lambda svc: storage_service
lambda svc, name=None: storage_service
)

monkeypatch.setattr(
Expand All @@ -2229,7 +2233,9 @@ def storage_service_store(path, file_path, *, meta):
resp = legacy.file_upload(db_request)

assert resp.status_code == 200
assert db_request.find_service.calls == [pretend.call(IFileStorage)]
assert db_request.find_service.calls == [
pretend.call(IFileStorage, name="files"),
]
assert storage_service.store.calls == [
pretend.call(
"/".join([
Expand Down Expand Up @@ -2315,7 +2321,7 @@ def storage_service_store(path, file_path, *, meta):
assert fp.read() == b"A fake file."

storage_service = pretend.stub(store=storage_service_store)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service

monkeypatch.setattr(
legacy,
Expand Down Expand Up @@ -2361,7 +2367,7 @@ def storage_service_store(path, file_path, *, meta):
assert fp.read() == b"A fake file."

storage_service = pretend.stub(store=storage_service_store)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service

monkeypatch.setattr(
legacy,
Expand Down Expand Up @@ -2463,7 +2469,7 @@ def test_upload_succeeds_creates_release(self, pyramid_config, db_request):
])

storage_service = pretend.stub(store=lambda path, filepath, meta: None)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service

resp = legacy.file_upload(db_request)

Expand Down Expand Up @@ -2554,7 +2560,7 @@ def test_equivalent_version_one_release(self, pyramid_config, db_request):
})

storage_service = pretend.stub(store=lambda path, filepath, meta: None)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service

resp = legacy.file_upload(db_request)

Expand Down Expand Up @@ -2601,7 +2607,7 @@ def test_equivalent_canonical_versions(self, pyramid_config, db_request):
})

storage_service = pretend.stub(store=lambda path, filepath, meta: None)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service

legacy.file_upload(db_request)

Expand Down Expand Up @@ -2631,7 +2637,7 @@ def test_upload_succeeds_creates_project(self, pyramid_config, db_request):
})

storage_service = pretend.stub(store=lambda path, filepath, meta: None)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service
db_request.remote_addr = "10.10.10.10"

resp = legacy.file_upload(db_request)
Expand Down Expand Up @@ -2733,7 +2739,7 @@ def test_upload_requires_verified_email(self, pyramid_config, db_request,
})

storage_service = pretend.stub(store=lambda path, filepath, meta: None)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service
db_request.remote_addr = "10.10.10.10"

if expected_success:
Expand Down Expand Up @@ -2777,7 +2783,7 @@ def test_upload_purges_legacy(self, pyramid_config, db_request,
})

storage_service = pretend.stub(store=lambda path, filepath, meta: None)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service
db_request.remote_addr = "10.10.10.10"

tm = pretend.stub(
Expand Down Expand Up @@ -2873,7 +2879,7 @@ def test_autohides_old_releases(self, pyramid_config, db_request):
])

storage_service = pretend.stub(store=lambda path, filepath, meta: None)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service

resp = legacy.file_upload(db_request)

Expand Down Expand Up @@ -2954,7 +2960,7 @@ def test_doesnt_autohides_old_releases(self, pyramid_config, db_request):
])

storage_service = pretend.stub(store=lambda path, filepath, meta: None)
db_request.find_service = lambda svc: storage_service
db_request.find_service = lambda svc, name=None: storage_service

resp = legacy.file_upload(db_request)

Expand Down
100 changes: 100 additions & 0 deletions tests/unit/manage/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
from warehouse.manage import views
from warehouse.accounts.interfaces import IUserService
from warehouse.packaging.models import JournalEntry, Project, Role, User
from warehouse.utils.project import remove_documentation

from ...common.db.accounts import EmailFactory
from ...common.db.packaging import (
Expand Down Expand Up @@ -830,6 +831,105 @@ def test_delete_project(self, db_request):
.filter(Project.name == "foo").count())


class TestManageProjectDocumentation:

def test_manage_project_documentation(self):
request = pretend.stub()
project = pretend.stub()

assert views.manage_project_documentation(project, request) == {
"project": project,
}

def test_destroy_project_docs_no_confirm(self):
project = pretend.stub(normalized_name='foo')
request = pretend.stub(
POST={},
session=pretend.stub(
flash=pretend.call_recorder(lambda *a, **kw: None),
),
route_path=lambda *a, **kw: "/foo/bar/",
)

with pytest.raises(HTTPSeeOther) as exc:
views.destroy_project_docs(project, request)
assert exc.value.status_code == 303
assert exc.value.headers["Location"] == "/foo/bar/"

assert request.session.flash.calls == [
pretend.call("Must confirm the request.", queue="error"),
]

def test_destroy_project_docs_wrong_confirm(self):
project = pretend.stub(normalized_name='foo')
request = pretend.stub(
POST={"confirm_project_name": "bar"},
session=pretend.stub(
flash=pretend.call_recorder(lambda *a, **kw: None),
),
route_path=lambda *a, **kw: "/foo/bar/",
)

with pytest.raises(HTTPSeeOther) as exc:
views.destroy_project_docs(project, request)
assert exc.value.status_code == 303
assert exc.value.headers["Location"] == "/foo/bar/"

assert request.session.flash.calls == [
pretend.call(
"Could not delete project - 'bar' is not the same as 'foo'",
queue="error"
),
]

def test_destroy_project_docs(self, db_request):
project = ProjectFactory.create(name="foo")
remove_documentation_recorder = pretend.stub(
delay=pretend.call_recorder(
lambda *a, **kw: None
)
)
task = pretend.call_recorder(
lambda *a, **kw: remove_documentation_recorder
)

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),
)
db_request.POST["confirm_project_name"] = project.normalized_name
db_request.user = UserFactory.create()
db_request.remote_addr = "192.168.1.1"
db_request.task = task

result = views.destroy_project_docs(project, db_request)

assert task.calls == [
pretend.call(remove_documentation)
]

assert remove_documentation_recorder.delay.calls == [
pretend.call(project.name)
]

assert db_request.session.flash.calls == [
pretend.call(
"Successfully deleted docs for project 'foo'.",
queue="success"
),
]
assert db_request.route_path.calls == [
pretend.call('manage.project.documentation', project_name='foo'),
]
assert isinstance(result, HTTPSeeOther)
assert result.headers["Location"] == "/the-redirect"
assert not (db_request.db.query(Project)
.filter(Project.name == "foo")
.first().has_docs)


class TestManageProjectReleases:

def test_manage_project_releases(self):
Expand Down
6 changes: 4 additions & 2 deletions tests/unit/packaging/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,12 @@ def key_factory(keystring, iterate_on=None):
config = pretend.stub(
maybe_dotted=lambda dotted: storage_class,
register_service_factory=pretend.call_recorder(
lambda factory, iface: None,
lambda factory, iface, name=None: None,
),
registry=pretend.stub(
settings={
"files.backend": "foo.bar",
"docs.backend": "wu.tang",
},
),
register_origin_cache_keys=pretend.call_recorder(lambda c, **kw: None),
Expand All @@ -50,7 +51,8 @@ def key_factory(keystring, iterate_on=None):
packaging.includeme(config)

assert config.register_service_factory.calls == [
pretend.call(storage_class.create_service, IFileStorage),
pretend.call(storage_class.create_service, IFileStorage, name='files'),
pretend.call(storage_class.create_service, IFileStorage, name='docs'),
]
assert config.register_origin_cache_keys.calls == [
pretend.call(
Expand Down
Loading