package com.googlecode.tawus.components; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.isA; import java.lang.annotation.Annotation; import org.apache.tapestry5.ComponentResources; import org.apache.tapestry5.PropertyOverrides; import org.apache.tapestry5.beaneditor.BeanModel; import org.apache.tapestry5.internal.BeanValidationContext; import org.apache.tapestry5.ioc.Location; import org.apache.tapestry5.ioc.Messages; import org.apache.tapestry5.ioc.internal.util.TapestryException; import org.apache.tapestry5.services.BeanEditContext; import org.apache.tapestry5.services.BeanModelSource; import org.apache.tapestry5.services.Environment; import org.apache.tapestry5.test.TapestryTestCase; import org.easymock.EasyMock; import org.easymock.IArgumentMatcher; import org.testng.annotations.Test; import com.googlecode.tawus.RegistrationData; import com.googlecode.tawus.components.EntityEditor; public class EntityEditorCoreTest extends TapestryTestCase { @Test public void object_created_as_needed() { ComponentResources resources = mockComponentResources(); BeanModelSource source = mockBeanModelSource(); @SuppressWarnings("rawtypes") BeanModel model = mockBeanModel(); RegistrationData data = new RegistrationData(); Messages messages = mockMessages(); PropertyOverrides overrides = mockPropertyOverrides(); Environment env = EasyMock.createNiceMock(Environment.class); train_getBoundType(resources, "object", RegistrationData.class); train_createEditModel(source, RegistrationData.class, messages, model); train_getOverrideMessages(overrides, messages); expect(model.newInstance()).andReturn(data); replay(); EasyMock.replay(env); EntityEditor component = new EntityEditor(); component.inject(resources, overrides, source, env); component.doPrepare(); assertSame(component.getObject(), data); verify(); } @Test public void object_can_not_be_instantiated() { ComponentResources resources = mockComponentResources(); BeanModelSource source = mockBeanModelSource(); @SuppressWarnings("rawtypes") BeanModel model = mockBeanModel(); Location l = mockLocation(); Throwable exception = new RuntimeException("Fall down go boom."); PropertyOverrides overrides = mockPropertyOverrides(); Messages messages = mockMessages(); Environment env = EasyMock.createNiceMock(Environment.class); train_getOverrideMessages(overrides, messages); train_getBoundType(resources, "object", Runnable.class); train_createEditModel(source, Runnable.class, messages, model); expect(model.newInstance()).andThrow(exception); train_getCompleteId(resources, "Foo.bar"); train_getLocation(resources, l); expect(model.getBeanType()).andReturn(Runnable.class); replay(); EasyMock.replay(env); EntityEditor component = new EntityEditor(); component.inject(resources, overrides, source, env); try { component.doPrepare(); unreachable(); } catch (TapestryException ex) { assertMessageContains(ex, "Exception instantiating instance of java.lang.Runnable (for component \'Foo.bar\'):"); assertSame(ex.getLocation(), l); } verify(); } private static BeanEditContext contextEq() { EasyMock.reportMatcher(new IArgumentMatcher() { public void appendTo(StringBuffer buf) { buf.append("BeanEditContextEq(RegistrationData.class)"); } public boolean matches(Object argument) { return (argument instanceof BeanEditContext) && ((BeanEditContext) argument).getBeanClass() == RegistrationData.class; } }); return null; } @Test public void beaneditcontext_pushed_to_environment() { ComponentResources resources = mockComponentResources(); BeanModelSource source = mockBeanModelSource(); @SuppressWarnings("rawtypes") BeanModel model = mockBeanModel(); Environment env = mockEnvironment(); RegistrationData data = new RegistrationData(); Messages messages = mockMessages(); PropertyOverrides overrides = mockPropertyOverrides(); train_getBoundType(resources, "object", RegistrationData.class); train_createEditModel(source, RegistrationData.class, messages, model); train_getOverrideMessages(overrides, messages); expect(model.newInstance()).andReturn(data); expect(env.peek(eq(BeanValidationContext.class))).andReturn(null); expect(model.getBeanType()).andReturn(RegistrationData.class); BeanEditContext ctxt = new BeanEditContext() { public Class<?> getBeanClass() { return RegistrationData.class; } public <T extends Annotation> T getAnnotation(Class<T> type) { return null; } }; expect(env.push(eq(BeanEditContext.class), contextEq())).andReturn(ctxt); replay(); EntityEditor component = new EntityEditor(); component.inject(resources, overrides, source, env); component.doPrepare(); verify(); } @Test public void refresh_bean_validation_context() { ComponentResources resources = mockComponentResources(); BeanModelSource source = mockBeanModelSource(); @SuppressWarnings("rawtypes") BeanModel model = mockBeanModel(); Environment env = mockEnvironment(); RegistrationData data = new RegistrationData(); Messages messages = mockMessages(); PropertyOverrides overrides = mockPropertyOverrides(); BeanValidationContext beanValidationContext = newMock(BeanValidationContext.class); train_getBoundType(resources, "object", RegistrationData.class); train_createEditModel(source, RegistrationData.class, messages, model); train_getOverrideMessages(overrides, messages); expect(model.newInstance()).andReturn(data); expect(env.peek(eq(BeanValidationContext.class))).andReturn(beanValidationContext); expect(env.pop(eq(BeanValidationContext.class))).andReturn(beanValidationContext); expect(env.push(eq(BeanValidationContext.class), isA(BeanValidationContext.class))).andReturn( beanValidationContext); expect(model.getBeanType()).andReturn(RegistrationData.class); BeanEditContext ctxt = new BeanEditContext() { public Class<?> getBeanClass() { return RegistrationData.class; } public <T extends Annotation> T getAnnotation(Class<T> type) { return null; } }; expect(env.push(eq(BeanEditContext.class), contextEq())).andReturn(ctxt); replay(); EntityEditor component = new EntityEditor(); component.inject(resources, overrides, source, env); component.doPrepare(); verify(); } @Test public void beaneditcontext_popped_from_environment() { ComponentResources resources = mockComponentResources(); BeanModelSource source = mockBeanModelSource(); Environment env = mockEnvironment(); PropertyOverrides overrides = mockPropertyOverrides(); expect(env.pop(BeanEditContext.class)).andReturn(null); replay(); EntityEditor component = new EntityEditor(); component.inject(resources, overrides, source, env); component.cleanupEnvironment(); verify(); } }