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

Reply via email to