Mostrando las entradas con la etiqueta wicket. Mostrar todas las entradas
Mostrando las entradas con la etiqueta wicket. Mostrar todas las entradas

jueves, 19 de noviembre de 2009

Test paginas con wicket messages

En el anterior post puse algo sobre la Internacionalización en wicket, ahora que pasa si tenemos los archivos.properties en otro lado que no sea la pagina

por ejemplo

home.java
home.html
home.properties

application.java
application.properties


las claves-valor q tengamos en application.properties cuando corramos los tests, no van a andar (no las va a encontrar )

esto se debe a que corriendo, wicket busca

panel_locale -> panel -> form_locale -> form -> page_locale -> page -> appication_locale -> application


pero WicketTester no, solo busca las primeras

lo q podemos hacer es en el setUp del test, especificarle que lo use, x.properties




import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.apache.wicket.spring.test.ApplicationContextMock;
import org.apache.wicket.util.tester.WicketTester;
import org.apache.wicket.resource.loader.ClassStringResourceLoader;

public class testHome extends TestCase {


@Override
public void setUp() {
appctx = new ApplicationContextMock();
testerApplication = new WicketTester();
testerApplication.getApplication().addComponentInstantiationListener(
new SpringComponentInjector(testerApplication.getApplication(),
appctx));
testerApplication.getApplication().getResourceSettings().addStringResourceLoader(new ClassStringResourceLoader(Application.class));
}
}





miércoles, 18 de noviembre de 2009

Internacionalización en wicket (aplicaciones multi idioma )

Obvio, no se usa mas poner los textos hace mil años =D, incluso, aunque la aplicacion este pensada para un solo idioma.
Por ? y facil, correcciones ortograficas, estandarizacion de palabras (no queda bien que un boton diga guardar, otro diga save, y otro aplicar )

Solucion magica gracias a java y wicket

archivos.properties

Simple, es un archivo de texto (o varios ) que tienen clave-valor para los textos (o configuraciones)



# comentarios
clave=valor

#clasico ejemplo hola mundo
message=Hola mundo !




ahora donde y como ponemos estos archivos ?

wicket busca primero en un archivo.properties con el mismo nombre que la pagina
por ej: home.html y home.java , va a buscar el home.properties, si no lo encuentra, va a buscar el de la clase super de este (WebPage.properties ) si no puede, su padre y asi hasta
llegar al object.java

si no encuentra la clave hasta ahi, busca por los componentes (por ejemplo panelMenu.properties , panelFooter.properties, etc ) o por la aplicacion.

Con esto, podemos tener uno con el nombre de la aplicacion, y sobreescribir si queremos algo particular, en uno

entonces


Application.properties



#clasico ejemplo hola mundo
message=Hola mundo !




home.properties



#clasico ejemplo hola mundo
message=Hola mundo sobreescrito


como se usa ?




<wicket:message key="message">esto se pisa si encuentra una clave (si no, no )</wicket:message>





en vez de poner el texto en el html


si lo queremos en un componente html por ejemplo un input



<input type="submit" value="Hello world"/>
lo reemplazamos por
<input type="submit" value="texto por defecto" wicket:message="value:helloworld"/>


y si quicieramos poner mas de una propiedad



<input type="submit" value="texto por defecto" wicket:message="value:helloworld,title:hellotitle"/>




como darle varios idiomas

se pone un archivo por cada idioma

(idioma por defecto)
application.properties
(ingles)
application.properties
(españo)
application.properties
(español argentina)
application.properties


codigos en http://msdn.microsoft.com/en-us/library/ms533052(VS.85).aspx

"si, m$ hace cosas buenas =P"



tambien podemos usar esto para configuraciones,

desde codigo java podemos levantarlo con wicket

new StringResourceModel(key, this,null)





MyPanel.properties:
bla=Un texto loco

MyPanel.html:
<span wicket:id="summary">Text that will be replaced.</span>

MyPanel.java:

Summary summary = ...;
add(new Label("summary", new StringResourceModel("bla", this, null)));





tambien se puede inducir cual locale usar

Locale.getDefault() y Locale.setDefault(Locale))




Referencias


http://cwiki.apache.org/WICKET/everything-about-wicket-internationalization.html
http://www.chuidiang.com/java/ResourceBundle/internacionalizacion.php
http://wicket.apache.org/docs/wicket-1.3.2/wicket/apidocs/org/apache/wicket/model/StringResourceModel.html
listado locales
http://msdn.microsoft.com/en-us/library/ms533052(VS.85).aspx















Powered by ScribeFire.

martes, 17 de noviembre de 2009

Testear todos los paneles wicket

Bueno primero que nada, no es mi idea, solo lo traduzco y adapte a mi codigo.

Original : http://stuq.nl/weblog/2009-11-01/automatically-test-your-wicket-panel-html-markup


La idea es de testear todos los componentes Panel (se puede hacer para mas cosas) por reflection, gracias a spring.
Intente dejarlo lindo con labdaj pero no me salio =( , quedaba inentendible, Cuando tenga mas practica con eso, probamos

Con esto, si en un panel no cerramos un tag (ej <div bla </div> ) el unit test fallaria donde lo encuentre, lo mismo con los errores comunes de cambiar un wicket:id o algo asi

bueno, dependencias solo junit y spring






package base2dev.web.panel;

import java.lang.reflect.Constructor;
import java.util.Set;
import org.apache.wicket.markup.html.panel.Panel;
import org.junit.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AssignableTypeFilter;
import base2dev.web.common.test.TestCase;

public class PanelsTest extends TestCase {

@Test
public void testAllWicketPanels() throws Exception {

//cosas de spring
ClassPathScanningCandidateComponentProvider provider =
new ClassPathScanningCandidateComponentProvider(true);

//seteo como filtro las cosas del tipo Panel
provider.addIncludeFilter(new AssignableTypeFilter(Panel.class));

//path donde buscar
Set<BeanDefinition> components = provider
.findCandidateComponents("base2dev/web/common/controls");


//esto podria ser mas lindo con labdaj
// llamamos a testear el panel, por cada componente, nada muy loco
for (BeanDefinition component : components) {
Class clazz = Class.forName(component.getBeanClassName());
if (hasDefaultConstructor(clazz)) {
testWicketPanel(clazz);
}
}
}

public void testWicketPanel(Class clazz) {
getTesterApplication().startPanel(clazz);
getTesterApplication().assertNoErrorMessage();
getTesterApplication().assertNoInfoMessage();
}

public boolean hasDefaultConstructor(Class clazz) {
for (Constructor constructor : clazz.getConstructors()) {
if (constructor.getParameterTypes().length == 1
&& constructor.getParameterTypes()[0].getSimpleName()
.equals("String")) {
return true;
}
}

return false;
}
}
-----------------------------------------------





Powered by ScribeFire.

lunes, 16 de noviembre de 2009

wicket test paginas con parametros

por ejemplo si tenemos







public class AlbumPage extends WebPage{
private final Album album;

public AlbumPage(Album album) {
this.album = album;
}
}







el test seria






//creado asi por fluent (http://en.wikipedia.org/wiki/Fluent_interface#Java )
final Album mockAlbum = new Album().setArtist( new Artist().setName("Pepe Argento")).setName("el disco de pp");

public void testRenderThePage() {
//con una clase anonima, estamos sobreescribiendo el metodo getTestPage(), para porder invocar a la pagina con el constructor
//(otra bondad de las clases anonimas =D )
getTesterApplication().startPage(new ITestPageSource() {
private static final long serialVersionUID = 1L;
public Page getTestPage() {
return new AlbumPage(mockAlbum);
}
});

getTesterApplication().assertRenderedPage(AlbumPage.class);








el error que da si queremos usar startPage(MiPagina.class )

org.apache.wicket.WicketRuntimeException: Unable to create page from class base2dev.web.pages.musics.AlbumPage.
Class does neither have a constructor with PageParameter nor a default constructor
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:68)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:299)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:321)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:234)
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92)
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250)
...





Powered by ScribeFire.



Testear paginas Wicket JUnit EasyMock

bueno vamos a testear una webPage de Wicket


asumo el uso de maven, asi que si no esta, a poner las librerias a manopla =D

dependencias en el pom







<!-- .......TEST (JUNIT).............-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
</dependency>

<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>2.5.2</version>
</dependency>

<dependency>
<groupId>easymock</groupId>
<artifactId>easymockclassextension</artifactId>
<version>2.2</version>
</dependency>




codigo


//uso de import static es para no escribir los tipos
// Ejemplo "EasyMock.expect( ...."
// con import static va solo "expect(.."
//mas en http://java.sun.com/j2se/1.5.0/docs/guide/language/static-import.html
import static org.easymock.EasyMock.*;

import java.util.ArrayList;

public class ArtistPageTest extends TestCase {

private WicketTester testerApplication;
private ApplicationContextMock appctx;

@Override
public void setUp() {
appctx = new ApplicationContextMock();

testerApplication = new WicketTester();
testerApplication.getApplication().addComponentInstantiationListener(
new SpringComponentInjector(testerApplication.getApplication(),
appctx));

//esto es un listado de artistas con un getAll (algo asi como un dao)
Bag<Artist> artists = createMock(Bag.class );


ArrayList<Artist> unaLista = new ArrayList<Artist>();

//esto es fluent new Algo().SetProp("bla") en vez de void los metodos son del tipo de la clase, y pongo return this
//http://code.google.com/p/base2dev/source/browse/src/trunk/base2dev/core/src/main/java/musics/model/Artist.java
unaLista.add(new Artist().setName("Pepe Argento").setDescription("pepe fue un grande"));


//seteamos con easyMock que espera cuando llama a algun metodo
expect(artists.getAll()).andReturn(mockList);
replay(artists);

// lo agregamos al manejador de instancias
getAppContext().putBean("artists", artists);

}

public WicketTester getTesterApplication() {
return testerApplication;
}

public ApplicationContextMock getAppContext() {
return appctx;
}




@Test
public void testRenderThePage() {

getTesterApplication().startPage(Artists.class);
getTesterApplication().assertRenderedPage(Artists.class);

}




todo el codigo esta en

http://code.google.com/p/base2dev/source/browse/src/trunk/#trunk/base2dev






Powered by ScribeFire.