agrosner
03/03/2025, 4:12 PMoverride fun resolveLeaf(context: FakeResolverContext): Any {
val mergedField = context.mergedField
val type = mergedField.type.rawType()
if (type is CustomScalarType) {
// workaround the fact that Apollo doesn't have an API for constructing adapters
// so we dont need explicit dependencies constructed here.
val adapter = __CustomScalarAdapters.responseAdapterFor<Any>(type)
if (adapter is AdapterResolver<*, *> && type.className == adapter.outputClass.qualifiedName) {
@Suppress("UNCHECKED_CAST")
return (adapter as AdapterResolver<Any, Any>).convert(resolver.resolve(context, adapter.inputClass))
}
}
return super.resolveLeaf(context)
}
since the default fake resolver does not handle scalar types. should I file a feature request?agrosner
03/03/2025, 4:13 PMagrosner
03/03/2025, 4:13 PM/**
* Workaround for adapters not knowing how to construct their own types.
*/
interface AdapterResolver<Input : Any, Output : Any> {
val inputClass: KClass<Input>
val outputClass: KClass<Output>
fun convert(input: Input): Output
}
mbonnin
03/03/2025, 4:22 PMmbonnin
03/03/2025, 4:50 PMagrosner
03/03/2025, 5:23 PMagrosner
03/03/2025, 5:24 PMSomeop.Data(resolver = resolver) {
}
to resolve things not explicitly filled inagrosner
03/03/2025, 5:25 PMmbonnin
03/03/2025, 6:07 PMmbonnin
03/03/2025, 6:08 PMmbonnin
03/03/2025, 6:09 PM2025-03-03T14:44:49Z
Subodh Nijsure
03/31/2025, 8:38 PMval dataResponse = SomeQuery.Data(DateTimeFakeResolver)
object CustomFakeResolver : FakeResolver {
override fun resolveLeaf(context: FakeResolverContext): Any {
return when (val leafName = context.mergedField.type.rawType().name) {
"DateTime" -> DateTimeFormatter.ISO_INSTANT.format(Instant.now())
"String" -> DataGenerator.randomString()
<... other stuff>
else -> error("Don't know how to fake scalar: ${context} ${leafName}")
}
}
override fun resolveListSize(context: FakeResolverContext): Int {
return Random.nextInt(1, 3) // Generate 1–2 items for lists
}
override fun resolveMaybeNull(context: FakeResolverContext): Boolean {
return false // Don't return nulls by default
}
override fun resolveTypename(context: FakeResolverContext): String {
return context.id
}
override fun stableIdForObject(
obj: Map<String, Any?>,
mergedField: CompiledField
): String? {
return null
}
}