def test_upload_fails_with_unsupported_wheel_plat(self, pyramid_config, db_request, plat): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}-cp34-none-{}.whl".format( project.name, release.version, plat, ) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "bdist_wheel", "pyversion": "cp34", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 Binary wheel for an unsupported platform."
def test_upload_fails_without_permission(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1, permissive=False) project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") filename = "{}-{}.tar.wat".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) with pytest.raises(HTTPForbidden): pypi.file_upload(db_request)
def test_upload_fails_with_previously_used_filename(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) db_request.db.add(Filename(filename=filename)) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == ( "400 This filename has previously been used, you should use a " "different version." )
def test_upload_fails_with_unsafe_filename(self, pyramid_config, db_request, character): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.wat".format( character + project.name, release.version, ) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == \ "400 Cannot upload a file with '/' or '\\' in the name."
def test_upload_fails_with_invalid_signature(self, pyramid_config, db_request, sig): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), "gpg_signature": pretend.stub( filename=filename + ".asc", file=io.BytesIO(sig), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 PGP signature is not ASCII armored."
def test_upload_fails_with_wrong_filename(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "nope-{}.tar.gz".format(release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == ( "400 The filename for {!r} must start with {!r}.".format( project.name, pkg_resources.safe_name(project.name).lower(), ) )
def test_upload_fails_with_invalid_hash(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == ( "400 The MD5 digest supplied does not match a digest calculated " "from the uploaded file." )
def test_upload_fails_with_too_large_signature(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "0cc175b9c0f1b6a831c399e269772661", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a"), ), "gpg_signature": pretend.stub( filename=filename + ".asc", file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 Signature too large."
def test_fails_without_user(self, pyramid_config, pyramid_request): pyramid_config.testing_securitypolicy(userid=None) with pytest.raises(HTTPForbidden) as excinfo: pypi.file_upload(pyramid_request) resp = excinfo.value assert resp.status_code == 403 assert resp.status == ( "403 Invalid or non-existent authentication information.")
def test_fails_invalid_post_data(self, pyramid_config, db_request, post_data, message): pyramid_config.testing_securitypolicy(userid=1) db_request.POST = MultiDict(post_data) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 {}".format(message)
def test_fails_without_user(self, pyramid_config, pyramid_request): pyramid_config.testing_securitypolicy(userid=None) with pytest.raises(HTTPForbidden) as excinfo: pypi.file_upload(pyramid_request) resp = excinfo.value assert resp.status_code == 403 assert resp.status == ( "403 Invalid or non-existent authentication information." )
def test_fails_invalid_post_data(self, pyramid_config, db_request, post_data, message): pyramid_config.testing_securitypolicy(userid=1) db_request.POST = MultiDict(post_data) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 {}".format(message)
def test_fails_invalid_version(self, pyramid_config, pyramid_request, version): pyramid_config.testing_securitypolicy(userid=1) pyramid_request.POST["protocol_version"] = version with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(pyramid_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 Unknown protocol version."
def test_fails_invalid_version(self, pyramid_config, pyramid_request, version): pyramid_config.testing_securitypolicy(userid=1) pyramid_request.POST["protocol_version"] = version with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(pyramid_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 Unknown protocol version."
def test_upload_cleans_unknown_values(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": "UNKNOWN", "version": "1.0", "filetype": "sdist", "md5_digest": "a fake md5 digest", }) with pytest.raises(HTTPBadRequest): pypi.file_upload(db_request) assert "name" not in db_request.POST
def test_upload_cleans_unknown_values(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": "UNKNOWN", "version": "1.0", "filetype": "sdist", "md5_digest": "a fake md5 digest", }) with pytest.raises(HTTPBadRequest): pypi.file_upload(db_request) assert "name" not in db_request.POST
def test_fails_with_invalid_names(self, pyramid_config, db_request, name): pyramid_config.testing_securitypolicy(userid=1) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": name, "version": "1.0", "filetype": "sdist", "md5_digest": "a fake md5 digest", }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 The name {!r} is not allowed.".format(name)
def test_upload_fails_without_file(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": "example", "version": "1.0", "filetype": "sdist", "md5_digest": "a fake md5 digest", }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 Upload payload does not have a file."
def test_upload_fails_without_file(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": "example", "version": "1.0", "filetype": "sdist", "md5_digest": "a fake md5 digest", }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 Upload payload does not have a file."
def test_fails_with_invalid_names(self, pyramid_config, db_request, name): pyramid_config.testing_securitypolicy(userid=1) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": name, "version": "1.0", "filetype": "sdist", "md5_digest": "a fake md5 digest", }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 The name {!r} is not allowed.".format(name)
def test_upload_succeeds_creates_project(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() filename = "{}-{}.tar.gz".format("example", "1.0") db_request.user = user db_request.POST = MultiDict({ "metadata_version": "1.2", "name": "example", "version": "1.0", "filetype": "sdist", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) storage_service = pretend.stub(store=lambda path, content: None) db_request.find_service = lambda svc: storage_service resp = pypi.file_upload(db_request) assert resp.status_code == 200 # Ensure that a Project object has been created. project = ( db_request.db.query(Project) .filter(Project.name == "example") .one() ) # Ensure that a Role with the user as owner has been created. role = db_request.db.query(Role) \ .filter((Role.user == user) & (Role.project == project)) \ .one() assert role.role_name == "Owner" # Ensure that a Release object has been created. release = ( db_request.db.query(Release) .filter((Release.project == project) & (Release.version == "1.0")) .one() ) # Ensure that a File object has been created. db_request.db.query(File) \ .filter((File.release == release) & (File.filename == filename)) \ .one() # Ensure that a Filename object has been created. db_request.db.query(Filename) \ .filter(Filename.filename == filename).one()
def test_upload_succeeds_creates_project(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() filename = "{}-{}.tar.gz".format("example", "1.0") db_request.user = user db_request.POST = MultiDict({ "metadata_version": "1.2", "name": "example", "version": "1.0", "filetype": "sdist", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) storage_service = pretend.stub(store=lambda path, content: None) db_request.find_service = lambda svc: storage_service resp = pypi.file_upload(db_request) assert resp.status_code == 200 # Ensure that a Project object has been created. project = (db_request.db.query(Project).filter( Project.name == "example").one()) # Ensure that a Role with the user as owner has been created. role = db_request.db.query(Role) \ .filter((Role.user == user) & (Role.project == project)) \ .one() assert role.role_name == "Owner" # Ensure that a Release object has been created. release = (db_request.db.query(Release).filter( (Release.project == project) & (Release.version == "1.0")).one()) # Ensure that a File object has been created. db_request.db.query(File) \ .filter((File.release == release) & (File.filename == filename)) \ .one() # Ensure that a Filename object has been created. db_request.db.query(Filename) \ .filter(Filename.filename == filename).one()
def test_upload_fails_with_unsupported_wheel_plat(self, pyramid_config, db_request, plat): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}-cp34-none-{}.whl".format( project.name, release.version, plat, ) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "bdist_wheel", "pyversion": "cp34", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 Binary wheel for an unsupported platform."
def test_upload_fails_with_invalid_classifier(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) db_request.POST.extend([ ("classifiers", "Environment :: Other Environment"), ]) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == ( "400 classifiers: 'Environment :: Other Environment' is not a " "valid choice for this field")
def test_upload_fails_with_invalid_signature(self, pyramid_config, db_request, sig): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), "gpg_signature": pretend.stub( filename=filename + ".asc", file=io.BytesIO(sig), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 PGP signature is not ASCII armored."
def test_upload_fails_with_too_large_signature(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "0cc175b9c0f1b6a831c399e269772661", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a"), ), "gpg_signature": pretend.stub( filename=filename + ".asc", file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == "400 Signature too large."
def test_upload_fails_with_previously_used_filename( self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) db_request.db.add(Filename(filename=filename)) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == ( "400 This filename has previously been used, you should use a " "different version.")
def test_upload_fails_with_wrong_filename(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "nope-{}.tar.gz".format(release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == ( "400 The filename for {!r} must start with {!r}.".format( project.name, pkg_resources.safe_name(project.name).lower(), ))
def test_upload_fails_with_unsafe_filename(self, pyramid_config, db_request, character): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.wat".format( character + project.name, release.version, ) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == \ "400 Cannot upload a file with '/' or '\\' in the name."
def test_upload_fails_without_permission(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1, permissive=False) project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") filename = "{}-{}.tar.wat".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"a" * (pypi.MAX_FILESIZE + 1)), ), }) with pytest.raises(HTTPForbidden): pypi.file_upload(db_request)
def test_upload_fails_with_invalid_hash(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "nope!", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == ( "400 The MD5 digest supplied does not match a digest calculated " "from the uploaded file.")
def test_upload_fails_with_invalid_classifier(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) db_request.POST.extend([ ("classifiers", "Environment :: Other Environment"), ]) with pytest.raises(HTTPBadRequest) as excinfo: pypi.file_upload(db_request) resp = excinfo.value assert resp.status_code == 400 assert resp.status == ( "400 classifiers: 'Environment :: Other Environment' is not a " "valid choice for this field" )
def test_upload_succeeds_with_wheel(self, tmpdir, monkeypatch, pyramid_config, db_request, plat): monkeypatch.setattr(tempfile, "tempdir", str(tmpdir)) pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}-cp34-none-{}.whl".format( project.name, release.version, plat, ) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "bdist_wheel", "pyversion": "cp34", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) @pretend.call_recorder def storage_service_store(path, file_path): with open(file_path, "rb") as fp: assert fp.read() == b"A fake file." storage_service = pretend.stub(store=storage_service_store) db_request.find_service = pretend.call_recorder( lambda svc: storage_service) resp = pypi.file_upload(db_request) assert resp.status_code == 200 assert db_request.find_service.calls == [pretend.call(IFileStorage)] assert storage_service.store.calls == [ pretend.call( os.path.join( "cp34", project.name[0], project.name, filename, ), mock.ANY, ), ] # Ensure that a File object has been created. db_request.db.query(File) \ .filter((File.release == release) & (File.filename == filename)) \ .one() # Ensure that a Filename object has been created. db_request.db.query(Filename) \ .filter(Filename.filename == filename).one()
def test_successful_upload(self, tmpdir, monkeypatch, pyramid_config, db_request, has_signature): monkeypatch.setattr(tempfile, "tempdir", str(tmpdir)) pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) db_request.db.add( Classifier(classifier="Environment :: Other Environment"), ) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "pyversion": "source", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) db_request.POST.extend([ ("classifiers", "Environment :: Other Environment"), ]) if has_signature: db_request.POST["gpg_signature"] = pretend.stub( filename=filename + ".asc", file=io.BytesIO(b"-----BEGIN PGP SIGNATURE-----\n" b" This is a Fake Signature"), ) @pretend.call_recorder def storage_service_store(path, file_path): if file_path.endswith(".asc"): expected = (b"-----BEGIN PGP SIGNATURE-----\n" b" This is a Fake Signature") else: expected = b"A fake file." with open(file_path, "rb") as fp: assert fp.read() == expected storage_service = pretend.stub(store=storage_service_store) db_request.find_service = pretend.call_recorder( lambda svc: storage_service) resp = pypi.file_upload(db_request) assert resp.status_code == 200 assert db_request.find_service.calls == [pretend.call(IFileStorage)] assert len(storage_service.store.calls) == 2 if has_signature else 1 assert storage_service.store.calls[0] == pretend.call( os.path.join( "source", project.name[0], project.name, filename, ), mock.ANY, ) if has_signature: assert storage_service.store.calls[1] == pretend.call( os.path.join( "source", project.name[0], project.name, filename + ".asc", ), mock.ANY, ) # Ensure that a File object has been created. db_request.db.query(File) \ .filter((File.release == release) & (File.filename == filename)) \ .one() # Ensure that a Filename object has been created. db_request.db.query(Filename) \ .filter(Filename.filename == filename).one()
def test_successful_upload(self, tmpdir, monkeypatch, pyramid_config, db_request, has_signature): monkeypatch.setattr(tempfile, "tempdir", str(tmpdir)) pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) db_request.db.add( Classifier(classifier="Environment :: Other Environment"), ) filename = "{}-{}.tar.gz".format(project.name, release.version) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "sdist", "pyversion": "source", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) db_request.POST.extend([ ("classifiers", "Environment :: Other Environment"), ]) if has_signature: db_request.POST["gpg_signature"] = pretend.stub( filename=filename + ".asc", file=io.BytesIO( b"-----BEGIN PGP SIGNATURE-----\n" b" This is a Fake Signature" ), ) @pretend.call_recorder def storage_service_store(path, file_path): if file_path.endswith(".asc"): expected = ( b"-----BEGIN PGP SIGNATURE-----\n" b" This is a Fake Signature" ) else: expected = b"A fake file." with open(file_path, "rb") as fp: assert fp.read() == expected storage_service = pretend.stub(store=storage_service_store) db_request.find_service = pretend.call_recorder( lambda svc: storage_service ) resp = pypi.file_upload(db_request) assert resp.status_code == 200 assert db_request.find_service.calls == [pretend.call(IFileStorage)] assert len(storage_service.store.calls) == 2 if has_signature else 1 assert storage_service.store.calls[0] == pretend.call( os.path.join( "source", project.name[0], project.name, filename, ), mock.ANY, ) if has_signature: assert storage_service.store.calls[1] == pretend.call( os.path.join( "source", project.name[0], project.name, filename + ".asc", ), mock.ANY, ) # Ensure that a File object has been created. db_request.db.query(File) \ .filter((File.release == release) & (File.filename == filename)) \ .one() # Ensure that a Filename object has been created. db_request.db.query(Filename) \ .filter(Filename.filename == filename).one()
def test_upload_succeeds_creates_release(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() RoleFactory.create(user=user, project=project) db_request.db.add( Classifier(classifier="Environment :: Other Environment"), ) db_request.db.add( Classifier(classifier="Programming Language :: Python"), ) filename = "{}-{}.tar.gz".format(project.name, "1.0") db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": "1.0", "summary": "This is my summary!", "filetype": "sdist", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) db_request.POST.extend([ ("classifiers", "Environment :: Other Environment"), ("classifiers", "Programming Language :: Python"), ("requires_dist", "foo"), ("requires_dist", "bar (>1.0)"), ("project_urls", "Test, https://example.com/"), ("requires_external", "Cheese (>1.0)"), ("provides", "testing"), ]) storage_service = pretend.stub(store=lambda path, content: None) db_request.find_service = lambda svc: storage_service resp = pypi.file_upload(db_request) assert resp.status_code == 200 # Ensure that a Release object has been created. release = (db_request.db.query(Release).filter( (Release.project == project) & (Release.version == "1.0")).one()) assert release.summary == "This is my summary!" assert release.classifiers == [ "Environment :: Other Environment", "Programming Language :: Python", ] assert set(release.requires_dist) == {"foo", "bar (>1.0)"} assert set(release.project_urls) == {"Test, https://example.com/"} assert set(release.requires_external) == {"Cheese (>1.0)"} assert set(release.provides) == {"testing"} # Ensure that a File object has been created. db_request.db.query(File) \ .filter((File.release == release) & (File.filename == filename)) \ .one() # Ensure that a Filename object has been created. db_request.db.query(Filename) \ .filter(Filename.filename == filename).one()
def test_upload_succeeds_with_wheel(self, tmpdir, monkeypatch, pyramid_config, db_request, plat): monkeypatch.setattr(tempfile, "tempdir", str(tmpdir)) pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() release = ReleaseFactory.create(project=project, version="1.0") RoleFactory.create(user=user, project=project) filename = "{}-{}-cp34-none-{}.whl".format( project.name, release.version, plat, ) db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": release.version, "filetype": "bdist_wheel", "pyversion": "cp34", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) @pretend.call_recorder def storage_service_store(path, file_path): with open(file_path, "rb") as fp: assert fp.read() == b"A fake file." storage_service = pretend.stub(store=storage_service_store) db_request.find_service = pretend.call_recorder( lambda svc: storage_service ) resp = pypi.file_upload(db_request) assert resp.status_code == 200 assert db_request.find_service.calls == [pretend.call(IFileStorage)] assert storage_service.store.calls == [ pretend.call( os.path.join( "cp34", project.name[0], project.name, filename, ), mock.ANY, ), ] # Ensure that a File object has been created. db_request.db.query(File) \ .filter((File.release == release) & (File.filename == filename)) \ .one() # Ensure that a Filename object has been created. db_request.db.query(Filename) \ .filter(Filename.filename == filename).one()
def test_upload_succeeds_creates_release(self, pyramid_config, db_request): pyramid_config.testing_securitypolicy(userid=1) user = UserFactory.create() project = ProjectFactory.create() RoleFactory.create(user=user, project=project) db_request.db.add( Classifier(classifier="Environment :: Other Environment"), ) db_request.db.add( Classifier(classifier="Programming Language :: Python"), ) filename = "{}-{}.tar.gz".format(project.name, "1.0") db_request.POST = MultiDict({ "metadata_version": "1.2", "name": project.name, "version": "1.0", "summary": "This is my summary!", "filetype": "sdist", "md5_digest": "335c476dc930b959dda9ec82bd65ef19", "content": pretend.stub( filename=filename, file=io.BytesIO(b"A fake file."), ), }) db_request.POST.extend([ ("classifiers", "Environment :: Other Environment"), ("classifiers", "Programming Language :: Python"), ("requires_dist", "foo"), ("requires_dist", "bar (>1.0)"), ("project_urls", "Test, https://example.com/"), ("requires_external", "Cheese (>1.0)"), ("provides", "testing"), ]) storage_service = pretend.stub(store=lambda path, content: None) db_request.find_service = lambda svc: storage_service resp = pypi.file_upload(db_request) assert resp.status_code == 200 # Ensure that a Release object has been created. release = ( db_request.db.query(Release) .filter((Release.project == project) & (Release.version == "1.0")) .one() ) assert release.summary == "This is my summary!" assert release.classifiers == [ "Environment :: Other Environment", "Programming Language :: Python", ] assert set(release.requires_dist) == {"foo", "bar (>1.0)"} assert set(release.project_urls) == {"Test, https://example.com/"} assert set(release.requires_external) == {"Cheese (>1.0)"} assert set(release.provides) == {"testing"} # Ensure that a File object has been created. db_request.db.query(File) \ .filter((File.release == release) & (File.filename == filename)) \ .one() # Ensure that a Filename object has been created. db_request.db.query(Filename) \ .filter(Filename.filename == filename).one()