Write unit tests for poll response event aggregation.

This commit is contained in:
Onuray Sahin 2022-05-17 14:13:38 +03:00
parent 4065bce47a
commit 00e800459d
1 changed files with 126 additions and 5 deletions

View File

@ -17,20 +17,31 @@
package org.matrix.android.sdk.internal.session.room.aggregation.poll package org.matrix.android.sdk.internal.session.room.aggregation.poll
import io.mockk.every import io.mockk.every
import io.mockk.mockk
import io.realm.RealmList
import io.realm.RealmModel import io.realm.RealmModel
import io.realm.RealmQuery import io.realm.RealmQuery
import org.amshove.kluent.shouldBeFalse import org.amshove.kluent.shouldBeFalse
import org.amshove.kluent.shouldBeTrue import org.amshove.kluent.shouldBeTrue
import org.junit.Before
import org.junit.Test import org.junit.Test
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.RelationType import org.matrix.android.sdk.api.session.events.model.RelationType
import org.matrix.android.sdk.api.session.events.model.toContent import org.matrix.android.sdk.api.session.events.model.toContent
import org.matrix.android.sdk.api.session.getRoom
import org.matrix.android.sdk.api.session.room.Room
import org.matrix.android.sdk.api.session.room.getTimelineEvent
import org.matrix.android.sdk.api.session.room.model.message.MessagePollContent import org.matrix.android.sdk.api.session.room.model.message.MessagePollContent
import org.matrix.android.sdk.api.session.room.model.message.MessagePollResponseContent
import org.matrix.android.sdk.api.session.room.model.message.PollAnswer import org.matrix.android.sdk.api.session.room.model.message.PollAnswer
import org.matrix.android.sdk.api.session.room.model.message.PollCreationInfo import org.matrix.android.sdk.api.session.room.model.message.PollCreationInfo
import org.matrix.android.sdk.api.session.room.model.message.PollQuestion import org.matrix.android.sdk.api.session.room.model.message.PollQuestion
import org.matrix.android.sdk.api.session.room.model.message.PollResponse
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
import org.matrix.android.sdk.api.session.room.sender.SenderInfo
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntity import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntity
import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntityFields import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntityFields
import org.matrix.android.sdk.internal.database.model.PollResponseAggregatedSummaryEntity import org.matrix.android.sdk.internal.database.model.PollResponseAggregatedSummaryEntity
@ -64,6 +75,26 @@ private val A_POLL_CONTENT = MessagePollContent(
) )
) )
private val A_POLL_RESPONSE_CONTENT = MessagePollResponseContent(
unstableResponse = PollResponse(
answers = listOf("5ef5f7b0-c9a1-49cf-a0b3-374729a43e76")
),
relatesTo = RelationDefaultContent(
type = RelationType.REFERENCE,
eventId = AN_EVENT_ID
)
)
private val AN_INVALID_POLL_RESPONSE_CONTENT = MessagePollResponseContent(
unstableResponse = PollResponse(
answers = listOf("fake-option-id")
),
relatesTo = RelationDefaultContent(
type = RelationType.REFERENCE,
eventId = AN_EVENT_ID
)
)
private val A_POLL_START_EVENT = Event( private val A_POLL_START_EVENT = Event(
type = EventType.POLL_START.first(), type = EventType.POLL_START.first(),
eventId = AN_EVENT_ID, eventId = AN_EVENT_ID,
@ -73,6 +104,45 @@ private val A_POLL_START_EVENT = Event(
content = A_POLL_CONTENT.toContent() content = A_POLL_CONTENT.toContent()
) )
private val A_POLL_RESPONSE_EVENT = Event(
type = EventType.POLL_RESPONSE.first(),
eventId = AN_EVENT_ID,
originServerTs = 1652435922563,
senderId = A_USER_ID_1,
roomId = A_ROOM_ID,
content = A_POLL_RESPONSE_CONTENT.toContent()
)
private val A_TIMELINE_EVENT = TimelineEvent(
root = A_POLL_START_EVENT,
localId = 1234,
eventId = AN_EVENT_ID,
displayIndex = 0,
senderInfo = SenderInfo(A_USER_ID_1, "A_USER_ID_1", true, null)
)
private val A_POLL_RESPONSE_EVENT_WITHOUT_REFERENCE = A_POLL_RESPONSE_EVENT.copy(
content = A_POLL_RESPONSE_CONTENT
.copy(
relatesTo = RelationDefaultContent(
type = RelationType.REFERENCE,
eventId = null
)
)
.toContent()
)
private val A_POLL_RESPONSE_EVENT_WITH_A_WRONG_REFERENCE = A_POLL_RESPONSE_EVENT.copy(
content = A_POLL_RESPONSE_CONTENT
.copy(
relatesTo = RelationDefaultContent(
type = RelationType.REPLACE,
eventId = null
)
)
.toContent()
)
private val A_POLL_REPLACE_EVENT = A_POLL_START_EVENT.copy( private val A_POLL_REPLACE_EVENT = A_POLL_START_EVENT.copy(
content = A_POLL_CONTENT content = A_POLL_CONTENT
.copy( .copy(
@ -106,6 +176,10 @@ private val A_POLL_REFERENCE_EVENT = A_POLL_START_EVENT.copy(
.toContent() .toContent()
) )
private val AN_INVALID_POLL_RESPONSE_EVENT = A_POLL_RESPONSE_EVENT.copy(
content = AN_INVALID_POLL_RESPONSE_CONTENT.toContent()
)
private val AN_EVENT_ANNOTATIONS_SUMMARY_ENTITY = EventAnnotationsSummaryEntity( private val AN_EVENT_ANNOTATIONS_SUMMARY_ENTITY = EventAnnotationsSummaryEntity(
roomId = A_ROOM_ID, roomId = A_ROOM_ID,
eventId = AN_EVENT_ID, eventId = AN_EVENT_ID,
@ -116,6 +190,13 @@ class PollAggregationProcessorTest {
private val pollAggregationProcessor: PollAggregationProcessor = DefaultPollAggregationProcessor() private val pollAggregationProcessor: PollAggregationProcessor = DefaultPollAggregationProcessor()
private val realm = FakeRealm() private val realm = FakeRealm()
private val session = mockk<Session>()
@Before
fun setup() {
mockEventAnnotationsSummaryEntity()
mockRoom(A_ROOM_ID, AN_EVENT_ID)
}
@Test @Test
fun `given a poll start event which is not a replace is not processed by poll aggregator`() { fun `given a poll start event which is not a replace is not processed by poll aggregator`() {
@ -134,15 +215,40 @@ class PollAggregationProcessorTest {
@Test @Test
fun `given a poll start event with a replace is processed by poll aggregator`() { fun `given a poll start event with a replace is processed by poll aggregator`() {
val queryResult = realm.givenWhereReturns(result = EventAnnotationsSummaryEntity())
queryResult.givenEqualTo(EventAnnotationsSummaryEntityFields.ROOM_ID, A_POLL_REPLACE_EVENT.roomId!!, queryResult)
queryResult.givenEqualTo(EventAnnotationsSummaryEntityFields.EVENT_ID, A_POLL_REPLACE_EVENT.eventId!!, queryResult)
pollAggregationProcessor.handlePollStartEvent(realm.instance, A_POLL_REPLACE_EVENT).shouldBeTrue() pollAggregationProcessor.handlePollStartEvent(realm.instance, A_POLL_REPLACE_EVENT).shouldBeTrue()
} }
@Test @Test
fun handlePollResponseEvent() { fun `given a poll response event with a broken reference is not processed by poll aggregator`() {
pollAggregationProcessor.handlePollResponseEvent(session, realm.instance, A_POLL_RESPONSE_EVENT_WITH_A_WRONG_REFERENCE).shouldBeFalse()
}
@Test
fun `given a poll response event with a reference is processed by poll aggregator`() {
every { realm.instance.createObject(PollResponseAggregatedSummaryEntity::class.java) } returns PollResponseAggregatedSummaryEntity()
pollAggregationProcessor.handlePollResponseEvent(session, realm.instance, A_POLL_RESPONSE_EVENT).shouldBeTrue()
}
@Test
fun `given a poll response event after poll is closed is not processed by poll aggregator`() {
every { realm.instance.createObject(PollResponseAggregatedSummaryEntity::class.java) } returns PollResponseAggregatedSummaryEntity().apply {
closedTime = (A_POLL_RESPONSE_EVENT.originServerTs ?: 0) - 1
}
pollAggregationProcessor.handlePollResponseEvent(session, realm.instance, A_POLL_RESPONSE_EVENT).shouldBeFalse()
}
@Test
fun `given a poll response event which is already processed is not processed by poll aggregator`() {
every { realm.instance.createObject(PollResponseAggregatedSummaryEntity::class.java) } returns PollResponseAggregatedSummaryEntity().apply {
sourceEvents = RealmList(A_POLL_RESPONSE_EVENT.eventId)
}
pollAggregationProcessor.handlePollResponseEvent(session, realm.instance, A_POLL_RESPONSE_EVENT).shouldBeFalse()
}
@Test
fun `given a poll response event which is not one of the options is not processed by poll aggregator`() {
every { realm.instance.createObject(PollResponseAggregatedSummaryEntity::class.java) } returns PollResponseAggregatedSummaryEntity()
pollAggregationProcessor.handlePollResponseEvent(session, realm.instance, AN_INVALID_POLL_RESPONSE_EVENT).shouldBeFalse()
} }
@Test @Test
@ -152,4 +258,19 @@ class PollAggregationProcessorTest {
private inline fun <reified T : RealmModel> RealmQuery<T>.givenEqualTo(fieldName: String, value: String, result: RealmQuery<T>) { private inline fun <reified T : RealmModel> RealmQuery<T>.givenEqualTo(fieldName: String, value: String, result: RealmQuery<T>) {
every { equalTo(fieldName, value) } returns result every { equalTo(fieldName, value) } returns result
} }
private fun mockEventAnnotationsSummaryEntity() {
val queryResult = realm.givenWhereReturns(result = EventAnnotationsSummaryEntity())
queryResult.givenEqualTo(EventAnnotationsSummaryEntityFields.ROOM_ID, A_POLL_REPLACE_EVENT.roomId!!, queryResult)
queryResult.givenEqualTo(EventAnnotationsSummaryEntityFields.EVENT_ID, A_POLL_REPLACE_EVENT.eventId!!, queryResult)
}
private fun mockRoom(
roomId: String,
eventId: String
) {
val room = mockk<Room>()
every { session.getRoom(roomId) } returns room
every { room.getTimelineEvent(eventId) } returns A_TIMELINE_EVENT
}
} }