Bug 1414084 - Part 16 - Add some tests for the handling of PageActions. r?grisha draft
authorJan Henning <jh+bugzilla@buttercookie.de>
Mon, 19 Mar 2018 20:27:01 +0100
changeset 823891 3d32da755f021757770513b5ffb23872f62af05e
parent 823890 aa5fd217ec44e9234c186879b8666cf9c472f4e0
child 823892 8902c9e7ecd2b9cd7e2f0f79f3c0bdcc64c6710a
push id117809
push usermozilla@buttercookie.de
push dateSun, 29 Jul 2018 18:19:15 +0000
reviewersgrisha
bugs1414084
milestone63.0a1
Bug 1414084 - Part 16 - Add some tests for the handling of PageActions. r?grisha MozReview-Commit-ID: EUl19vyK3Ra
mobile/android/app/src/test/java/org/mozilla/gecko/TestAddonUICache.java
--- a/mobile/android/app/src/test/java/org/mozilla/gecko/TestAddonUICache.java
+++ b/mobile/android/app/src/test/java/org/mozilla/gecko/TestAddonUICache.java
@@ -7,40 +7,48 @@ import android.view.Menu;
 import android.view.MenuItem;
 
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.mozilla.gecko.util.GeckoBundle;
 import org.robolectric.RobolectricTestRunner;
 
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import static org.mozilla.gecko.toolbar.PageActionLayout.PageAction;
+import static org.mozilla.gecko.toolbar.PageActionLayout.PageActionLayoutDelegate;
+
 @RunWith(RobolectricTestRunner.class)
 public class TestAddonUICache {
     private AddonUICache mAddonUICache;
     private @Mock Menu mMockMenu;
+    private @Mock PageActionLayoutDelegate mMockPalDelegate;
+    private @Captor ArgumentCaptor<List<PageAction>> palCaptor;
     private static final MessageGenerator addonMessage = new AddonMenuMessageGenerator();
+    private static final MessageGenerator pageActionMessage = new PageActionMessageGenerator();
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         when(mMockMenu.add(anyInt(), anyInt(), anyInt(), anyString())).thenReturn(mock(MenuItem.class));
 
         mAddonUICache = AddonUICache.getInstance();
         mAddonUICache.init();
@@ -84,39 +92,129 @@ public class TestAddonUICache {
         Map<String, GeckoBundle> sentMessages = sendAddonMessages("Menu:Add",
                 addonMessage);
         sendAddonMessages("Menu:Remove", new ArrayList<>(sentMessages.values()));
 
         mAddonUICache.onCreateOptionsMenu(mMockMenu);
         verify(mMockMenu, never()).add(anyInt(), anyInt(), anyInt(), anyString());
     }
 
+    @Test
+    public void testResolvedPageActionListSaving() {
+        final List<PageAction> pageActionList = new ArrayList<>();
+        mAddonUICache.removePageActionLayoutDelegate(pageActionList);
+
+        mAddonUICache.setPageActionLayoutDelegate(mMockPalDelegate);
+        verify(mMockPalDelegate).setCachedPageActions(palCaptor.capture());
+        Assert.assertEquals(pageActionList, palCaptor.getValue());
+    }
+
+    @Test
+    public void testPageActionMessageDirectForward() {
+        mAddonUICache.setPageActionLayoutDelegate(mMockPalDelegate);
+        verify(mMockPalDelegate, never()).addPageAction(any(GeckoBundle.class));
+        verify(mMockPalDelegate, never()).removePageAction(any(GeckoBundle.class));
+
+        Map<String, GeckoBundle> sentMessages = sendAddonMessages("PageActions:Add",
+                pageActionMessage);
+
+        ArgumentCaptor<GeckoBundle> messages = ArgumentCaptor.forClass(GeckoBundle.class);
+        verify(mMockPalDelegate, times(4)).addPageAction(messages.capture());
+
+        List<GeckoBundle> expectedMessages = new ArrayList<>(sentMessages.values());
+        Assert.assertEquals(expectedMessages, messages.getAllValues());
+
+        sendAddonMessages("PageActions:Remove", new ArrayList<>(sentMessages.values()));
+        messages = ArgumentCaptor.forClass(GeckoBundle.class);
+        verify(mMockPalDelegate, times(4)).removePageAction(messages.capture());
+
+        Assert.assertEquals(expectedMessages, messages.getAllValues());
+    }
+
+    @Test
+    public void testPageActionMessageStoreForward() {
+        Map<String, GeckoBundle> sentMessages = sendAddonMessages("PageActions:Add",
+                pageActionMessage);
+
+        mAddonUICache.setPageActionLayoutDelegate(mMockPalDelegate);
+        ArgumentCaptor<GeckoBundle> messages = ArgumentCaptor.forClass(GeckoBundle.class);
+        verify(mMockPalDelegate, times(4)).addPageAction(messages.capture());
+
+        List<GeckoBundle> expectedMessages = new ArrayList<>(sentMessages.values());
+        Assert.assertEquals(expectedMessages, messages.getAllValues());
+
+        verify(mMockPalDelegate, never()).removePageAction(any(GeckoBundle.class));
+    }
+
+    @Test
+    public void testPageActionMessageStoreRemoveForward() {
+        Map<String, GeckoBundle> sentMessages = sendAddonMessages("PageActions:Add",
+                pageActionMessage);
+        sendAddonMessages("PageActions:Remove", new ArrayList<>(sentMessages.values()));
+
+        mAddonUICache.setPageActionLayoutDelegate(mMockPalDelegate);
+        verify(mMockPalDelegate, never()).addPageAction(any(GeckoBundle.class));
+        verify(mMockPalDelegate, never()).removePageAction(any(GeckoBundle.class));
+    }
+
+    @Test
+    public void testResolvedPageActionListSavingRemoval() {
+        final List<PageAction> pageActionList = new ArrayList<>();
+        final GeckoBundle palMessage = pageActionMessage.getMessage("Frob widget");
+        final PageAction pageAction = new PageAction(palMessage.getString("id"),
+                palMessage.getString("title"), null, null, false);
+        pageActionList.add(pageAction);
+        mAddonUICache.removePageActionLayoutDelegate(pageActionList);
+
+        sendAddonMessage("PageActions:Remove", palMessage);
+
+        mAddonUICache.setPageActionLayoutDelegate(mMockPalDelegate);
+        verify(mMockPalDelegate).setCachedPageActions(palCaptor.capture());
+        Assert.assertEquals(pageActionList, palCaptor.getValue());
+        Assert.assertTrue(pageActionList.isEmpty());
+    }
+
     private Map<String, GeckoBundle> sendAddonMessages(String event, MessageGenerator generator) {
         Map<String, GeckoBundle> sentMessages = new LinkedHashMap<>();
         for (int i = 0; i < 4; i++) {
             String label = "Menu " + i;
             GeckoBundle message = generator.getMessage(label);
-            mAddonUICache.handleMessage(event, message, null);
+            sendAddonMessage(event, message);
             sentMessages.put(label, message);
         }
         return sentMessages;
     }
 
     private void sendAddonMessages(String event, List<GeckoBundle> messages) {
         for (GeckoBundle message : messages) {
-            mAddonUICache.handleMessage(event, message, null);
+            sendAddonMessage(event, message);
         }
     }
 
+    private void sendAddonMessage(String event, GeckoBundle message) {
+        mAddonUICache.handleMessage(event, message, null);
+    }
+
     private interface MessageGenerator {
         GeckoBundle getMessage(String label);
     }
 
     private static class AddonMenuMessageGenerator implements MessageGenerator {
         @Override
         public GeckoBundle getMessage(String label) {
             GeckoBundle message = new GeckoBundle(2);
             message.putString("name", label);
             message.putString("uuid", "{" + UUID.randomUUID().toString() + "}");
             return message;
         }
     }
+
+    private static class PageActionMessageGenerator implements MessageGenerator {
+        @Override
+        public GeckoBundle getMessage(String label) {
+            GeckoBundle message = new GeckoBundle(2);
+            message.putString("title", label);
+            message.putString("id", "{" + UUID.randomUUID().toString() + "}");
+            return message;
+        }
+    }
 }
+