WICKET-5346 Support MultiFileUploadField in FormTester
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/026768ea Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/026768ea Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/026768ea Branch: refs/heads/master Commit: 026768ea4423b4f74704210fda47a9ca503689aa Parents: 34c8dce Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Fri Sep 27 13:13:32 2013 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Fri Sep 27 13:15:40 2013 +0200 ---------------------------------------------------------------------- .../html/form/upload/MultiFileUploadField.java | 4 +- .../apache/wicket/util/tester/FormTester.java | 30 +++-- .../form/upload/MultiFileUploadFieldTest.java | 123 +++++++++++++++++++ .../form/upload/MultiFileUploadFieldTest0.txt | 1 + .../form/upload/MultiFileUploadFieldTest1.txt | 1 + 5 files changed, 148 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/026768ea/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java index bec6489..4e803a3 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.java @@ -90,13 +90,11 @@ public class MultiFileUploadField extends FormComponentPanel<Collection<FileUplo private static final String NAME_ATTR = "name"; - private static final String MAGIC_SEPARATOR = "_mf_"; - + public static final String MAGIC_SEPARATOR = "_mf_"; public static final ResourceReference JS = new JavaScriptResourceReference( MultiFileUploadField.class, "MultiFileUploadField.js"); - private final WebComponent upload; private final WebMarkupContainer container; http://git-wip-us.apache.org/repos/asf/wicket/blob/026768ea/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java index 180eaaa..319d1af 100644 --- a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java +++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java @@ -40,6 +40,7 @@ import org.apache.wicket.markup.html.form.ListMultipleChoice; import org.apache.wicket.markup.html.form.Radio; import org.apache.wicket.markup.html.form.RadioGroup; import org.apache.wicket.markup.html.form.upload.FileUploadField; +import org.apache.wicket.markup.html.form.upload.MultiFileUploadField; import org.apache.wicket.protocol.http.mock.MockHttpServletRequest; import org.apache.wicket.util.file.File; import org.apache.wicket.util.lang.Args; @@ -58,6 +59,11 @@ import org.apache.wicket.util.visit.IVisitor; public class FormTester { /** + * An auto incrementing index used as a suffix for MultiFileUploadField's inputName + */ + private int multiFileUploadIndex = 0; + + /** * A selector template for selecting selectable <code>FormComponent</code>s with an index of * option -- supports <code>RadioGroup</code>, <code>CheckGroup</code>, and * <code>AbstractChoice</code> family. @@ -293,9 +299,9 @@ public class FormTester if (formComponent == null) { fail("Trying to select on null component."); + return null; } - - if (formComponent instanceof RadioGroup || + else if (formComponent instanceof RadioGroup || formComponent instanceof AbstractSingleSelectChoice) { return new SingleChoiceSelector(formComponent); @@ -420,7 +426,7 @@ public class FormTester { if (formComponent instanceof IFormSubmittingComponent) { - // buttons have to be sumitted explicitely + // buttons have to be submitted explicitely } else if (formComponent instanceof AbstractTextComponent) { @@ -565,7 +571,7 @@ public class FormTester { checkClosed(); - if (replace == true) + if (replace) { // Reset first setValue(formComponentId, ""); @@ -661,16 +667,24 @@ public class FormTester FormComponent<?> formComponent = (FormComponent<?>)workingForm.get(formComponentId); - if (formComponent instanceof FileUploadField == false) + MockHttpServletRequest servletRequest = tester.getRequest(); + + if (formComponent instanceof FileUploadField) + { + servletRequest.addFile(formComponent.getInputName(), file, contentType); + } + else if (formComponent instanceof MultiFileUploadField) + { + String inputName = formComponent.getInputName() + MultiFileUploadField.MAGIC_SEPARATOR + multiFileUploadIndex++; + servletRequest.addFile(inputName, file, contentType); + } + else { fail("'" + formComponentId + "' is not " + "a FileUploadField. You can only attach a file to form " + "component of this type."); } - MockHttpServletRequest servletRequest = tester.getRequest(); - servletRequest.addFile(formComponent.getInputName(), file, contentType); - return this; } http://git-wip-us.apache.org/repos/asf/wicket/blob/026768ea/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest.java new file mode 100644 index 0000000..472c8e8 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.wicket.markup.html.form.upload; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.wicket.MarkupContainer; +import org.apache.wicket.WicketTestCase; +import org.apache.wicket.markup.IMarkupResourceStreamProvider; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.model.util.ListModel; +import org.apache.wicket.util.file.File; +import org.apache.wicket.util.io.IOUtils; +import org.apache.wicket.util.resource.IResourceStream; +import org.apache.wicket.util.resource.StringResourceStream; +import org.apache.wicket.util.tester.FormTester; +import org.junit.Test; + +/** + * Tests for MultiFileUploadField + */ +public class MultiFileUploadFieldTest extends WicketTestCase +{ + /** + * FormTester supports MultiFileUploadField + * + * https://issues.apache.org/jira/browse/WICKET-5346 + */ + @Test + public void submitMultiFileUploadFields() + { + final AtomicBoolean submitted = new AtomicBoolean(false); + final ListModel<FileUpload> filesModel = new ListModel<FileUpload>(new ArrayList<FileUpload>()); + + TestPage page = new TestPage(filesModel) + { + @Override + protected void onSubmit() + { + super.onSubmit(); + + List<FileUpload> uploads = filesModel.getObject(); + assertEquals(2, uploads.size()); + + for (int i = 1; i < 2; i++) + { + FileUpload fileUpload = uploads.get(i); + assertEquals(MultiFileUploadFieldTest.class.getSimpleName()+i+".txt", fileUpload.getClientFileName()); + try + { + assertEquals("Test"+i, IOUtils.toString(fileUpload.getInputStream())); + } catch (IOException e) + { + fail("Reading file upload '"+i+"' failed: " + e.getMessage()); + } + } + submitted.set(true); + } + }; + tester.startPage(page); + + FormTester ft = tester.newFormTester("f"); + + ft.setFile("muf", new File("target/test-classes/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest0.txt"), "plain/text"); + ft.setFile("muf", new File("target/test-classes/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest1.txt"), "plain/text"); + ft.submit(); + + assertEquals("The form is not submitted", true, submitted.get()); + } + + private static class TestPage extends WebPage implements IMarkupResourceStreamProvider + { + public TestPage(final ListModel<FileUpload> model) + { + Form f = new Form("f") + { + @Override + protected void onSubmit() + { + super.onSubmit(); + + TestPage.this.onSubmit(); + } + }; + add(f); + + f.add(new MultiFileUploadField("muf", model)); + } + + protected void onSubmit() + { + } + + @Override + public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) + { + return new StringResourceStream("<html><body>\n" + + "\t\t<form wicket:id=\"f\">\n" + + "\t\t\t<input type=\"file\" wicket:id=\"muf\" />\n" + + "\t\t\t<input type=\"submit\" value=\"Submit!\" />\t\n" + + "\t\t</form>\n" + + "\t</body></html>"); + } + } +} http://git-wip-us.apache.org/repos/asf/wicket/blob/026768ea/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest0.txt ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest0.txt b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest0.txt new file mode 100644 index 0000000..2eca140 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest0.txt @@ -0,0 +1 @@ +Test0 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/026768ea/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest1.txt ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest1.txt b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest1.txt new file mode 100644 index 0000000..e88ded9 --- /dev/null +++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadFieldTest1.txt @@ -0,0 +1 @@ +Test1 \ No newline at end of file
