Hi all,
    I'm trying to test a wicket 1.5.7 application and I'm hitting a
strange (at least for me) issue.
I have two dropdowns (combo 1 and combo2) and when I select one value
from combo1 I fire an AjaxUpdateBehavior on onchange event which selects
a value on combo2.
If I use the application everything is working as expected but If I try
to simulate the application with wicket tester I come into trouble.
Basically the test code is the following one:

        WicketTester tester= new WicketTester(new WicketApplication());
        tester.startPage(TestAjaxDropDown.class);
        FormTester formTester=tester.newFormTester("form");
        formTester.select("combo1", 0);
        tester.executeAjaxEvent("form:combo1", "onchange");
        formTester.submit();
        tester.assertNoErrorMessage();

what I got is that after firing the onchange event combo1 gets a null
value as object model and this does not happen when I use a browser. If
I do not fire the event the application reports that combo2 has no
element selected.
Am I  missing something or is it a bug?

Grazie,
      Giovanni

P.S. I built a simple test case that I insert here

main page class

package com.sg2net.test;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.PropertyModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class TestAjaxDropDown extends WebPage {

    private static final Logger
logger=LoggerFactory.getLogger(TestAjaxDropDown.class.getName());

    public TestAjaxDropDown() {
        add(new FeedbackPanel("feedback"));
        add(new TestAjaxDropDownFrom("form"));
    }

    private class DomainObject1 implements Serializable {
        public DomainObject1(long id, String description) {
            super();
            this.id = id;
            this.description = description;
        }
        private static final long serialVersionUID = 1L;
        private long id;
        private String description;

        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }
        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + getOuterType().hashCode();
            result = prime * result + (int) (id ^ (id >>> 32));
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            DomainObject1 other = (DomainObject1) obj;
            if (!getOuterType().equals(other.getOuterType()))
                return false;
            if (id != other.id)
                return false;
            return true;
        }
        private TestAjaxDropDown getOuterType() {
            return TestAjaxDropDown.this;
        }

    }

    private class DomainObject2 implements Serializable {
        public DomainObject2(long id, String description) {
            super();
            this.id = id;
            this.description = description;
        }
        private static final long serialVersionUID = 1L;
        private long id;
        private String description;

        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }
        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + getOuterType().hashCode();
            result = prime * result + (int) (id ^ (id >>> 32));
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            DomainObject2 other = (DomainObject2) obj;
            if (!getOuterType().equals(other.getOuterType()))
                return false;
            if (id != other.id)
                return false;
            return true;
        }
        private TestAjaxDropDown getOuterType() {
            return TestAjaxDropDown.this;
        }

    }

    private static final long serialVersionUID = 1L;

    private class TestAjaxDropDownFrom extends Form<Void> {

        private static final long serialVersionUID = 1L;
        private DomainObject1 domainObject1;
        private DomainObject2 domainObject2;
        private DropDownChoice<DomainObject2> secondCombo;

        public TestAjaxDropDownFrom(String id) {
            super(id);
            List<DomainObject1> choicesForCombo1= new
ArrayList<DomainObject1>();
            choicesForCombo1.add(new DomainObject1(1L,"uno"));
            choicesForCombo1.add(new DomainObject1(2L,"due"));
            choicesForCombo1.add(new DomainObject1(3L,"tre"));
            DropDownChoice<DomainObject1> firstCombo= new
DropDownChoice<DomainObject1>("combo1",
                    new
PropertyModel<DomainObject1>(this,"domainObject1"),choicesForCombo1,
                    new ChoiceRenderer<DomainObject1>("description",
"id"));
            firstCombo.setRequired(true);
            firstCombo.setNullValid(true);
            firstCombo.add(new AjaxUpdateBehavior("onchange"));
            add(firstCombo);

            List<DomainObject2> choicesForCombo2= new
ArrayList<DomainObject2>();
            choicesForCombo2.add(new DomainObject2(10L,"unozero"));
            choicesForCombo2.add(new DomainObject2(20L,"duezero"));
            choicesForCombo2.add(new DomainObject2(30L,"trezero"));
            secondCombo= new DropDownChoice<DomainObject2>("combo2",
                    new
PropertyModel<DomainObject2>(this,"domainObject2"),choicesForCombo2,
                    new ChoiceRenderer<DomainObject2>("description",
"id"));
            secondCombo.setOutputMarkupId(true);
            secondCombo.setNullValid(true);
            add(secondCombo);

        }

        @Override
        public void onSubmit() {
            if (domainObject2==null) {
                error("Domain object2 is null");
            } else {
                info("OK");
            }
        }

        private class AjaxUpdateBehavior extends
AjaxFormComponentUpdatingBehavior {


            private static final long serialVersionUID = 1L;

            public AjaxUpdateBehavior(String event) {
                super(event);
            }

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                if (domainObject1!=null) {
                    logger.warn("domainObject1.getId()=" +
domainObject1.getId());
                    if (domainObject1.getId()==1L) {
                        domainObject2=new DomainObject2(10L,"unozero");
                        logger.warn("domainObject2.getId()=" +
domainObject2.getId());
                    }
                    if (domainObject1.getId()==2L) {
                        domainObject2=new DomainObject2(20L,"duezero");
                        logger.warn("domainObject2.getId()=" +
domainObject2.getId());
                    }
                    if (domainObject1.getId()==3L) {
                        domainObject2=new DomainObject2(30L,"trezero");
                        logger.warn("domainObject2.getId()=" +
domainObject2.getId());
                    }
                    secondCombo.modelChanged();
                    target.add(secondCombo);
                } else {
                    logger.warn("domainObject1==null");
                }
            }
        }

    }
}

test class

package com.sg2net.test;

import org.apache.wicket.util.tester.FormTester;
import org.apache.wicket.util.tester.WicketTester;
import org.testng.annotations.Test;

public class WicketTesterAjaxDropDown {
    @Test
    public void testAjaxDropDown() {
        WicketTester tester= new WicketTester(new WicketApplication());
        tester.startPage(TestAjaxDropDown.class);
        FormTester formTester=tester.newFormTester("form");
        formTester.select("combo1", 0);
        tester.executeAjaxEvent("form:combo1", "onchange");
        //formTester.select("combo1", 0);
        formTester.submit();
        tester.assertNoErrorMessage();
    }
}

wicket application class

package com.sg2net.test;
import org.apache.wicket.Page;
import org.apache.wicket.protocol.http.WebApplication;

import com.sg2net.test.TestAjaxDropDown;


public class WicketApplication extends WebApplication {

    @Override
    public Class<? extends Page> getHomePage() {

        return TestAjaxDropDown.class;
    }

    protected void init() {
        getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
    }

}



--
Giovanni Cuccu
Responsabile area sviluppo - CUP 2000 Spa
Via del Borgo di S. Pietro, 90/c - 40126 Bologna
e-mail: giovanni.cuccu _at_ cup2000.it




---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to