Testing
Star Wars resolver tests use ResolverTestBase. For setup, context construction, and the full API reference see the Testing guide.
Field resolver¶
CharacterDisplayNameResolver resolves displayName from the Character GRT. The test uses runFieldResolver and builds the input object with Character.of(context), setting only the fields the resolver reads.
@Test
fun `DisplayNameResolver returns name correctly`(): Unit =
runBlocking {
val resolver = CharacterDisplayNameResolver()
val result = runFieldResolver(resolver) {
objectValue = Character.of(context) { name("Leia Organa") }
}
assertEquals("Leia Organa", result)
}
With arguments¶
CharacterFormattedDescriptionResolver takes a format argument that controls the output shape. The test builds the arguments object with Character_FormattedDescription_Arguments.of(context) and passes it alongside the object value.
@Test
fun `FormattedDescriptionResolver returns full description for detailed format`(): Unit =
runBlocking {
val resolver = CharacterFormattedDescriptionResolver()
val result = runFieldResolver(resolver) {
arguments = Character_FormattedDescription_Arguments.of(context) { format("detailed") }
objectValue = Character.of(context) {
name("Padmé Amidala")
birthYear("46BBY")
eyeColor("brown")
hairColor("brown")
}
}
assertEquals("Padmé Amidala (born 46BBY) - brown eyes, brown hair", result)
}
Field batch resolver¶
CharacterFilmCountResolver is a batching resolver (@resolver(isBatching: true)) that counts how many films each character appears in. The test uses runFieldBatchResolver, passing a list of Character objects as objectValues. Call .get() on each result to extract the value.
@Test
fun `runFieldBatchResolver returns film count for each character in batch`(): Unit =
runBlocking {
val results = runFieldBatchResolver(CharacterFilmCountResolver(characterFilmsRepository)) {
objectValues = characterRepository.findAll().take(3).map { char ->
Character.of(context) { id(globalIDFor(Character.Reflection, char.id)) }
}
}
assertEquals(3, results.size)
results.forEach { fv -> assertEquals(3, fv.get()) }
}
Node resolver¶
FilmNodeResolver fetches a Film by its GlobalID. The test uses runNodeResolver and builds the ID with globalIDFor(Film.Reflection, internalId). The id property on the spec is required.
@Test
fun `film by id returns the correct Film using node resolver`(): Unit =
runBlocking {
val ref = filmsRepository.getAllFilms().first()
val result = runNodeResolver(FilmNodeResolver(filmsRepository)) {
id = globalIDFor(Film.Reflection, ref.id)
}
assertNotNull(result)
assertEquals(ref.title, result.getTitle())
}
Node batch resolver¶
CharacterNodeResolver supports batch resolution. The test uses runNodeBatchResolver, passing a list of GlobalIDs as ids. Call .get() on each result to extract the resolved object.
@Test
fun `CharacterBatchNodeResolver resolves multiple ids`() =
runBlocking {
val results = runNodeBatchResolver(CharacterNodeResolver(characterRepository)) {
ids = listOf("1", "2").map { globalIDFor(Character.Reflection, it) }
}
assertEquals(2, results.size)
}
Mutation resolver¶
CreateCharacterMutation creates a new character. The test uses runMutationFieldResolver, building the input and arguments objects with CreateCharacterInput.of(context) and Mutation_CreateCharacter_Arguments.of(context).
@Test
fun `runMutationFieldResolver CreateCharacter creates and returns new character`(): Unit =
runBlocking {
val resolver = CreateCharacterMutation(characterRepository, adminAccess)
val input = CreateCharacterInput.of(context) {
name("Ahsoka Tano")
birthYear("36BBY")
}
val args = Mutation_CreateCharacter_Arguments.of(context) { input(input) }
val result = runMutationFieldResolver(resolver) {
arguments = args
}
assertNotNull(result)
assertEquals("Ahsoka Tano", result!!.getName())
assertEquals("36BBY", result.getBirthYear())
}