View Javadoc
1   package com.atlassian.refapp.sal.usersettings;
2   
3   import com.atlassian.sal.api.user.UserKey;
4   import com.atlassian.sal.api.user.UserManager;
5   import com.atlassian.sal.api.usersettings.UserSettings;
6   import com.atlassian.sal.api.usersettings.UserSettingsBuilder;
7   import com.google.common.base.Function;
8   import org.hamcrest.Matchers;
9   import org.junit.Before;
10  import org.junit.Test;
11  import org.junit.runner.RunWith;
12  import org.mockito.Mock;
13  import org.mockito.runners.MockitoJUnitRunner;
14  
15  import java.security.Principal;
16  import java.util.concurrent.atomic.AtomicReference;
17  
18  import static org.hamcrest.Matchers.emptyIterable;
19  import static org.junit.Assert.assertEquals;
20  import static org.junit.Assert.assertThat;
21  import static org.junit.Assert.assertTrue;
22  import static org.mockito.Mockito.mock;
23  import static org.mockito.Mockito.when;
24  
25  @RunWith(MockitoJUnitRunner.class)
26  public class RefimplUserSettingsServiceTest {
27      public static final UserKey TEST_USER = new UserKey("test");
28      @Mock
29      private UserManager userManager;
30  
31      private RefimplUserSettingsService userSettingsService;
32  
33      @Before
34      public void createService() {
35          userSettingsService = new RefimplUserSettingsService(userManager);
36      }
37  
38      @Before
39      public void setUpUser() {
40          Principal mockPrincipal = mock(Principal.class);
41          when(userManager.resolve(TEST_USER.getStringValue())).thenReturn(mockPrincipal);
42      }
43  
44      @Test
45      public void shouldAllowToAddMultipleSettings() {
46          userSettingsService.updateUserSettings(TEST_USER, new Function<UserSettingsBuilder, UserSettings>() {
47              @Override
48              public UserSettings apply(UserSettingsBuilder builder) {
49                  return builder.put("test-boolean1", true)
50                          .put("test-boolean2", false)
51                          .put("test-string1", "string1")
52                          .put("test-string2", "string2")
53                          .put("test-long1", 1L)
54                          .put("test-long2", 2L)
55                          .build();
56              }
57          });
58  
59          UserSettings settings = userSettingsService.getUserSettings(TEST_USER);
60          assertThat(settings.getKeys(), Matchers.<String>iterableWithSize(6));
61          assertBooleanOption(settings, "test-boolean1", true);
62          assertBooleanOption(settings, "test-boolean2", false);
63          assertStringOption(settings, "test-string1", "string1");
64          assertStringOption(settings, "test-string2", "string2");
65          assertLongOption(settings, "test-long1", 1L);
66          assertLongOption(settings, "test-long2", 2L);
67      }
68  
69      @Test
70      public void shouldAllowToRemoveSettings() {
71          userSettingsService.updateUserSettings(TEST_USER, new Function<UserSettingsBuilder, UserSettings>() {
72              @Override
73              public UserSettings apply(UserSettingsBuilder builder) {
74                  return builder.put("test-boolean", true)
75                          .put("test-string", "string")
76                          .put("test-long", 1L)
77                          .build();
78              }
79          });
80  
81          UserSettings settings = userSettingsService.getUserSettings(TEST_USER);
82          assertThat(settings.getKeys(), Matchers.<String>iterableWithSize(3));
83  
84          // now remove all keys
85          userSettingsService.updateUserSettings(TEST_USER, new Function<UserSettingsBuilder, UserSettings>() {
86              @Override
87              public UserSettings apply(UserSettingsBuilder builder) {
88                  for (String key : builder.getKeys()) {
89                      builder.remove(key);
90                  }
91                  return builder.build();
92              }
93          });
94  
95          assertThat(userSettingsService.getUserSettings(TEST_USER).getKeys(), emptyIterable());
96      }
97  
98      @Test
99      public void shouldNotAllowManipulatingSettingsByManipulatingTheOriginalBuilder() {
100         final AtomicReference<UserSettingsBuilder> builderRef = new AtomicReference<UserSettingsBuilder>();
101         userSettingsService.updateUserSettings(TEST_USER, new Function<UserSettingsBuilder, UserSettings>() {
102             @Override
103             public UserSettings apply(UserSettingsBuilder builder) {
104                 builderRef.set(builder);
105                 return builder.put("test-boolean", true).build();
106             }
107         });
108 
109         // add extra key to the builder
110         builderRef.get().put("extra-key", false);
111 
112         // settings should still have 1 key only
113         UserSettings settings = userSettingsService.getUserSettings(TEST_USER);
114         assertThat(settings.getKeys(), Matchers.<String>iterableWithSize(1));
115     }
116 
117     private static void assertBooleanOption(UserSettings settings, String key, boolean value) {
118         assertTrue(settings.getBoolean(key).isDefined());
119         assertEquals(value, settings.getBoolean(key).get());
120     }
121 
122     private static void assertStringOption(UserSettings settings, String key, String value) {
123         assertTrue(settings.getString(key).isDefined());
124         assertEquals(value, settings.getString(key).get());
125     }
126 
127     private static void assertLongOption(UserSettings settings, String key, long value) {
128         assertTrue(settings.getLong(key).isDefined());
129         assertEquals(value, (long) settings.getLong(key).get());
130     }
131 }