Mostrando las entradas con la etiqueta test. Mostrar todas las entradas
Mostrando las entradas con la etiqueta test. 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.

jueves, 31 de julio de 2008

Templates de proyectos / Items en Visual Studio 2005

Bueno, primero voy a crear un template para Proyectos , y de paso, voy a hacer uno para crear proyectos de test con Nunit y Rhino Mocks.



Template de project

Primero creamos un proyecto Comun , con el nombre que quieras ,
(Mi caso KellNess.Core.Test, test de KellNess.Core una libreria mia )

Este lo hice console application (solo por facilidad de pruebas de test, pero puede ser un library )

Agrego referencia a las dll de NUnit y Rhino

NUnit
http://nunit.org/index.php?p=download

Rhino
http://nunit.org/index.php?p=download


Agrego un Carpeta "Tests"

Y dentro de ella una clase

"UnitTest.cs"

donde pongo :





using System;
using System.Text;
using System.Collections.Generic;
using NUnit.Framework;

namespace AdminCris.test
{
/// <summary>
/// //Solo para probar que NUnit anda
/// </summary>

[TestFixture]
public class UnitTest
{
public UnitTest()
{

}

[TestFixtureSetUp]
public void SetUp()
{

}



[Test]
public void TestMethod()
{
//Solo para probar que NUnit anda
NUnit.Framework.Assert.AreEqual(1, 1);
}
}
}


Ahora selecciono en el Solution Explorer El proyecto , y vamos a

File->Export Template

Si no esta seleccionado el proyecto (porque tenemos otro) lo seleccionamos y siguiente

Nombre, icono y descripcion y lesto.Finish


...
Ahora si vamos a New Proyect, deberia aparecer el nuevo, que si lo seleccionamos, pondra la copia de lo que teniamos en el template dentro.



La "magia" es
en
C:\Documents and Settings\[usuario]\My Documents\Visual Studio 2005\My Exported Templates\

pone un zip con lo que teniamos, y luego lo deszipea (nuevo verbo)



Template de Item

lo mismo, pero creo una clase


/**
* Clase Creada por MBerrueta
* 30/07/2008 - 09.24
* **************************************************
*
                              /----\
-------/ \
/ \
/ |
-----------------/ --------\
----------------------------------------------

$ aptitude -vvvvvv moo
¿Qué es? Un elefante siendo devorado por una serpiente, evidentemente.

*/

namespace KellNess.Web.Test
{
/// <summary>
/// Clase para
/// </summary>
public class Class1
{
/// <summary>
/// Constructor
/// </summary>
public Class1()
{

}

}
}



le agrego lo que quiero en mi caso la Documentacion y el public (algo que me rompe las bolas el que no te ponga el public class )

la seleccionamos, vamos a file->ExportTemplate , y lo mismo pero con Item Template.


Salutes