blob: 7e2fb9593c0ef44e4affa0db32f206335c497a0d [file] [log] [blame]
package grails.test.app
import org.grails.gorm.graphql.plugin.testing.GraphQLSpec
import grails.testing.mixin.integration.Integration
import org.grails.web.json.JSONObject
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Stepwise
@Integration
@Stepwise
class UserIntegrationSpec extends Specification implements GraphQLSpec {
@Shared long managerId
@Shared long subordinateId
void "test creating a user without a profile"() {
when:
def resp = graphQL.graphql("""
mutation {
userCreate(user: {
firstNumber: 2,
secondNumber: 3,
address: {
city: "Youngstown",
state: "OH",
zip: 44512
}
}) {
id
}
}
""")
Map obj = resp.body()
then:
obj.data == null
obj.errors.size() == 1
obj.errors[0].message.startsWith('Validation error (WrongType@[userCreate])')
obj.errors[0].message.endsWith("is missing required fields '[profile]'")
when: 'The profile is provided, but missing a required field'
resp = graphQL.graphql("""
mutation {
userCreate(user: {
firstNumber: 2,
secondNumber: 3,
profile: {
email: "email",
firstName: "First"
}
address: {
city: "Youngstown",
state: "OH",
zip: 44512
}
}) {
id
}
}
""")
obj = resp.body()
then:
obj.data == null
obj.errors.size() == 1
obj.errors[0].message.startsWith('Validation error (WrongType@[userCreate])')
obj.errors[0].message.endsWith("is missing required fields '[lastName]'")
}
void "test creating a user without an address"() {
when:
def resp = graphQL.graphql("""
mutation {
userCreate(user: {
firstNumber: 2,
secondNumber: 3,
profile: {
email: "email",
firstName: "First",
lastName: "Last"
}
}) {
id
}
}
""")
Map obj = resp.body()
then:
obj.data == null
obj.errors.size() == 1
obj.errors[0].message.startsWith('Validation error (WrongType@[userCreate])')
obj.errors[0].message.endsWith("is missing required fields '[address]'")
when: 'The address is provided, but missing a required field'
resp = graphQL.graphql("""
mutation {
userCreate(user: {
firstNumber: 2,
secondNumber: 3,
profile: {
email: "email",
firstName: "First",
lastName: "Last"
},
address: {
city: "Youngstown",
state: "OH"
}
}) {
id
}
}
""")
obj = resp.body()
then:
obj.data == null
obj.errors.size() == 1
obj.errors[0].message.startsWith('Validation error (WrongType@[userCreate])')
obj.errors[0].message.endsWith("is missing required fields '[zip]'")
}
void "test creating the top level manager"() {
when:
def resp = graphQL.graphql("""
mutation {
userCreate(user: {
firstNumber: 2,
secondNumber: 3,
profile: {
email: "email",
firstName: "First",
lastName: "Last"
}
address: {
city: "Youngstown",
state: "OH",
zip: 44512
}
}) {
id
addedNumbers
profile {
email
firstName
lastName
}
address {
city
state
zip
}
manager {
id
}
}
}
""")
Map obj = resp.body().data.userCreate
managerId = obj.id as Long
then:
obj.id != null
obj.addedNumbers == 5
obj.profile.email == 'email'
obj.profile.firstName == 'First'
obj.profile.lastName == 'Last'
obj.address.city == 'Youngstown'
obj.address.state == 'OH'
obj.address.zip == 44512
obj.manager == null
}
void "create new user with manager"() {
when:
def resp = graphQL.graphql("""
mutation {
userCreate(user: {
firstNumber: 4,
secondNumber: 7,
profile: {
email: "email",
firstName: "First",
lastName: "Last"
}
address: {
city: "Youngstown",
state: "OH",
zip: 44512
}
manager: {
id: ${managerId}
}
}) {
id
addedNumbers
profile {
email
firstName
lastName
}
address {
city
state
zip
}
manager {
id
}
}
}
""")
Map obj = resp.body().data.userCreate
subordinateId = obj.id as Long
then:
obj.id != null
obj.addedNumbers == 11
obj.profile.email == 'email'
obj.profile.firstName == 'First'
obj.profile.lastName == 'Last'
obj.address.city == 'Youngstown'
obj.address.state == 'OH'
obj.address.zip == 44512
obj.manager.id == managerId
}
void "test updating a user"() {
when:
def resp = graphQL.graphql("""
mutation {
userUpdate(id: ${subordinateId}, user: {
firstNumber: 5,
secondNumber: 7,
profile: {
email: "emailUpdated",
firstName: "FirstUpdated",
lastName: "LastUpdated"
}
address: {
city: "Pittsburgh",
state: "PA",
zip: 90210
}
}) {
id
addedNumbers
profile {
email
firstName
lastName
}
address {
city
state
zip
}
manager {
id
}
}
}
""")
Map obj = resp.body().data.userUpdate
then:
obj.id == subordinateId
obj.addedNumbers == 12
obj.profile.email == 'emailUpdated'
obj.profile.firstName == 'FirstUpdated'
obj.profile.lastName == 'LastUpdated'
obj.address.city == 'Pittsburgh'
obj.address.state == 'PA'
obj.address.zip == 90210
obj.manager.id == managerId
}
void "test listing users"() {
when:
def resp = graphQL.graphql("""
{
userList(sort: "id") {
id
addedNumbers
profile {
email
firstName
lastName
}
address {
city
state
zip
}
manager {
id
addedNumbers
}
}
}
""")
List obj = resp.body().data.userList
then:
JSONObject subordinate = obj.find { it.id == subordinateId }
JSONObject manager = obj.find { it.id == managerId }
manager.id != null
manager.addedNumbers == 5
manager.profile.email == 'email'
manager.profile.firstName == 'First'
manager.profile.lastName == 'Last'
manager.address.city == 'Youngstown'
manager.address.state == 'OH'
manager.address.zip == 44512
manager.manager == null
subordinate.id != null
subordinate.addedNumbers == 12
subordinate.profile.email == 'emailUpdated'
subordinate.profile.firstName == 'FirstUpdated'
subordinate.profile.lastName == 'LastUpdated'
subordinate.address.city == 'Pittsburgh'
subordinate.address.state == 'PA'
subordinate.address.zip == 90210
subordinate.manager.id != null
subordinate.manager.addedNumbers == 5
}
void "test querying a single user"() {
when:
def resp = graphQL.graphql("""
{
user(id: ${subordinateId}) {
id
addedNumbers
profile {
email
firstName
lastName
}
address {
city
state
zip
}
manager {
id
addedNumbers
}
}
}
""")
Map json = resp.body()
JSONObject obj = json.data.user
then:
obj.id == subordinateId
obj.addedNumbers == 12
obj.profile.email == 'emailUpdated'
obj.profile.firstName == 'FirstUpdated'
obj.profile.lastName == 'LastUpdated'
obj.address.city == 'Pittsburgh'
obj.address.state == 'PA'
obj.address.zip == 90210
obj.manager.id == managerId
obj.manager.addedNumbers == 5
}
void "test deleting a user that is a manager of another user"() {
when:
def resp = graphQL.graphql("""
mutation {
userDelete(id: ${managerId}) {
success
}
}
""")
Map obj = resp.body().data.userDelete
then:
!obj.success
}
void "test deleting a user that is NOT a manager of another user"() {
when:
def resp = graphQL.graphql("""
mutation {
userDelete(id: ${subordinateId}) {
success
}
}
""")
Map obj = resp.body().data.userDelete
then:
obj.success
}
void "test deleting the last user is now successful"() {
when:
def resp = graphQL.graphql("""
mutation {
userDelete(id: ${managerId}) {
success
}
}
""")
Map obj = resp.body().data.userDelete
then:
obj.success
}
}