From 2ceadbcb285b59d57ee820d0171e9599cd95b630 Mon Sep 17 00:00:00 2001
From: Robert Scott <code@humanleg.org.uk>
Date: Thu, 1 Nov 2018 22:05:13 +0000
Subject: [PATCH v1 2/4] ChangesetCacheManagerTest: fix testQueryAction for
 non-headless mode, also increasing coverage of test

---
 .../dialogs/changeset/ChangesetCacheManager.java   | 28 ++++++-------
 .../changeset/query/ChangesetQueryDialog.java      |  8 +++-
 .../changeset/ChangesetCacheManagerTest.java       | 49 ++++++++++++++++++++++
 3 files changed, 68 insertions(+), 17 deletions(-)

diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
index 062945664..a24638b72 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
@@ -392,22 +392,20 @@ public class ChangesetCacheManager extends JFrame {
         @Override
         public void actionPerformed(ActionEvent evt) {
             Window parent = GuiHelper.getWindowAncestorFor(evt);
-            if (!GraphicsEnvironment.isHeadless()) {
-                ChangesetQueryDialog dialog = new ChangesetQueryDialog(parent);
-                dialog.initForUserInput();
-                dialog.setVisible(true);
-                if (dialog.isCanceled())
-                    return;
-
-                try {
-                    ChangesetQuery query = dialog.getChangesetQuery();
-                    if (query != null) {
-                        ChangesetCacheManager.getInstance().runDownloadTask(new ChangesetQueryTask(parent, query));
-                    }
-                } catch (IllegalStateException e) {
-                    Logging.error(e);
-                    JOptionPane.showMessageDialog(parent, e.getMessage(), tr("Error"), JOptionPane.ERROR_MESSAGE);
+            ChangesetQueryDialog dialog = new ChangesetQueryDialog(parent);
+            dialog.initForUserInput();
+            dialog.setVisible(true);
+            if (dialog.isCanceled())
+                return;
+
+            try {
+                ChangesetQuery query = dialog.getChangesetQuery();
+                if (query != null) {
+                    ChangesetCacheManager.getInstance().runDownloadTask(new ChangesetQueryTask(parent, query));
                 }
+            } catch (IllegalStateException e) {
+                Logging.error(e);
+                JOptionPane.showMessageDialog(parent, e.getMessage(), tr("Error"), JOptionPane.ERROR_MESSAGE);
             }
         }
     }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java
index 6766ad84d..fbcf78be2 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialog.java
@@ -72,8 +72,12 @@ public class ChangesetQueryDialog extends JDialog {
     protected JPanel buildButtonPanel() {
         JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
 
-        pnl.add(new JButton(new QueryAction()));
-        pnl.add(new JButton(new CancelAction()));
+        final JButton queryButton = new JButton(new QueryAction());
+        queryButton.setName("queryButton");
+        pnl.add(queryButton);
+        final JButton cancelButton = new JButton(new CancelAction());
+        cancelButton.setName("cancelButton");
+        pnl.add(cancelButton);
         pnl.add(new JButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Dialog/ChangesetQuery"))));
 
         return pnl;
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
index 589462645..df518ea21 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
@@ -2,12 +2,18 @@
 package org.openstreetmap.josm.gui.dialogs.changeset;
 
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.awt.GraphicsEnvironment;
+import javax.swing.JButton;
+import javax.swing.JDialog;
 
 import java.util.Collections;
 import java.util.List;
 
 import org.junit.Rule;
 import org.junit.Test;
+import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.CancelAction;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.ChangesetDetailViewSynchronizer;
@@ -18,7 +24,13 @@ import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.Downlo
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.QueryAction;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.RemoveFromCacheAction;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.ShowDetailAction;
+import org.openstreetmap.josm.gui.dialogs.changeset.query.ChangesetQueryDialog;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.mockers.WindowMocker;
+
+import mockit.Invocation;
+import mockit.Mock;
+import mockit.MockUp;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
@@ -130,7 +142,44 @@ public class ChangesetCacheManagerTest {
      */
     @Test
     public void testQueryAction() {
+        TestUtils.assumeWorkingJMockit();
+
+        // set up mockers to simulate the dialog being cancelled
+        final boolean[] dialogShown = new boolean[] {false};
+        if (GraphicsEnvironment.isHeadless()) {
+            new WindowMocker();
+        }
+        new MockUp<JDialog>() {
+            @Mock
+            void setVisible(final Invocation invocation, final boolean visible) throws Exception {
+                if (visible) {
+                    ((JButton) TestUtils.getComponentByName((JDialog) invocation.getInvokedInstance(), "cancelButton")).doClick();
+                    dialogShown[0] = true;
+                }
+                // critically, don't proceed into implementation
+            }
+        };
+        new MockUp<ChangesetQueryDialog>() {
+            @Mock
+            void setVisible(final Invocation invocation, final boolean visible) throws Exception {
+                if (GraphicsEnvironment.isHeadless()) {
+                    // we have to mock the behaviour quite coarsely as much of ChangesetQueryDialog will
+                    // raise a HeadlessException
+                    if (visible) {
+                        TestUtils.setPrivateField(ChangesetQueryDialog.class, invocation.getInvokedInstance(), "canceled", true);
+                        dialogShown[0] = true;
+                    }
+                } else {
+                    // proceeding into the implementation allows a bit more of the target code to be
+                    // covered, actual mocking is performed on JDialog's setVisible()
+                    invocation.proceed(visible);
+                }
+            }
+        };
+
         new QueryAction().actionPerformed(null);
+
+        assertTrue(dialogShown[0]);
     }
 
     /**
-- 
2.11.0

