blob: 5af670e75e43d2806e4cdd176ce551926e6c283d [file] [log] [blame]
package grails.test.app
import org.grails.gorm.graphql.plugin.testing.GraphQLSpec
import grails.testing.mixin.integration.Integration
import grails.testing.spock.OnceBefore
import org.grails.web.json.JSONArray
import org.grails.web.json.JSONObject
import org.spockframework.util.StringMessagePrintStream
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Stepwise
@Integration
@Stepwise
class UserRoleIntegrationSpec extends Specification implements GraphQLSpec {
@Shared Long userId
@Shared Long roleId
@OnceBefore
void createUserAndRole() {
def resp = graphQL.graphql("""
mutation {
userCreate(user: {
firstNumber: 2,
secondNumber: 3,
profile: {
email: "admin@email.com",
firstName: "First",
lastName: "Last"
}
address: {
city: "Youngstown",
state: "OH",
zip: 44512
}
}) {
id
}
}
""")
Map obj = resp.body().data.userCreate
userId = obj.id
resp = graphQL.graphql("""
mutation {
roleCreate(role: {
name: "ROLE_ADMIN"
}) {
id
}
}
""")
obj = resp.body().data.roleCreate
roleId = obj.id
}
void "test creating an entity with a complex composite id"() {
when:
def resp = graphQL.graphql("""
mutation {
userRoleCreate(userRole: {
user: {
id: ${userId}
},
role: {
id: ${roleId}
}
}) {
user {
profile {
email
}
}
role {
name
}
}
}
""")
Map obj = resp.body().data.userRoleCreate
then:
obj.user.profile.email == 'admin@email.com'
obj.role.name == 'ROLE_ADMIN'
}
void "test reading an entity with a complex composite id"() {
given:
PrintStream originalOut = System.out
String query
int outCount = 0
System.setOut(new StringMessagePrintStream() {
@Override
protected void printed(String message) {
query = message
outCount++
}
})
when:
def resp = graphQL.graphql("""
{
userRole(role: ${roleId}, user: ${userId}) {
user {
id
}
role {
id
}
}
}
""".toString())
Map obj = resp.body().data.userRole
then:
obj.user.id == userId
obj.role.id == roleId
outCount == 1
query ==~ 'Hibernate: select this_.user_id as user_id[0-9]+_[0-9]+_[0-9]+_, this_.role_id as role_id[0-9]+_[0-9]+_[0-9]+_ from user_role this_ where this_.user_id=\\? and this_.role_id=\\? limit \\?\n'
when:
outCount = 0
resp = graphQL.graphql("""
{
userRole(role: ${roleId}, user: ${userId}) {
user {
profile {
email
}
}
role {
name
}
}
}
""".toString())
obj = resp.body().data.userRole
then: 'The user and role will be fetched with the same query'
obj.user.profile.email == 'admin@email.com'
obj.role.name == 'ROLE_ADMIN'
outCount == 1
query ==~ 'Hibernate: select this_.user_id as user_id[0-9]+_[0-9]{2}_[0-9]_, this_.role_id as role_id[0-9]+_[0-9]+_[0-9]+_, user2_.id as id[0-9]+_[0-9]+_[0-9]+_, user2_.version as version[0-9]+_[0-9]+_[0-9]+_, user2_.manager_id as manager_[0-9]+_[0-9]+_[0-9]+_, user2_.added_numbers as added_nu[0-9]+_[0-9]+_[0-9]+_, user2_.address_zip as address_[0-9]+_[0-9]+_[0-9]+_, user2_.address_city as address_[0-9]+_[0-9]+_[0-9]+_, user2_.address_state as address_[0-9]+_[0-9]+_[0-9]+_, user2_.profile_first_name as profile_[0-9]+_[0-9]+_[0-9]+_, user2_.profile_last_name as profile_[0-9]+_[0-9]+_[0-9]+_, user2_.profile_email as profile[0-9]+_[0-9]+_[0-9]+_, role3_.id as id[0-9]+_[0-9]+_[0-9]+_, role3_.version as version[0-9]+_[0-9]+_[0-9]+_, role3_.authority as authorit[0-9]+_[0-9]+_[0-9]+_ from user_role this_ inner join user user2_ on this_.user_id=user2_.id inner join role role3_ on this_.role_id=role3_.id where this_.user_id=\\? and this_.role_id=\\?\n'
cleanup:
System.setOut(originalOut)
}
void "test we cannot update a UserRole because it is turned off in the mapping"() {
when:
def resp = graphQL.graphql("""
mutation {
userRoleUpdate(role: ${roleId}, user: ${userId}) {
user {
id
}
role {
id
}
}
}
""".toString())
Map result = resp.body()
then:
result.errors.size() == 1
result.errors[0].message == "Validation error (FieldUndefined@[userRoleUpdate]) : Field 'userRoleUpdate' in type 'Mutation' is undefined"
}
void "test listing entities with a complex composite id"() {
when:
def resp = graphQL.graphql("""
{
userRoleList {
user {
profile {
email
}
}
role {
name
}
}
}
""".toString())
List obj = resp.body().data.userRoleList
then:
obj.size() == 1
obj[0].user.profile.email == 'admin@email.com'
obj[0].role.name == 'ROLE_ADMIN'
}
void "test custom query operation added in the mapping"() {
when:
def resp = graphQL.graphql("""
{
usersByRole(role: ${roleId}) {
profile {
email
}
}
}
""".toString())
List obj = resp.body().data.usersByRole
then:
obj.size() == 1
obj[0].profile.email == 'admin@email.com'
}
void "test custom mutation operation added in the mapping"() {
setup: 'Add another role to the existing user'
def resp = graphQL.graphql("""
mutation {
roleCreate(role: {
name: "ROLE_USER"
}) {
id
}
}
""")
Long newRoleId = resp.body().data.roleCreate.id
graphQL.graphql("""
mutation {
userRoleCreate(userRole: {
user: {
id: ${userId}
},
role: {
id: ${newRoleId}
}
}) {
user {
id
}
role {
id
}
}
}
""".toString())
when:
resp = graphQL.graphql("""
{
userRoleList {
role {
name
}
}
}
""".toString())
List list = resp.body().data.userRoleList
then:
list.size() == 2
when:
resp = graphQL.graphql("""
mutation {
revokeAllRoles(user: ${userId}) {
success
}
}
""".toString())
Map obj = resp.body().data.revokeAllRoles
then:
obj.success
when:
resp = graphQL.graphql("""
{
userRoleList {
user {
id
}
role {
id
}
}
}
""".toString())
list = resp.body().data.userRoleList
then: 'Check if the delete worked'
list.empty
cleanup: 'Re-create the user role so the next test can delete it'
graphQL.graphql("""
mutation {
userRoleCreate(userRole: {
user: {
id: ${userId}
},
role: {
id: ${roleId}
}
}) {
user {
id
}
role {
id
}
}
}
""".toString())
}
void "test deleting an entity with a complex composite id"() {
when:
def resp = graphQL.graphql("""
mutation {
userRoleDelete(role: ${roleId}, user: ${userId}) {
success
}
}
""".toString())
Map obj = resp.body().data.userRoleDelete
then:
obj.success
}
}