Write unit tests for poll response event aggregation.
This commit is contained in:
parent
4065bce47a
commit
00e800459d
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue