Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
"clean": "npm run clean -w packages/ -w plugins/",
"reset": "npm run clean && ts-node ./scripts/clean.ts node_modules && npm install",
"generateNonCodeFiles": "npm run generateNonCodeFiles -w packages/ --if-present",
"mergeReports": "ts-node ./scripts/mergeReports.ts"
"mergeReports": "ts-node ./scripts/mergeReports.ts",
"skippedTestReport": "ts-node ./scripts/skippedTestReport.ts ./packages/amazonq/test/e2e/"
},
"devDependencies": {
"@aws-toolkits/telemetry": "^1.0.295",
Expand Down
113 changes: 113 additions & 0 deletions scripts/skippedTestReport.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
/*!
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

/**
* Scans test files for skipped Mocha tests.
*
* It uses a regex instead of mocha's loader, because mocha's
* loader can't resolve vscode by default
*/

import * as fs from 'fs'
import * as path from 'path'

interface SkippedTest {
file: string
testName: string
lineNumber: number
}

function findSkippedTests(directoryPath: string): SkippedTest[] {
const skippedTests: SkippedTest[] = []

const skipPatterns = [/\b(describe|it)\.skip\(['"`](.*?)['"`]/g]
Copy link
Contributor

@Hweinstock Hweinstock Feb 10, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about something like

it('checks that the environment exists', async function () {
// This test is not accurate anymore because dependencies are checked prior to API calls
// Unit tests are ran without other extensions activated, so this fails on the SSH extension check
this.skip()
const getDevEnvStub = sinon.stub().rejects(new Error('No dev environment found'))
client.getDevEnvironment = getDevEnvStub
const errorMessage = getTestWindow()
.waitForMessage(/Failed to handle/)
.then((message) => {
message.assertSeverity(SeverityLevel.Error)
})
await handler.handleUri(createConnectUri(devenvId))
await errorMessage
})

I can't think of a good solution here since it can be conditionally skipped or always skipped via this.skip. Do you think its worth including these as a separate "conditionally skipped"?

Either approach seems fine, but could be worth documenting that in this script.


function searchInFile(filePath: string): void {
try {
const content = fs.readFileSync(filePath, 'utf8')
const lines = content.split('\n')

lines.forEach((line, index) => {
for (const pattern of skipPatterns) {
const matches = line.matchAll(pattern)
for (const match of matches) {
skippedTests.push({
file: filePath,
testName: match[2],
lineNumber: index + 1,
})
}
}
})
} catch (error) {
console.error(`Error reading file ${filePath}:`, error)
}
}

function visitDirectory(currentPath: string): void {
const files = fs.readdirSync(currentPath)

files.forEach((file) => {
const fullPath = path.join(currentPath, file)
const stat = fs.statSync(fullPath)

if (stat.isDirectory()) {
// Skip hidden directories
if (!file.startsWith('.')) {
visitDirectory(fullPath)
}
} else if (stat.isFile() && file.endsWith('.ts')) {
searchInFile(fullPath)
}
})
}

visitDirectory(directoryPath)
return skippedTests
}

function main() {
const targetDirectory = process.argv[2] || '.'

try {
const skippedTests = findSkippedTests(targetDirectory)

if (skippedTests.length === 0) {
console.log('No skipped tests found.')
return
}

const testsByFile = skippedTests.reduce(
(acc, test) => {
const file = test.file
if (!acc[file]) {
acc[file] = []
}
acc[file].push(test)
return acc
},
{} as Record<string, SkippedTest[]>
)

console.log('\nSkipped Tests Report')
console.log(`Total skipped tests: ${skippedTests.length}`)
console.log(`Files affected: ${Object.keys(testsByFile).length}`)
console.log('===================\n')

Object.entries(testsByFile).forEach(([file, tests]) => {
console.log(`📁 ${file}`)
console.log(' Skipped tests:')
tests.forEach((test) => {
console.log(` • ${test.testName} (line ${test.lineNumber})`)
})
console.log('')
})
} catch (error) {
console.error('Error:', error)
process.exit(1)
}
}

main()
Loading