Skip to content

Commit 673d887

Browse files
authored
Warn for missing targets (#659)
* Warn for missing openApiOperationId
1 parent 23f8a0e commit 673d887

File tree

10 files changed

+77
-8
lines changed

10 files changed

+77
-8
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## [Unreleased]
22

3+
- Warn for missing targets (#632 #391)
4+
35
## v1.30.4 - (2024-10-07)
46

57
- Handle Postman API non-200 responses better (#660)

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,10 @@ Options:
137137
--filterFile Path/URL to openapi-format config file (oas-format-filter.json) [string]
138138
--envFile Path to the .env file to inject environment variables [string]
139139
--collectionName Overwrite OpenAPI title to set the Postman collection name [string]
140-
--cliOptionsFile Path/URL to Portman CLI options file [string]
140+
--cliOptionsFile Path/URL to Portman CLI options file [string]
141141
--ignoreCircularRefs Ignore circular references in OpenAPI spec (default: false) [boolean]
142142
--logAssignVariables Toggle logging of assigned variables (default: true) [boolean]
143+
--warn/--no-warn Toggle warnings for missing openApiOperationIds (default: true) [boolean]
143144
--init Configure Portman CLI options in an interactive manner [string]
144145
--extraUnknownFormats Add extra unknown formats to json schema tests [array]
145146
```

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
"@apidevtools/swagger-parser": "^10.1.0",
7171
"@faker-js/faker": "5.5.3",
7272
"ajv": "^8.12.0",
73-
"axios": "^1.6.5",
73+
"axios": "^1.7.7",
7474
"chalk": "^4.1.2",
7575
"dot-object": "^2.1.5",
7676
"dotenv": "^10.0.0",

src/Portman.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { clearTmpDirectory, getConfig } from './lib'
2020
import { OpenApiFormatter, OpenApiParser } from './oas'
2121
import { PostmanParser } from './postman'
2222
import { IOpenApiToPostmanConfig, OpenApiToPostmanService, PostmanSyncService } from './services'
23-
import { PortmanConfig, PortmanTestTypes } from './types'
23+
import { PortmanConfig, PortmanTestTypes, Track } from './types'
2424
import { PortmanOptions } from './types/PortmanOptions'
2525
import { validate } from './utils/PortmanConfig.validator'
2626
import { PortmanError } from './utils/PortmanError'
@@ -189,6 +189,7 @@ export class Portman {
189189

190190
async after(): Promise<void> {
191191
const { consoleLine, collectionFile } = this
192+
192193
await clearTmpDirectory()
193194
console.log(chalk.green(consoleLine))
194195

@@ -199,6 +200,9 @@ export class Portman {
199200
)
200201

201202
console.log(chalk.green(consoleLine))
203+
204+
// Display warning
205+
this.displayMissingTargets(this.testSuite.track)
202206
}
203207

204208
async parseOpenApiSpec(): Promise<void> {
@@ -666,4 +670,34 @@ export class Portman {
666670
process.exit(1)
667671
}
668672
}
673+
674+
displayMissingTargets = (track: Track): void => {
675+
const {
676+
consoleLine,
677+
options: { warn }
678+
} = this
679+
680+
if (warn === false) {
681+
return
682+
}
683+
684+
// Deduplicate missing targets
685+
const uniqueOperationIds = Array.from(new Set(track.openApiOperationIds))
686+
const uniqueOperations = Array.from(new Set(track.openApiOperations))
687+
688+
if (uniqueOperationIds.length > 0 || uniqueOperations.length === 0) {
689+
console.log(
690+
chalk.yellow(`WARNING: The following targets are missing from the OpenAPI specification.`)
691+
)
692+
if (uniqueOperationIds.length > 0) {
693+
const idsList = uniqueOperationIds.join(', ')
694+
console.log(chalk.yellow(`operationId:\t\t${idsList}`))
695+
}
696+
if (uniqueOperations.length > 0) {
697+
const opsList = uniqueOperations.join(', ')
698+
console.log(chalk.yellow(`openApiOperation:\t${opsList}`))
699+
}
700+
console.log(chalk.yellow(consoleLine))
701+
}
702+
}
669703
}

src/application/IntegrationTestWriter.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ export class IntegrationTestWriter {
3939

4040
const pmOperation = testSuite.postmanParser.getOperationById(openApiOperationId)
4141

42-
if (!pmOperation) return
42+
if (!pmOperation) {
43+
this.testSuite.track.openApiOperationIds.push(openApiOperationId)
44+
return
45+
}
4346

4447
const folderId = variationWriter.variationFolder.id
4548
// const folderName = pmOperation.getParentFolderName()

src/application/TestSuite.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
ResponseTime,
3737
StatusCode,
3838
TestSuiteOptions,
39+
Track,
3940
VariationTestConfig
4041
} from '../types'
4142
import { inRange } from '../utils'
@@ -61,6 +62,9 @@ export class TestSuite {
6162

6263
requestTestTypes: PortmanReqTestType[]
6364

65+
// Tracker
66+
public track = { openApiOperationIds: [], openApiOperations: [] } as Track
67+
6468
constructor(testSuiteOptions: TestSuiteOptions) {
6569
const { oasParser, postmanParser, config, options } = testSuiteOptions
6670

@@ -168,10 +172,24 @@ export class TestSuite {
168172

169173
if (openApiOperation) {
170174
pmOperations = this.postmanParser.getOperationsByPath(openApiOperation)
175+
// Track missing operations
176+
if (pmOperations.length === 0) {
177+
this.track.openApiOperations.push(openApiOperation)
178+
}
171179
} else if (openApiOperationId) {
172180
pmOperations = this.postmanParser.getOperationsByIds([openApiOperationId])
181+
182+
// Track missing operations
183+
if (pmOperations.length === 0) {
184+
this.track.openApiOperationIds.push(openApiOperationId)
185+
}
173186
} else if (openApiOperationIds) {
174187
pmOperations = this.postmanParser.getOperationsByIds(openApiOperationIds)
188+
189+
// Track missing operations
190+
if (pmOperations.length === 0) {
191+
this.track.openApiOperationIds.push(...openApiOperationIds)
192+
}
175193
}
176194

177195
if (settings?.excludeForOperations) {

src/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,10 @@ require('dotenv').config()
129129
describe: 'Toggle logging of assigned variables',
130130
type: 'boolean'
131131
})
132+
.option('warn', {
133+
describe: 'Toggle warnings for missing openApiOperationIds',
134+
type: 'boolean'
135+
})
132136
.option('init', {
133137
describe: 'Initialize Portman and generate a Portman CLI configuration file',
134138
type: 'boolean'
@@ -232,6 +236,7 @@ require('dotenv').config()
232236
const oaOutput = options.oaOutput || ''
233237
const collectionName = options.collectionName || ''
234238
const logAssignVariables = options?.logAssignVariables
239+
const warn = options?.warn || true
235240
const extraUnknownFormats = options?.extraUnknownFormats || []
236241
const syncPostmanCollectionIds = options?.syncPostmanCollectionIds || false
237242

@@ -254,6 +259,7 @@ require('dotenv').config()
254259
oaOutput,
255260
collectionName,
256261
logAssignVariables,
262+
warn,
257263
extraUnknownFormats,
258264
syncPostmanCollectionIds
259265
})

src/types/PortmanOptions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export interface PortmanOptions {
3232
oaUrl?: string
3333
init?: boolean
3434
logAssignVariables?: boolean
35+
warn?: boolean
3536
extraUnknownFormats?: string[]
3637
syncPostmanCollectionIds?: boolean
3738
}

src/types/PortmanTestSuite.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@ export type PortmanReqTestType = {
99
export interface PortmanTestSuite {
1010
pmReqTestType?: PortmanReqTestType
1111
}
12+
export interface Track {
13+
openApiOperationIds: string[]
14+
openApiOperations: string[]
15+
}

0 commit comments

Comments
 (0)