/** * @author Graeme Rocher * @since 1.0 * * Created: Nov 26, 2007 */ package org.codehaus.groovy.grails.web.mime import org.codehaus.groovy.grails.commons.ConfigurationHolder import org.codehaus.groovy.grails.web.servlet.mvc.AbstractGrailsControllerTests class ContentFormatControllerTests extends AbstractGrailsControllerTests { public void onSetUp() { def config = new ConfigSlurper().parse( """ grails.mime.use.accept.header = true grails.mime.types = [ html: ['text/html','application/xhtml+xml'], xml: ['text/xml', 'application/xml'], text: 'text/plain', js: 'text/javascript', rss: 'application/rss+xml', atom: 'application/atom+xml', css: 'text/css', cvs: 'text/csv', all: '*/*', json: 'application/json' ] """) ConfigurationHolder.setConfig config gcl.parseClass ''' import grails.converters.* class ContentController { def testFormat = { render request.format } def testWithFormat = { withFormat { html { render "" } js { render "alert('hello')" } } } def testWithFormatAndEqualQualityGrading = { withFormat { html { render "" } xml { render(contentType:"text/xml",text: "") } } } def testWithFormatAndModel = { withFormat { js { render "alert('hello')" } html hello:'world' } } def testWithFormatZeroArgs = { withFormat { html() xml() } } def testWithFormatRenderAs = { def gizmos = Gizmo.get() withFormat { html { render "hello" } xml { render gizmos as XML } json { render gizmos as JSON } } } } class Gizmo { Long id Long version String name static get() { new Gizmo(name:"iPod") } } ''' } public void tearDown() { super.tearDown(); ConfigurationHolder.setConfig null MimeType.reset() } void testFormatWithRenderAsXML() { request.setParameter "format", "xml" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testWithFormatRenderAs.call() assertEquals '''iPod''', response.contentAsString } void testFormatWithRenderAsJSON() { request.setParameter "format", "json" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testWithFormatRenderAs.call() assertEquals '{"class":"Gizmo","id":null,"name":"iPod"}', response.contentAsString } void testAllFormat() { request.addHeader "Accept", "*/*" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testFormat.call() assertEquals "all", response.contentAsString } void testWithFormatAndAll() { request.addHeader "Accept", "*/*" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' assertEquals "all", request.format c.testWithFormat.call() assertEquals "", response.contentAsString assertEquals "html", request.format } void testWithFormatAndAll2() { request.addHeader "Accept", "*/*" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' assertEquals "all", request.format c.testWithFormatAndModel.call() assertEquals "alert('hello')", response.contentAsString assertEquals "js", request.format } void testDefaultFormat() { def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testFormat.call() assertEquals "html", response.contentAsString } void testWithContentTypeAndAcceptHeader() { // should favour content type header request.addHeader "Accept", "text/javascript, text/html, application/xml, text/xml, */*" request.addHeader "Content-Type", "text/html" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testFormat.call() assertEquals "html", response.contentAsString } void testFirefox2AcceptHeader() { request.addHeader "Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testFormat.call() assertEquals "html", response.contentAsString } void testFirefox3AcceptHeader() { request.addHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testFormat.call() assertEquals "html", response.contentAsString } void testFirefox2AcceptHeaderWithFormatOrdering() { request.addHeader "Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testWithFormatAndEqualQualityGrading.call() assertEquals "", response.contentAsString assertEquals "html", request.format } void testPrototypeFormat() { request.addHeader "Accept", "text/javascript, text/html, application/xml, text/xml, */*" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testFormat.call() assertEquals "js", response.contentAsString } void testOverrideWithRequestParameter() { request.addHeader "Accept", "text/javascript, text/html, application/xml, text/xml, */*" request.setParameter "format", "xml" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testFormat.call() assertEquals "xml", response.contentAsString } void testOverrideWithControllerParameter() { request.addHeader "Accept", "text/javascript, text/html, application/xml, text/xml, */*" def c = ga.getControllerClass("ContentController").newInstance() c.params.format = "xml" webRequest.controllerName = 'content' c.testFormat.call() assertEquals "xml", response.contentAsString } void testWithFormatAndDefaults() { def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testWithFormat.call() assertEquals "", response.contentAsString } void testPrototypeWithFormat() { request.addHeader "Accept", "text/javascript, text/html, application/xml, text/xml, */*" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testWithFormat.call() assertEquals "alert('hello')", response.contentAsString } void testWithFormatParameterOverride() { request.setParameter "format", "js" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testWithFormat.call() assertEquals "alert('hello')", response.contentAsString } void testWithFormatAndModel() { request.addHeader "Accept", "text/html" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' def model = c.testWithFormatAndModel.call() assertEquals 'world', model?.hello } void testWithFormatZeroArgs() { request.addHeader "Accept", "text/javascript, text/html, application/xml, text/xml, */*" def c = ga.getControllerClass("ContentController").newInstance() webRequest.controllerName = 'content' c.testWithFormatZeroArgs.call() assertEquals "html", request.format } }