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
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
110 builderRef.get().put("extra-key", false);
111
112
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 }