1package eu.siacs.conversations.entities;
2
3import static org.mockito.Mockito.mock;
4import static org.mockito.Mockito.when;
5
6import java.util.concurrent.atomic.AtomicReference;
7
8import org.junit.Before;
9import org.junit.BeforeClass;
10import org.junit.Test;
11import org.junit.runner.RunWith;
12import org.robolectric.RobolectricTestRunner;
13import org.robolectric.annotation.Config;
14import org.robolectric.annotation.ConscryptMode;
15
16import android.os.Build;
17import eu.siacs.conversations.Conversations;
18import eu.siacs.conversations.xml.Namespace;
19import eu.siacs.conversations.xmpp.Jid;
20import im.conversations.android.xmpp.model.disco.info.Feature;
21import im.conversations.android.xmpp.model.disco.info.InfoQuery;
22import junit.framework.Assert;
23
24@RunWith(RobolectricTestRunner.class)
25@Config(sdk = Build.VERSION_CODES.TIRAMISU, application = Conversations.class)
26@ConscryptMode(ConscryptMode.Mode.OFF)
27public class ConversationTest {
28 private static final InfoQuery INFO_QUERY_WITH_OCCUPANT_ID = new InfoQuery();
29 private static final InfoQuery INFO_QUERY_WITHOUT_OCCUPANT_ID = new InfoQuery();
30
31 private Conversation withOccupantId;
32 private Conversation withoutOccupantId;
33 private Conversation nullMucOptions;
34
35 @BeforeClass
36 public static void setupClass() {
37 final var occupantIdFeature = new Feature();
38 occupantIdFeature.setVar(Namespace.OCCUPANT_ID);
39 INFO_QUERY_WITH_OCCUPANT_ID.addChild(occupantIdFeature);
40 }
41
42 @Before
43 public void setUp() throws Exception {
44 final var account = mock(Account.class);
45 when(account.getJid()).thenReturn(Jid.ofLocalAndDomain("testAccount", "example.org"));
46
47 withOccupantId = new Conversation(
48 "Test MUC",
49 account,
50 Jid.ofLocalAndDomain("testMuc", "example.org"),
51 Conversation.MODE_MULTI
52 );
53 withOccupantId.getMucOptions().updateConfiguration(INFO_QUERY_WITH_OCCUPANT_ID);
54
55 withoutOccupantId = new Conversation(
56 "Test MUC",
57 account,
58 Jid.ofLocalAndDomain("testMuc", "example.org"),
59 Conversation.MODE_MULTI
60 );
61 withoutOccupantId.getMucOptions().updateConfiguration(INFO_QUERY_WITHOUT_OCCUPANT_ID);
62
63 nullMucOptions = new Conversation(
64 "Test MUC",
65 account,
66 Jid.ofLocalAndDomain("testMuc", "example.org"),
67 Conversation.MODE_MULTI
68 );
69 final var mucOptionsField = Conversation.class.getDeclaredField("mucOptions");
70 mucOptionsField.setAccessible(true);
71 ((AtomicReference<?>) mucOptionsField.get(nullMucOptions)).set(null);
72 }
73
74 @Test
75 public void getMucOccupantsCacheReturnsCacheWhenMucOptionsIsNull() throws Exception {
76 var cache = nullMucOptions.getMucOccupantCache();
77 Assert.assertNotNull("Should return cache when mucOptions is null", cache);
78 }
79
80 @Test
81 public void getMucOccupantsCacheReturnsCacheWhenFeatureSupported() throws Exception {
82 var cache = withOccupantId.getMucOccupantCache();
83 Assert.assertNotNull("Should return cache when occupant-id is supported", cache);
84 }
85
86 @Test
87 public void getMucOccupantsCacheReturnsCacheWhenFeatureNotSupported() throws Exception {
88 var cache = withoutOccupantId.getMucOccupantCache();
89 Assert.assertNotNull("Should return cache even when occupant-id is not supported", cache);
90 }
91}