ConversationTest.java

 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}