From ce0d7f6c6721fc98adc4d18c7194bd1beb6e5597 Mon Sep 17 00:00:00 2001
From: Robert Scott <code@humanleg.org.uk>
Date: Thu, 25 Oct 2018 21:39:40 +0100
Subject: [PATCH v1] DownloadOpenChangesetsTaskTest: fix for non-headless mode

---
 .../josm/gui/io/DownloadOpenChangesetsTask.java    | 20 ++---
 .../gui/io/DownloadOpenChangesetsTaskTest.java     | 88 +++++++++++++++++++++-
 2 files changed, 92 insertions(+), 16 deletions(-)

diff --git a/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java b/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java
index 1fefad0c8..d4a36ccce 100644
--- a/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java
+++ b/src/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTask.java
@@ -66,10 +66,8 @@ public class DownloadOpenChangesetsTask extends PleaseWaitRunnable {
                     + "You have either chosen to work anonymously or you are not entitled<br>"
                     + "to know the identity of the user on whose behalf you are working.");
             Logging.warn(msg);
-            if (!GraphicsEnvironment.isHeadless()) {
-                JOptionPane.showMessageDialog(GuiHelper.getFrameForComponent(parent),
-                        "<html>" + msg + "</html>", tr("Missing user identity"), JOptionPane.ERROR_MESSAGE);
-            }
+            JOptionPane.showMessageDialog(GuiHelper.getFrameForComponent(parent),
+                    "<html>" + msg + "</html>", tr("Missing user identity"), JOptionPane.ERROR_MESSAGE);
             return;
         }
         if (canceled) return;
@@ -78,14 +76,12 @@ public class DownloadOpenChangesetsTask extends PleaseWaitRunnable {
             return;
         }
         if (changesets.isEmpty()) {
-            if (!GraphicsEnvironment.isHeadless()) {
-                JOptionPane.showMessageDialog(
-                        MainApplication.getMainFrame(),
-                        tr("There are no open changesets"),
-                        tr("No open changesets"),
-                        JOptionPane.INFORMATION_MESSAGE
-                );
-            }
+            JOptionPane.showMessageDialog(
+                    MainApplication.getMainFrame(),
+                    tr("There are no open changesets"),
+                    tr("No open changesets"),
+                    JOptionPane.INFORMATION_MESSAGE
+            );
             return;
         }
         SwingUtilities.invokeLater(() -> ChangesetCache.getInstance().update(changesets));
diff --git a/test/unit/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTaskTest.java b/test/unit/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTaskTest.java
index 669b5ca3b..c7552adbd 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTaskTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/DownloadOpenChangesetsTaskTest.java
@@ -1,16 +1,31 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.io;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.awt.GraphicsEnvironment;
+import javax.swing.JOptionPane;
 import javax.swing.JPanel;
+import java.net.URL;
 
 import org.junit.Rule;
 import org.junit.Test;
+import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.UserIdentityManager;
+import org.openstreetmap.josm.gui.oauth.OAuthAuthorizationWizard;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.mockers.JOptionPaneSimpleMocker;
+import org.openstreetmap.josm.testutils.mockers.WindowMocker;
+import org.openstreetmap.josm.tools.UserCancelException;
+
+import mockit.Invocation;
+import mockit.Mock;
+import mockit.MockUp;
+
+import com.google.common.collect.ImmutableMap;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
@@ -24,13 +39,49 @@ public class DownloadOpenChangesetsTaskTest {
      */
     @Rule
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().devAPI().timeout(20000);
+    public JOSMTestRules test = new JOSMTestRules().preferences().devAPI();
+
+    public static class OAuthWizardMocker extends MockUp<OAuthAuthorizationWizard> {
+        public boolean called = false;
+
+        @Mock
+        void showDialog() throws UserCancelException {
+            this.called = true;
+            throw new UserCancelException();
+        }
+
+        @Mock
+        void obtainAccessToken(final Invocation invocation, final URL serverUrl) throws UserCancelException {
+            if (GraphicsEnvironment.isHeadless()) {
+                // we can't really let execution proceed any further as construction of the ui
+                // elements will fail with a mocked Window
+                this.called = true;
+                return;
+            }
+            // else we can allow a bit more of the code to be covered before we raise
+            // UserCancelException in showDialog
+            invocation.proceed(serverUrl);
+        }
+    }
 
     /**
-     * Test of {@link DownloadOpenChangesetsTask} class.
+     * Test of {@link DownloadOpenChangesetsTask} class when anonymous.
      */
     @Test
-    public void testDownloadOpenChangesetsTask() {
+    public void testAnonymous() {
+        TestUtils.assumeWorkingJMockit();
+        if (GraphicsEnvironment.isHeadless()) {
+            new WindowMocker();
+        }
+        final OAuthWizardMocker oaWizardMocker = new OAuthWizardMocker();
+        final JOptionPaneSimpleMocker jopsMocker = new JOptionPaneSimpleMocker(
+            ImmutableMap.<String, Object>of(
+                "<html>Could not retrieve the list of your open changesets because<br>JOSM does not know "
+                + "your identity.<br>You have either chosen to work anonymously or you are not "
+                + "entitled<br>to know the identity of the user on whose behalf you are working.</html>", JOptionPane.OK_OPTION
+            )
+        );
+
         DownloadOpenChangesetsTask task = new DownloadOpenChangesetsTask(new JPanel());
         assertNull(task.getChangesets());
 
@@ -38,10 +89,39 @@ public class DownloadOpenChangesetsTaskTest {
         task.run();
         assertNull(task.getChangesets());
 
-        task = new DownloadOpenChangesetsTask(new JPanel());
+        assertEquals(1, jopsMocker.getInvocationLog().size());
+        Object[] invocationLogEntry = jopsMocker.getInvocationLog().get(0);
+        assertEquals(JOptionPane.OK_OPTION, (int) invocationLogEntry[0]);
+        assertEquals("Missing user identity", invocationLogEntry[2]);
+
+        assertTrue(oaWizardMocker.called);
+    }
+
+    /**
+     * Test of {@link DownloadOpenChangesetsTask} class when "partially identified".
+     */
+    @Test
+    public void testPartiallyIdentified() {
+        TestUtils.assumeWorkingJMockit();
+        if (GraphicsEnvironment.isHeadless()) {
+            new WindowMocker();
+        }
+        final OAuthWizardMocker oaWizardMocker = new OAuthWizardMocker();
+        final JOptionPaneSimpleMocker jopsMocker = new JOptionPaneSimpleMocker(
+            ImmutableMap.<String, Object>of("There are no open changesets", JOptionPane.OK_OPTION)
+        );
+
+        DownloadOpenChangesetsTask task = new DownloadOpenChangesetsTask(new JPanel());
         UserIdentityManager.getInstance().setPartiallyIdentified(System.getProperty("osm.username", "josm_test"));
         assertTrue(UserIdentityManager.getInstance().isPartiallyIdentified());
         task.run();
         assertNotNull(task.getChangesets());
+
+        assertEquals(1, jopsMocker.getInvocationLog().size());
+        Object[] invocationLogEntry = jopsMocker.getInvocationLog().get(0);
+        assertEquals(JOptionPane.OK_OPTION, (int) invocationLogEntry[0]);
+        assertEquals("No open changesets", invocationLogEntry[2]);
+
+        assertTrue(oaWizardMocker.called);
     }
 }
-- 
2.11.0

