• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.messaging.ui.attachmentchooser;
18 
19 import android.app.Fragment;
20 import android.test.suitebuilder.annotation.LargeTest;
21 import android.widget.CheckBox;
22 
23 import com.android.messaging.FakeFactory;
24 import com.android.messaging.R;
25 import com.android.messaging.datamodel.DataModel;
26 import com.android.messaging.datamodel.data.DraftMessageData;
27 import com.android.messaging.datamodel.data.MessageData;
28 import com.android.messaging.datamodel.data.MessagePartData;
29 import com.android.messaging.datamodel.data.TestDataFactory;
30 import com.android.messaging.ui.FragmentTestCase;
31 import com.android.messaging.ui.TestActivity;
32 import com.android.messaging.ui.TestActivity.FragmentEventListener;
33 import com.android.messaging.ui.attachmentchooser.AttachmentChooserFragment;
34 import com.android.messaging.ui.attachmentchooser.AttachmentGridItemView;
35 import com.android.messaging.ui.attachmentchooser.AttachmentGridView;
36 import com.android.messaging.ui.attachmentchooser.AttachmentChooserFragment.AttachmentChooserFragmentHost;
37 import com.android.messaging.ui.conversationlist.ConversationListFragment;
38 
39 import org.mockito.ArgumentMatcher;
40 import org.mockito.Matchers;
41 import org.mockito.Mock;
42 import org.mockito.Mockito;
43 
44 import java.util.Arrays;
45 import java.util.HashSet;
46 import java.util.List;
47 import java.util.Set;
48 
49 
50 /**
51  * Unit tests for {@link ConversationListFragment}.
52  */
53 @LargeTest
54 public class AttachmentChooserFragmentTest extends FragmentTestCase<AttachmentChooserFragment> {
55 
56     @Mock protected DataModel mockDataModel;
57     @Mock protected DraftMessageData mockDraftMessageData;
58     @Mock protected AttachmentChooserFragmentHost mockHost;
59 
60     private static final String CONVERSATION_ID = "cid";
61 
62     /** A custom argument matcher that checks whether the set argument passed in is a set
63      * with identical attachment data as the given set.
64      */
65     private class IsSetOfGivenAttachments implements ArgumentMatcher<Set<MessagePartData>> {
66         private final Set<MessagePartData> mGivenParts;
IsSetOfGivenAttachments(final Set<MessagePartData> givenParts)67         public IsSetOfGivenAttachments(final Set<MessagePartData> givenParts) {
68             mGivenParts = givenParts;
69         }
70 
71         @Override
matches(final Set<MessagePartData> actualSet)72         public boolean matches(final Set<MessagePartData> actualSet) {
73             if (actualSet.size() != mGivenParts.size()) {
74                 return false;
75             }
76             return mGivenParts.containsAll(actualSet) && actualSet.containsAll(mGivenParts);
77         }
78      }
79 
AttachmentChooserFragmentTest()80     public AttachmentChooserFragmentTest() {
81         super(AttachmentChooserFragment.class);
82     }
83 
84     @Override
setUp()85     protected void setUp() throws Exception {
86         super.setUp();
87         FakeFactory.register(this.getInstrumentation().getTargetContext())
88             .withDataModel(mockDataModel);
89     }
90 
loadWith(final List<MessagePartData> attachments)91     private void loadWith(final List<MessagePartData> attachments) {
92         Mockito.when(mockDraftMessageData.isBound(Matchers.anyString()))
93             .thenReturn(true);
94         Mockito.doReturn(mockDraftMessageData)
95             .when(mockDataModel)
96             .createDraftMessageData(Mockito.anyString());
97         Mockito.doReturn(attachments)
98             .when(mockDraftMessageData)
99             .getReadOnlyAttachments();
100         Mockito.when(mockDataModel.createDraftMessageData(
101                 Matchers.anyString()))
102             .thenReturn(mockDraftMessageData);
103 
104         // Create fragment synchronously to avoid need for volatile, synchronization etc.
105         final AttachmentChooserFragment fragment = getFragment();
106         // Binding to model happens when attaching fragment to activity, so hook into test
107         // activity to do so.
108         getActivity().setFragmentEventListener(new FragmentEventListener() {
109             @Override
110             public void onAttachFragment(final Fragment attachedFragment) {
111                 if (fragment == attachedFragment) {
112                     fragment.setConversationId(CONVERSATION_ID);
113                 }
114             }
115         });
116 
117         getActivity().runOnUiThread(new Runnable() {
118             @Override
119             public void run() {
120                 fragment.setHost(mockHost);
121                 getActivity().setFragment(fragment);
122                 Mockito.verify(mockDataModel).createDraftMessageData(
123                         Mockito.matches(CONVERSATION_ID));
124                 Mockito.verify(mockDraftMessageData).loadFromStorage(
125                         Matchers.eq(fragment.mBinding), Matchers.eq((MessageData) null),
126                         Matchers.eq(false));
127             }
128         });
129         // Now load the cursor
130         getActivity().runOnUiThread(new Runnable() {
131             @Override
132             public void run() {
133                 fragment.onDraftChanged(mockDraftMessageData, DraftMessageData.ALL_CHANGED);
134             }
135         });
136         getInstrumentation().waitForIdleSync();
137     }
138 
testUnselect()139     public void testUnselect() {
140         final List<MessagePartData> attachments = TestDataFactory.getTestDraftAttachments();
141         loadWith(attachments);
142         final AttachmentGridView attachmentGridView = (AttachmentGridView)
143                 getFragment().getView().findViewById(R.id.grid);
144         assertEquals("bad view count", attachments.size(),
145                 attachmentGridView.getAdapter().getCount());
146 
147         final AttachmentGridItemView itemView = (AttachmentGridItemView)
148                 attachmentGridView.getChildAt(0);
149         assertEquals(attachmentGridView, itemView.testGetHostInterface());
150         final CheckBox checkBox = (CheckBox) itemView.findViewById(R.id.checkbox);
151         assertEquals(true, checkBox.isChecked());
152         assertEquals(true, attachmentGridView.isItemSelected(itemView.mAttachmentData));
153         clickButton(checkBox);
154         assertEquals(false, checkBox.isChecked());
155         assertEquals(false, attachmentGridView.isItemSelected(itemView.mAttachmentData));
156 
157         final AttachmentGridItemView itemView2 = (AttachmentGridItemView)
158                 attachmentGridView.getChildAt(1);
159         final CheckBox checkBox2 = (CheckBox) itemView2.findViewById(R.id.checkbox);
160         clickButton(checkBox2);
161 
162         getFragment().confirmSelection();
163         final MessagePartData[] attachmentsToRemove = new MessagePartData[] {
164                 itemView.mAttachmentData, itemView2.mAttachmentData };
165         Mockito.verify(mockDraftMessageData).removeExistingAttachments(Matchers.argThat(
166                 new IsSetOfGivenAttachments(new HashSet<>(Arrays.asList(attachmentsToRemove)))));
167         Mockito.verify(mockDraftMessageData).saveToStorage(Matchers.eq(getFragment().mBinding));
168         Mockito.verify(mockHost).onConfirmSelection();
169     }
170 }
171