First try to resolve the room before checking for the alias validity. Fixes #5611
This commit is contained in:
parent
2938d4db59
commit
c59878988b
2 changed files with 115 additions and 3 deletions
|
|
@ -113,7 +113,7 @@ class JoinRoomByAddressPresenter(
|
||||||
// debounce the room address resolution
|
// debounce the room address resolution
|
||||||
delay(300)
|
delay(300)
|
||||||
val roomAlias = tryOrNull { RoomAlias(fullAddress) }
|
val roomAlias = tryOrNull { RoomAlias(fullAddress) }
|
||||||
if (roomAlias != null && roomAliasHelper.isRoomAliasValid(roomAlias)) {
|
if (roomAlias != null) {
|
||||||
onChange(RoomAddressState.Resolving)
|
onChange(RoomAddressState.Resolving)
|
||||||
onChange(client.resolveRoomAddress(roomAlias))
|
onChange(client.resolveRoomAddress(roomAlias))
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -130,11 +130,21 @@ class JoinRoomByAddressPresenter(
|
||||||
if (resolved.isPresent) {
|
if (resolved.isPresent) {
|
||||||
RoomAddressState.RoomFound(resolved.get())
|
RoomAddressState.RoomFound(resolved.get())
|
||||||
} else {
|
} else {
|
||||||
RoomAddressState.RoomNotFound
|
roomAlias.toInvalidOrNotFound()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onFailure = { _ -> RoomAddressState.RoomNotFound }
|
onFailure = { _ ->
|
||||||
|
roomAlias.toInvalidOrNotFound()
|
||||||
|
}
|
||||||
)
|
)
|
||||||
} ?: RoomAddressState.RoomNotFound
|
} ?: RoomAddressState.RoomNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun RoomAlias.toInvalidOrNotFound(): RoomAddressState {
|
||||||
|
return if (roomAliasHelper.isRoomAliasValid(this)) {
|
||||||
|
RoomAddressState.RoomNotFound
|
||||||
|
} else {
|
||||||
|
RoomAddressState.Invalid
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||||
import io.element.android.tests.testutils.test
|
import io.element.android.tests.testutils.test
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import java.util.Optional
|
||||||
|
|
||||||
class JoinBaseRoomByAddressPresenterTest {
|
class JoinBaseRoomByAddressPresenterTest {
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -58,6 +59,107 @@ class JoinBaseRoomByAddressPresenterTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - invalid address - but room exists`() = runTest {
|
||||||
|
val presenter = createJoinRoomByAddressPresenter(
|
||||||
|
roomAliasHelper = FakeRoomAliasHelper(
|
||||||
|
isRoomAliasValidLambda = {
|
||||||
|
// The SDK still return false, but we have a room for this alias
|
||||||
|
false
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
presenter.test {
|
||||||
|
with(awaitItem()) {
|
||||||
|
eventSink(JoinRoomByAddressEvents.UpdateAddress("#ö:invalid.org"))
|
||||||
|
}
|
||||||
|
with(awaitItem()) {
|
||||||
|
assertThat(address).isEqualTo("#ö:invalid.org")
|
||||||
|
assertThat(addressState).isEqualTo(RoomAddressState.Unknown)
|
||||||
|
eventSink(JoinRoomByAddressEvents.Continue)
|
||||||
|
}
|
||||||
|
// The address should not be marked as valid
|
||||||
|
with(awaitItem()) {
|
||||||
|
assertThat(address).isEqualTo("#ö:invalid.org")
|
||||||
|
assertThat(addressState).isEqualTo(RoomAddressState.Resolving)
|
||||||
|
}
|
||||||
|
with(awaitItem()) {
|
||||||
|
assertThat(address).isEqualTo("#ö:invalid.org")
|
||||||
|
assertThat(addressState).isInstanceOf(RoomAddressState.RoomFound::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - invalid address - room does not exist`() = runTest {
|
||||||
|
val presenter = createJoinRoomByAddressPresenter(
|
||||||
|
roomAliasHelper = FakeRoomAliasHelper(
|
||||||
|
isRoomAliasValidLambda = {
|
||||||
|
// The SDK return false
|
||||||
|
false
|
||||||
|
}
|
||||||
|
),
|
||||||
|
matrixClient = FakeMatrixClient(
|
||||||
|
resolveRoomAliasResult = {
|
||||||
|
Result.success(Optional.empty())
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
presenter.test {
|
||||||
|
with(awaitItem()) {
|
||||||
|
eventSink(JoinRoomByAddressEvents.UpdateAddress("#ö:invalid.org"))
|
||||||
|
}
|
||||||
|
with(awaitItem()) {
|
||||||
|
assertThat(address).isEqualTo("#ö:invalid.org")
|
||||||
|
assertThat(addressState).isEqualTo(RoomAddressState.Unknown)
|
||||||
|
eventSink(JoinRoomByAddressEvents.Continue)
|
||||||
|
}
|
||||||
|
// The address should not be marked as valid
|
||||||
|
with(awaitItem()) {
|
||||||
|
assertThat(address).isEqualTo("#ö:invalid.org")
|
||||||
|
assertThat(addressState).isEqualTo(RoomAddressState.Resolving)
|
||||||
|
}
|
||||||
|
with(awaitItem()) {
|
||||||
|
assertThat(address).isEqualTo("#ö:invalid.org")
|
||||||
|
assertThat(addressState).isEqualTo(RoomAddressState.Invalid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `present - invalid address - failure to resolve the room`() = runTest {
|
||||||
|
val presenter = createJoinRoomByAddressPresenter(
|
||||||
|
roomAliasHelper = FakeRoomAliasHelper(
|
||||||
|
isRoomAliasValidLambda = {
|
||||||
|
// The SDK still return false, but we have a room for this alias
|
||||||
|
false
|
||||||
|
}
|
||||||
|
),
|
||||||
|
matrixClient = FakeMatrixClient(
|
||||||
|
resolveRoomAliasResult = { Result.failure(RuntimeException()) }
|
||||||
|
)
|
||||||
|
)
|
||||||
|
presenter.test {
|
||||||
|
with(awaitItem()) {
|
||||||
|
eventSink(JoinRoomByAddressEvents.UpdateAddress("#ö:invalid.org"))
|
||||||
|
}
|
||||||
|
with(awaitItem()) {
|
||||||
|
assertThat(address).isEqualTo("#ö:invalid.org")
|
||||||
|
assertThat(addressState).isEqualTo(RoomAddressState.Unknown)
|
||||||
|
eventSink(JoinRoomByAddressEvents.Continue)
|
||||||
|
}
|
||||||
|
// The address should not be marked as valid
|
||||||
|
with(awaitItem()) {
|
||||||
|
assertThat(address).isEqualTo("#ö:invalid.org")
|
||||||
|
assertThat(addressState).isEqualTo(RoomAddressState.Resolving)
|
||||||
|
}
|
||||||
|
with(awaitItem()) {
|
||||||
|
assertThat(address).isEqualTo("#ö:invalid.org")
|
||||||
|
assertThat(addressState).isEqualTo(RoomAddressState.Invalid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `present - room found`() = runTest {
|
fun `present - room found`() = runTest {
|
||||||
val openRoomLambda = lambdaRecorder<RoomIdOrAlias, List<String>, Unit> { _, _ -> }
|
val openRoomLambda = lambdaRecorder<RoomIdOrAlias, List<String>, Unit> { _, _ -> }
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue