Pyramid - Writing unittest for file upload form

pyramid, python, python-2.7, unit-testing

Solution

It's really bad practice (and a potential security hole) to actually create a file on your filesystem with the a name supplied by the client (`upload.filename`).

With that out of the way, I see in your code you call `request.params`, `request.POST.get('profile')`, `upload.file` and `upload.filename`. We can mock all of these out, ultimately providing a StringIO object for `upload.file`.

class MockCGIFieldStorage(object):
    pass

upload = MockCGIFieldStorage()
upload.file = StringIO('foo')
upload.filename = 'foo.html'

request = DummyRequest(post={'profile': upload, 'form.submitted': '1'})

response = profilePictureUpload(request)

Problem

I'm strugling with creating unittests for function in charge of uploading pictures recieved from a form on a page. Main problem is that I can't figure out how to add picture to post parameters of a dummy request and as such pass it to function. Here is code I'm trying to test. Thanks ``` @view_config(route_name='profile_pic') def profilePictureUpload(request): if 'form.submitted' in request.params: #max picture size is 700kb form = Form(request, schema=PictureUpload) if request.method == 'POST' and form.validate(): upload_directory = 'filesystem_path' upload = request.POST.get('profile') saved_file = str(upload_directory) + str(upload.filename) perm_file = open(saved_file, 'wb') shutil.copyfileobj(upload.file, perm_file) upload.file.close() perm_file.close() else: log.info(form.errors) redirect_url = route_url('profile', request) return HTTPFound(location=redirect_url) ```

Original source