Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
117 changes: 117 additions & 0 deletions scripts/skippedTestReport.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/*!
* 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
*
* Note: This script doesn't handle cases where teams use this.skip() inside of their tests
*
* Usage: node skippedTestReport.js <directoryPath>
*/

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