1 /*
2  * Copyright (C) 2020 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 package com.android.settings.slices;
17 
18 import static com.google.common.truth.Truth.assertThat;
19 
20 import android.content.ContentResolver;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.content.IntentFilter;
24 import android.net.Uri;
25 import android.provider.SettingsSlicesContract;
26 
27 import androidx.slice.Slice;
28 import androidx.test.core.app.ApplicationProvider;
29 import androidx.test.ext.junit.runners.AndroidJUnit4;
30 
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.junit.runner.RunWith;
34 
35 @RunWith(AndroidJUnit4.class)
36 public class SpecialCaseSliceManagerTest {
37 
38     private static final String FAKE_PARAMETER_KEY = "fake_parameter_key";
39     private static final String FAKE_PARAMETER_VALUE = "fake_value";
40 
41     private Context mContext;
42 
43     @Before
setUp()44     public void setUp() {
45         mContext = ApplicationProvider.getApplicationContext();
46         CustomSliceRegistry.sUriToSlice.clear();
47         CustomSliceRegistry.sUriToSlice.put(FakeSliceable.URI, FakeSliceable.class);
48     }
49 
50     @Test
getSliceableFromUri_returnsCorrectObject()51     public void getSliceableFromUri_returnsCorrectObject() {
52         final CustomSliceable sliceable = CustomSliceable.createInstance(
53                 mContext, CustomSliceRegistry.getSliceClassByUri(FakeSliceable.URI));
54 
55         assertThat(sliceable).isInstanceOf(FakeSliceable.class);
56     }
57 
58     @Test
getSliceableFromUriWithParameter_returnsCorrectObject()59     public void getSliceableFromUriWithParameter_returnsCorrectObject() {
60         final Uri parameterUri = FakeSliceable.URI
61                 .buildUpon()
62                 .clearQuery()
63                 .appendQueryParameter(FAKE_PARAMETER_KEY, FAKE_PARAMETER_VALUE)
64                 .build();
65 
66         final CustomSliceable sliceable = CustomSliceable.createInstance(
67                 mContext, CustomSliceRegistry.getSliceClassByUri(parameterUri));
68 
69         assertThat(sliceable).isInstanceOf(FakeSliceable.class);
70     }
71 
72     @Test
isValidUri_validUri_returnsTrue()73     public void isValidUri_validUri_returnsTrue() {
74         final boolean isValidUri = CustomSliceRegistry.isValidUri(FakeSliceable.URI);
75 
76         assertThat(isValidUri).isTrue();
77     }
78 
79     @Test
isValidUri_invalidUri_returnsFalse()80     public void isValidUri_invalidUri_returnsFalse() {
81         final boolean isValidUri = CustomSliceRegistry.isValidUri(null);
82 
83         assertThat(isValidUri).isFalse();
84     }
85 
86     @Test
isValidAction_validActions_returnsTrue()87     public void isValidAction_validActions_returnsTrue() {
88         final boolean isValidAction =
89                 CustomSliceRegistry.isValidAction(FakeSliceable.URI.toString());
90 
91         assertThat(isValidAction).isTrue();
92     }
93 
94     @Test
isValidAction_invalidAction_returnsFalse()95     public void isValidAction_invalidAction_returnsFalse() {
96         final boolean isValidAction = CustomSliceRegistry.isValidAction("action");
97 
98         assertThat(isValidAction).isFalse();
99     }
100 
101     static class FakeSliceable implements CustomSliceable {
102 
103         static final String KEY = "magic key of khazad dum";
104 
105         static final Uri URI = new Uri.Builder()
106                 .scheme(ContentResolver.SCHEME_CONTENT)
107                 .authority(SettingsSliceProvider.SLICE_AUTHORITY)
108                 .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
109                 .appendPath(KEY)
110                 .build();
111 
112         static final Slice SLICE = new Slice.Builder(URI).build();
113 
114         static boolean sBackingData = false;
115 
116         final Context mContext;
117 
FakeSliceable(Context context)118         public FakeSliceable(Context context) {
119             mContext = context;
120         }
121 
122         @Override
getSlice()123         public Slice getSlice() {
124             return SLICE;
125         }
126 
127         @Override
getUri()128         public Uri getUri() {
129             return URI;
130         }
131 
132         @Override
onNotifyChange(Intent intent)133         public void onNotifyChange(Intent intent) {
134             sBackingData = !sBackingData;
135         }
136 
137         @Override
getIntentFilter()138         public IntentFilter getIntentFilter() {
139             return new IntentFilter();
140         }
141 
142         @Override
getIntent()143         public Intent getIntent() {
144             return null;
145         }
146 
147         @Override
getSliceHighlightMenuRes()148         public int getSliceHighlightMenuRes() {
149             return NO_RES;
150         }
151     }
152 }
153