Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ apollo {
packageName.set("com.github.damontecres.stashapp.api")
schemaFiles.setFrom(fileTree("../stash-server/graphql/schema/").filter { it.extension == "graphql" }.files.map { it.path })
generateOptionalOperationVariables.set(false)
outputDirConnection {
// Fixes where classes aren't detected in unit tests
// See: https://community.apollographql.com/t/android-warning-duplicate-content-roots-detected-after-just-adding-apollo3-kotlin-client/4529/6
connectToKotlinSourceSet("main")
}
}
}

Expand All @@ -90,4 +95,5 @@ dependencies {

implementation("com.apollographql.apollo3:apollo-runtime:3.8.2")
implementation("androidx.preference:preference-ktx:1.2.1")
testImplementation("junit:junit:4.13.2")
}
57 changes: 36 additions & 21 deletions app/src/main/java/com/github/damontecres/stashapp/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ fun convertIntCriterionInput(it: Map<String, *>?): IntCriterionInput? {
return if (it != null) {
val values = it["value"]!! as Map<String, Int?>
IntCriterionInput(
values["value"]!!,
values["value"] ?: 0,
Optional.presentIfNotNull(values["value2"]),
CriterionModifier.valueOf(it["modifier"]!! as String)
)
Expand All @@ -245,10 +245,10 @@ fun convertIntCriterionInput(it: Map<String, *>?): IntCriterionInput? {

fun convertFloatCriterionInput(it: Map<String, *>?): FloatCriterionInput? {
return if (it != null) {
val values = it["value"]!! as Map<String, Double?>
val values = it["value"]!! as Map<String, Number?> // Might be an int or double
FloatCriterionInput(
values["value"]!!,
Optional.presentIfNotNull(values["value2"]),
values["value"]?.toDouble() ?: 0.0,
Optional.presentIfNotNull(values["value2"]?.toDouble()),
CriterionModifier.valueOf(it["modifier"]!! as String)
)
} else {
Expand All @@ -258,9 +258,8 @@ fun convertFloatCriterionInput(it: Map<String, *>?): FloatCriterionInput? {

fun convertStringCriterionInput(it: Map<String, *>?): StringCriterionInput? {
return if (it != null) {
val values = it["value"]!! as Map<String, String?>
StringCriterionInput(
values["value"]!!,
it["value"]?.toString() ?: "",
CriterionModifier.valueOf(it["modifier"]!!.toString())
)
} else {
Expand All @@ -276,7 +275,7 @@ fun convertHierarchicalMultiCriterionInput(it: Map<String, *>?): HierarchicalMul
return if (it != null) {
val values = it["value"]!! as Map<String, *>
val items = mapToIds(values["items"])
val excludes = mapToIds(values["excludes"])
val excludes = mapToIds(values["excluded"])
HierarchicalMultiCriterionInput(
Optional.presentIfNotNull(items),
CriterionModifier.valueOf(it["modifier"]!!.toString()),
Expand All @@ -290,9 +289,8 @@ fun convertHierarchicalMultiCriterionInput(it: Map<String, *>?): HierarchicalMul

fun convertMultiCriterionInput(it: Map<String, *>?): MultiCriterionInput? {
return if (it != null) {
val values = it["value"]!! as Map<String, *>
val items = mapToIds(values["items"])
val excludes = mapToIds(values["excludes"])
val items = mapToIds(it["items"])
val excludes = mapToIds(it["excluded"])
MultiCriterionInput(
Optional.presentIfNotNull(items),
CriterionModifier.valueOf(it["modifier"]!!.toString()),
Expand Down Expand Up @@ -344,9 +342,9 @@ fun convertTimestampCriterionInput(it: Map<String, *>?): TimestampCriterionInput

fun convertCircumcisionCriterionInput(it: Map<String, *>?): CircumcisionCriterionInput? {
return if (it != null) {
val values = it["value"]!! as Map<String, List<String>?>
val valueList = (it["value"] as List<String>?)
CircumcisionCriterionInput(
Optional.presentIfNotNull(values["value"]?.map { CircumisedEnum.valueOf(it) }
Optional.presentIfNotNull(valueList?.map { CircumisedEnum.valueOf(it.uppercase()) }
?.toList()),
CriterionModifier.valueOf(it["modifier"]!! as String)
)
Expand All @@ -357,9 +355,9 @@ fun convertCircumcisionCriterionInput(it: Map<String, *>?): CircumcisionCriterio

fun convertGenderCriterionInput(it: Map<String, *>?): GenderCriterionInput? {
return if (it != null) {
val values = it["value"]!! as Map<String, String?>
val value = it["value"].toString().uppercase().replace(" ", "_")
GenderCriterionInput(
Optional.presentIfNotNull(GenderEnum.valueOf(values["value"]!!)),
Optional.presentIfNotNull(GenderEnum.valueOf(value)),
CriterionModifier.valueOf(it["modifier"]!! as String)
)
} else {
Expand All @@ -369,8 +367,7 @@ fun convertGenderCriterionInput(it: Map<String, *>?): GenderCriterionInput? {

fun convertString(it: Map<String, *>?): String? {
return if (it != null) {
val values = it["value"]!! as Map<String, String?>
return values["value"]
return it["value"]?.toString()
} else {
null
}
Expand Down Expand Up @@ -404,21 +401,39 @@ fun convertPhashDistanceCriterionInput(it: Map<String, *>?): PhashDistanceCriter

fun convertPHashDuplicationCriterionInput(it: Map<String, *>?): PHashDuplicationCriterionInput? {
return if (it != null) {
val values = it["value"]!! as Map<String, *>
PHashDuplicationCriterionInput(
Optional.presentIfNotNull(values["duplicated"].toString().toBoolean()),
Optional.presentIfNotNull(values["distance"].toString().toInt())
Optional.presentIfNotNull(it["duplicated"]?.toString()?.toBoolean()),
Optional.presentIfNotNull(it["distance"]?.toString()?.toInt())
)
} else {
null
}
}

fun convertToResolutionEnum(str: String): ResolutionEnum {
return when (str) {
"114p" -> ResolutionEnum.VERY_LOW
"240p" -> ResolutionEnum.LOW
"360p" -> ResolutionEnum.R360P
"480p" -> ResolutionEnum.STANDARD
"540p" -> ResolutionEnum.WEB_HD
"720p" -> ResolutionEnum.STANDARD_HD
"1080p" -> ResolutionEnum.FULL_HD
"1440p" -> ResolutionEnum.QUAD_HD
"4k" -> ResolutionEnum.FOUR_K
"5k" -> ResolutionEnum.FIVE_K
"6k" -> ResolutionEnum.SIX_K
"7k" -> ResolutionEnum.SEVEN_K
"8k" -> ResolutionEnum.EIGHT_K
"Huge" -> ResolutionEnum.HUGE
else -> ResolutionEnum.UNKNOWN__
}
}

fun convertResolutionCriterionInput(it: Map<String, *>?): ResolutionCriterionInput? {
return if (it != null) {
val values = it["value"]!! as Map<String, String?>
ResolutionCriterionInput(
ResolutionEnum.valueOf(values["value"]!!),
convertToResolutionEnum(it["value"].toString()),
CriterionModifier.valueOf(it["modifier"]!! as String)
)
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.github.damontecres.stashapp

import com.apollographql.apollo3.api.json.BufferedSourceJsonReader
import com.apollographql.apollo3.api.parseJsonResponse
import com.github.damontecres.stashapp.api.FindSavedFilterQuery
import com.github.damontecres.stashapp.api.fragment.SavedFilterData
import com.github.damontecres.stashapp.api.type.FilterMode
import okio.FileSystem
import okio.Path.Companion.toPath
import org.junit.Assert
import org.junit.Test

class ObjectFilterParsingTests {

/**
* Get the SavedFilterData from a json file resource
*/
private fun getSavedFilterData(file: String): SavedFilterData {
val path = file.toPath()
FileSystem.RESOURCES.read(path) {
val jsonReader = BufferedSourceJsonReader(this)
val response = FindSavedFilterQuery("1").parseJsonResponse(jsonReader)
return response.data!!.findSavedFilter!!.savedFilterData
}
}

@Test
fun testSceneFilter() {
val savedFilterData = getSavedFilterData("scene_savedfilter.json")
val sceneFilter =
convertSceneObjectFilter(savedFilterData.object_filter)
Assert.assertNotNull(sceneFilter!!)
Assert.assertEquals(FilterMode.SCENES, savedFilterData.mode)
Assert.assertEquals(
"33",
sceneFilter.studios.getOrThrow()!!.value.getOrThrow()!!.first()
)
Assert.assertEquals(
listOf("8", "148"),
sceneFilter.tags.getOrThrow()!!.value.getOrThrow()!!
)
Assert.assertEquals(
1,
sceneFilter.play_count.getOrThrow()!!.value
)
Assert.assertEquals(
4,
sceneFilter.resume_time.getOrThrow()!!.value
)
Assert.assertEquals(
9,
sceneFilter.resume_time.getOrThrow()!!.value2.getOrThrow()!!
)
Assert.assertEquals(
"2024-01-01 23:00",
sceneFilter.updated_at.getOrThrow()!!.value
)
}

@Test
fun testPerformerFilter() {
val savedFilterData = getSavedFilterData("performer_savedfilter.json")
val performerFilter = convertPerformerObjectFilter(savedFilterData.object_filter)
Assert.assertNotNull(performerFilter!!)
Assert.assertEquals(FilterMode.PERFORMERS, savedFilterData.mode)

Assert.assertEquals(3, performerFilter.tags.getOrThrow()!!.value.getOrThrow()!!.size)
Assert.assertEquals(3, performerFilter.studios.getOrThrow()!!.value.getOrThrow()!!.size)
Assert.assertEquals(1, performerFilter.studios.getOrThrow()!!.excludes.getOrThrow()!!.size)
Assert.assertEquals(
"94",
performerFilter.studios.getOrThrow()!!.excludes.getOrThrow()!!.first()
)
}
}
Loading