Skip to content

Commit

Permalink
Fix null provider bug
Browse files Browse the repository at this point in the history
  • Loading branch information
Alan-Cha committed Jun 17, 2020
1 parent f21fdb9 commit 41df1c9
Show file tree
Hide file tree
Showing 11 changed files with 323 additions and 241 deletions.
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
![GitHub last commit](https://img.shields.io/github/last-commit/ibm/graphql-query-generator.svg?style=flat)

[![npm](https://img.shields.io/npm/v/ibm-graphql-query-generator.svg?style=flat)](https://www.npmjs.com/package/ibm-graphql-query-generator)

# GraphQL Query Generator

This library will generate randomized [GraphQL](https://graphql.org/) queries from a given schema.
Expand Down Expand Up @@ -65,8 +69,8 @@ const configuration = {
return companyNameList[
Math.floor(Math.random() * companyNameList.length)
]
},
},
}
}
}

const { queryDocument, variableValues, seed } = generateRandomQuery(
Expand Down
57 changes: 28 additions & 29 deletions lib/generate-query.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion lib/generate-query.js.map

Large diffs are not rendered by default.

17 changes: 6 additions & 11 deletions lib/provide-variables.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion lib/provide-variables.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

88 changes: 42 additions & 46 deletions src/generate-query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -458,62 +458,58 @@ function getArgsAndVars(

// If there is no providerMap, then just create a query with null variables
if (config.providerMap) {
const variableValues: { [varName: string]: any } = {}

const typeFieldName = `${nodeName}__${fieldName}`

// Check for type__field provider
let providedVariableValues = getProviderValue(
typeFieldName,
config,
providedValues
) as { [varName: string]: any }

// Map to full type__field__argument provider name
if (providedVariableValues) {
const temp = {}
Object.entries(providedVariableValues).forEach(([argName, value]) => {
try {
// Check for type__field provider
const typeFieldProviderValue = getProviderValue(
typeFieldName,
config,
providedValues
) as { [varName: string]: any }

// Map to full type__field__argument provider name
Object.entries(typeFieldProviderValue).forEach(([argName, value]) => {
const varName = `${typeFieldName}__${argName}`

// Make sure it is a required argument (provider can provide more that necessary)
if (Object.keys(variableDefinitionsMap).includes(varName)) {
temp[`${typeFieldName}__${argName}`] = value
variableValues[`${typeFieldName}__${argName}`] = value
}
})

providedVariableValues = temp
}

const variableValues: { [varName: string]: any } = providedVariableValues
? providedVariableValues
: {}

// Check for type__field__argument providers (and overwrite if applicable)
requiredArguments.forEach((arg) => {
const varName = `${typeFieldName}__${arg.name.value}`
const argType = schema.getType(getTypeName(arg.type))

if (isEnumType(argType)) {
variableValues[varName] = getRandomEnum(argType)
} else {
const providedValue = getProviderValue(
varName,
config,
{ ...variableValues, ...providedValues },
argType
) as any

if (providedValue) {
variableValues[varName] = providedValue
} else if (!variableValues[varName]) {
throw new Error(
`No provider found for "${varName}" in ` +
`${Object.keys(config.providerMap).join(', ')}. ` +
`Consider applying wildcard provider with "*__*" or "*__*__*"`
)
} finally {
// Check for type__field__argument providers (and overwrite if applicable)
requiredArguments.forEach((arg) => {
const varName = `${typeFieldName}__${arg.name.value}`
const argType = schema.getType(getTypeName(arg.type))

if (isEnumType(argType)) {
variableValues[varName] = getRandomEnum(argType)
} else {
try {
const typeFieldArgumentProviderValue = getProviderValue(
varName,
config,
{ ...variableValues, ...providedValues },
argType
)

variableValues[varName] = typeFieldArgumentProviderValue
} catch (e) {
// No value identified from either type__field or type__field__argument
if (!variableValues[varName]) {
throw new Error(
`${e} Consider applying wildcard provider with "*__*" or "*__*__*"`
)
}
}
}
}
})
})

return { args, variableDefinitionsMap, variableValues }
return { args, variableDefinitionsMap, variableValues }
}

// This is a special case allowing the user to generate a query without caring for argument values
} else {
Expand Down
18 changes: 8 additions & 10 deletions src/provide-variables.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,10 @@ function getProvider(varName: string, providerMap: ProviderMap) {
if (providerKey) {
return providerMap[providerKey]
} else {
return null
throw new Error(
`No provider found for "${varName}" in ` +
`${Object.keys(providerMap).join(', ')}.`
)
}
}

Expand Down Expand Up @@ -87,16 +90,11 @@ export function getProviderValue(
providedValues: Variables,
argType?: GraphQLNamedType
) {
// If no providerMap was provided, then just create a query with no argument values
if (config.providerMap) {
const provider = getProvider(varName, config.providerMap)
const provider = getProvider(varName, config.providerMap)

if (typeof provider === 'function') {
return (provider as ProviderFunction)(providedValues, argType)
} else {
return provider
}
if (typeof provider === 'function') {
return (provider as ProviderFunction)(providedValues, argType)
} else {
return null
return provider
}
}
Loading

0 comments on commit 41df1c9

Please sign in to comment.