in experimental/generation/generator/packages/library/src/testGenerator.ts [18:100]
export async function generateTest(path: string, dialog: string, output: string, mock: boolean, schema?: string): Promise<string> {
let transcript = JSON.parse(await fs.readFile(path, 'utf8'))
await fs.ensureDir(output)
let outputPath = ppath.resolve(ppath.join(output, ppath.basename(path, ppath.extname(path)) + '.test.dialog'))
let test: any = {}
if (schema) {
test.$schema = ppath.relative(ppath.resolve(schema), ppath.resolve(outputPath))
} else {
test.$schema = 'https://raw.githubusercontent.com/microsoft/botbuilder-samples/main/experimental/generation/TestBot/TestBot/TestBot.schema'
}
test.$kind = 'Microsoft.Test.Script'
test.dialog = dialog
let script: object[] = []
test.script = script
let mocks: any[] = []
test.httpRequestMocks = mocks
let userCount = 0
let responses = 0
let description = 'BeginDialog'
for (let record of transcript) {
if (isBot(record)) {
if (record.text) {
++responses
script.push({
$kind: 'Microsoft.Test.AssertReply',
text: record.text,
description: `${responses}: ${description}`
})
} else if (record.attachments) {
let assertions: any[] = []
++responses
script.push({
$kind: 'Microsoft.Test.AssertReplyActivity',
assertions,
description: `${responses}: ${description}`
})
assertions.push(`type == 'message'`)
objectAssertions(record.attachments, assertions, 'attachments')
}
} else if (isUser(record)) {
if (record.text) {
script.push({$kind: 'Microsoft.Test.UserSays', 'text': record.text})
} else if (record.value) {
script.push({$kind: 'Microsoft.Test.UserActivity', 'activity': {'type': record.type, 'value': record.value}})
}
++userCount
responses = 0
description = `Response to input ${userCount}`
} else if (isSetTestOptions(record)) {
script.push({
$kind: 'Microsoft.Test.CustomEvent',
name: 'SetTestOptions',
value: record.value
})
} else if (isConversationUpdate(record)) {
let membersAdded: string[] = []
let membersRemoved: string[] = []
for (let member of record.membersAdded) {
membersAdded.push(member.name)
}
for (let member of record.membersRemoved) {
membersRemoved.push(member.name)
}
script.push({$kind: 'Microsoft.Test.UserConversationUpdate', membersAdded, membersRemoved})
} else if (mock && isHttpRequest(record)) {
let request = record.value.request
let mock = mocks.find(m => m.url === request.url && m.method === request.method)
if (!mock) {
mock = {url: request.url, method: request.method}
mocks.push(mock)
}
mock.responses.push({
// TODO: Responses really should include a status code as well to model errors.
contentType: 'String',
content: record.value.response
})
}
}
await fs.writeFile(outputPath, normalizeEOL(JSON.stringify(test, undefined, 2)))
return outputPath
}