From de78ba2d6b53dd491975d8139664736779b411fa Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Mon, 20 Jul 2026 16:07:31 +0200 Subject: [PATCH] =?utf8?q?=E2=9C=A8=20Add=20filter=20for=20updated=20Sones?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../sone/core/UpdatedSoneProcessor.kt | 8 ++++++++ .../sone/core/UpdatedSoneProcessorTest.kt | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt b/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt index 18773e0..35052ba 100644 --- a/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt +++ b/src/main/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessor.kt @@ -17,6 +17,9 @@ import jakarta.inject.Inject @ImplementedBy(DefaultUpdateSoneProcessor::class) interface UpdatedSoneProcessor { + var postFilter: (post: Post) -> Boolean + var postReplyFilter: (postReply: PostReply) -> Boolean + fun updateSone(sone: Sone) } @@ -26,12 +29,17 @@ abstract class BasicUpdateSoneProcessor(private val database: Database, private private val logger = Logger.getLogger(UpdatedSoneProcessor::class.qualifiedName)!! + override var postFilter: (post: Post) -> Boolean = { _ -> true } + override var postReplyFilter: (postReply: PostReply) -> Boolean = { _ -> true } + override fun updateSone(sone: Sone) { val storedSone = database.getSone(sone.id) ?: return if (!soneCanBeUpdated(storedSone, sone)) { logger.fine("Downloaded Sone $sone can not update stored Sone $storedSone.") return } + sone.setPosts(sone.posts.filter(postFilter)) + sone.setReplies(sone.replies.filter(postReplyFilter)) SoneComparison(storedSone, sone).apply { newPosts diff --git a/src/test/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessorTest.kt b/src/test/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessorTest.kt index 51eb8b6..ab90893 100644 --- a/src/test/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessorTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/core/UpdatedSoneProcessorTest.kt @@ -8,8 +8,10 @@ import net.pterodactylus.sone.core.event.PostReplyRemovedEvent import net.pterodactylus.sone.data.Post import net.pterodactylus.sone.data.PostReply import net.pterodactylus.sone.data.Sone +import net.pterodactylus.sone.data.SoneOptions.DefaultSoneOptions import net.pterodactylus.sone.database.Database import net.pterodactylus.sone.test.argumentCaptor +import net.pterodactylus.sone.test.createRemoteSone import net.pterodactylus.sone.test.getInstance import net.pterodactylus.sone.test.isProvidedByMock import net.pterodactylus.sone.test.mock @@ -148,6 +150,26 @@ class UpdatedSoneProcessorTest { } @Test + fun `updated Sone processor only stores posts that match the post filter`() { + whenever(storedSone.posts).thenReturn(emptyList()) + whenever(storedSone.options).thenReturn(DefaultSoneOptions()) + updatedSoneProcessor.postFilter = { post -> post.time > 2500 } + val newSone = createRemoteSone("sone", posts = posts, time = 9999) + updatedSoneProcessor.updateSone(newSone) + assertThat(newSone.posts, contains(posts[2])) + } + + @Test + fun `updated Sone processor only stores post replies that match the post reply filter`() { + whenever(storedSone.posts).thenReturn(emptyList()) + whenever(storedSone.options).thenReturn(DefaultSoneOptions()) + updatedSoneProcessor.postReplyFilter = { postReply -> postReply.time > 2500 } + val newSone = createRemoteSone("sone", postReplies = postReplies.toSet(), time = 9999) + updatedSoneProcessor.updateSone(newSone) + assertThat(newSone.replies, contains(postReplies[2])) + } + + @Test fun `default updated Sone processor can be created by dependency injection`() { assertThat(baseInjector.createChildInjector( Database::class.isProvidedByMock() -- 2.7.4