parent
39b4484887
commit
d28fa304c8
10 changed files with 525 additions and 557 deletions
|
@ -1,93 +0,0 @@
|
|||
package org.thoughtcrime.securesms.recipients;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.Intent;
|
||||
import android.provider.ContactsContract;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.thoughtcrime.securesms.profiles.ProfileName;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import static android.provider.ContactsContract.Intents.Insert.EMAIL;
|
||||
import static android.provider.ContactsContract.Intents.Insert.NAME;
|
||||
import static android.provider.ContactsContract.Intents.Insert.PHONE;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(manifest = Config.NONE, application = Application.class)
|
||||
public final class RecipientExporterTest {
|
||||
|
||||
@Test
|
||||
public void asAddContactIntent_with_phone_number() {
|
||||
Recipient recipient = givenPhoneRecipient(ProfileName.fromParts("Alice", null), "+1555123456");
|
||||
|
||||
Intent intent = RecipientExporter.export(recipient).asAddContactIntent();
|
||||
|
||||
assertEquals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction());
|
||||
assertEquals(ContactsContract.Contacts.CONTENT_ITEM_TYPE, intent.getType());
|
||||
assertEquals("Alice", intent.getStringExtra(NAME));
|
||||
assertEquals("+1555123456", intent.getStringExtra(PHONE));
|
||||
assertNull(intent.getStringExtra(EMAIL));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void asAddContactIntent_with_phone_number_should_not_show_number() {
|
||||
Recipient recipient = givenPhoneRecipient(ProfileName.fromParts("Alice", null), "+1555123456", false);
|
||||
|
||||
Intent intent = RecipientExporter.export(recipient).asAddContactIntent();
|
||||
|
||||
assertEquals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction());
|
||||
assertEquals(ContactsContract.Contacts.CONTENT_ITEM_TYPE, intent.getType());
|
||||
assertEquals("Alice", intent.getStringExtra(NAME));
|
||||
assertNull(intent.getStringExtra(PHONE));
|
||||
assertNull(intent.getStringExtra(EMAIL));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void asAddContactIntent_with_email() {
|
||||
Recipient recipient = givenEmailRecipient(ProfileName.fromParts("Bob", null), "bob@signal.org");
|
||||
|
||||
Intent intent = RecipientExporter.export(recipient).asAddContactIntent();
|
||||
|
||||
assertEquals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction());
|
||||
assertEquals(ContactsContract.Contacts.CONTENT_ITEM_TYPE, intent.getType());
|
||||
assertEquals("Bob", intent.getStringExtra(NAME));
|
||||
assertEquals("bob@signal.org", intent.getStringExtra(EMAIL));
|
||||
assertNull(intent.getStringExtra(PHONE));
|
||||
}
|
||||
|
||||
|
||||
private Recipient givenPhoneRecipient(ProfileName profileName, String phone) {
|
||||
return givenPhoneRecipient(profileName, phone, true);
|
||||
}
|
||||
|
||||
private Recipient givenPhoneRecipient(ProfileName profileName, String phone, boolean shouldShowPhoneNumber) {
|
||||
Recipient recipient = mock(Recipient.class);
|
||||
when(recipient.getProfileName()).thenReturn(profileName);
|
||||
|
||||
when(recipient.requireE164()).thenReturn(phone);
|
||||
when(recipient.getE164()).thenAnswer(i -> Optional.of(phone));
|
||||
when(recipient.getEmail()).thenAnswer(i -> Optional.empty());
|
||||
when(recipient.getShouldShowE164()).thenAnswer(i -> shouldShowPhoneNumber);
|
||||
|
||||
return recipient;
|
||||
}
|
||||
|
||||
private Recipient givenEmailRecipient(ProfileName profileName, String email) {
|
||||
Recipient recipient = mock(Recipient.class);
|
||||
when(recipient.getProfileName()).thenReturn(profileName);
|
||||
|
||||
when(recipient.requireEmail()).thenReturn(email);
|
||||
when(recipient.getEmail()).thenAnswer(i -> Optional.of(email));
|
||||
when(recipient.getE164()).thenAnswer(i -> Optional.empty());
|
||||
|
||||
return recipient;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
package org.thoughtcrime.securesms.recipients
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Intent
|
||||
import android.provider.ContactsContract
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertNull
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.robolectric.RobolectricTestRunner
|
||||
import org.robolectric.annotation.Config
|
||||
import org.thoughtcrime.securesms.profiles.ProfileName
|
||||
import java.util.Optional
|
||||
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
@Config(manifest = Config.NONE, application = Application::class)
|
||||
class RecipientExporterTest {
|
||||
@Test
|
||||
fun asAddContactIntent_with_phone_number() {
|
||||
val recipient = givenPhoneRecipient(
|
||||
profileName = ProfileName.fromParts("Alice", null),
|
||||
phone = "+1555123456"
|
||||
)
|
||||
|
||||
val intent = RecipientExporter.export(recipient).asAddContactIntent()
|
||||
|
||||
assertEquals(Intent.ACTION_INSERT_OR_EDIT, intent.action)
|
||||
assertEquals(ContactsContract.Contacts.CONTENT_ITEM_TYPE, intent.type)
|
||||
assertEquals("Alice", intent.getStringExtra(ContactsContract.Intents.Insert.NAME))
|
||||
assertEquals("+1555123456", intent.getStringExtra(ContactsContract.Intents.Insert.PHONE))
|
||||
assertNull(intent.getStringExtra(ContactsContract.Intents.Insert.EMAIL))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun asAddContactIntent_with_phone_number_should_not_show_number() {
|
||||
val recipient = givenPhoneRecipient(
|
||||
profileName = ProfileName.fromParts("Alice", null),
|
||||
phone = "+1555123456",
|
||||
shouldShowPhoneNumber = false
|
||||
)
|
||||
|
||||
val intent = RecipientExporter.export(recipient).asAddContactIntent()
|
||||
|
||||
assertEquals(Intent.ACTION_INSERT_OR_EDIT, intent.action)
|
||||
assertEquals(ContactsContract.Contacts.CONTENT_ITEM_TYPE, intent.type)
|
||||
assertEquals("Alice", intent.getStringExtra(ContactsContract.Intents.Insert.NAME))
|
||||
assertNull(intent.getStringExtra(ContactsContract.Intents.Insert.PHONE))
|
||||
assertNull(intent.getStringExtra(ContactsContract.Intents.Insert.EMAIL))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun asAddContactIntent_with_email() {
|
||||
val recipient = givenEmailRecipient(
|
||||
profileName = ProfileName.fromParts("Bob", null),
|
||||
email = "bob@signal.org"
|
||||
)
|
||||
|
||||
val intent = RecipientExporter.export(recipient).asAddContactIntent()
|
||||
|
||||
assertEquals(Intent.ACTION_INSERT_OR_EDIT, intent.action)
|
||||
assertEquals(ContactsContract.Contacts.CONTENT_ITEM_TYPE, intent.type)
|
||||
assertEquals("Bob", intent.getStringExtra(ContactsContract.Intents.Insert.NAME))
|
||||
assertEquals("bob@signal.org", intent.getStringExtra(ContactsContract.Intents.Insert.EMAIL))
|
||||
assertNull(intent.getStringExtra(ContactsContract.Intents.Insert.PHONE))
|
||||
}
|
||||
|
||||
private fun givenPhoneRecipient(profileName: ProfileName, phone: String, shouldShowPhoneNumber: Boolean = true): Recipient {
|
||||
val recipient = mockk<Recipient>()
|
||||
every { recipient.profileName } returns profileName
|
||||
|
||||
every { recipient.requireE164() } returns phone
|
||||
every { recipient.e164 } returns Optional.of(phone)
|
||||
every { recipient.email } returns Optional.empty()
|
||||
every { recipient.shouldShowE164 } returns shouldShowPhoneNumber
|
||||
|
||||
return recipient
|
||||
}
|
||||
|
||||
private fun givenEmailRecipient(profileName: ProfileName, email: String): Recipient {
|
||||
val recipient = mockk<Recipient>()
|
||||
every { recipient.profileName } returns profileName
|
||||
|
||||
every { recipient.requireEmail() } returns email
|
||||
every { recipient.email } returns Optional.of(email)
|
||||
every { recipient.e164 } returns Optional.empty()
|
||||
|
||||
return recipient
|
||||
}
|
||||
}
|
|
@ -1,234 +0,0 @@
|
|||
package org.thoughtcrime.securesms.recipients;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockedStatic;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
import org.thoughtcrime.securesms.database.MessageTable;
|
||||
import org.thoughtcrime.securesms.database.RecipientTable;
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase;
|
||||
import org.thoughtcrime.securesms.database.ThreadTable;
|
||||
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.ArgumentMatchers.anyLong;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
public class RecipientUtilTest {
|
||||
|
||||
@Rule
|
||||
public MockitoRule rule = MockitoJUnit.rule();
|
||||
|
||||
private Context context = mock(Context.class);
|
||||
private Recipient recipient = mock(Recipient.class);
|
||||
private ThreadTable mockThreadTable = mock(ThreadTable.class);
|
||||
private MessageTable mockMessageTable = mock(MessageTable.class);
|
||||
private RecipientTable mockRecipientTable = mock(RecipientTable.class);
|
||||
|
||||
@Mock
|
||||
private MockedStatic<SignalDatabase> signalDatabaseMockedStatic;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
signalDatabaseMockedStatic.when(SignalDatabase::threads).thenReturn(mockThreadTable);
|
||||
signalDatabaseMockedStatic.when(SignalDatabase::messages).thenReturn(mockMessageTable);
|
||||
signalDatabaseMockedStatic.when(SignalDatabase::recipients).thenReturn(mockRecipientTable);
|
||||
|
||||
when(recipient.getId()).thenReturn(RecipientId.from(5));
|
||||
when(recipient.resolve()).thenReturn(recipient);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenThreadIsNegativeOne_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, -1L);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenRecipientIsNullForThreadId_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, 1L);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenIHaveSentASecureMessageInThisThread_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
when(mockThreadTable.getRecipientForThreadId(anyLong())).thenReturn(recipient);
|
||||
when(mockMessageTable.getOutgoingSecureMessageCount(1L)).thenReturn(5);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, 1L);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenIHaveNotSentASecureMessageInThisThreadAndIAmProfileSharing_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
when(recipient.isProfileSharing()).thenReturn(true);
|
||||
when(mockThreadTable.getRecipientForThreadId(anyLong())).thenReturn(recipient);
|
||||
when(mockMessageTable.getOutgoingSecureMessageCount(1L)).thenReturn(0);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, 1L);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenIHaveNotSentASecureMessageInThisThreadAndRecipientIsSystemContact_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
when(recipient.isSystemContact()).thenReturn(true);
|
||||
when(mockThreadTable.getRecipientForThreadId(anyLong())).thenReturn(recipient);
|
||||
when(mockMessageTable.getOutgoingSecureMessageCount(1L)).thenReturn(0);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, 1L);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void givenIHaveReceivedASecureMessageIHaveNotSentASecureMessageAndRecipientIsNotSystemContactAndNotProfileSharing_whenIsThreadMessageRequestAccepted_thenIExpectFalse() {
|
||||
// GIVEN
|
||||
when(mockThreadTable.getRecipientForThreadId(anyLong())).thenReturn(recipient);
|
||||
when(mockMessageTable.getOutgoingSecureMessageCount(1L)).thenReturn(0);
|
||||
when(mockMessageTable.getSecureMessageCount(1L)).thenReturn(5);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, 1L);
|
||||
|
||||
// THEN
|
||||
assertFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenIHaveNotReceivedASecureMessageIHaveNotSentASecureMessageAndRecipientIsNotSystemContactAndNotProfileSharing_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
when(mockThreadTable.getRecipientForThreadId(anyLong())).thenReturn(recipient);
|
||||
when(mockMessageTable.getOutgoingSecureMessageCount(1L)).thenReturn(0);
|
||||
when(mockMessageTable.getSecureMessageCount(1L)).thenReturn(0);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, 1L);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenRecipientIsNull_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, null);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNonZeroOutgoingSecureMessageCount_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
when(mockMessageTable.getOutgoingSecureMessageCount(anyLong())).thenReturn(1);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, recipient);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenIAmProfileSharing_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
when(recipient.isProfileSharing()).thenReturn(true);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, recipient);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenRecipientIsASystemContact_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
when(recipient.isSystemContact()).thenReturn(true);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, recipient);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void givenNoSecureMessagesSentSomeSecureMessagesReceivedNotSharingAndNotSystemContact_whenIsRecipientMessageRequestAccepted_thenIExpectFalse() {
|
||||
// GIVEN
|
||||
when(recipient.isRegistered()).thenReturn(true);
|
||||
when(mockMessageTable.getSecureMessageCount(anyLong())).thenReturn(5);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, recipient);
|
||||
|
||||
// THEN
|
||||
assertFalse(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNoSecureMessagesSentNoSecureMessagesReceivedNotSharingAndNotSystemContact_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
when(mockMessageTable.getSecureMessageCount(anyLong())).thenReturn(0);
|
||||
|
||||
// WHEN
|
||||
boolean result = RecipientUtil.isMessageRequestAccepted(context, recipient);
|
||||
|
||||
// THEN
|
||||
assertTrue(result);
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void givenNoSecureMessagesSent_whenIShareProfileIfFirstSecureMessage_thenIShareProfile() {
|
||||
// GIVEN
|
||||
when(mockMessageTable.getOutgoingSecureMessageCount(anyLong())).thenReturn(0);
|
||||
|
||||
// WHEN
|
||||
RecipientUtil.shareProfileIfFirstSecureMessage(recipient);
|
||||
|
||||
// THEN
|
||||
verify(mockRecipientTable).setProfileSharing(recipient.getId(), true);
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void givenSecureMessagesSent_whenIShareProfileIfFirstSecureMessage_thenIShareProfile() {
|
||||
// GIVEN
|
||||
when(mockMessageTable.getOutgoingSecureMessageCount(anyLong())).thenReturn(5);
|
||||
|
||||
// WHEN
|
||||
RecipientUtil.shareProfileIfFirstSecureMessage(recipient);
|
||||
|
||||
// THEN
|
||||
verify(mockRecipientTable, never()).setProfileSharing(recipient.getId(), true);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,229 @@
|
|||
package org.thoughtcrime.securesms.recipients
|
||||
|
||||
import android.content.Context
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import io.mockk.mockkObject
|
||||
import io.mockk.unmockkObject
|
||||
import io.mockk.verify
|
||||
import org.junit.After
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Before
|
||||
import org.junit.Ignore
|
||||
import org.junit.Test
|
||||
import org.thoughtcrime.securesms.database.MessageTable
|
||||
import org.thoughtcrime.securesms.database.RecipientTable
|
||||
import org.thoughtcrime.securesms.database.SignalDatabase
|
||||
import org.thoughtcrime.securesms.database.ThreadTable
|
||||
|
||||
class RecipientUtilTest {
|
||||
private val context = mockk<Context>()
|
||||
private val recipient = mockk<Recipient>(relaxed = true)
|
||||
private val mockThreadTable = mockk<ThreadTable>(relaxed = true)
|
||||
private val mockMessageTable = mockk<MessageTable>()
|
||||
private val mockRecipientTable = mockk<RecipientTable>()
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
mockkObject(SignalDatabase.Companion)
|
||||
every { SignalDatabase.Companion.instance } returns mockk {
|
||||
every { threadTable } returns mockThreadTable
|
||||
every { messageTable } returns mockMessageTable
|
||||
every { recipientTable } returns mockRecipientTable
|
||||
}
|
||||
|
||||
every { recipient.id } returns RecipientId.from(5)
|
||||
every { recipient.resolve() } returns recipient
|
||||
}
|
||||
|
||||
@After
|
||||
fun cleanup() {
|
||||
unmockkObject(SignalDatabase.Companion)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenThreadIsNegativeOne_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, -1L)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenRecipientIsNullForThreadId_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, 1L)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenIHaveSentASecureMessageInThisThread_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
every { mockThreadTable.getRecipientForThreadId(any()) } returns recipient
|
||||
every { mockMessageTable.getOutgoingSecureMessageCount(1L) } returns 5
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, 1L)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenIHaveNotSentASecureMessageInThisThreadAndIAmProfileSharing_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
every { recipient.isProfileSharing } returns true
|
||||
every { mockThreadTable.getRecipientForThreadId(any()) } returns recipient
|
||||
every { mockMessageTable.getOutgoingSecureMessageCount(1L) } returns 0
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, 1L)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenIHaveNotSentASecureMessageInThisThreadAndRecipientIsSystemContact_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
every { recipient.isSystemContact } returns true
|
||||
every { mockThreadTable.getRecipientForThreadId(any()) } returns recipient
|
||||
every { mockMessageTable.getOutgoingSecureMessageCount(1L) } returns 0
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, 1L)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
fun givenIHaveReceivedASecureMessageIHaveNotSentASecureMessageAndRecipientIsNotSystemContactAndNotProfileSharing_whenIsThreadMessageRequestAccepted_thenIExpectFalse() {
|
||||
// GIVEN
|
||||
every { mockThreadTable.getRecipientForThreadId(any()) } returns recipient
|
||||
every { mockMessageTable.getOutgoingSecureMessageCount(1L) } returns 0
|
||||
every { mockMessageTable.getSecureMessageCount(1L) } returns 5
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, 1L)
|
||||
|
||||
// THEN
|
||||
assertFalse(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenIHaveNotReceivedASecureMessageIHaveNotSentASecureMessageAndRecipientIsNotSystemContactAndNotProfileSharing_whenIsThreadMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
every { mockThreadTable.getRecipientForThreadId(any()) } returns recipient
|
||||
every { mockMessageTable.getOutgoingSecureMessageCount(1L) } returns 0
|
||||
every { mockMessageTable.getSecureMessageCount(1L) } returns 0
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, 1L)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenRecipientIsNull_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, null)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenNonZeroOutgoingSecureMessageCount_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
every { mockMessageTable.getOutgoingSecureMessageCount(any()) } returns 1
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, recipient)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenIAmProfileSharing_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
every { recipient.isProfileSharing } returns true
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, recipient)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenRecipientIsASystemContact_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
every { recipient.isSystemContact } returns true
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, recipient)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
fun givenNoSecureMessagesSentSomeSecureMessagesReceivedNotSharingAndNotSystemContact_whenIsRecipientMessageRequestAccepted_thenIExpectFalse() {
|
||||
// GIVEN
|
||||
every { recipient.isRegistered } returns true
|
||||
every { mockMessageTable.getSecureMessageCount(any()) } returns 5
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, recipient)
|
||||
|
||||
// THEN
|
||||
assertFalse(result)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenNoSecureMessagesSentNoSecureMessagesReceivedNotSharingAndNotSystemContact_whenIsRecipientMessageRequestAccepted_thenIExpectTrue() {
|
||||
// GIVEN
|
||||
every { mockMessageTable.getSecureMessageCount(any()) } returns 0
|
||||
|
||||
// WHEN
|
||||
val result = RecipientUtil.isMessageRequestAccepted(context, recipient)
|
||||
|
||||
// THEN
|
||||
assertTrue(result)
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
fun givenNoSecureMessagesSent_whenIShareProfileIfFirstSecureMessage_thenIShareProfile() {
|
||||
// GIVEN
|
||||
every { mockMessageTable.getOutgoingSecureMessageCount(any()) } returns 0
|
||||
|
||||
// WHEN
|
||||
RecipientUtil.shareProfileIfFirstSecureMessage(recipient)
|
||||
|
||||
// THEN
|
||||
verify { mockRecipientTable.setProfileSharing(recipient.id, true) }
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
fun givenSecureMessagesSent_whenIShareProfileIfFirstSecureMessage_thenIShareProfile() {
|
||||
// GIVEN
|
||||
every { mockMessageTable.getOutgoingSecureMessageCount(any()) } returns 5
|
||||
|
||||
// WHEN
|
||||
RecipientUtil.shareProfileIfFirstSecureMessage(recipient)
|
||||
|
||||
// THEN
|
||||
verify(exactly = 0) { mockRecipientTable.setProfileSharing(recipient.id, true) }
|
||||
}
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
package org.thoughtcrime.securesms.util;
|
||||
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockedStatic;
|
||||
import org.mockito.junit.MockitoJUnit;
|
||||
import org.mockito.junit.MockitoRule;
|
||||
import org.mockito.stubbing.Answer;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
|
||||
public class DelimiterUtilTest {
|
||||
|
||||
@Rule
|
||||
public MockitoRule rule = MockitoJUnit.rule();
|
||||
|
||||
@Mock
|
||||
private MockedStatic<TextUtils> textUtilsMockedStatic;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
textUtilsMockedStatic.when(() -> TextUtils.isEmpty(anyString())).thenAnswer((Answer<Boolean>) invocation -> {
|
||||
if (invocation.getArguments()[0] == null) return true;
|
||||
return ((String) invocation.getArguments()[0]).isEmpty();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEscape() {
|
||||
assertEquals(DelimiterUtil.escape("MTV Music", ' '), "MTV\\ Music");
|
||||
assertEquals(DelimiterUtil.escape("MTV Music", ' '), "MTV\\ \\ Music");
|
||||
|
||||
assertEquals(DelimiterUtil.escape("MTV,Music", ','), "MTV\\,Music");
|
||||
assertEquals(DelimiterUtil.escape("MTV,,Music", ','), "MTV\\,\\,Music");
|
||||
|
||||
assertEquals(DelimiterUtil.escape("MTV Music", '+'), "MTV Music");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSplit() {
|
||||
String[] parts = DelimiterUtil.split("MTV\\ Music", ' ');
|
||||
assertEquals(parts.length, 1);
|
||||
assertEquals(parts[0], "MTV\\ Music");
|
||||
|
||||
parts = DelimiterUtil.split("MTV Music", ' ');
|
||||
assertEquals(parts.length, 2);
|
||||
assertEquals(parts[0], "MTV");
|
||||
assertEquals(parts[1], "Music");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEscapeSplit() {
|
||||
String input = "MTV Music";
|
||||
String intermediate = DelimiterUtil.escape(input, ' ');
|
||||
String[] parts = DelimiterUtil.split(intermediate, ' ');
|
||||
|
||||
assertEquals(parts.length, 1);
|
||||
assertEquals(parts[0], "MTV\\ Music");
|
||||
assertEquals(DelimiterUtil.unescape(parts[0], ' '), "MTV Music");
|
||||
|
||||
input = "MTV\\ Music";
|
||||
intermediate = DelimiterUtil.escape(input, ' ');
|
||||
parts = DelimiterUtil.split(intermediate, ' ');
|
||||
|
||||
assertEquals(parts.length, 1);
|
||||
assertEquals(parts[0], "MTV\\\\ Music");
|
||||
assertEquals(DelimiterUtil.unescape(parts[0], ' '), "MTV\\ Music");
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
package org.thoughtcrime.securesms.util
|
||||
|
||||
import android.text.TextUtils
|
||||
import io.mockk.every
|
||||
import io.mockk.mockkStatic
|
||||
import io.mockk.unmockkStatic
|
||||
import org.junit.After
|
||||
import org.junit.Assert.assertArrayEquals
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
|
||||
class DelimiterUtilTest {
|
||||
@Before
|
||||
fun setup() {
|
||||
mockkStatic(TextUtils::class)
|
||||
every { TextUtils.isEmpty(any()) } answers {
|
||||
(invocation.args.first() as? String)?.isEmpty() ?: true
|
||||
}
|
||||
}
|
||||
|
||||
@After
|
||||
fun cleanup() {
|
||||
unmockkStatic(TextUtils::class)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testEscape() {
|
||||
assertEquals("MTV\\ Music", DelimiterUtil.escape("MTV Music", ' '))
|
||||
assertEquals("MTV\\ \\ Music", DelimiterUtil.escape("MTV Music", ' '))
|
||||
|
||||
assertEquals("MTV\\,Music", DelimiterUtil.escape("MTV,Music", ','))
|
||||
assertEquals("MTV\\,\\,Music", DelimiterUtil.escape("MTV,,Music", ','))
|
||||
|
||||
assertEquals("MTV Music", DelimiterUtil.escape("MTV Music", '+'))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testSplit() {
|
||||
assertArrayEquals(
|
||||
arrayOf("MTV\\ Music"),
|
||||
DelimiterUtil.split("MTV\\ Music", ' ')
|
||||
)
|
||||
assertArrayEquals(
|
||||
arrayOf("MTV", "Music"),
|
||||
DelimiterUtil.split("MTV Music", ' ')
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testEscapeSplit() {
|
||||
"MTV Music".let { input ->
|
||||
val intermediate = DelimiterUtil.escape(input, ' ')
|
||||
val parts = DelimiterUtil.split(intermediate, ' ')
|
||||
assertEquals("MTV\\ Music", parts.single())
|
||||
assertEquals("MTV Music", DelimiterUtil.unescape(parts.single(), ' '))
|
||||
}
|
||||
|
||||
"MTV\\ Music".let { input ->
|
||||
val intermediate = DelimiterUtil.escape(input, ' ')
|
||||
val parts = DelimiterUtil.split(intermediate, ' ')
|
||||
assertEquals("MTV\\\\ Music", parts.single())
|
||||
assertEquals("MTV\\ Music", DelimiterUtil.unescape(parts.single(), ' '))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,94 +0,0 @@
|
|||
package org.signal.core.util.concurrent;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
public final class LatestPrioritizedSerialExecutorTest {
|
||||
|
||||
@Test
|
||||
public void execute_sortsInPriorityOrder() {
|
||||
TestExecutor executor = new TestExecutor();
|
||||
Runnable placeholder = new TestRunnable();
|
||||
|
||||
Runnable first = spy(new TestRunnable());
|
||||
Runnable second = spy(new TestRunnable());
|
||||
Runnable third = spy(new TestRunnable());
|
||||
|
||||
LatestPrioritizedSerialExecutor subject = new LatestPrioritizedSerialExecutor(executor);
|
||||
subject.execute(0, placeholder); // The first thing we execute can't be sorted, so we put in this placeholder
|
||||
subject.execute(1, third);
|
||||
subject.execute(2, second);
|
||||
subject.execute(3, first);
|
||||
|
||||
executor.next(); // Clear the placeholder task
|
||||
|
||||
executor.next();
|
||||
verify(first).run();
|
||||
|
||||
executor.next();
|
||||
verify(second).run();
|
||||
|
||||
executor.next();
|
||||
verify(third).run();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void execute_replacesDupes() {
|
||||
TestExecutor executor = new TestExecutor();
|
||||
Runnable placeholder = new TestRunnable();
|
||||
|
||||
Runnable firstReplaced = spy(new TestRunnable());
|
||||
Runnable first = spy(new TestRunnable());
|
||||
Runnable second = spy(new TestRunnable());
|
||||
Runnable thirdReplaced = spy(new TestRunnable());
|
||||
Runnable third = spy(new TestRunnable());
|
||||
|
||||
LatestPrioritizedSerialExecutor subject = new LatestPrioritizedSerialExecutor(executor);
|
||||
subject.execute(0, placeholder); // The first thing we execute can't be sorted, so we put in this placeholder
|
||||
subject.execute(1, thirdReplaced);
|
||||
subject.execute(1, third);
|
||||
subject.execute(2, second);
|
||||
subject.execute(3, firstReplaced);
|
||||
subject.execute(3, first);
|
||||
|
||||
executor.next(); // Clear the placeholder task
|
||||
|
||||
executor.next();
|
||||
verify(first).run();
|
||||
|
||||
executor.next();
|
||||
verify(second).run();
|
||||
|
||||
executor.next();
|
||||
verify(third).run();
|
||||
|
||||
verify(firstReplaced, never()).run();
|
||||
verify(thirdReplaced, never()).run();
|
||||
}
|
||||
|
||||
private static final class TestExecutor implements Executor {
|
||||
|
||||
private final Queue<Runnable> tasks = new LinkedList<>();
|
||||
|
||||
@Override
|
||||
public void execute(Runnable command) {
|
||||
tasks.add(command);
|
||||
}
|
||||
|
||||
public void next() {
|
||||
tasks.remove().run();
|
||||
}
|
||||
}
|
||||
|
||||
public static class TestRunnable implements Runnable {
|
||||
@Override
|
||||
public void run() { }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,90 @@
|
|||
package org.signal.core.util.concurrent
|
||||
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
import java.util.concurrent.Executor
|
||||
|
||||
class LatestPrioritizedSerialExecutorTest {
|
||||
@Test
|
||||
fun execute_sortsInPriorityOrder() {
|
||||
val executor = TestExecutor()
|
||||
val placeholder = TestRunnable()
|
||||
|
||||
val first = TestRunnable()
|
||||
val second = TestRunnable()
|
||||
val third = TestRunnable()
|
||||
|
||||
val subject = LatestPrioritizedSerialExecutor(executor)
|
||||
subject.execute(0, placeholder) // The first thing we execute can't be sorted, so we put in this placeholder
|
||||
subject.execute(1, third)
|
||||
subject.execute(2, second)
|
||||
subject.execute(3, first)
|
||||
|
||||
executor.next() // Clear the placeholder task
|
||||
|
||||
executor.next()
|
||||
assertTrue(first.didRun)
|
||||
|
||||
executor.next()
|
||||
assertTrue(second.didRun)
|
||||
|
||||
executor.next()
|
||||
assertTrue(third.didRun)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun execute_replacesDupes() {
|
||||
val executor = TestExecutor()
|
||||
val placeholder = TestRunnable()
|
||||
|
||||
val firstReplaced = TestRunnable()
|
||||
val first = TestRunnable()
|
||||
val second = TestRunnable()
|
||||
val thirdReplaced = TestRunnable()
|
||||
val third = TestRunnable()
|
||||
|
||||
val subject = LatestPrioritizedSerialExecutor(executor)
|
||||
subject.execute(0, placeholder) // The first thing we execute can't be sorted, so we put in this placeholder
|
||||
subject.execute(1, thirdReplaced)
|
||||
subject.execute(1, third)
|
||||
subject.execute(2, second)
|
||||
subject.execute(3, firstReplaced)
|
||||
subject.execute(3, first)
|
||||
|
||||
executor.next() // Clear the placeholder task
|
||||
|
||||
executor.next()
|
||||
assertTrue(first.didRun)
|
||||
|
||||
executor.next()
|
||||
assertTrue(second.didRun)
|
||||
|
||||
executor.next()
|
||||
assertTrue(third.didRun)
|
||||
|
||||
assertFalse(firstReplaced.didRun)
|
||||
assertFalse(thirdReplaced.didRun)
|
||||
}
|
||||
|
||||
private class TestExecutor : Executor {
|
||||
private val tasks = ArrayDeque<Runnable>()
|
||||
|
||||
override fun execute(command: Runnable) {
|
||||
tasks.add(command)
|
||||
}
|
||||
|
||||
fun next() {
|
||||
tasks.removeLast().run()
|
||||
}
|
||||
}
|
||||
|
||||
class TestRunnable : Runnable {
|
||||
private var _didRun = false
|
||||
val didRun get() = _didRun
|
||||
|
||||
override fun run() {
|
||||
_didRun = true
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,60 +0,0 @@
|
|||
package org.whispersystems.signalservice.api.services;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.JUnit4;
|
||||
import org.mockito.Mockito;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
|
||||
import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription;
|
||||
import org.whispersystems.signalservice.api.subscriptions.SubscriberId;
|
||||
import org.whispersystems.signalservice.internal.ServiceResponse;
|
||||
import org.whispersystems.signalservice.internal.push.PushServiceSocket;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(JUnit4.class)
|
||||
public class DonationsServiceTest {
|
||||
|
||||
private final PushServiceSocket pushServiceSocket = Mockito.mock(PushServiceSocket.class);
|
||||
private final DonationsService testSubject = new DonationsService(pushServiceSocket);
|
||||
|
||||
@Test
|
||||
public void givenASubscriberId_whenIGetASuccessfulResponse_thenItIsMappedWithTheCorrectStatusCodeAndNonEmptyObject() throws Exception {
|
||||
// GIVEN
|
||||
SubscriberId subscriberId = SubscriberId.generate();
|
||||
when(pushServiceSocket.getSubscription(subscriberId.serialize()))
|
||||
.thenReturn(getActiveSubscription());
|
||||
|
||||
// WHEN
|
||||
ServiceResponse<ActiveSubscription> response = testSubject.getSubscription(subscriberId);
|
||||
|
||||
// THEN
|
||||
verify(pushServiceSocket).getSubscription(subscriberId.serialize());
|
||||
assertEquals(200, response.getStatus());
|
||||
assertTrue(response.getResult().isPresent());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenASubscriberId_whenIGetAnUnsuccessfulResponse_thenItIsMappedWithTheCorrectStatusCodeAndEmptyObject() throws Exception {
|
||||
// GIVEN
|
||||
SubscriberId subscriberId = SubscriberId.generate();
|
||||
when(pushServiceSocket.getSubscription(subscriberId.serialize()))
|
||||
.thenThrow(new NonSuccessfulResponseCodeException(403));
|
||||
|
||||
// WHEN
|
||||
ServiceResponse<ActiveSubscription> response = testSubject.getSubscription(subscriberId);
|
||||
|
||||
// THEN
|
||||
verify(pushServiceSocket).getSubscription(subscriberId.serialize());
|
||||
assertEquals(403, response.getStatus());
|
||||
assertFalse(response.getResult().isPresent());
|
||||
}
|
||||
|
||||
private ActiveSubscription getActiveSubscription() {
|
||||
return ActiveSubscription.EMPTY;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
package org.whispersystems.signalservice.api.services
|
||||
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
import io.mockk.verify
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException
|
||||
import org.whispersystems.signalservice.api.subscriptions.ActiveSubscription
|
||||
import org.whispersystems.signalservice.api.subscriptions.SubscriberId
|
||||
import org.whispersystems.signalservice.internal.push.PushServiceSocket
|
||||
|
||||
class DonationsServiceTest {
|
||||
private val pushServiceSocket: PushServiceSocket = mockk<PushServiceSocket>()
|
||||
private val testSubject = DonationsService(pushServiceSocket)
|
||||
private val activeSubscription = ActiveSubscription.EMPTY
|
||||
|
||||
@Test
|
||||
fun givenASubscriberId_whenIGetASuccessfulResponse_thenItIsMappedWithTheCorrectStatusCodeAndNonEmptyObject() {
|
||||
// GIVEN
|
||||
val subscriberId = SubscriberId.generate()
|
||||
every { pushServiceSocket.getSubscription(subscriberId.serialize()) } returns activeSubscription
|
||||
|
||||
// WHEN
|
||||
val response = testSubject.getSubscription(subscriberId)
|
||||
|
||||
// THEN
|
||||
verify { pushServiceSocket.getSubscription(subscriberId.serialize()) }
|
||||
assertEquals(200, response.status)
|
||||
assertTrue(response.result.isPresent)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun givenASubscriberId_whenIGetAnUnsuccessfulResponse_thenItIsMappedWithTheCorrectStatusCodeAndEmptyObject() {
|
||||
// GIVEN
|
||||
val subscriberId = SubscriberId.generate()
|
||||
every { pushServiceSocket.getSubscription(subscriberId.serialize()) } throws NonSuccessfulResponseCodeException(403)
|
||||
|
||||
// WHEN
|
||||
val response = testSubject.getSubscription(subscriberId)
|
||||
|
||||
// THEN
|
||||
verify { pushServiceSocket.getSubscription(subscriberId.serialize()) }
|
||||
assertEquals(403, response.status)
|
||||
assertFalse(response.result.isPresent)
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue