prompt-to-edit API request snapshot testing infrastructure (#5514)
* POC write output to json * move to cmd bar * write files * clean up * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * tweak * tweak * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * update fmt ignore etc * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This commit is contained in:
@ -1,5 +1,7 @@
|
||||
import type { Page, Locator } from '@playwright/test'
|
||||
import { expect } from '@playwright/test'
|
||||
import type { Page, Locator, Route, Request } from '@playwright/test'
|
||||
import { expect, TestInfo } from '@playwright/test'
|
||||
import * as fs from 'fs'
|
||||
import * as path from 'path'
|
||||
|
||||
type CmdBarSerialised =
|
||||
| {
|
||||
@ -187,4 +189,71 @@ export class CmdBarFixture {
|
||||
selectOption = (options: Parameters<typeof this.page.getByRole>[1]) => {
|
||||
return this.page.getByRole('option', options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Captures a snapshot of the request sent to the text-to-cad API endpoint
|
||||
* and saves it to a file named after the current test.
|
||||
*
|
||||
* The snapshot file will be saved in the specified directory with a filename
|
||||
* derived from the test's full path (including describe blocks).
|
||||
*
|
||||
* @param testInfoInOrderToGetTestTitle The TestInfo object from the test context
|
||||
* @param customOutputDir Optional custom directory for the output file
|
||||
*/
|
||||
async captureTextToCadRequestSnapshot(
|
||||
testInfoInOrderToGetTestTitle: TestInfo,
|
||||
customOutputDir = 'e2e/playwright/snapshots/prompt-to-edit'
|
||||
) {
|
||||
// First sanitize each title component individually
|
||||
const sanitizedTitleComponents = [
|
||||
...testInfoInOrderToGetTestTitle.titlePath.slice(0, -1), // Get all parent titles
|
||||
testInfoInOrderToGetTestTitle.title, // Add the test title
|
||||
].map(
|
||||
(component) =>
|
||||
component
|
||||
.replace(/[^a-z0-9]/gi, '-') // Replace non-alphanumeric chars with hyphens
|
||||
.toLowerCase()
|
||||
.replace(/-+/g, '-') // Replace multiple consecutive hyphens with a single one
|
||||
.replace(/^-|-$/g, '') // Remove leading/trailing hyphens
|
||||
)
|
||||
|
||||
// Join the sanitized components with -- as a clear separator
|
||||
const sanitizedTestName = sanitizedTitleComponents.join('--')
|
||||
|
||||
// Create the output path
|
||||
const outputPath = path.join(
|
||||
customOutputDir,
|
||||
`${sanitizedTestName}.snap.json`
|
||||
)
|
||||
|
||||
// Create a handler function that saves request bodies to a file
|
||||
const requestHandler = (route: Route, request: Request) => {
|
||||
try {
|
||||
const requestBody = request.postDataJSON()
|
||||
|
||||
// Ensure directory exists
|
||||
const dir = path.dirname(outputPath)
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true })
|
||||
}
|
||||
|
||||
// Write the request body to the file
|
||||
fs.writeFileSync(outputPath, JSON.stringify(requestBody, null, 2))
|
||||
|
||||
console.log(`Saved text-to-cad API request to: ${outputPath}`)
|
||||
} catch (error) {
|
||||
console.error('Error processing text-to-cad request:', error)
|
||||
}
|
||||
|
||||
// Use void to explicitly mark the promise as ignored
|
||||
void route.continue()
|
||||
}
|
||||
|
||||
// Start monitoring requests
|
||||
await this.page.route('**/ml/text-to-cad/iteration', requestHandler)
|
||||
|
||||
console.log(
|
||||
`Monitoring text-to-cad API requests. Output will be saved to: ${outputPath}`
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user