Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to test file upload in Grails

I have a controller that takes in a file as part of the parameter. I'm wondering how can I test this?

my controller action:

def save () {
  def colorInstance = new Color(params.color)
  CommonsMultipartFile file = request.getFile('color.filename')
  fileUploadService.upload(colorInstance, file, "foldername")
  if (requestInstance.save(flush: true)) {
    withFormat {
      html {redirect(action: "list") }
      js {render "test"}
    }
  }
}

I've started with something like this:...

import org.junit.Before
import grails.test.mixin.Mock
import grails.test.mixin.TestFor

@TestFor(ColorController)
@Mock(Color)
class ColorControllerTests {

    @Before
    void setUp() {
        controller.fileUploadService = new FileUploadService
    }
}

Question

  • I can't figure out how to test the CommonsMultipartFile for file upload.
  • Also, this test case will sit in unit test folder. How can I execute it?
like image 900
birdy Avatar asked Dec 16 '22 10:12

birdy


1 Answers

I am using Grails 2.4, and you can simply use GrailsMockMultipartFile and request.addFile method in your unit test.

This code works on Grails 2.4.4, with Spock testing framework:

Controller side:

class FileUploadController {

    def upload() {
        def multipartFile = request.getFile('requestParamName')
        if (multipartFile.empty) {
            flash.message = 'Error: file cannot be empty'
            render(view: 'upload')
            return
        }

        // do something now with your file
    }
}

Unit test side:

import grails.test.mixin.TestFor
import org.codehaus.groovy.grails.plugins.testing.GrailsMockMultipartFile
import spock.lang.Specification

@TestFor(FileUploadController)
class FileUploadControllerSpec extends Specification {

    void "upload should add flash error message if empty file in request"() {
        given:
        def multipartFile = new GrailsMockMultipartFile('requestParamName', 'someExcelFile.xls', 'application/vnd.ms-excel', new byte[0])
        request.addFile(multipartFile)

        when:
        controller.upload()

        then:
        assertEquals('Error: file cannot be empty', flash.message)
    }

}
like image 134
Damien Beaufils Avatar answered Jan 04 '23 23:01

Damien Beaufils