@@ -12,6 +12,7 @@ import app.cash.molecule.RecompositionMode
1212import app.cash.molecule.moleculeFlow
1313import app.cash.turbine.test
1414import com.google.common.truth.Truth.assertThat
15+ import io.element.android.libraries.androidutils.file.TemporaryUriDeleter
1516import io.element.android.libraries.architecture.AsyncAction
1617import io.element.android.libraries.matrix.api.MatrixClient
1718import io.element.android.libraries.matrix.api.user.MatrixUser
@@ -29,6 +30,9 @@ import io.element.android.libraries.permissions.test.FakePermissionsPresenterFac
2930import io.element.android.tests.testutils.WarmUpRule
3031import io.element.android.tests.testutils.consumeItemsUntilPredicate
3132import io.element.android.tests.testutils.consumeItemsUntilTimeout
33+ import io.element.android.tests.testutils.fake.FakeTemporaryUriDeleter
34+ import io.element.android.tests.testutils.lambda.lambdaRecorder
35+ import io.element.android.tests.testutils.lambda.value
3236import io.mockk.every
3337import io.mockk.mockk
3438import io.mockk.mockkStatic
@@ -73,12 +77,14 @@ class EditUserProfilePresenterTest {
7377 matrixClient : MatrixClient = FakeMatrixClient (),
7478 matrixUser : MatrixUser = aMatrixUser(),
7579 permissionsPresenter : PermissionsPresenter = FakePermissionsPresenter (),
80+ temporaryUriDeleter : TemporaryUriDeleter = FakeTemporaryUriDeleter (),
7681 ): EditUserProfilePresenter {
7782 return EditUserProfilePresenter (
7883 matrixClient = matrixClient,
7984 matrixUser = matrixUser,
8085 mediaPickerProvider = fakePickerProvider,
8186 mediaPreProcessor = fakeMediaPreProcessor,
87+ temporaryUriDeleter = temporaryUriDeleter,
8288 permissionsPresenterFactory = FakePermissionsPresenterFactory (permissionsPresenter),
8389 )
8490 }
@@ -107,7 +113,12 @@ class EditUserProfilePresenterTest {
107113 @Test
108114 fun `present - updates state in response to changes` () = runTest {
109115 val user = aMatrixUser(id = A_USER_ID .value, displayName = " Name" , avatarUrl = AN_AVATAR_URL )
110- val presenter = createEditUserProfilePresenter(matrixUser = user)
116+ val presenter = createEditUserProfilePresenter(
117+ matrixUser = user,
118+ temporaryUriDeleter = FakeTemporaryUriDeleter (
119+ deleteCallback = { assertThat(it).isEqualTo(userAvatarUri) }
120+ ),
121+ )
111122 moleculeFlow(RecompositionMode .Immediate ) {
112123 presenter.present()
113124 }.test {
@@ -136,7 +147,12 @@ class EditUserProfilePresenterTest {
136147 fun `present - obtains avatar uris from gallery` () = runTest {
137148 val user = aMatrixUser(id = A_USER_ID .value, displayName = " Name" , avatarUrl = AN_AVATAR_URL )
138149 fakePickerProvider.givenResult(anotherAvatarUri)
139- val presenter = createEditUserProfilePresenter(matrixUser = user)
150+ val presenter = createEditUserProfilePresenter(
151+ matrixUser = user,
152+ temporaryUriDeleter = FakeTemporaryUriDeleter (
153+ deleteCallback = { assertThat(it).isEqualTo(userAvatarUri) }
154+ ),
155+ )
140156 moleculeFlow(RecompositionMode .Immediate ) {
141157 presenter.present()
142158 }.test {
@@ -154,9 +170,13 @@ class EditUserProfilePresenterTest {
154170 val user = aMatrixUser(id = A_USER_ID .value, displayName = " Name" , avatarUrl = AN_AVATAR_URL )
155171 fakePickerProvider.givenResult(anotherAvatarUri)
156172 val fakePermissionsPresenter = FakePermissionsPresenter ()
173+ val deleteCallback = lambdaRecorder<Uri ?, Unit > {}
157174 val presenter = createEditUserProfilePresenter(
158175 matrixUser = user,
159176 permissionsPresenter = fakePermissionsPresenter,
177+ temporaryUriDeleter = FakeTemporaryUriDeleter (
178+ deleteCallback = deleteCallback,
179+ ),
160180 )
161181 moleculeFlow(RecompositionMode .Immediate ) {
162182 presenter.present()
@@ -177,14 +197,24 @@ class EditUserProfilePresenterTest {
177197 stateWithNewAvatar.eventSink(EditUserProfileEvents .HandleAvatarAction (AvatarAction .TakePhoto ))
178198 val stateWithNewAvatar2 = awaitItem()
179199 assertThat(stateWithNewAvatar2.userAvatarUrl).isEqualTo(userAvatarUri)
200+ deleteCallback.assertions().isCalledExactly(2 ).withSequence(
201+ listOf (value(userAvatarUri)),
202+ listOf (value(anotherAvatarUri)),
203+ )
180204 }
181205 }
182206
183207 @Test
184208 fun `present - updates save button state` () = runTest {
185209 val user = aMatrixUser(id = A_USER_ID .value, displayName = " Name" , avatarUrl = AN_AVATAR_URL )
186210 fakePickerProvider.givenResult(userAvatarUri)
187- val presenter = createEditUserProfilePresenter(matrixUser = user)
211+ val deleteCallback = lambdaRecorder<Uri ?, Unit > {}
212+ val presenter = createEditUserProfilePresenter(
213+ matrixUser = user,
214+ temporaryUriDeleter = FakeTemporaryUriDeleter (
215+ deleteCallback = deleteCallback
216+ ),
217+ )
188218 moleculeFlow(RecompositionMode .Immediate ) {
189219 presenter.present()
190220 }.test {
@@ -210,14 +240,24 @@ class EditUserProfilePresenterTest {
210240 awaitItem().apply {
211241 assertThat(saveButtonEnabled).isFalse()
212242 }
243+ deleteCallback.assertions().isCalledExactly(2 ).withSequence(
244+ listOf (value(userAvatarUri)),
245+ listOf (value(null )),
246+ )
213247 }
214248 }
215249
216250 @Test
217251 fun `present - updates save button state when initial values are null` () = runTest {
218252 val user = aMatrixUser(id = A_USER_ID .value, displayName = " Name" , avatarUrl = null )
219253 fakePickerProvider.givenResult(userAvatarUri)
220- val presenter = createEditUserProfilePresenter(matrixUser = user)
254+ val deleteCallback = lambdaRecorder<Uri ?, Unit > {}
255+ val presenter = createEditUserProfilePresenter(
256+ matrixUser = user,
257+ temporaryUriDeleter = FakeTemporaryUriDeleter (
258+ deleteCallback = deleteCallback
259+ ),
260+ )
221261 moleculeFlow(RecompositionMode .Immediate ) {
222262 presenter.present()
223263 }.test {
@@ -243,6 +283,10 @@ class EditUserProfilePresenterTest {
243283 awaitItem().apply {
244284 assertThat(saveButtonEnabled).isFalse()
245285 }
286+ deleteCallback.assertions().isCalledExactly(2 ).withSequence(
287+ listOf (value(null )),
288+ listOf (value(userAvatarUri)),
289+ )
246290 }
247291 }
248292
@@ -252,7 +296,10 @@ class EditUserProfilePresenterTest {
252296 val user = aMatrixUser(id = A_USER_ID .value, displayName = " Name" , avatarUrl = AN_AVATAR_URL )
253297 val presenter = createEditUserProfilePresenter(
254298 matrixClient = matrixClient,
255- matrixUser = user
299+ matrixUser = user,
300+ temporaryUriDeleter = FakeTemporaryUriDeleter (
301+ deleteCallback = { assertThat(it).isEqualTo(userAvatarUri) }
302+ ),
256303 )
257304 moleculeFlow(RecompositionMode .Immediate ) {
258305 presenter.present()
@@ -318,7 +365,10 @@ class EditUserProfilePresenterTest {
318365 givenPickerReturnsFile()
319366 val presenter = createEditUserProfilePresenter(
320367 matrixClient = matrixClient,
321- matrixUser = user
368+ matrixUser = user,
369+ temporaryUriDeleter = FakeTemporaryUriDeleter (
370+ deleteCallback = { assertThat(it).isEqualTo(userAvatarUri) }
371+ ),
322372 )
323373 moleculeFlow(RecompositionMode .Immediate ) {
324374 presenter.present()
@@ -337,7 +387,10 @@ class EditUserProfilePresenterTest {
337387 val user = aMatrixUser(id = A_USER_ID .value, displayName = " Name" , avatarUrl = AN_AVATAR_URL )
338388 val presenter = createEditUserProfilePresenter(
339389 matrixClient = matrixClient,
340- matrixUser = user
390+ matrixUser = user,
391+ temporaryUriDeleter = FakeTemporaryUriDeleter (
392+ deleteCallback = { assertThat(it).isEqualTo(userAvatarUri) }
393+ ),
341394 )
342395 fakePickerProvider.givenResult(anotherAvatarUri)
343396 fakeMediaPreProcessor.givenResult(Result .failure(Throwable (" Oh no" )))
@@ -403,7 +456,13 @@ class EditUserProfilePresenterTest {
403456 }
404457
405458 private suspend fun saveAndAssertFailure (matrixUser : MatrixUser , matrixClient : MatrixClient , event : EditUserProfileEvents ) {
406- val presenter = createEditUserProfilePresenter(matrixUser = matrixUser, matrixClient = matrixClient)
459+ val presenter = createEditUserProfilePresenter(
460+ matrixUser = matrixUser,
461+ matrixClient = matrixClient,
462+ temporaryUriDeleter = FakeTemporaryUriDeleter (
463+ deleteCallback = { assertThat(it).isEqualTo(userAvatarUri) }
464+ ),
465+ )
407466 moleculeFlow(RecompositionMode .Immediate ) {
408467 presenter.present()
409468 }.test {
0 commit comments