Skip to content

Commit cb8fd68

Browse files
authored
Persist history deletion result. Fixes #451. (#453)
1 parent 4f46d85 commit cb8fd68

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

datasource/implementation/src/main/java/com/mitteloupe/whoami/datasource/history/datasource/IpAddressHistoryDataSourceImpl.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ class IpAddressHistoryDataSourceImpl(
4848

4949
override fun delete(deletionIdentifier: HistoryRecordDeletionIdentifierDataModel) {
5050
historyRecords.remove(deletionIdentifier.ipAddress)
51+
sharedPreferences.edit {
52+
putString(KEY_HISTORY_RECORDS, jsonEncoder.encode(historyRecords))
53+
}
5154
mutableHistoryRecordsFlow.emitRecords()
5255
}
5356

datasource/implementation/src/test/java/com/mitteloupe/whoami/datasource/history/datasource/IpAddressHistoryDataSourceImplTest.kt

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import org.mockito.kotlin.anyOrNull
2626
import org.mockito.kotlin.doReturn
2727
import org.mockito.kotlin.eq
2828
import org.mockito.kotlin.mock
29+
import org.mockito.kotlin.verify
2930

3031
private typealias SavedIpAddressHistoryRecordLocalMap =
3132
Map<String, SavedIpAddressHistoryRecordLocalModel>
@@ -40,6 +41,9 @@ class IpAddressHistoryDataSourceImplTest {
4041
@Mock
4142
private lateinit var savedIpAddressRecordDataMapper: SavedIpAddressRecordDataMapper
4243

44+
@Mock
45+
private lateinit var preferencesEditor: SharedPreferences.Editor
46+
4347
private lateinit var sharedPreferences: SharedPreferences
4448

4549
@Mock
@@ -50,7 +54,6 @@ class IpAddressHistoryDataSourceImplTest {
5054

5155
@Before
5256
fun setUp() {
53-
val preferencesEditor: SharedPreferences.Editor = mock()
5457
sharedPreferences = mock {
5558
on { edit() } doReturn preferencesEditor
5659
}
@@ -104,7 +107,7 @@ class IpAddressHistoryDataSourceImplTest {
104107
}
105108

106109
@Test
107-
fun `Given records,delete identifier when delete then deletes identified record`() = runTest {
110+
fun `Given records,delete identifier when delete then emits remaining records`() = runTest {
108111
// Given
109112
val ipAddressToDelete = "1.1.1.1"
110113
val recordsString = "{JSON}"
@@ -140,6 +143,46 @@ class IpAddressHistoryDataSourceImplTest {
140143
assertEquals(2, actualRecords.size)
141144
}
142145

146+
@Test
147+
fun `Given records,delete identifier when delete then deletes identified record`() = runTest {
148+
// Given
149+
val ipAddressToDelete = "1.1.1.1"
150+
val recordsString = "{JSON}"
151+
given(sharedPreferences.getString(eq(KEY_HISTORY_RECORDS), anyOrNull()))
152+
.willReturn(recordsString)
153+
val localSavedIpAddressHistoryRecord1 =
154+
localSavedIpAddressHistoryRecord(ipAddress = "0.0.0.0")
155+
val localSavedIpAddressHistoryRecordToDelete =
156+
localSavedIpAddressHistoryRecord(ipAddress = ipAddressToDelete)
157+
val localSavedIpAddressHistoryRecord3 =
158+
localSavedIpAddressHistoryRecord(ipAddress = "2.2.2.2")
159+
val decodedRecords = mapOf(
160+
localSavedIpAddressHistoryRecord1.ipAddress to localSavedIpAddressHistoryRecord1,
161+
ipAddressToDelete to localSavedIpAddressHistoryRecordToDelete,
162+
localSavedIpAddressHistoryRecord3.ipAddress to localSavedIpAddressHistoryRecord3
163+
)
164+
given(jsonDecoder.decode(recordsString)).willReturn(decodedRecords)
165+
val deletionIdentifier = HistoryRecordDeletionIdentifierDataModel(ipAddressToDelete)
166+
val dataSavedIpAddressHistoryRecord1 = dataSavedIpAddressHistoryRecord("0.0.0.0")
167+
givenMappedToData(localSavedIpAddressHistoryRecord1, dataSavedIpAddressHistoryRecord1)
168+
val dataSavedIpAddressHistoryRecord3 = dataSavedIpAddressHistoryRecord("2.2.2.2")
169+
givenMappedToData(localSavedIpAddressHistoryRecord3, dataSavedIpAddressHistoryRecord3)
170+
171+
val recordsAfterDeletion = mapOf(
172+
localSavedIpAddressHistoryRecord1.ipAddress to localSavedIpAddressHistoryRecord1,
173+
localSavedIpAddressHistoryRecord3.ipAddress to localSavedIpAddressHistoryRecord3
174+
)
175+
val recordsAfterDeletionString = "{JSON2}"
176+
given(jsonEncoder.encode(recordsAfterDeletion))
177+
.willReturn(recordsAfterDeletionString)
178+
179+
// When
180+
classUnderTest.delete(deletionIdentifier)
181+
182+
// Then
183+
verify(preferencesEditor).putString(KEY_HISTORY_RECORDS, recordsAfterDeletionString)
184+
}
185+
143186
private fun givenMappedToData(
144187
localRecord: SavedIpAddressHistoryRecordLocalModel,
145188
expectedRecord: SavedIpAddressHistoryRecordDataModel

0 commit comments

Comments
 (0)